ADC/CAD转换
ADC,全称为Analog-to-Digital Converter,是将模拟信号转换为数字信号的重要器件。在转换过程中涉及到的技术指标包括分辨率、量化误差和偏移误差等。
利用分辨率=量程/2n公式可以计算出分辨率,例如量程为单极性0-5V,8位ADC的分辨率是: 5/255= 0.0196V。最后,完成一次完整的A/D转换所需要的时间,包括采样、保持、量化、编码的全过程这个称之为转换时间。
分辨率 =参考电压 /ADC的位数最大值如8位255,10位1023
具体的转换过程中,如果一次A/D转换中的数字量是1010101010,那么可以通过计算得出对应的模拟电压。首先,这10位二进制数对应的十进制数是682;然后,用这个数字量乘以参考电压(例如VREF),就可以得到对应的模拟电压值。
ADC转DAC:模转数
公式:DAC = ADC*分辨率
DAC转ADC:数转模
公式:ADC = DAC/分辨率
如何减少误差
1.将电压量化和浮点化
公式:DAC = ADC陪数分辨率
公式:ADC = DAC/分辨率/陪数
ADC0809 芯片
ADC0809是美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼近式A/D模数转换器。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
该芯片主要具有以下特性:
- 8路输入通道:可以进行多路模拟信号的同步采样和转换。
- 8位A/D转换器:分辨率为8位,可以将模拟信号转换为256个不同的数字值。
- 具有转换启动停止控制端:可以控制A/D转换的启动和停止。
- 转换时间为100μs(时钟为640KHz时),130μs(时钟为500KHz时):转换速度较快。
- 单个+5V电源供电:工作电压范围较宽,可以在+5V~+15V的范围内正常工作。
ADC0809芯片有28条引脚,采用双列直插式封装。各引脚的功能如下:
- IN0~IN7:这8个引脚是模拟量输入端,可以接收8路模拟信号的输入。
- 2-1~2-8:这8个引脚是数字量输出端,转换后的8位二进制数字量从这些引脚输出。
- ADDA、ADDB、ADDC:这3个引脚是地址输入线,用于选通8路模拟输入中的一路。通过这三根线的不同的0和1的组合,可以选择对应的通道(IN0~IN7)。
- ALE:这是地址锁存允许信号,当输入一个正脉冲(至少100ns宽)时,该信号有效,用于锁存地址。
- START:这是A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽),可以使其启动A/D转换。脉冲上升沿使0809复位,下降沿启动A/D转换。
- EOC:这是A/D转换结束信号,当A/D转换结束时,此端会输出一个高电平信号。在转换期间,此信号一直为低电平。
- OE:这是数据输出允许信号,当输入为高电平时,数据输出端有效。
- ADC转换
#include <reg52.h>
sbit AD_CS = P1^0; //ADC芯片选择端
void ADC_Init() {
AD_CS = 1; //选通ADC
Delay_ms(1);
}
uint Get_ADC(uchar ch) {
AD_CS = 0; //选通ADC
P1OUT = (0x01<<ch); //设置ADC通道
Delay_us(25); //等待稳定
P1OUT |= 0x08; //开始转换
Delay_us(55);
AD_CS = 1;
return (P1IN & 0x0F); //读取数字量
}
void main() {
ADC_Init();
while(1) {
uint val = Get_ADC(2); //读取通道2
//处理转换结果val
}
}
初始化并使用ADC(模数转换器)的STC89C52单片机的C语言程序。下面是对代码的详细解释:
- sbit AD_CS = P1^0;这行代码定义了一个名为AD_CS的sbit,它连接到P1端口的第0位。sbit是单片机中的一个特殊位,通常用于低电平有效的硬件选择信号,这里就是ADC芯片的选择信号。
- void ADC_Init() {…}这个函数是用来初始化ADC的。它将AD_CS设为1,从而选通ADC。然后延迟1毫秒。这个延迟通常用于让ADC有时间进行初始化,尽管这里的具体延时需要根据实际硬件和ADC的具体工作条件来确定。
- uint Get_ADC(uchar ch) {…}这个函数是用来获取ADC的值的。首先,它将AD_CS设为0,从而选通ADC。然后,它将ADC通道设置为参数ch指定的通道(通过将0x01<<ch写入P1OUT)。接着,它等待一段时间(25微秒)让ADC稳定。然后,它启动ADC转换(通过将0x08写入P1OUT)。然后等待55微秒让ADC完成转换。最后,它将AD_CS设为1,然后返回ADC的数字量(通过读取P1IN的低4位)。
- void main() {…}这是程序的主函数。首先,它调用ADC_Init()来初始化ADC。然后,它进入一个无限循环,在每次迭代中,它都调用Get_ADC(2)来读取通道2的ADC值,然后对结果进行处理。
注意:这段代码中缺少了定义Delay_ms和Delay_us函数的代码。在实际使用中,需要确保这些函数被正确实现。
- DAC转换
#include <reg52.h>
sbit DAC_CS = P2^0;
sbit DAC_CLK = P2^1;
void DAC_Init() {
DAC_CS = 1;
DAC_CLK = 0;
}
void DAC_Out(uchar dat) {
uchar i;
DAC_CS = 0; //使能芯片
/* 如果是连接8位的线,如连接P0数据线 delay_ns(10); P0 = dat; delay_ns(10) */
for(i=0; i<8; i++) {
DAC_CLK = 0;
if(dat & 0x80)
DAC_DATA_IN = 1;
else
DAC_DATA_IN = 0;
DAC_CLK = 1; //输出数据
dat <<= 1;
}
DAC_CS = 1; //禁能芯片
}
void main() {
DAC_Init();
while(1) {
//生成0-255的电压输出
DAC_Out(count);
count++;
if(count > 255)
count = 0;
}
}
主要就是利用ADC和DAC的控制引脚,根据时序要求进行置位和复位,完成模数转换或数模转换
用于初始化DAC(数字模拟转换器)并输出模拟信号的STC89C52单片机的C语言程序。
下面是对代码的详细解释:
#include <reg52.h>
:包含reg52.h
头文件。这个头文件为STC89C52单片机提供了标准寄存器和特殊功能寄存器的定义。sbit DAC_CS = P2^0;
和sbit DAC_CLK = P2^1;
:这两行定义了两个sbit,分别连接到P2端口的第0位和第1位。DAC_CS
用于使能/禁用DAC芯片,DAC_CLK
用于传输数据到DAC芯片。void DAC_Init() {...}
:这个函数用于初始化DAC。它将DAC_CS
设为1,从而选通DAC,并且将DAC_CLK
设为0。void DAC_Out(uchar dat) {...}
:这个函数用于输出数据到DAC。它首先将DAC_CS
设为0,从而选通DAC芯片。然后,通过一个循环,它将每个数据位传输到DAC。在每个时钟上升沿,它检查数据位的值(0或1),并相应地将DAC_DATA_IN
设为0或1。然后,它左移dat
,准备传输下一个数据位。最后,它将DAC_CS
设为1,从而禁用DAC芯片。void main() {...}
:这是程序的主函数。首先,它调用DAC_Init()
来初始化DAC。然后,它进入一个无限循环,在每次迭代中,它生成一个0-255的电压输出(通过DAC_Out(count)
),然后增加count
的值。如果count
的值超过255,它重置为0。
注意:这段代码中缺少了定义DAC_DATA_IN
的代码。在实际使用中,需要确保这个定义存在。此外,这段代码假设了DAC的工作原理和数据输入方式,但这些可能因DAC的具体型号和配置而有所不同。
今天的文章adc转换顺序_adc芯片介绍分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/84127.html