双积分AD转换电路

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"电压换时间"的思想,具有良好的抗干扰能力与线性特性,同时数字控制逻辑清晰、模块划分明确,适合教学实验与基础测量应用。在实际工程中,可进一步提升参考源精度、改进比较器零点稳定性、采用更优的模拟开关与更严格的布局布线,以获得更高精度与更稳定的显示效果。

相关推荐
youcans_2 小时前
【动手学STM32G4】(8)STM32G431之 DAC进阶
stm32·单片机·嵌入式硬件·dma·定时器
hqwest2 小时前
码上通QT实战14--监控页面06-串口设备数据初始化-
单片机·rs232·serialport·波特率·串口设备·虚拟串口设备软件·qt项目配置文件
qq_397562312 小时前
BMI088 , 传感器的使用经验 . ( SPI 模式 )
单片机
+VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue建筑材料管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
点灯小铭3 小时前
基于单片机的智能收银机模拟系统设计
单片机·嵌入式硬件·mongodb·毕业设计·课程设计·期末大作业
TEC_INO3 小时前
STM32_9:I2C_DHT11_OLED项目
stm32·单片机·嵌入式硬件
__万波__3 小时前
STM32基于HAL 库开发包创建新的工程-编译-烧录
stm32·单片机·嵌入式硬件
曾浩轩3 小时前
跟着江协科技学STM32之4-5OLED模块教程OLED显示原理
科技·stm32·单片机·嵌入式硬件·学习
BreezeJuvenile4 小时前
ADC_案例练习:独立模式多通道采集
stm32·单片机·adc·多通道采集·dma辅助