摘要:电池电压检测值偏低、跳变,换了精密分压电阻依旧?不是电阻精度问题,而是ADC 采样窗口(Sampling Time)与输入阻抗不匹配,导致采样电容(Csh)充电不足。本文解析 ADC 采样的底层物理过程。
一、问题描述(现象)
**电池电压 4.2V,分压后给 ADC,读数只有 4.0V;
换用 0.1% 精密电阻,读数依旧偏低;
用手触摸分压电阻,读数突然变准了。**
很多工程师的排查方向是:
电阻精度不够?
基准电压(Vref)不稳?
软件滤波没做好?
二、原理分析
1. 物理模型
ADC 输入不是一个无穷大的阻抗,而是一个开关电容网络。
Vin ──► [Rsource] ──► [Sampling Switch] ──► [Csh (采样电容)]2. 核心参数
Rsource(源阻抗):外部电路的总电阻(分压电阻 + 走线电阻)。
Csh(采样电容):ADC 内部的保持电容(通常几 pF 到几十 pF)。
Ts(采样时间):采样开关闭合的时间窗口。
3. 反直觉真相
“分压电阻阻值越小越好”是错的。
如果分压电阻太大(如 1MΩ + 1MΩ):
Rsource 太大。
在采样时间(Ts)内,Csh 充不满电。
ADC 采样的是“半充满的电平” → 读数偏低。
如果分压电阻太小(如 1kΩ + 1kΩ):
功耗太大,电池直接被耗干。
三、工程级解决方案
方案 1:计算最小采样时间(公式)
必须确保采样时间足够长。
充电时间常数:
τ = Rsource × Csh稳定条件:
Ts ≥ k × τ (k 通常为 7~10,保证误差 < 1/2 LSB)实战经验:
如果 Rsource = 10kΩ,Csh = 10pF:
τ = 100ns。
Ts 需 > 1µs。
如果 MCU 时钟快,采样周期短,必须软件配置更长的采样时间。
方案 2:增加采样电容(硬件解法)
在 ADC 引脚并联一个小电容(如 10nF ~ 100nF)。
Vin ──► [R] ──► ADC Pin ──► GND │ [Cext]作用:外部电容作为电荷库,辅助内部 Csh 快速充电。
代价:增加了滤波效果,但也降低了响应速度(不适合快速变化信号)。
方案 3:正确配置 ADC 参数(软件解法)
以 STM32 为例:
ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES; // 关键!加大采样周期 HAL_ADC_ConfigChannel(&hadc1, &sConfig);四、选型避坑建议
不要盲目追求高阻抗:
电池检测分压电阻通常选100kΩ ~ 500kΩ 级别。
必须配合长采样时间 或外部电容。
基准电压(Vref):
如果 Vref 随 VDD 波动(如直接使用 VDD 作为 Vref):
测量结果会是比率度量(Ratiometric),与 VDD 无关。
如果需要绝对电压,必须使用外部基准 或内部带隙基准。
漏电流:
某些 MCU 在深度睡眠时,IO 会有漏电流。
如果分压电阻太大,漏电流会拉低电压。
五、总结 Checklist
[ ] 是否计算了 Rsource × Csh 的时间常数?
[ ] ADC 采样时间是否配置得足够长?
[ ] 是否在 ADC 引脚并联了外部采样电容?
[ ] Vref 是否稳定(或使用了比率度量)?
六、写在最后(关注我,少走弯路)
我是 gqqsherry,一个拒绝调包、专注底层逻辑的嵌入式工程师。
ADC 采样是“模拟与数字世界的握手”,握手时间太短,数据就会“握空”。
关注我的专栏《嵌入式底层避坑指南》,下一篇我们将深入解析《复位与启动(Boot)底层避坑指南》系列开篇。
👉下一篇预告:《为什么 Bootloader 跳转 App 会 HardFault?》
原创文章,转载请注明出处。