ADC 模数转换器原理与常见测量电路

📅 2026/7/15 21:45:30
ADC 模数转换器原理与常见测量电路
1. ADC 是什么ADC 是 Analog-to-Digital Converter 的缩写中文叫模数转换器。它的作用是把连续变化的模拟电压转换成 MCU、单片机、DSP、FPGA 等数字系统可以处理的数字量。很多传感器输出的不是 0 和 1而是一个连续变化的电压。例如电池电压可能是 3.7V、4.1V、11.8V。电位器旋钮随着旋转角度输出 0 到 3.3V。摇杆模块X 轴、Y 轴各输出一个模拟电压。温度传感器温度越高输出电压越高或越低。电流采样电阻电流流过电阻后产生一个很小的压降。MCU 本身不能直接理解“1.65V”这样的模拟量所以需要 ADC 把它转换成数字值例如 12 位 ADC 输出 0 到 4095 之间的整数。2. ADC 的基本作用ADC 主要用于测量电压但通过不同电路可以间接测量很多物理量。常见用途包括测量电源电压、电池电压。测量电位器、摇杆、滑动变阻器的位置。测量温度、光照、湿度、压力等传感器信号。测量电流例如电机电流、充电电流、负载电流。测量音频、麦克风等交流信号。测量按键电阻网络用一个 ADC 口识别多个按键。检测外部模拟输入是否超过阈值。简单理解ADC 只能直接测电压其他量都要先通过传感器或电路转换成电压。3. ADC 的测量原理ADC 会把输入电压和参考电压进行比较然后输出一个数字值。假设ADC 位数12 位。参考电压 Vref3.3V。输入电压 Vin1.65V。12 位 ADC 的数字范围是0 ~ 4095理想情况下ADC值 Vin / Vref * (2^N - 1)其中VinADC 输入电压。VrefADC 参考电压。NADC 位数。代入 12 位 ADCADC值 1.65 / 3.3 * 4095 2047.5所以 ADC 读数大约是 2048。反过来如果已知 ADC 读数也可以计算输入电压Vin ADC值 / (2^N - 1) * Vref例如Vin 2048 / 4095 * 3.3 1.65V4. ADC 位数和分辨率ADC 位数越高能区分的电压等级越细。常见 ADC 位数ADC 位数数字范围等级数量8 位0 ~ 25525610 位0 ~ 1023102412 位0 ~ 4095409616 位0 ~ 6553565536分辨率可以理解为 ADC 最小能分辨的电压变化。计算公式最小分辨电压 Vref / (2^N - 1)如果 Vref 3.3VADC 位数最小分辨电压8 位约 12.94mV10 位约 3.23mV12 位约 0.806mV16 位约 0.050mV注意分辨率高不代表绝对准确度一定高。实际精度还会受参考电压、噪声、PCB 布线、采样时间、输入阻抗、ADC 线性误差等影响。5. ADC 输入电压范围大多数 MCU 的 ADC 输入范围是0V ~ Vref如果 MCU 供电和 ADC 参考电压是 3.3V那么 ADC 引脚通常只能输入 0 到 3.3V。重要注意事项ADC 输入电压不能超过芯片允许范围。不能直接测 5V、12V、24V 电源除非先经过分压或隔离电路。不能输入负电压除非 ADC 或前端电路支持双极性输入。信号源输出阻抗不能太高否则 ADC 采样值可能不准。对噪声较大的信号通常需要加 RC 滤波。6. ADC 的基本连接方式最基本的 ADC 测量连接如下被测电压信号 ---- ADC_IN 信号地 GND ---- MCU_GND必须满足被测信号和 MCU 要有共同参考地。输入电压必须在 ADC 允许范围内。信号变化太快时需要考虑采样率。信号有噪声时需要滤波。如果被测电压高于 ADC 量程需要先分压被测电压 Vin ---- R1 -------- ADC_IN | R2 | GNDADC 引脚处电压为Vadc Vin * R2 / (R1 R2)反推被测电压Vin Vadc * (R1 R2) / R27. 测试电源电压的电路7.1 为什么不能直接测高电压如果 MCU 的 ADC 最大输入是 3.3V而要测 12V 电源不能把 12V 直接接到 ADC。否则可能烧坏 MCU。正确做法是用电阻分压把 12V 降到 3.3V 以下。7.2 电阻分压测电源电压典型连接电源正极 Vin ---- R1 -------- ADC_IN | C1 | GND | R2 | 电源负极 GND ---------------- MCU_GND更标准的画法Vin ---- R1 -------- ADC_IN | R2 | GND ADC_IN ---- C1 ---- GND其中R1 和 R2 组成分压电路。C1 用于滤波常用 0.01uF 到 0.1uF。GND 必须和 MCU 的 GND 相连。分压公式Vadc Vin * R2 / (R1 R2)例如测 12V 电源希望 12V 时 ADC 电压约为 3.0V可以选R1 30kΩ R2 10kΩ此时Vadc 12V * 10k / (30k 10k) 3.0V如果 ADC 读到 Vadc 3.0V则实际电源电压Vin 3.0V * (30k 10k) / 10k 12V7.3 测电池电压测单节锂电池 4.2V也需要分压因为 4.2V 大于 3.3V。可以选择R1 100kΩ R2 100kΩ分压后Vadc Vin / 2电池满电 4.2V 时Vadc 2.1V反推Vin Vadc * 2这种电路简单但电阻会持续耗电。如果用于低功耗设备可以在分压电路上加 MOS 管由 MCU 控制测量时才接通。8. 测试摇杆值的电路常见双轴摇杆模块内部通常是两个电位器X 轴一个电位器。Y 轴一个电位器。有些模块还有一个按压开关 SW。8.1 摇杆模块引脚常见引脚引脚作用VCC供电通常接 3.3V 或 5VGND地VRxX 轴模拟输出VRyY 轴模拟输出SW按压开关输出如果 MCU 是 3.3V 系统建议摇杆 VCC 接 3.3V这样 VRx 和 VRy 输出不会超过 ADC 范围。8.2 摇杆连接方式摇杆 VCC ---- 3.3V 摇杆 GND ---- MCU_GND 摇杆 VRx ---- ADC_CH_X 摇杆 VRy ---- ADC_CH_Y 摇杆 SW ---- GPIO_INPUT摇杆处于中间位置时VRx 约等于 VCC / 2 VRy 约等于 VCC / 2如果 VCC 3.3V12 位 ADC中间值约为 2048 最小值约为 0 最大值约为 4095实际模块会有误差所以通常要做校准记录中心值 center_x、center_y。设置死区 deadzone例如 ±100。小于死区的偏移当作 0。最大和最小值可以根据实际测量重新映射。8.3 摇杆值计算示例x_raw ADC读取值 x_offset x_raw - center_x如果center_x 2048 deadzone 100则当 x_raw 在 1948 ~ 2148 之间时认为摇杆没有明显偏移。可以把 ADC 值映射到 -100 到 100x_percent (x_raw - center_x) / 最大偏移 * 1009. 测试电位器旋钮电位器本质上是一个可调分压器非常适合接 ADC。连接方式3.3V ---- 电位器一端 GND ---- 电位器另一端 滑动端 ---- ADC_IN旋转电位器时滑动端电压会在 0 到 3.3V 之间变化。用途调节音量。调节亮度。设置速度。设置阈值。作为菜单参数输入。注意推荐电位器阻值 5kΩ 到 50kΩ。阻值太小会浪费电流。阻值太大可能导致 ADC 采样不稳定。可以在 ADC_IN 对地加 0.01uF 到 0.1uF 电容滤波。10. 测试热敏电阻 NTC 温度NTC 热敏电阻的阻值会随温度变化通常温度升高阻值下降。常见分压连接3.3V ---- R固定 -------- ADC_IN | NTC | GND也可以反过来3.3V ---- NTC -------- ADC_IN | R固定 | GND第一种连接中温度升高时 NTC 阻值下降ADC 电压通常下降。第二种连接中温度升高时 NTC 阻值下降ADC 电压通常上升。用途电池温度检测。电机温度检测。环境温度检测。电源模块过温保护。实际温度计算可以使用查表法。Beta 公式。Steinhart-Hart 公式。简单项目中查表法最直观。11. 测试光敏电阻光照光敏电阻 LDR 的阻值会随光照变化。一般光越强阻值越小。常见连接3.3V ---- R固定 -------- ADC_IN | LDR | GND光照变化会导致 ADC 电压变化。用途自动亮度调节。光照检测。白天黑夜判断。寻光小车。注意光敏电阻响应速度较慢。不适合精确测量照度。如果要精确测 lux建议使用数字光照传感器例如 BH1750。12. 测试电流ADC 不能直接测电流需要把电流转换成电压。常见方法是使用采样电阻。12.1 低边电流采样低边采样把采样电阻放在负载和地之间电源 ---- 负载 -------- Rsense ---- GND | ADC_IN采样电阻上的电压Vsense I * Rsense电流I Vsense / Rsense例如Rsense 0.1Ω I 1A Vsense 0.1V优点电路简单。ADC 可以直接测小电压。缺点负载地端会被抬高。不适合所有场合。小电压容易受噪声影响。如果电压太小可以加运放放大。12.2 高边电流采样高边采样把采样电阻放在电源正极和负载之间电源 ---- Rsense ---- 负载 ---- GND这种方式不会抬高负载地但采样电压叠加在高电压上不能直接接普通 ADC。通常需要高边电流检测芯片。差分放大器。专用电流传感器例如 INA219、INA226。13. 测试交流信号和音频信号普通 MCU ADC 通常只能测 0 到 Vref 的正电压不能直接测正负摆动的交流信号。如果要测音频或交流小信号需要加直流偏置。典型电路3.3V ---- R1 -------- R2 ---- GND | Vbias 音频输入 ---- C1 -------- ADC_IN | Vbias其中R1 R2 时Vbias 约为 1.65V。C1 是耦合电容隔离音频信号的直流成分。音频信号会围绕 1.65V 上下变化。注意信号最大值不能超过 0 到 3.3V。音频采样需要足够高的采样率。需要抗混叠滤波。14. 一个 ADC 识别多个按键可以用电阻网络让不同按键按下时产生不同电压然后 ADC 根据电压范围判断按键。示例3.3V ---- R上拉 -------- ADC_IN | 按键1 ---- R1 ---- GND 按键2 ---- R2 ---- GND 按键3 ---- R3 ---- GND 按键4 ---- R4 ---- GND不同按键接入不同电阻ADC_IN 得到不同电压。用途遥控器按键。面板按键。节省 GPIO。注意同时按多个键可能导致判断混乱。电阻值要留足区间避免误判。软件中要加消抖。15. 测试传感器模拟输出很多模拟传感器可以直接接 ADC只要输出电压范围符合 MCU 输入范围。常见模拟传感器传感器输出特点ADC 用途土壤湿度传感器电压随湿度变化判断土壤干湿MQ 系列气体传感器模拟电压变化粗略检测气体浓度压力传感器电压随压力变化测压力霍尔电流传感器电压随电流变化测电流模拟温度传感器 LM3510mV/°C测温度麦克风模块音频包络或音频波形声音检测连接方式通常是传感器 VCC ---- 3.3V 或 5V 传感器 GND ---- MCU_GND 传感器 AO ---- ADC_IN如果传感器用 5V 供电需要确认 AO 输出是否会超过 3.3V。超过时必须分压或选择 3.3V 供电。16. ADC 测量的常见误差来源ADC 读数不稳定或不准确常见原因有参考电压 Vref 不稳定。输入信号噪声大。电源纹波影响 ADC。ADC 输入阻抗过高。采样时间太短。PCB 走线靠近电机、开关电源、高速信号。地线压降导致参考地不一致。分压电阻误差较大。ADC 本身存在偏移误差和增益误差。改进方法使用稳定的参考电压。ADC 输入端加 RC 低通滤波。适当增加 ADC 采样时间。多次采样取平均值。使用 1% 或 0.1% 精度电阻。模拟地和数字地布线要合理。远离电机、继电器、开关电源等强干扰源。必要时使用运放缓冲。17. ADC 输入滤波电路最常见的是 RC 低通滤波信号 ---- R -------- ADC_IN | C | GND作用减小高频噪声。让 ADC 读数更稳定。对慢速信号特别有用。常见取值R 100Ω ~ 10kΩ C 0.01uF ~ 1uF截止频率fc 1 / (2πRC)R 和 C 越大滤波越强但响应越慢。18. ADC 软件处理方法18.1 多次采样平均uint32_tsum0;for(inti0;i16;i){sumadc_read();}uint16_tadc_avgsum/16;优点简单。能降低随机噪声。缺点响应速度变慢。18.2 滑动平均适合连续测量保存最近 N 次采样值取平均作为输出。优点输出平滑。适合电池电压、温度等慢变化信号。18.3 一阶低通滤波filteredfiltered*0.9fnew_value*0.1f;优点代码简单。占用内存少。系数越小输出越平稳但响应越慢。19. ADC 测量公式总结19.1 ADC 值转电压Vadc ADC值 / (2^N - 1) * Vref19.2 分压电路反推原电压Vin Vadc * (R1 R2) / R219.3 采样电阻测电流I Vadc / Rsense19.4 运放放大后测电流如果采样电阻电压被放大 G 倍I Vadc / (Rsense * G)20. 常见 ADC 测量电路汇总测量对象典型电路说明低压信号直接接 ADC信号必须在 0 ~ Vref 内高于 Vref 的电压电阻分压测电池、电源、电压输入电位器三端接 VCC、GND、ADC测旋钮位置摇杆两路电位器输出接 ADC测 X/Y 轴NTC 温度NTC 分压测温度光敏电阻LDR 分压测光照电流采样电阻或电流检测芯片测负载电流音频/交流偏置加耦合电容测交流波形多按键电阻网络一个 ADC 识别多个按键模拟传感器AO 接 ADC测传感器模拟输出21. 设计 ADC 电路时的检查清单设计 ADC 电路前可以按下面顺序检查被测量最终是否已经转换成电压。电压范围是否在 ADC 允许范围内。是否需要电阻分压。是否需要 RC 滤波。信号源阻抗是否太高。ADC 参考电压是否稳定。分压电阻精度是否满足要求。是否需要防止过压。是否需要软件滤波。是否需要校准。22. 简单代码计算示例假设MCU ADC12 位。Vref3.3V。分压电阻 R1 30kΩR2 10kΩ。ADC 读数3723。计算 ADC 引脚电压Vadc 3723 / 4095 * 3.3 3.00V计算原始输入电压Vin 3.00 * (30k 10k) / 10k 12.00VC 语言示例#defineADC_MAX4095.0f#defineVREF3.3f#defineR130000.0f#defineR210000.0ffloatadc_to_voltage(uint16_tadc_value){returnadc_value/ADC_MAX*VREF;}floatread_input_voltage(uint16_tadc_value){floatvadcadc_to_voltage(adc_value);returnvadc*(R1R2)/R2;}23. 总结ADC 的核心作用是把模拟电压转换成数字值。它本质上测的是电压但通过分压、电阻采样、传感器、运放、电阻网络等电路可以测量电源电压、电池电压、摇杆位置、电位器位置、温度、光照、电流、音频、按键和各种模拟传感器。实际使用 ADC 时最重要的是保证输入电压不超过 ADC 范围并处理好参考电压、滤波、采样时间、输入阻抗和校准问题。只要电路连接正确、量程设计合理、软件换算公式正确ADC 就可以完成非常多的测量任务。