基于单片机的16位逐次逼近AD电路设计
点击链接下载设计资料:https://download.csdn.net/download/m0_51061483/92081535
1. 系统功能概述
本设计的目标是构建一个基于单片机控制的高精度16位逐次逼近式模数转换(ADC)电路系统,实现对模拟电压信号的精确采样、数字化处理和结果显示。系统的核心任务是将模拟电压信号通过逐次逼近的方式转换为数字信号,并利用LCD1602液晶显示屏实时显示当前电压值与对应的AD值。
系统的功能主要包括:
- 构建由分立元件组成的16位逐次逼近式模数转换电路;
- 通过单片机采集ADC输出数据;
- 实时在LCD1602上显示模拟电压值与对应的AD转换结果;
- 具有较高的精度和稳定性,误差控制在5%左右;
- 模拟与数字部分混合仿真,能反映真实ADC的工作特性。
逐次逼近型ADC(SAR ADC)是目前工业测量中广泛使用的一种高精度ADC结构。其原理是通过比较器与逐次逼近寄存器(SAR)逐位判断输入电压的高低,最终得到对应的数字量。该方式兼顾速度与精度,适合在本设计中实现高分辨率的模数转换。
2. 系统电路设计
本系统的硬件部分由单片机控制核心、逐次逼近ADC模块、数模转换模块(DAC)、比较器模块、LCD1602显示模块、电源电路等部分组成。以下分别对各模块的设计进行详细介绍。
2.1 单片机最小系统设计
本系统选用AT89C51单片机作为控制核心。该单片机具有丰富的I/O口、稳定的时钟系统和良好的外设扩展能力。其主要作用包括:
- 产生逐次逼近的控制信号;
- 读取比较器输出并判断电平高低;
- 控制DAC输出电压;
- 将最终的AD结果计算为对应的电压值;
- 驱动LCD1602显示模块进行数据显示。
单片机的时钟频率为12MHz,能够满足逐次逼近ADC的转换速度需求。系统使用内部程序控制逐次逼近的16位判断流程,逐步确定输入电压对应的数字码。
2.2 逐次逼近ADC电路设计
逐次逼近ADC的核心组成包括:
- 比较器:用于判断输入模拟电压与DAC输出电压的大小;
- DAC电路:由分立电阻网络或DAC芯片组成,用于输出逐步逼近的电压;
- SAR寄存器:在本设计中由单片机程序模拟实现。
逐次逼近的基本工作流程为:
- 先将最高位(MSB)设为1;
- 将对应数字值送入DAC生成比较电压;
- 比较输入电压与DAC电压大小;
- 若输入电压大于DAC电压,则保留该位为1,否则置0;
- 依次逼近下一个位,直到最低位(LSB);
- 最终得到完整的16位数字量。
由于使用分立元件搭建,电阻网络的精度直接影响ADC的整体线性度和转换精度。为保证准确性,选用1%精度金属膜电阻,并进行误差匹配调整。
2.3 数模转换模块设计
数模转换器(DAC)在此起关键作用,用于将单片机输出的数字码转换为对应的模拟电压,与输入电压进行比较。本设计采用R-2R电阻网络DAC,该结构简单、成本低、精度高,适合分立元件实现。
R-2R网络的电压输出遵循公式:
V o u t = V r e f × D 2 16 V_{out} = V_{ref} \times \frac{D}{2^{16}} Vout=Vref×216D
其中,
- ( V_{ref} ):参考电压;
- ( D ):16位二进制输入值。
AT89C51输出的控制信号经过R-2R网络形成模拟电压信号,再送入比较器输入端。
2.4 比较器电路设计
比较器用于判断输入模拟信号与DAC输出电压的大小。本设计选用高速运放LM339构成比较器电路。比较器输出高电平表示输入电压大于DAC输出电压,低电平表示相反。
为了增强系统抗干扰能力,比较器输出端接入一个小电容进行滤波,并通过上拉电阻将输出信号稳定输入单片机端口。
2.5 LCD1602显示模块设计
LCD1602用于显示ADC转换结果与对应的电压值。其控制方式采用4位数据总线模式,以节省I/O口。主要显示内容包括:
- 第一行显示电压值(单位:V);
- 第二行显示AD转换结果(16位十六进制或十进制形式)。
LCD的显示程序通过定时刷新机制,确保数据实时更新并具备良好的可读性。
2.6 电源电路设计
系统供电采用+5V直流电源,为单片机、LCD和比较器提供工作电压。为保证模拟信号部分的稳定性,ADC模块与数字部分电源采用RC滤波网络隔离,减少噪声干扰。
3. 系统程序设计
系统的软件设计部分采用C语言编程,主要包括主程序、逐次逼近算法模块、DAC输出控制模块、比较器采样模块、LCD显示模块等部分。程序通过模块化设计,使逻辑结构清晰,便于调试与扩展。
3.1 主程序设计
主程序负责系统初始化、启动逐次逼近过程、调用LCD显示子程序。流程如下:
- 初始化单片机端口与LCD;
- 执行ADC转换程序;
- 将结果转换为电压值;
- 调用显示函数输出结果。
主程序代码如下:
#include <reg51.h>
#include "lcd1602.h"
unsigned int ad_result;
float voltage;
void main() {
LCD_Init();
while(1) {
ad_result = SAR_ADC(); // 执行逐次逼近
voltage = (float)ad_result * 5.0 / 65535.0;
LCD_ShowString(0,0,"V:");
LCD_ShowFloat(2,0,voltage,3);
LCD_ShowString(0,1,"AD:");
LCD_ShowInt(3,1,ad_result);
delay_ms(500);
}
}
3.2 逐次逼近算法模块
逐次逼近算法模拟16位SAR寄存器的工作原理。单片机通过逐位测试确定输入电压的数字表示。算法思想如下:
- 从高位到低位逐位设定1;
- 输出至DAC;
- 读取比较器结果;
- 根据结果保留或清除该位。
程序实现如下:
unsigned int SAR_ADC(void) {
unsigned int i;
unsigned int result = 0;
for (i = 0; i < 16; i++) {
result |= (1 << (15 - i)); // 设置当前位
DAC_Output(result); // 输出至DAC
delay_us(5); // 稳定时间
if (Comparator_Read() == 0) { // 若输入电压小于DAC
result &= ~(1 << (15 - i)); // 清除该位
}
}
return result;
}
3.3 DAC输出控制模块
DAC模块通过单片机的I/O口控制R-2R电阻网络电压输出。程序根据输入的数字值依次输出各位电平。
void DAC_Output(unsigned int value) {
P1 = (unsigned char)(value >> 8); // 高8位
P2 = (unsigned char)(value & 0xFF); // 低8位
}
3.4 比较器采样模块
比较器模块读取LM339的输出,判断输入信号与DAC电压的关系。
bit Comparator_Read(void) {
return P3^0; // 读取比较器输出端口
}
3.5 LCD显示模块
LCD模块提供数值的可视化显示。LCD驱动程序包含字符显示、浮点数显示和整数显示等功能。
void LCD_ShowFloat(unsigned char x, unsigned char y, float val, unsigned char num) {
unsigned int temp;
temp = val * 1000;
LCD_ShowInt(x, y, temp / 1000);
LCD_ShowChar(x + 1, y, '.');
LCD_ShowInt(x + 2, y, temp % 1000);
}
4. 系统运行与性能分析
系统运行时,输入端连接可调电压源,LCD实时显示输入电压值及其对应AD码。实际测试中,在0~5V范围内的线性度较高,误差控制在5%左右。影响误差的主要因素包括:
- R-2R电阻网络的阻值偏差;
- 比较器响应延时;
- 单片机延时控制精度;
- 模拟信号噪声干扰。
通过在DAC端加入滤波电容和调整延时参数,可有效提高转换稳定性与线性精度。
5. 总结
本设计通过AT89C51单片机实现了一个完整的16位逐次逼近式ADC系统,采用分立元件构建DAC与比较器电路,成功完成高分辨率模数转换与显示功能。系统结构清晰、逻辑合理、成本低廉,可用于教学实验及ADC算法研究。虽然存在一定的误差,但整体性能优异,为高精度数据采集提供了有益参考。