深入解析ADC0809:8路8位CMOS ADC芯片应用与转换原理

版权申诉
0 下载量 143 浏览量 更新于2024-10-19 收藏 13KB RAR 举报
资源摘要信息:"ADC0809是一种广泛应用于模拟数字转换领域的CMOS组件。它包含了8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑。ADC0809是一种逐次逼近式A/D转换器,可以通过其多路开关对多个模拟信号源进行选择,然后将其转换为数字信号。 描述中提到,ADC0809可以和单片机直接接口,这说明它的设计与单片机兼容,可以在不添加额外接口电路的情况下,实现模拟信号到数字信号的转换。这对于需要进行模拟数字转换的嵌入式系统和微控制器系统来说,是非常方便的。 ADC0809的使用方法也很简单,只需要从其通道IN3输入0-5V之间的模拟量,然后通过ADC0809将其转换为数字量。最后,这个数字量可以在数码管上以十进制形式显示出来。 此外,ADC0809的VREF需要接+5V电压。这是因为它采用的是逐次逼近式A/D转换技术,需要一个参考电压来确定其转换的范围和精度。在ADC0809中,这个参考电压就是+5V。 总的来说,ADC0809是一种功能强大的CMOS组件,它的高性能、高精度、高稳定性和易用性,使其在各个领域都有广泛的应用。" 【知识点】 1. ADC0809组件介绍:ADC0809是一种带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件,主要用于模拟数字转换领域。 2. ADC0809的工作原理:ADC0809是一种逐次逼近式A/D转换器,通过其多路开关对多个模拟信号源进行选择,然后将其转换为数字信号。 3. ADC0809的使用方法:ADC0809可以和单片机直接接口,通过其通道IN3输入0-5V之间的模拟量,然后通过ADC0809将其转换为数字量。最后,这个数字量可以在数码管上以十进制形式显示出来。 4. ADC0809的供电需求:ADC0809的VREF需要接+5V电压,这是因为它采用的是逐次逼近式A/D转换技术,需要一个参考电压来确定其转换的范围和精度。 5. ADC0809的应用领域:由于ADC0809的高性能、高精度、高稳定性和易用性,使其在各个领域都有广泛的应用。

import numpy as np import torch import torch.nn as nn import torch.nn.functional as F import matplotlib.pyplot as plt # 定义RBF神经网络的类 class RBFNetwork(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(RBFNetwork, self).__init__() # 初始化输入层,隐含层,输出层的节点数 self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size # 初始化权重矩阵和偏置向量 self.W1 = nn.Parameter(torch.randn(input_size, hidden_size)) # 输入层到隐含层的权重矩阵 self.b1 = nn.Parameter(torch.randn(hidden_size)) # 隐含层的偏置向量 self.W2 = nn.Parameter(torch.randn(hidden_size, output_size)) # 隐含层到输出层的权重矩阵 self.b2 = nn.Parameter(torch.randn(output_size)) # 输出层的偏置向量 def forward(self,x): # 前向传播过程 x = torch.from_numpy(x).float() # 将输入向量转换为张量 x = x.view(-1, self.input_size) # 调整输入向量的形状,使其与权重矩阵相匹配 h = torch.exp(-torch.cdist(x, self.W1.t()) + self.b1) # 计算隐含层的输出值,使用高斯径向基函数作为激活函数 y = F.linear(h, self.W2.t(), self.b2) # 计算输出层的输出值,使用线性函数作为激活函数 return y #定义pid控制器 class Pid(): def __init__(self, exp_val, kp, ki, kd): self.KP = kp self.KI = ki self.KD = kd self.exp_val = exp_val self.now_val = 0 self.sum_err = 0 self.now_err = 0 self.last_err = 0 def cmd_pid(self): self.last_err = self.now_err self.now_err = self.exp_val - self.now_val self.sum_err += self.now_err self.now_val = self.KP * (self.exp_val - self.now_val) \ + self.KI * self.sum_err + self.KD * (self.now_err - self.last_err) return self.now_val def err_pid(self): self.last_err = self.now_err self.now_err = self.exp_val - self.now_val self.sum_err += self.now_err self.p_err = self.exp_val - self.now_val self.i_err = self.sum_err self.d_err = self.now_err - self.last_err self.now_val = self.KP * (self.exp_val - self.now_val) \ + self.KI * self.sum_err + self.KD * (self.now_err - self.last_err) return self.p_err, self.i_err, self.d_err rbf_net = RBFNetwork(3,10,4) pid_val = [] #对pid进行初始化,目标值是1000 ,p=0.1 ,i=0.15, d=0.1 A_Pid = Pid(1000, 0.1, 0.1, 0.1) # 然后循环100次把数存进数组中去 for i in range(0, 100): input_vector = np.array(A_Pid.err_pid()) output_vector = rbf_net(input_vector) output_vector = output_vector.reshape(4,1) A_Pid = Pid(1000, output_vector[0], output_vector[1], output_vector[2]) pid_val.append(A_Pid.cmd_pid())

2023-06-06 上传