扫码加入

  • 方案介绍
  • 相关推荐
申请入驻 产业图谱

基于单片机的16位逐次逼近AD电路设计

5小时前
35
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
  1. 基于单片机的16位逐次逼近AD电路设计

点击链接下载protues仿真设计资料:https://download.csdn.net/download/m0_51061483/92081535


  1. 系统概述

2.1 设计背景与研究意义
嵌入式系统工业控制、仪器仪表以及物联网传感器应用中,模拟量采集始终是最重要的基础功能之一。虽然如今市场上已经有大量成熟的集成 ADC 芯片(如 SAR ADC、Σ-Δ ADC、流水线 ADC 等),但在教学、原理验证与基础电路设计训练中,使用分立元件搭建逐次逼近式 ADC(SAR ADC)具有非常典型的学习价值。通过完整搭建一个 16 位 SAR ADC,不仅可以深入理解模数转换核心结构——采样保持、比较器、DAC、逐次逼近寄存器(SAR)、控制逻辑以及参考电压体系,还可以掌握模拟电路与数字逻辑的接口设计、误差来源分析与系统级调试方法。

逐次逼近 ADC(SAR ADC)因其结构相对清晰、转换速度较快、功耗较低、适用于中高分辨率的测量场景而被广泛应用。在集成电路中,SAR ADC 通常采用电容阵列 DAC 或 R-2R DAC 完成逐次逼近过程。本设计采用分立元件实现 DAC、比较器与控制逻辑,并使用单片机完成 SAR 控制与数据读取显示,从而构建一个“电路级 + 系统级”完整的 16 位 SAR ADC 实验平台。

需要特别说明的是:由于 16 位 SAR ADC 同时涉及高精度模拟 DAC、比较器判决、开关网络与数字控制,若在仿真软件中进行模数混合仿真,计算量会非常大,因此仿真速度可能较慢,跑一次可能需要半分钟甚至更久,具体取决于电脑性能。此外,由于分立器件匹配误差、参考源稳定性、比较器漂移、开关电阻与仿真步长等因素影响,误差可能达到约 5% 左右,这是模数混合仿真中较难控制的常见问题。本设计会在系统分析中重点解释误差来源与改善方向,帮助读者理解“理想理论”与“工程实现”之间的差距。

2.2 系统总体目标
本系统围绕“16 位逐次逼近 ADC 电路 + 单片机读取显示”实现以下目标:
1)使用分立元件搭建 16 位逐次逼近式 ADC 电路(包含 DAC、比较器、采样与逐次逼近控制结构);
2)使用单片机控制 SAR 转换流程、读取 ADC 的 16 位输出,并计算对应输入电压
3)使用 LCD1602 显示电压值与 AD 数值,实时反映采样输入变化;
4)在仿真环境中完成电路运行与功能验证,评估误差与稳定性,并给出误差原因分析与改进措施。

2.3 系统工作原理概览
逐次逼近 ADC 的基本思想是“二分搜索”。在一次转换周期内,SAR 控制器从最高位(MSB)开始尝试:

  • 先把 MSB 置 1,DAC 输出为 Vref/2,与输入 Vin 比较;
  • 如果 Vin ≥ Vdac,保留该位为 1;如果 Vin < Vdac,则清零该位;
  • 然后继续下一位,逐位逼近,直到最低位(LSB)判决完成。
    最终得到一个 16 位数字结果,代表 Vin 相对参考电压的量化值:
    AD = round( Vin / Vref * (2^16 - 1) )
    电压反算:
    Vin_est = AD * Vref / (2^16 - 1)

  1. 系统功能设计

3.1 16 位逐次逼近 ADC 电路功能(分立元件实现)
系统通过分立元件构建逐次逼近 ADC 的关键硬件结构,使其具备:

  • 16 位分辨率的模数转换能力;
  • 可接受 0~Vref 范围内的模拟输入 Vin;
  • 提供比较器输出(Vin 与 Vdac 大小关系);
  • 提供 16 位转换结果(可由单片机读取)。

为了完成逐次逼近,系统必须具备 DAC 输出能力与比较器判决能力,并有一种方式让控制器(可由单片机承担)逐位改变 DAC 输出并根据比较器反馈决定该位取值。

3.2 单片机读取并显示 ADC 电压和 AD 值
单片机作为控制核心,承担以下任务:

  • 控制 SAR 转换时序:从 MSB 到 LSB 逐位试探;
  • 读入比较器结果(HIGH/LOW);
  • 形成最终 16 位 AD 结果;
  • 将 AD 转换为电压值 Vin_est;
  • 在 LCD1602 上显示 AD 与电压值;
  • 可选:设置转换速率、平均滤波、误差校准等。

3.3 LCD1602 显示电压与 AD 值
LCD1602 用于显示人机交互结果。显示内容建议布局为:

  • 第一行显示电压:V=1.2345V
  • 第二行显示 AD 值:AD=45678
    由于 16 位 AD 最大为 65535,需要 5 位数显示;电压显示可显示 4~5 位小数(取决于 Vref 与精度需求)。

3.4 仿真特性与误差说明(工程约束)
本设计强调电路级实现与仿真验证,必须接受以下现实约束:

  • 模数混合仿真计算量大,16 位逐次逼近需要至少 16 次比较与 DAC 变化,仿真速度会慢;
  • 分立元件 DAC 线性度与匹配误差很难达到 16 位要求;
  • 比较器模型、开关模型与仿真步长会显著影响结果;
  • 因此误差可能达到约 5% 属于可理解范围。
    系统的价值在于“理解结构与流程”,并学习如何分析误差与改进。

  1. 系统电路设计

4.1 电路总体结构与模块划分
16 位逐次逼近 ADC 电路由以下核心模块组成:
1)模拟输入与采样保持模块(S/H)
2)16 位 DAC 模块(分立元件实现)
3)比较器模块
4)逐次逼近控制与寄存模块(可由单片机 + 锁存器实现)
5)参考电压与基准源模块
6)时钟与控制时序模块
7)输出接口与电平匹配模块
8)LCD1602 显示与按键/调试模块(系统层)
9)电源、去耦与模拟数字地分区模块

其中 DAC + 比较器 + SAR 控制 是逐次逼近 ADC 的核心。分立搭建 16 位 ADC 的最大难点在于 DAC 线性度和比较器稳定性,这两部分决定了系统的有效分辨率往往达不到理论 16 位,但不影响其作为结构验证与学习平台的价值。


4.2 模拟输入与采样保持模块(S/H)

4.2.1 采样保持的必要性
SAR ADC 的逐次逼近过程需要在一个转换周期内不断比较 Vin 与 Vdac。如果 Vin 在此期间变化(例如来自传感器波动或输入噪声),比较结果会变得不一致,导致转换结果错误。因此必须使用采样保持模块:

  • 在转换开始时采样 Vin,并保持该电压不变;
  • SAR 过程在保持电压上完成;
  • 转换结束后释放保持电容,进入下一次采样。

4.2.2 分立采样保持实现方式
常见分立实现:

  • 模拟开关(如 CD4066、74HC4053 等)+ 保持电容 + 缓冲运放
    工作流程:
    1)采样阶段:模拟开关闭合,保持电容充电到 Vin;
    2)保持阶段:模拟开关断开,电容维持电压;
    3)运放缓冲输出,提供低阻抗给比较器输入,防止电容放电导致电压下滑。

4.2.3 保持电容选择与误差来源
保持电容越大,保持时间内电压下滑越慢,但充电时间变长。误差来源:

  • 电容漏电
  • 开关漏电
  • 运放输入偏置电流
  • 介质吸收导致电压回弹
    在仿真中这些因素会影响转换稳定性,进一步导致误差。

4.3 16 位 DAC 模块(分立元件实现)

4.3.1 DAC 的作用与关键指标
DAC 负责把当前 SAR 寄存器的 16 位数字转换为模拟电压 Vdac,并与 Vin(保持电压)进行比较。理想情况下 DAC 输出满足:
Vdac = Vref * Code / 65535
关键指标包括:

  • 单调性(是否随着 Code 增加而不下降)
  • INL/DNL(积分/微分非线性)
  • 输出稳定时间(settling time)
    在 16 位精度下,理论 LSB = Vref / 65536。例如 Vref=5V,则 LSB ≈ 76.3 µV。分立电阻网络难以达到如此精度,因此实际有效位数会显著降低。

4.3.2 DAC 实现方案选择:R-2R 电阻网络
在分立元件条件下,实现 16 位 DAC 常见方案为:

  • R-2R 梯形网络 DAC
    优点:电阻种类少(只需 R 和 2R),结构清晰,便于扩展到 16 位。
    缺点:对电阻匹配精度要求极高,开关电阻会引入非线性误差。

R-2R DAC 的工作原理:每一位通过开关选择连接到 Vref 或 GND,从而形成加权电流/电压输出。16 位时需要 16 个开关与大量电阻,电路复杂且对布局敏感。

4.3.3 开关网络(分立数字控制到模拟连接)
每一位需要一个开关选择:

  • 位为 1 → 连接 Vref
  • 位为 0 → 连接 GND
    开关可用:
  • CD4066/74HC4066 模拟开关
  • 4051/4053 等模拟多路开关(需组合)
    也可用 MOSFET 构建传输门,但设计更复杂。
    开关的导通电阻 Ron 会随电压变化,导致 DAC 非线性;开关漏电会导致静态误差,这些都会在 16 位情况下放大。

4.3.4 运放输出缓冲与参考驱动
R-2R 网络输出阻抗较高,必须用运放缓冲形成稳定 Vdac,并提供低阻抗给比较器输入。运放需具备:

  • 输入偏置电流低
  • 输入失调电压
  • 足够带宽与摆率
  • 输出能够驱动比较器输入
    在仿真中运放模型若不理想,会导致 Vdac 建立时间变长或出现振荡。

4.4 比较器模块

4.4.1 比较器作用
比较器比较 Vin_hold 与 Vdac:

  • 若 Vin_hold ≥ Vdac → 输出 1(表示当前试探位可保留)
  • 若 Vin_hold < Vdac → 输出 0(表示试探位应清零)
    比较器输出送入 SAR 控制逻辑或单片机输入口。

4.4.2 比较器选型与分立实现
分立实现可采用:

  • 专用比较器(LM311LM393 等)
  • 高速运放作为比较器使用(不推荐但可用于仿真)
    比较器应具备:
  • 足够快的响应速度(与转换时钟匹配)
  • 输入失调电压尽量小(否则会产生系统性偏差)
  • 输出形式与 MCU 输入兼容(开集电极需上拉)

4.4.3 比较器抖动与迟滞(Hysteresis)
当 Vin 与 Vdac 接近时,噪声会导致比较器输出抖动,影响 SAR 判决。可加入少量迟滞:

  • 正反馈电阻构成施密特触发
    迟滞过大则降低分辨率,迟滞过小则抖动明显,需要权衡。
    在 16 位系统中,理想迟滞应远小于 1 LSB,但分立电路难以做到,因此通常只能做到“避免抖动”而非“保持 16 位精度”。

4.5 逐次逼近寄存器与控制逻辑模块(SAR)

4.5.1 SAR 的功能与实现方式
SAR 负责控制 DAC 的试探位并根据比较器结果决定该位最终值。分立 SAR 可用:

  • 16 位寄存器/锁存器(如 74HC595、74HC574 等)
  • 逐位控制逻辑(计数器 + 状态机
    但本设计要求“使用单片机读取并显示 ADC 电路的电压和 AD 值”,因此可以让单片机直接承担 SAR 控制逻辑:
  • MCU 输出 16 位控制码到 DAC 开关网络(通过移位寄存器扩展 IO)
  • MCU 读取比较器输出
  • MCU 逐位更新控制码
    最终得到 AD 结果并显示。
    这种方式减少分立逻辑复杂度,也更符合嵌入式系统设计思路。

4.5.2 输出扩展:移位寄存器驱动 DAC 位
单片机 IO 不足以直接驱动 16 位开关,可使用:

  • 2 片 74HC595 级联输出 16 位
    MCU 只需 3 根线:DATA、CLK、LATCH,即可输出 16 位 DAC 控制码。
    74HC595 输出为数字电平,可直接驱动模拟开关控制端。

4.5.3 时序控制与转换周期
一次转换流程:
1)采样保持进入 HOLD;
2)SAR 从 bit15(MSB)到 bit0(LSB)循环:

  • 设定当前位为 1
  • 更新 DAC 输出
  • 等待稳定时间(DAC settling + 比较器响应)
  • 读取比较器结果决定该位保留/清零
    3)转换完成输出 16 位 AD;
    4)进入下一次转换。

稳定等待时间是仿真与真实电路差异很大的地方:

  • 等待太短会读到不稳定比较器结果
  • 等待太长会降低转换速度,但保证正确性
    在仿真环境中等待往往需要更长,因为模拟器收敛与步长限制会导致波形稳定变慢。

4.6 参考电压与基准源模块(Vref)

4.6.1 Vref 对精度的影响
SAR ADC 的所有转换结果都以 Vref 为基准。Vref 的误差会直接导致输出误差:

  • Vref 偏高 → 转换结果偏低
  • Vref 偏低 → 转换结果偏高
    同时 Vref 的噪声会引入量化抖动。16 位系统对 Vref 的稳定性要求极高。

4.6.2 分立基准实现方式
可采用:

  • 精密基准源芯片(如 2.5V/4.096V 基准)
  • 稳压二极管 + 运放缓冲(精度较差)
    在仿真中可以使用理想电压源作为 Vref,减少误差来源,使系统更易验证。但即便 Vref 理想,DAC 电阻误差仍会导致明显误差。

4.6.3 参考驱动能力与滤波
R-2R DAC 在转换过程中会产生瞬态电流变化,Vref 必须具有足够驱动能力并通过去耦电容滤波,否则 Vref 会随负载波动,导致系统误差进一步扩大。


4.7 输出接口与电平匹配模块

4.7.1 比较器输出到 MCU 输入
比较器输出常为开集电极形式,需要上拉电阻到 MCU 电源(3.3V 或 5V)。上拉电阻过大响应慢,过小增加功耗,一般取 4.7k~10k。

4.7.2 数字控制到模拟开关
74HC595 输出驱动模拟开关控制端时要注意:

  • 控制电平必须满足模拟开关逻辑门
  • 控制电源与模拟开关工作电压一致
    若模拟开关工作在 5V,而 MCU 为 3.3V,可能出现控制不彻底导通的问题,因此推荐统一电源或加电平转换。

4.8 LCD1602 显示模块(系统层)

4.8.1 LCD1602 驱动方式
LCD1602 可用 4 位模式连接,节省 IO。也可使用 I2C 转接板进一步减少 IO,但会带来通信延迟。由于系统已经需要控制 DAC 输出,IO 资源紧张,推荐:

  • LCD1602 + I2C 转接(PCF8574)
  • LCD1602 4 位模式 + 74HC595 输出扩展结合规划 IO。

4.8.2 显示内容设计
建议:

  • 第一行:显示电压(单位 V)
  • 第二行:显示 AD 值(0~65535)
    同时可增加显示 Vref 值与误差提示(可选),帮助调试。

4.9 电源、去耦与模拟数字地分区模块

4.9.1 电源规划
模拟电路(DAC、比较器、运放)对电源噪声敏感,数字电路(MCU、74HC595)切换会产生噪声。因此建议:

  • 模拟电源与数字电源分开滤波
  • 单点接地
  • 在 DAC、运放、比较器电源脚附近布置 0.1uF + 10uF 去耦电容
    在仿真中虽然没有布局问题,但噪声模型仍可能影响结果,合理滤波有助于稳定。

4.9.2 地线分区的重要性
R-2R DAC 与比较器属于高精度模拟测量部分,地线抖动会直接映射为误差。实际 PCB 中应采用模拟地与数字地分区设计,并在 ADC 参考点单点相连。


  1. 程序设计

5.1 软件总体架构

5.1.1 模块划分
系统软件可分为:
1)硬件初始化模块(GPIOSPI/I2C、LCD、定时器
2)SAR 控制模块(逐次逼近流程)
3)DAC 输出驱动模块(74HC595 输出 16 位控制码)
4)比较器读取模块(读取比较器输出)
5)电压计算模块(AD → 电压)
6)显示模块(LCD1602 显示格式化)
7)滤波与平均模块(减少抖动,提升显示稳定性)
8)误差校准模块(可选:增益/零点校正)
9)主循环与调度模块(定时转换与显示刷新)

5.1.2 时序与采样频率设计
由于是分立电路,转换速度不必追求很快,建议:

  • 每次转换完成后间隔 100ms~500ms 更新一次显示
  • 每个 bit 判决等待 50us~500us(仿真可更长,如 1ms)
    这样能显著提高仿真稳定性,减少误判概率。

5.1.3 为什么需要滤波/平均
由于比较器抖动与 DAC 非线性,AD 结果会跳动。为了让 LCD 显示稳定可读,建议对连续多次转换结果进行平均:

  • 例如 8 次平均或滑动平均
    平均后再显示电压与 AD 值,可降低噪声造成的波动。

5.2 DAC 输出驱动模块(74HC595 输出 16 位)

5.2.1 驱动流程
使用 SPI 或 GPIO bit-bang 输出:

  • 先发送高字节,再发送低字节
  • 拉动 LATCH 锁存输出
    输出到 R-2R DAC 开关控制端。
    注意:输出更新后必须等待 DAC 稳定后才能读取比较器结果。

5.2.2 输出编码与位序
需要确保 MCU 输出位序与 DAC 开关位序一致,例如:

  • bit15 对应 MSB
  • bit0 对应 LSB
    若位序错误,逐次逼近过程会完全失效,因此建议在程序中统一定义掩码,并在调试阶段使用示波器或仿真波形确认 DAC 输出阶梯正确。

5.3 SAR 控制模块(逐次逼近核心)

5.3.1 逐次逼近算法流程
对 16 位 ADC:

  • 初始化 code=0
  • 从 bit=15 到 bit=0:
    • code |= (1<<bit)
    • 输出到 DAC
    • 等待稳定
    • 读取比较器:若 Vin < Vdac,则 code &= ~(1<<bit)
      最终 code 即为 AD 值。

5.3.2 稳定等待时间的工程设置
稳定时间应覆盖:

  • DAC 输出建立时间(R-2R + 运放)
  • 比较器传播延迟
    仿真中可设为 0.5ms~2ms,以提高成功率;实际硬件可根据响应速度缩短。

5.3.3 误判抑制:多次采样投票
当 Vin 接近某个量化边界时比较器输出可能抖动,可采取:

  • 连续读取比较器 3 次,2 次一致为准
  • 或延长等待时间再读
    这样能减少抖动导致的随机误差,提升重复性。

5.4 电压计算模块(AD→电压)

5.4.1 计算公式
Vin_est = AD * Vref / 65535
其中 Vref 可设为常量(例如 5.000V),也可在系统中测量或校准。

5.4.2 定点运算与显示精度
为了避免浮点运算(在 8051 等 MCU 上较慢),可采用定点运算:

  • 使用 mV 或 µV 为单位
  • 例如 Vin_mV = AD * Vref_mV / 65535
    再格式化显示。
    LCD1602 显示可显示到 1mV 或 0.1mV,取决于实际误差与可读性。

5.5 LCD1602 显示模块

5.5.1 刷新频率与闪烁控制
LCD1602 不适合频繁清屏,否则闪烁明显。建议:

  • 固定位置更新数值,不清屏
  • 200ms~500ms 刷新一次
  • 仅当数值变化超过阈值时刷新(可选)

5.5.2 显示格式设计
示例:

  • 第一行:V=1.2345V
  • 第二行:AD=45678
    如果误差较大,可将小数位减少到 3 位,使显示更符合实际可信度。

5.6 数据滤波与误差校准模块(可选但推荐)

5.6.1 滑动平均滤波
对连续 N 次 AD 值求平均:
AD_avg = (Σ AD[i]) / N
N 可取 4、8 或 16。
滤波能显著降低噪声抖动,使显示稳定。

5.6.2 两点校准(增益与零点修正)
由于误差约 5%,可通过简单校准改善:

  • 在 Vin=0V 时记录 AD0
  • 在 Vin=Vcal(例如 2.5V)时记录 ADcal
    根据线性关系计算增益与偏置,修正输出:
    AD_corr = (AD_raw - AD0) * G
    这样能减少系统性误差,使读数更接近真实值。
    但由于 DAC 非线性,校准只能改善整体比例误差,对 DNL/INL 造成的局部误差无能为力。

  1. 程序示例代码(逐次逼近控制 + LCD1602 显示)
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>

/* =========================
   用户需要实现的硬件接口
   ========================= */
// 通过 74HC595 输出 16 位 DAC 控制码(bit15=MSB)
extern void DAC_Out16(uint16_t code);

// 读取比较器输出:返回 1 表示 Vin >= Vdac,返回 0 表示 Vin < Vdac
extern uint8_t CMP_Read(void);

// 延时函数:用于等待 DAC/比较器稳定(仿真可设较大)
extern void Delay_us(uint32_t us);
extern void Delay_ms(uint32_t ms);

// LCD1602 驱动接口(可使用 I2C 转接或并行)
extern void LCD_Init(void);
extern void LCD_SetCursor(uint8_t row, uint8_t col);
extern void LCD_Print(const char *s);

/* =========================
   参数设置
   ========================= */
#define VREF_MV     5000      // 参考电压 5000mV
#define ADC_MAX     65535U

#define SETTLE_US   800       // 每bit稳定等待时间(可根据仿真调整)
#define VOTE_TIMES  3         // 多次读取投票次数

/* =========================
   比较器读取投票
   ========================= */
static uint8_t CMP_ReadVote(void)
{
    uint8_t ones = 0;
    for (int i = 0; i < VOTE_TIMES; i++) {
        ones += (CMP_Read() ? 1 : 0);
        Delay_us(20);
    }
    return (ones >= 2) ? 1 : 0; // 多数票
}

/* =========================
   16位逐次逼近转换
   ========================= */
static uint16_t SAR_ADC_Convert16(void)
{
    uint16_t code = 0;

    for (int bit = 15; bit >= 0; bit--) {
        code |= (uint16_t)(1U << bit);
        DAC_Out16(code);

        // 等待DAC与比较器稳定
        Delay_us(SETTLE_US);

        // 比较器:1表示Vin >= Vdac,则保留该位;0表示Vin < Vdac,则清零
        if (CMP_ReadVote() == 0) {
            code &= (uint16_t)~(1U << bit);
            DAC_Out16(code);
            Delay_us(50);
        }
    }
    return code;
}

/* =========================
   滑动平均(简单N次平均)
   ========================= */
static uint16_t ADC_Average(uint8_t n)
{
    uint32_t sum = 0;
    for (uint8_t i = 0; i < n; i++) {
        sum += SAR_ADC_Convert16();
    }
    return (uint16_t)(sum / n);
}

/* =========================
   AD -> 电压(mV)
   ========================= */
static uint32_t ADC_To_mV(uint16_t ad)
{
    // Vin_mV = ad * VREF_MV / 65535
    return (uint32_t)ad * (uint32_t)VREF_MV / (uint32_t)ADC_MAX;
}

/* =========================
   显示格式化
   ========================= */
static void Show_Value(uint16_t ad, uint32_t mv)
{
    char line1[17];
    char line2[17];

    uint32_t v_int = mv / 1000;
    uint32_t v_dec = mv % 1000; // 3位小数

    // 第一行:V=1.234V
    snprintf(line1, sizeof(line1), "V=%lu.%03luV      ",
             (unsigned long)v_int, (unsigned long)v_dec);

    // 第二行:AD=65535
    snprintf(line2, sizeof(line2), "AD=%5u          ", ad);

    LCD_SetCursor(0, 0);
    LCD_Print(line1);
    LCD_SetCursor(1, 0);
    LCD_Print(line2);
}

int main(void)
{
    LCD_Init();

    // 初始显示
    LCD_SetCursor(0, 0);
    LCD_Print("16bit SAR ADC   ");
    LCD_SetCursor(1, 0);
    LCD_Print("Starting...     ");
    Delay_ms(500);

    while (1) {
        // 取8次平均提升稳定性
        uint16_t ad = ADC_Average(8);
        uint32_t mv = ADC_To_mV(ad);

        Show_Value(ad, mv);

        // 刷新间隔(仿真可设大一些)
        Delay_ms(300);
    }
}

  1. 误差分析与仿真卡顿原因说明(工程视角)

7.1 为什么 16 位分立 SAR ADC 很难达到理论精度
16 位分辨率意味着 1 LSB 非常小,例如 Vref=5V 时 LSB≈76µV。要达到 16 位精度,系统总误差必须远小于 1 LSB,而分立元件几乎无法满足:

  • 电阻误差:普通 1% 电阻远远不够,即使 0.1% 也不足以保证 16 位线性
  • 温漂:电阻温漂、运放漂移会改变 DAC 比例
  • 开关 Ron:模拟开关导通电阻随电压变化,导致非线性
  • 比较器失调:毫伏级失调会直接造成多个 LSB 的偏移
    因此分立 16 位 SAR ADC 常常只能获得 10~12 位甚至更低的有效位数,但仍可以输出 16 位“数字格式”,只是低位不可信或呈现噪声。

7.2 为什么模数混合仿真误差难控制
仿真中误差来源包括:

  • 仿真步长与收敛:步长过大导致比较器瞬态判决不稳定;步长过小导致运行极慢
  • 器件模型:运放、比较器、开关模型的非理想参数影响结果
  • 浮点误差与迭代误差:多级反馈与大量开关导致数值迭代误差累积
  • 初始条件:保持电容初值、参考源稳定时间影响第一次转换
    因此仿真误差达到 5% 属于常见现象,尤其在复杂 16 位 R-2R 网络下更明显。

7.3 仿真为什么会很卡(半分钟甚至更久)
原因主要来自三个方面:
1)电路规模大:16 位 R-2R 网络包含大量电阻与开关节点,节点数高;
2)开关瞬态多:逐次逼近过程每一位都要切换开关并等待收敛,至少 16 次切换;
3)模数混合求解复杂:比较器属于非线性器件,收敛迭代耗时,且需要较小步长捕捉判决边沿。
因此仿真速度慢是结构性的,不是简单优化就能彻底解决。提高电脑性能或降低仿真精度(减少位数、降低模型精度)可以改善运行时间。


  1. 提高精度与稳定性的改进方向(工程建议)

8.1 降低目标:从 16 位改为 12~14 位更现实
如果希望误差更小、仿真更稳定,可将 DAC 与 SAR 位数降低到 12 位或 14 位,电阻匹配要求显著下降,仿真速度也会明显提升,同时仍能体现 SAR 工作原理。

8.2 提高电阻匹配与使用分段 DAC
若坚持 16 位,可采用:

  • 0.01% 精密电阻网络(实际成本高)
  • 分段 DAC(高位用电阻网络,低位用电容微调)
  • 使用激光修调电阻阵列(集成工艺常用)
    分立条件下很难完全实现,但可以作为理论改进方向。

8.3 比较器加前置放大与减小失调
使用更高精度比较器,减少失调与噪声;加入输入滤波与迟滞,改善抖动。迟滞要谨慎设置,否则直接降低分辨率。

8.4 优化参考源与缓冲
Vref 必须稳定且低噪声,可用精密基准源 + 运放缓冲,加入充分去耦与低噪声设计。

8.5 软件层面改进:多次投票、平均与校准
软件可通过:

  • 多次判决投票
  • 多次转换平均
  • 两点或多点校准
    提升显示稳定性并降低系统性误差。对于仿真误差较大的情况,校准尤其有效。

  1. 总结

基于单片机的 16 位逐次逼近 AD 电路设计通过分立元件搭建 DAC、比较器与采样保持结构,并由单片机执行逐次逼近控制流程,实现对模拟输入电压的 16 位格式模数转换。系统能够将转换得到的 AD 值与计算得到的电压值显示在 LCD1602 上,形成完整的“模拟量输入—逐次逼近转换—数字结果输出—人机交互显示”闭环系统。由于 16 位精度对 DAC 电阻匹配、比较器失调、参考源稳定性与开关非线性要求极高,在分立实现与模数混合仿真中难以获得理想精度,因此误差可能达到约 5%,仿真速度也可能较慢甚至每次运行需要较长时间。这些现象并不影响系统作为逐次逼近 ADC 原理验证与工程实践训练平台的价值。通过对误差来源分析并采用滤波、投票、平均与校准等软件策略,以及优化参考与比较器、改善 DAC 结构等硬件策略,可以进一步提升系统稳定性与测量一致性,使其在教学实验与原型验证中更具可用性与可扩展性。

相关推荐