计数型8位AD转换器仿真实验,采用proteus实现,版本是proteus8.9,能实现基本要求。 有讲解视频
电路板上的红绿灯交替亮起,调试用的杜邦线在实验桌上缠成一团。我盯着屏幕里跳动的波形,突然意识到这个计数型AD转换器就像在玩"猜数字"游戏——只不过这次猜谜的是单片机自己。
咱们先聊聊这个AD转换器的原理。它不像逐次逼近型那么聪明,反而像个固执的小孩,从零开始数数,每次加1就跑去问比较器:"现在电压够了吗?"当DAC输出的电压刚超过输入电压时,计数器立马刹车,这时候的计数值就是转换结果。虽然速度慢了点,但硬件结构简单得让人感动,特别适合给萌新理解AD转换的本质。
打开Proteus 8.9,先把核心部件拖进工作区:AT89C51单片机、DAC0808模数转换芯片、LM393比较器,外加几个电阻电容。注意DAC的基准电压要接稳定,我这用的是5V电源经两个1kΩ电阻分压得2.5V(实际应用建议用TL431这类基准源)。比较器的输出接到P3.7口,这样单片机就能知道什么时候该停止计数了。
别急,咱们上代码:
#include <reg51.h> sbit COMP = P3^7; // 比较器输出接这里 void delay(unsigned int t) { while(t--); } void main() { unsigned char count = 0; P1 = 0x00; // 计数输出端口 P2 = 0x00; // DAC控制端口 while(1) { for(count=0; count<255; count++) { P2 = count; // 往DAC送当前计数值 delay(100); // 等DAC输出电压稳定 if(COMP == 0) { // 当比较器翻转时 P1 = count; // 锁存当前计数值 break; } } delay(50000); // 间隔一段时间再采样 } }这段代码就像个自动化的猜数机器。每次循环都从0开始往上累加,P2口把数字喂给DAC转换成模拟电压。当这个电压超过被测电压时,比较器输出低电平,程序立马抓住此时的计数值送到P1口显示。那个delay(100)特别重要——DAC转换需要时间,要是没这个延时,比较器可能读到的是上个周期的电压值。
仿真时试着调调输入电压,比如输入3V时会显示0x60(96的十六进制)。这是因为DAC的分辨率是5V/256≈19.5mV,3V对应的数字量就是3/0.0195≈154,不过实际显示值可能因为比较器阈值有些偏差。这时候可以掏出万用表量量DAC输出,确认电压爬坡过程是否均匀。
遇到过坑的人都知道,比较器偶尔会抽风似的抖动。这时可以在比较器输入端加个0.1uF的滤波电容,或者在软件里做多次采样取平均。另外单片机时钟别调太高,否则delay函数的等待时间会不够,导致采样频率飞起——结果就是数码管显示的数字跳得比DJ打碟还快。
最后唠叨一句:这种AD转换方式实战中很少用,毕竟速度慢得像树懒。但作为理解AD转换原理的实验,它比那些SPI接口的ADC芯片更能让人看清模数转换的本质——不就是让计算机学会用数字量丈量模拟世界嘛!