4. 电压检测原理:ADC基础概念、分压电阻网络设计、参考电压选择、采样定理在电池检测中的应用
做体温计电池管理,最核心的一件事就是——你得知道电池还剩多少电。说白了,就是测电压。
我刚开始做这个项目时,觉得测电压嘛,拿个万用表量一下不就行了?但放到产品里,你得让单片机自己去读。这就绕不开ADC了。
4.1 ADC基础概念
ADC,全称是模数转换器。它的工作就是把连续的模拟电压,变成单片机认识的数字量。
举个例子。假设你用的是10位ADC,参考电压是3.3V。那么它能分辨的最小电压就是3.3V除以2的10次方,也就是3.3V / 1024 ≈ 3.2mV。
嗯,这里要注意:位数越高,分辨率越细。但成本也上去了。我个人习惯,体温计这种应用,10位或12位ADC就够用了。没必要上16位,那是给精密仪器用的。
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Ω之间。既省电,又能保证采样精度。
4.3 参考电压选择
参考电压,就是ADC用来做比较的基准。它直接决定了测量精度。
常见的参考电压来源有三种:
- 内部参考电压:单片机自带的,比如1.2V或2.5V。优点是省事,缺点是精度一般,温漂大。
- 电源电压VCC:直接用3.3V或5V做参考。简单,但电源不稳时,测量也不稳。
- 外部精密参考:比如TL431或REF3033。精度高,温漂小,但要多一个芯片。
我个人习惯,体温计这种消费级产品,用内部参考电压就够了。但如果你要做医疗级认证,那还是老老实实上外部参考。
你想想看,如果参考电压本身漂了1%,那测出来的电池电量也跟着漂1%。本来显示还有20%电,结果突然关机了,用户肯定骂娘。
4.4 采样定理在电池检测中的应用
采样定理,也叫奈奎斯特定理。它说:采样频率必须大于信号最高频率的两倍,才能无失真地恢复信号。
但电池电压是直流信号啊,变化很慢。所以采样定理在这里的应用,其实更偏向于——抗混叠和噪声抑制。
电池电压上经常叠加有高频噪声,比如来自DC-DC转换器的开关噪声。如果你采样频率太低,这些噪声会被混叠到低频,导致读数抖动。
我的做法是两步走:
- 硬件滤波:在ADC引脚加RC低通滤波器,截止频率设在10Hz左右。把高频噪声滤掉。
- 软件过采样:连续采样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以内。嗯,够用了。
好了,这一章就讲到这里。下一章我们聊聊电池的充放电管理,那又是另一番天地了。