第10章 电源模块故障排查:电池电压检测、升压电路(DC-DC)故障、电源纹波过大导致系统重启、低电量误报问题
电源模块,说白了就是血糖仪的“心脏”。我修过不下三百台血糖仪,其中电源相关故障占了将近四成。你想想看,一个测血糖的设备,如果供电都不稳,测出来的数据谁敢信?今天咱们就把电源模块这几个硬骨头啃下来。
10.1 电池电压检测——别被“假电压”骗了
电池电压检测看似简单,其实坑不少。很多工程师直接用ADC采样电池两端电压,结果发现电压跳来跳去,根本没法用。
为什么会出现这种情况?
因为电池内部有等效串联电阻(ESR)。当血糖仪突然启动电机(采血笔)或无线模块时,瞬间电流会拉低电池端电压。ADC采到的其实是这个“被拉低”的电压,而不是电池的真实开路电压。
核心要点:电池电压检测必须做“去抖”处理,不能直接拿单次采样值做判断。
我个人习惯的做法是:
- 先关闭大负载(比如无线模块、背光),等50ms
- 连续采样10次,去掉最大值和最小值
- 取剩余8次的平均值作为当前电压
代码示例(伪代码):
// 电池电压检测函数
uint16_t get_battery_voltage(void) {
uint32_t sum = 0;
uint16_t samples[10];
uint16_t max_val = 0, min_val = 0xFFFF;
// 关闭大负载
disable_high_power_modules();
delay_ms(50);
// 采集10次
for(int i=0; i<10; i++) {
samples[i] = adc_read(BATTERY_CHANNEL);
delay_ms(2);
}
// 找最大最小值
for(int i=0; i<10; i++) {
if(samples[i] > max_val) max_val = samples[i];
if(samples[i] < min_val) min_val = samples[i];
}
// 去掉最大最小,取平均
for(int i=0; i<10; i++) {
if(samples[i] != max_val && samples[i] != min_val) {
sum += samples[i];
}
}
return (uint16_t)(sum / 8);
}
小技巧:如果MCU有内置比较器,可以用比较器做快速过压/欠压判断,ADC只做精确测量。这样既快又准。
10.2 升压电路(DC-DC)故障——纹波和效率的博弈
血糖仪通常用两节AAA电池(2.4V-3.2V),但主控和运放需要3.3V甚至5V。所以DC-DC升压电路几乎是标配。我在项目中遇到过一台机器,开机正常,但一测血糖就死机。查了半天,发现是DC-DC输出纹波太大,干扰了ADC采样。
DC-DC常见故障模式:
| 故障现象 | 可能原因 | 排查方法 |
|---|---|---|
| 输出电压偏低 | 电感饱和、反馈电阻变值 | 测电感两端波形,看是否进入饱和 |
| 输出纹波过大 | 输出电容ESR增大、布局不合理 | 用示波器AC耦合测纹波,看频率 |
| 效率低、发热 | MOS管驱动不足、开关频率不对 | 测栅极驱动波形,看上升沿是否陡峭 |
| 带载能力差 | 电感值偏小、输入电容不足 | 加大输入电容,换更大电感试试 |
嗯,这里要注意一个容易被忽略的点:DC-DC的反馈回路。反馈电阻的分压比决定了输出电压。如果反馈电阻虚焊或者PCB受潮漏电,输出电压就会飘。我修过一台机器,输出电压从3.3V慢慢升到4.2V,直接把运放烧了。后来发现是反馈电阻下面的PCB有助焊剂残留,导致漏电。
警告:DC-DC输出端一定要加足够的输出电容,而且电容的ESR要低。陶瓷电容(MLCC)是首选,但要注意DC偏压特性——10μF的电容在5V下可能只剩4μF。
10.3 电源纹波过大导致系统重启——最隐蔽的故障
系统重启,很多人第一反应是看软件看门狗。但有时候,问题出在电源上。我曾经遇到一台血糖仪,每次蓝牙传输数据时就重启。用示波器一看,DC-DC输出纹波高达200mVpp,而蓝牙模块瞬间电流达到200mA,直接把电压拉到了MCU的欠压复位阈值以下。
排查步骤:
- 用示波器(带宽至少100MHz)测DC-DC输出端纹波
- 同时监测MCU的VDD引脚,看是否有瞬间跌落
- 在最大负载条件下测试(比如同时开蓝牙、背光、电机)
- 检查输入路径:电池→保险丝→PCB走线→DC-DC输入
说白了,纹波过大的根本原因就三个:
- 电容不够——输出电容容量不足或ESR太大
- 布局不合理——DC-DC的输入回路面积太大,引入了噪声
- 负载瞬态响应差——DC-DC的环路补偿没调好
实战经验:如果纹波频率等于DC-DC开关频率,那是输出滤波不足。如果纹波频率是开关频率的几分之一,那可能是环路不稳定,需要调整补偿网络。
10.4 低电量误报问题——软件和硬件的“配合战”
低电量误报,这个故障特别烦人。用户明明刚换了新电池,机器却提示“电量低”。我见过最夸张的一台,开机就报低电量,但测电压有2.8V,完全正常。
为什么会误报?
原因通常有两个:
- 检测时机不对——在负载高峰时检测电压,比如电机启动瞬间
- 阈值设置不合理——没有考虑电池的放电曲线和温度特性
我曾经处理过一个案例:某款血糖仪在冬天频繁报低电量,夏天就正常。查了电池规格书才发现,碱性电池在0℃时容量会下降30%,内阻增大一倍。原来的低电量阈值是按25℃设置的,到了冬天自然就误报了。
解决方案:
- 分时检测:只在系统空闲时检测电池电压,避开负载高峰
- 温度补偿:加入NTC测温,根据温度调整低电量阈值
- 迟滞判断:设置两个阈值——报警阈值和恢复阈值,中间留0.1V的迟滞
代码示例(带迟滞和温度补偿):
// 低电量判断函数
uint8_t check_low_battery(void) {
uint16_t voltage = get_battery_voltage(); // 用之前去抖后的值
uint8_t temp = read_temperature(); // 读取温度
// 温度补偿:每降低10℃,阈值提高0.05V
uint16_t threshold = LOW_BAT_THRESHOLD;
if(temp < 10) {
threshold += 50; // 0.05V = 50mV
} else if(temp < 0) {
threshold += 100; // 0.1V
}
// 迟滞判断
static uint8_t low_bat_flag = 0;
if(voltage < threshold) {
low_bat_flag = 1;
} else if(voltage > (threshold + 100)) { // 恢复阈值高0.1V
low_bat_flag = 0;
}
return low_bat_flag;
}
避坑指南:我曾经在量产前才发现,某批电池的放电曲线和规格书差了0.15V。从那以后,我每批电池到货都会抽测10颗,实测放电曲线,再根据实测数据调整阈值。别完全相信规格书,要相信自己的万用表。
10.5 总结——电源排查的“三板斧”
好了,电源模块的故障排查,说到底就三件事:
- 测电压——用万用表测静态电压,用示波器测动态电压
- 看纹波——AC耦合,看峰峰值,看频率成分
- 查负载——看大负载启动时电压是否跌落
你想想看,如果这三步都走完了还找不到问题,那大概率是PCB布局或器件选型的问题了。这时候就得回头看看原理图和Layout,是不是走线太细、电容离芯片太远、或者地线处理不当。
电源这东西,说难不难,说简单也不简单。关键是要有耐心,一步一步来。我修了十年医疗设备,最深的体会就是:电源问题,90%都能用示波器找到答案。剩下的10%,嗯,那就要靠经验和一点点运气了。