1、双积分AD转换电路
点击链接下载prrotues仿真设计资料:https://download.csdn.net/download/m0_51061483/92081537
2、系统总体概述
2.1 设计背景与应用意义
模数转换(Analog to Digital Converter,ADC)是电子系统中最重要的基础功能之一,它承担着把连续变化的模拟电压转换为离散数字量的任务。常见的ADC类型包括逐次逼近型(SAR)、并行比较型(Flash)、Sigma-Delta型、双积分型等。其中,双积分ADC因其结构直观、抗干扰能力强、对器件误差不敏感、线性度好而被广泛应用在数字万用表、精密测量仪器、工业采集模块等领域。
双积分ADC的典型特点是转换速度相对较慢,但精度与抗干扰性能优良,特别是对于工频噪声(50Hz/60Hz)有天然抑制能力。其核心思想是通过"积分---反积分(回零)"两阶段实现对输入电压的时间测量:在固定的积分时间内让积分器对输入电压积分,随后用参考电压进行反向积分,使积分器输出回到零点。由于积分电路本质上对输入信号做平均,短时的干扰与噪声在积分过程中会被显著削弱,因此在复杂环境下具有很强的稳定性。
本设计的目标是:利用数字电路与模拟电路组合实现一个双积分ADC,转换位数为8位(即输出0~255),并将转换结果以十六进制形式在数码管上显示。系统兼顾原理性和可实现性,重点体现双积分ADC的完整工作流程以及数字控制逻辑与显示系统的联动。
2.2 系统功能需求与指标
本系统实现的主要功能与指标如下:
(1)采用双积分原理完成AD转换,模拟部分包含积分器、比较器、参考电压切换等电路;数字部分包含计数、时序控制、状态机与显示驱动。
(2)AD转换位数为8位,输出范围0255,对应输入电压范围可按参考电压设置(如0Vref)。
(3)转换结果以十六进制显示,使用数码管显示两位HEX(00~FF)。
(4)系统支持周期性自动采样转换,能够持续更新显示。
(5)电路设计不需要画连接图,但需对每个模块进行较详细说明。
2.3 系统总体结构
双积分ADC系统可以分为四大部分:
(1)模拟积分与比较部分:包含运算放大器积分器、模拟开关(或继电器/晶体管切换网络)、参考电压、比较器与零点检测。
(2)数字计时与控制部分:包含时钟源、计数器、控制状态机、控制信号输出(积分阶段/反积分阶段/复位阶段)。
(3)数据锁存与编码部分:在反积分结束瞬间锁存计数值,形成8位数字输出,并转换为两位十六进制BCD/HEX显示码。
(4)数码管显示部分:包含数码管、段码译码、动态扫描或静态驱动。
双积分ADC的核心数据关系为:
- 第1阶段:积分时间固定为 (T_{int})
- 第2阶段:反积分时间 (T_{deint}) 与输入电压成正比
在理想情况下:T_{deint} = \\frac{V_{in}}{V_{ref}} \\cdot T_{int}
因此,只要 (T_{int}) 固定并准确,且 (V_{ref}) 稳定,反积分计数值就能直接表示输入电压的大小。通过数字计数器对 (T_{deint}) 计数即可得到数字结果。
3、系统功能与工作流程详解
3.1 双积分AD转换基本原理
双积分ADC的关键是"先积分、再反积分",其输出不是直接比较电压大小,而是把电压转换为"时间"。具体过程如下:
(1)复位阶段(Reset/Auto-Zero)
积分电容先被放电,使积分器输出归零,避免残余电荷影响下一次测量。某些高精度设计还会增加"自零"阶段,用于抵消运放偏置。
(2)积分阶段(Run-Up)
在一个固定时间 (T_{int}) 内,把输入电压 (V_{in}) 加到积分器输入端,积分器输出以一定斜率变化:
V_o(t) = -\\frac{1}{RC}\\int_0\^{T_{int}}V_{in}dt = -\\frac{V_{in}}{RC}T_{int}
积分结束时的输出幅度与输入电压成正比。
(3)反积分阶段(Run-Down)
切换输入端为一个已知极性的参考电压 (V_{ref})(通常取与积分阶段相反的极性),使积分器输出向零点回归。由于反积分的斜率由 (V_{ref}) 决定,是已知且稳定的,因此"回到零点所需时间"与积分结束时的输出幅度成正比,也就与 (V_{in}) 成正比。反积分阶段时间公式为:
T_{deint} = \\frac{V_{in}}{V_{ref}}T_{int}
在反积分开始时同时启动计数器计数时钟脉冲,当比较器检测到积分器输出过零(回到0V)时停止计数。该计数值就是AD转换结果的数字表示。
3.2 8位量化与满量程设计
系统输出为8位,即最大可表示255。为了使计数值与输入电压对应关系直观,通常选择:
- 积分阶段固定时钟数 (N_{int}) = 256 或 255 或 512 等整数
- 反积分阶段计数 (N_{deint}) 对应输出码
如果选择 (N_{int}=256),则理想情况下:
N_{deint} = \\frac{V_{in}}{V_{ref}} \\cdot 256
当 (V_{in}=V_{ref}) 时,反积分计数为256,但8位最大是255,因此可采用两种策略:
(1)积分时间取255个时钟周期,使满量程对应255;
(2)积分时间取256个周期,但对输出进行饱和限制(超过255则显示FF)。
在实际设计中,为了简单直观,常采用 (N_{int}=255) 或 (N_{int}=256) 并加限制。本方案重点体现原理与结构,因此以 (N_{int}=256) 作为积分阶段基准,输出超过255时强制显示FF。
3.3 数码管十六进制显示功能
转换结果为8位二进制数据D[7:0],需要显示为两位十六进制:
- 高4位:D[7:4] → HEX高位(0~F)
- 低4位:D[3:0] → HEX低位(0~F)
数码管显示可采用:
(1)静态显示:每位数码管独立驱动,硬件资源多但稳定。
(2)动态扫描:两位数码管共用段线,通过位选轮流点亮,节省IO资源,需定时刷新避免闪烁。
一般采用动态扫描较常见。显示驱动需要将4位HEX转换为7段段码(a~g,可加dp)。可以用查表方式实现。
4、系统电路设计
4.1 电路设计总体说明
双积分ADC由模拟电路和数字电路组成,模拟部分决定精度与抗噪声能力,数字部分决定计时精度与显示效果。设计时应重点关注:
(1)参考电压稳定性:Vref的漂移会直接影响转换比例。
(2)积分器元件匹配:R、C的稳定性影响积分线性,但双积分对RC绝对误差不敏感,对漂移相对不那么敏感。
(3)比较器过零检测准确性:比较器输入噪声、滞回特性会影响回零判定。
(4)时钟稳定性:计数时钟是时间基准,频率稳定度影响转换一致性。
(5)模拟开关切换与充放电:开关注入电荷会造成微小误差,需要适当处理。
4.2 模拟积分器模块
4.2.1 积分器基本结构
积分器通常用运算放大器构成:输入端串联电阻R,反馈为电容C。输出公式:
V_o(t) = -\\frac{1}{RC}\\int V_{in}(t)dt
关键点:
(1)运放应选择输入偏置电流小、失调电压小、低漂移型号,以减少积分误差累积。
(2)电容应选择低漏电、低温漂电容(如C0G/NP0陶瓷、聚丙烯电容),避免漏电导致积分漂移。
(3)R建议选择精密金属膜电阻,温漂小。
4.2.2 积分器复位(放电)电路
积分阶段开始前必须将积分电容放电,使积分器输出回到零点。复位方式:
(1)使用模拟开关/场效应管在电容两端短接放电;
(2)使用继电器或晶体管方式放电(速度慢或误差大,一般不推荐)。
复位放电时间应足够长,使电容完全放电,同时避免复位开关断开瞬间注入电荷造成输出跳变。一般在软件或状态机中设置固定复位时间窗口。
4.2.3 输入保护与限幅
为了防止输入过压损坏积分器,输入端可以加入限幅电路:
(1)串联限流电阻
(2)钳位二极管对地与对参考电压
(3)输入滤波(RC低通)降低高频噪声
对于婴儿车等场景之外的电压采样,双积分ADC往往用于精密测量,因此输入保护与滤波是必要的。
4.3 参考电压模块
参考电压是双积分ADC的比例基准,直接决定转换的准确性。推荐方案:
(1)使用精密基准源芯片(如2.5V或4.096V基准),温漂低、长期稳定性好;
(2)使用稳压二极管基准(成本低但稳定性较差);
(3)使用三端稳压器输出作为参考(稳定性一般,适合教学演示)。
Vref的噪声会映射到转换结果,因此参考电压输出端应加去耦电容和适当滤波,同时避免与电机负载共用同一供电支路。
4.4 模拟开关/切换模块
双积分ADC需要在三个输入状态之间切换:
(1)复位:积分电容短接放电
(2)积分:Vin接入积分器输入
(3)反积分:±Vref接入积分器输入(极性与积分阶段相反)
因此需要模拟开关或多路复用器实现信号切换。常见实现方式:
(1)CMOS模拟开关(如CD4053、CD4066、74HC4053等)
(2)运放前端用模拟多路选择器(如4051/4052系列)
(3)用继电器切换(精度高但体积大、速度慢、寿命有限)
设计要点:
(1)开关导通电阻对积分斜率影响可通过双积分抵消部分,但仍需尽量选择低Ron器件。
(2)开关注入电荷会导致积分器输出瞬间跳变,可在输出端增加适当滤波或选择低注入器件。
(3)数字控制信号应远离模拟输入走线,防止串扰。
4.5 比较器与过零检测模块
比较器用于检测积分器输出是否回到零点。比较器可选:
(1)高速比较器:响应快,过零判定准;
(2)运放做比较器:实现简单但速度与输出摆幅可能不足;
(3)施密特触发器输入:抗噪声更强,但会引入滞回误差。
推荐使用专用比较器,并设置轻微滞回以防止输出在零点附近抖动频繁翻转。滞回不能过大,否则会引入系统性误差。
比较器输出连接到数字控制逻辑,可作为反积分结束的触发信号,用于停止计数并锁存结果。
4.6 时钟与计数器模块
双积分ADC的时间基准来自时钟源。常用方案:
(1)晶振振荡器 + 分频
(2)RC振荡器(精度差,仅适合演示)
(3)外部精密时钟模块
8位系统对时钟稳定性要求不算极高,但为了显示稳定,建议使用晶振。时钟频率可选范围较大,常见为10kHz~1MHz,取决于转换速度需求。转换时间包括固定积分时间 + 可变反积分时间,因此时钟频率越高转换越快,但数字电路切换噪声也更大,需要平衡。
计数器包括:
(1)积分阶段计数器(固定计数到Nint后切换到反积分)
(2)反积分阶段计数器(从0计数,直到过零停止)
(3)锁存器(保存最终反积分计数值)
计数器可以使用74系列计数芯片构建,或使用可编程逻辑/单片机实现。本题强调"数字电路+模拟电路",因此可采用硬件计数器与状态机,也可用单片机实现计数与状态机控制。无论实现方式,逻辑思想相同。
4.7 数据锁存与十六进制显示模块
4.7.1 锁存器
比较器触发停止计数时,需要立即锁存反积分计数值,否则计数器可能在短时间内改变导致显示错误。可以使用:
(1)74HC573/74HC574等8位锁存器/触发器
(2)单片机内部寄存器锁存(若使用单片机实现计数)
4.7.2 十六进制译码与数码管驱动
8位数据拆成两个4位数据后,需要译码为7段显示。可采用:
(1)查表ROM/逻辑门实现HEX段码
(2)单片机软件查表
(3)专用译码驱动芯片(常见为BCD到7段,HEX需额外逻辑)
由于要显示0~F,通常采用查表方式最简单。数码管驱动需要考虑电流限制:
(1)每段串联限流电阻
(2)动态扫描时要保证峰值电流与刷新频率合适
(3)可增加三极管/达林顿阵列做段驱动或位选驱动
5、程序设计
5.1 程序总体设计思路
程序的核心任务是产生双积分ADC所需的控制时序,并在反积分结束时准确捕获计数值。系统可以用状态机实现,主要状态包括:
(1)RESET:积分器复位放电
(2)RUN_UP:固定积分阶段(对Vin积分)
(3)RUN_DOWN:反积分阶段(对±Vref积分直至过零)
(4)LATCH:锁存结果并更新显示
(5)REPORT:可选,用于串口输出或调试(本题不要求,但利于验证)
程序设计的关键要点:
(1)积分阶段计时必须固定且稳定,通常通过定时器或硬件计数实现。
(2)反积分计数必须从0开始计时,并在比较器过零信号到达时立刻停止。
(3)要处理比较器抖动,防止多次触发。
(4)显示刷新应独立于转换流程,避免阻塞导致闪烁。
5.2 模块化程序结构
为了让程序清晰、可扩展,可按模块划分:
(1)IO控制模块:控制模拟开关的控制端、复位开关、参考电压切换端。
(2)计数与定时模块:积分阶段固定计数、反积分阶段计数、系统节拍。
(3)比较器输入模块:过零检测中断/轮询采样、去抖处理。
(4)数据处理模块:饱和限制、拆分高低4位、HEX段码查表。
(5)显示驱动模块:两位数码管动态扫描,定时刷新。
5.3 双积分控制状态机设计
5.3.1 RESET状态
(1)打开积分电容放电开关,使积分器输出快速回零。
(2)等待一个固定时间(例如若时钟为100kHz,可等待几毫秒)。
(3)关闭放电开关,进入RUN_UP状态。
5.3.2 RUN_UP(积分)状态
(1)模拟开关选择输入Vin。
(2)积分计数器从0开始计数,达到Nint后停止。
(3)积分结束后立即切换进入RUN_DOWN。
积分阶段必须使用固定Nint,例如256个时钟周期。
5.3.3 RUN_DOWN(反积分)状态
(1)切换模拟开关选择参考电压(极性与积分方向相反)。
(2)反积分计数器清零并开始计数。
(3)等待比较器输出翻转(过零)。
(4)过零后停止计数,并进入LATCH。
5.3.4 LATCH(锁存)状态
(1)锁存反积分计数值。
(2)对数值进行范围检查:若大于255则置为255。
(3)更新HEX显示缓存。
(4)进入RESET,开始下一次循环。
通过上述循环,系统即可不断采样并显示输入电压对应的数字值。
5.4 数码管显示程序设计
5.4.1 HEX段码查表
将0~F映射到七段码。这里以共阴极为例(点亮为1),实际需根据数码管类型调整。
查表示例:
0:0x3F(a b c d e f亮)
1:0x06
2:0x5B
...
F:0x71
5.4.2 动态扫描
两位数码管动态扫描一般需要1ms~5ms刷新一次,每一位轮流点亮,整体刷新频率应高于100Hz,避免肉眼闪烁。
(1)定时器中断每1ms执行一次
(2)交替输出段码和位选信号
(3)注意先关闭位选再更新段码,防止鬼影
5.5 关键时序与抗抖设计
5.5.1 比较器抖动处理
当积分器输出接近0时可能存在噪声,导致比较器输出在短时间内来回翻转。常见处理方法:
(1)比较器硬件加入小滞回
(2)软件上只接受第一次过零触发,并立即关闭反积分计数,锁存结果
(3)过零后延时一个很短时间再进入下一状态,避免重复触发
5.5.2 模拟开关切换延时
模拟开关切换瞬间可能产生电压跳变,建议在切换后加入短暂稳定延时(如几个时钟周期),再开始计数或判断,避免误触发。
6、程序示例代码(以单片机实现数字部分为例)
说明:以下代码展示数字控制逻辑与显示驱动的典型实现思路,包括状态机、积分计时、反积分计数、过零检测与HEX显示。硬件接口函数需要根据实际平台编写(如GPIO读写、定时器配置等)。
6.1 全局定义与状态机
c
#include <stdint.h>
#include <stdbool.h>
typedef enum {
ADC_RESET = 0,
ADC_RUN_UP,
ADC_RUN_DOWN,
ADC_LATCH
} adc_state_t;
#define NINT_TICKS 256 // 固定积分计数
#define MAX_8BIT 255
// 控制信号:根据实际电路映射到模拟开关控制端
void SW_SelectVin(void); // 选择Vin接入积分器
void SW_SelectVref(void); // 选择Vref接入积分器(反积分极性)
void SW_ResetIntegrator(bool en); // 积分电容放电
// 比较器输出读取
bool CMP_IsZeroCrossed(void); // 检测积分器输出是否过零
// 计时基准:假设有1个稳定时钟tick(例如100kHz)
void Tick_Delay(uint16_t n); // 简单延时(演示用,实际建议用定时器)
static volatile adc_state_t g_adc_state = ADC_RESET;
static volatile uint16_t g_runup_cnt = 0;
static volatile uint16_t g_rundown_cnt = 0;
static volatile uint8_t g_result_8bit = 0;
6.2 HEX段码查表与显示缓存
c
// 共阴极示例段码:a b c d e f g (bit0~bit6)
static const uint8_t hex_seg_lut[16] = {
0x3F, //0
0x06, //1
0x5B, //2
0x4F, //3
0x66, //4
0x6D, //5
0x7D, //6
0x07, //7
0x7F, //8
0x6F, //9
0x77, //A
0x7C, //B
0x39, //C
0x5E, //D
0x79, //E
0x71 //F
};
static volatile uint8_t disp_seg_hi = 0;
static volatile uint8_t disp_seg_lo = 0;
static void Display_UpdateHex(uint8_t val)
{
uint8_t hi = (val >> 4) & 0x0F;
uint8_t lo = val & 0x0F;
disp_seg_hi = hex_seg_lut[hi];
disp_seg_lo = hex_seg_lut[lo];
}
6.3 双积分转换主流程(状态机任务)
c
// 该任务可在主循环中周期调用,或由定时器tick驱动
void DualSlope_ADC_Task(void)
{
switch (g_adc_state)
{
case ADC_RESET:
// 1) 复位积分器
SW_ResetIntegrator(true);
Tick_Delay(50); // 放电稳定时间(与RC相关)
SW_ResetIntegrator(false);
Tick_Delay(5);
// 2) 进入积分阶段
g_runup_cnt = 0;
SW_SelectVin();
g_adc_state = ADC_RUN_UP;
break;
case ADC_RUN_UP:
// 固定积分计数
g_runup_cnt++;
if (g_runup_cnt >= NINT_TICKS) {
// 积分结束,切换到反积分
g_rundown_cnt = 0;
SW_SelectVref();
Tick_Delay(2); // 切换稳定
g_adc_state = ADC_RUN_DOWN;
}
break;
case ADC_RUN_DOWN:
// 反积分计数,直到比较器过零
g_rundown_cnt++;
if (CMP_IsZeroCrossed()) {
g_adc_state = ADC_LATCH;
}
// 安全保护:防止超量程导致一直不回零
if (g_rundown_cnt > 1000) {
g_adc_state = ADC_LATCH;
}
break;
case ADC_LATCH:
// 将反积分计数映射到8位输出
// 简化处理:直接取低8位或进行饱和限制
if (g_rundown_cnt > MAX_8BIT) {
g_result_8bit = MAX_8BIT;
} else {
g_result_8bit = (uint8_t)g_rundown_cnt;
}
Display_UpdateHex(g_result_8bit);
// 进入下一轮
g_adc_state = ADC_RESET;
break;
default:
g_adc_state = ADC_RESET;
break;
}
}
6.4 数码管动态扫描显示任务
c
// 需要根据硬件连接实现:段线输出、位选输出
void SEG_Output(uint8_t seg); // 输出段码
void DIG_Select(uint8_t index); // 选择数码管位:0=高位,1=低位
// 建议每1ms调用一次
void Display_Scan_Task(void)
{
static uint8_t scan = 0;
// 先关闭所有位,避免鬼影
DIG_Select(0xFF);
if (scan == 0) {
SEG_Output(disp_seg_hi);
DIG_Select(0); // 高位
scan = 1;
} else {
SEG_Output(disp_seg_lo);
DIG_Select(1); // 低位
scan = 0;
}
}
6.5 比较器过零检测示例(去抖)
c
// 如果比较器输出为数字信号,可做简单去抖:连续检测到同状态N次再确认
bool CMP_ReadPin(void);
bool CMP_IsZeroCrossed(void)
{
static uint8_t stable_cnt = 0;
if (CMP_ReadPin()) {
stable_cnt++;
if (stable_cnt >= 3) { // 连续3次为真
stable_cnt = 3;
return true;
}
} else {
stable_cnt = 0;
}
return false;
}
7、系统关键设计要点与误差分析
7.1 双积分ADC的抗干扰优势
双积分ADC在积分阶段对输入信号做时间平均,若积分时间选择为工频周期的整数倍(20ms对应50Hz,16.67ms对应60Hz),工频干扰在积分过程中会趋近于零,从而显著抑制工频噪声。这也是数字万用表普遍使用双积分ADC的原因之一。
7.2 影响精度的关键因素
(1)参考电压漂移:Vref漂移会按比例影响输出读数,应使用高稳定基准源。
(2)比较器零点偏移:过零判定点偏移会造成计数误差,建议使用低失调比较器并合理设置滞回。
(3)积分器漏电与运放偏置:积分电容漏电、运放输入偏置会导致积分输出漂移,尤其在低输入电压时影响显著。
(4)时钟误差:计数时钟频率偏差会直接影响计数值比例,晶振更可靠。
(5)模拟开关误差:导通电阻、注入电荷、漏电流可能引入微小误差,需合理选型与布局。
7.3 满量程与超量程处理
当Vin大于Vref时,积分器反积分可能需要更长时间才能回零,计数可能超过255。为了满足8位输出要求,系统必须采用饱和策略:
(1)超过255直接显示FF
(2)可同时点亮小数点或报警指示(可扩展)提示超量程
7.4 转换速度与显示稳定性
双积分ADC的转换时间与积分时间、反积分时间有关:
T_{total} = T_{reset} + T_{int} + T_{deint}
若积分时间取256个时钟周期,且时钟为100kHz,则积分阶段约2.56ms;反积分最大约2.56ms(Vin≈Vref)。加上复位与切换延时,总转换时间约6~10ms量级,可实现每秒上百次刷新,足以驱动两位数码管实时显示。若追求更强抗工频干扰,可将积分时间设置为20ms(50Hz整周期),此时刷新速度降低但稳定性增强。
8、总结
本设计实现了一个8位双积分AD转换电路系统,通过模拟积分器、参考电压、模拟开关与比较器构成双积分转换核心,并利用数字电路实现固定积分计时、反积分计数、过零检测与数据锁存。最终将8位转换结果拆分成两位十六进制并通过数码管显示(00~FF)。系统充分体现双积分ADC"电压换时间"的思想,具有良好的抗干扰能力与线性特性,同时数字控制逻辑清晰、模块划分明确,适合教学实验与基础测量应用。在实际工程中,可进一步提升参考源精度、改进比较器零点稳定性、采用更优的模拟开关与更严格的布局布线,以获得更高精度与更稳定的显示效果。