4. 电压检测原理:ADC基础概念、分压电阻网络设计、参考电压选择、采样定理在电池检测中的应用

做体温计电池管理,最核心的一件事就是——你得知道电池还剩多少电。说白了,就是测电压。

我刚开始做这个项目时,觉得测电压嘛,拿个万用表量一下不就行了?但放到产品里,你得让单片机自己去读。这就绕不开ADC了。

4.1 ADC基础概念

ADC,全称是模数转换器。它的工作就是把连续的模拟电压,变成单片机认识的数字量。

举个例子。假设你用的是10位ADC,参考电压是3.3V。那么它能分辨的最小电压就是3.3V除以2的10次方,也就是3.3V / 1024 ≈ 3.2mV。

嗯,这里要注意:位数越高,分辨率越细。但成本也上去了。我个人习惯,体温计这种应用,10位或12位ADC就够用了。没必要上16位,那是给精密仪器用的。

小提示: 我见过有人用8位ADC做电池检测,结果电压跳得跟心电图似的。分辨率太低,根本没法用。

4.2 分压电阻网络设计

为什么需要分压?因为电池电压通常高于单片机的ADC输入范围。

一节锂电池满电4.2V,而很多单片机的ADC只能测到3.3V。直接接上去,轻则读数不准,重则烧掉ADC引脚。

解决办法就是分压电阻网络。两个电阻串联,从中间取电压。

// 典型分压电路
// Vbat --- R1 --- ADC引脚 --- R2 --- GND
// 
// ADC输入电压 = Vbat * R2 / (R1 + R2)
// 
// 假设 Vbat_max = 4.2V, ADC_Vmax = 3.3V
// 取 R1 = 10kΩ, R2 = 20kΩ
// 则分压比 = 20 / (10 + 20) = 2/3
// ADC输入电压 = 4.2 * 2/3 = 2.8V (安全)

我在项目中遇到过一个问题:分压电阻选太大,比如100kΩ级别,结果ADC读数偏小。为什么?因为ADC输入引脚有采样电容,电阻太大,电容充不满,读数就不准。

所以我的建议是:分压电阻总阻值控制在10kΩ到30kΩ之间。既省电,又能保证采样精度。

避坑指南: 我曾经踩过一个坑——分压电阻没加滤波电容。结果电池电压一波动,ADC读数乱跳。后来在ADC引脚对地加了个0.1μF的电容,问题就解决了。

4.3 参考电压选择

参考电压,就是ADC用来做比较的基准。它直接决定了测量精度。

常见的参考电压来源有三种:

  • 内部参考电压:单片机自带的,比如1.2V或2.5V。优点是省事,缺点是精度一般,温漂大。
  • 电源电压VCC:直接用3.3V或5V做参考。简单,但电源不稳时,测量也不稳。
  • 外部精密参考:比如TL431或REF3033。精度高,温漂小,但要多一个芯片。

我个人习惯,体温计这种消费级产品,用内部参考电压就够了。但如果你要做医疗级认证,那还是老老实实上外部参考。

你想想看,如果参考电压本身漂了1%,那测出来的电池电量也跟着漂1%。本来显示还有20%电,结果突然关机了,用户肯定骂娘。

4.4 采样定理在电池检测中的应用

采样定理,也叫奈奎斯特定理。它说:采样频率必须大于信号最高频率的两倍,才能无失真地恢复信号。

但电池电压是直流信号啊,变化很慢。所以采样定理在这里的应用,其实更偏向于——抗混叠和噪声抑制。

电池电压上经常叠加有高频噪声,比如来自DC-DC转换器的开关噪声。如果你采样频率太低,这些噪声会被混叠到低频,导致读数抖动。

我的做法是两步走:

  1. 硬件滤波:在ADC引脚加RC低通滤波器,截止频率设在10Hz左右。把高频噪声滤掉。
  2. 软件过采样:连续采样16次或32次,取平均值。相当于软件上的低通滤波。
// 软件过采样示例
uint32_t sum = 0;
for(int i = 0; i < 16; i++) {
    sum += ADC_Read();
    delay_ms(1);  // 每次采样间隔1ms
}
uint16_t avg = sum / 16;  // 取平均

这样做下来,电池电压读数基本稳定在±1个LSB以内。嗯,够用了。

核心要点: 电池电压检测,不是简单地读一下ADC就完事了。分压电阻要算准,参考电压要选对,采样要加滤波。这三步做好了,电量显示才靠谱。

好了,这一章就讲到这里。下一章我们聊聊电池的充放电管理,那又是另一番天地了。