第10章 电源模块故障排查:电池电压检测、升压电路(DC-DC)故障、电源纹波过大导致系统重启、低电量误报问题

电源模块,说白了就是血糖仪的“心脏”。我修过不下三百台血糖仪,其中电源相关故障占了将近四成。你想想看,一个测血糖的设备,如果供电都不稳,测出来的数据谁敢信?今天咱们就把电源模块这几个硬骨头啃下来。

10.1 电池电压检测——别被“假电压”骗了

电池电压检测看似简单,其实坑不少。很多工程师直接用ADC采样电池两端电压,结果发现电压跳来跳去,根本没法用。

为什么会出现这种情况?

因为电池内部有等效串联电阻(ESR)。当血糖仪突然启动电机(采血笔)或无线模块时,瞬间电流会拉低电池端电压。ADC采到的其实是这个“被拉低”的电压,而不是电池的真实开路电压。

核心要点:电池电压检测必须做“去抖”处理,不能直接拿单次采样值做判断。

我个人习惯的做法是:

  1. 先关闭大负载(比如无线模块、背光),等50ms
  2. 连续采样10次,去掉最大值和最小值
  3. 取剩余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的欠压复位阈值以下。

排查步骤:

  1. 用示波器(带宽至少100MHz)测DC-DC输出端纹波
  2. 同时监测MCU的VDD引脚,看是否有瞬间跌落
  3. 在最大负载条件下测试(比如同时开蓝牙、背光、电机)
  4. 检查输入路径:电池→保险丝→PCB走线→DC-DC输入

说白了,纹波过大的根本原因就三个:

  • 电容不够——输出电容容量不足或ESR太大
  • 布局不合理——DC-DC的输入回路面积太大,引入了噪声
  • 负载瞬态响应差——DC-DC的环路补偿没调好

实战经验:如果纹波频率等于DC-DC开关频率,那是输出滤波不足。如果纹波频率是开关频率的几分之一,那可能是环路不稳定,需要调整补偿网络。

10.4 低电量误报问题——软件和硬件的“配合战”

低电量误报,这个故障特别烦人。用户明明刚换了新电池,机器却提示“电量低”。我见过最夸张的一台,开机就报低电量,但测电压有2.8V,完全正常。

为什么会误报?

原因通常有两个:

  • 检测时机不对——在负载高峰时检测电压,比如电机启动瞬间
  • 阈值设置不合理——没有考虑电池的放电曲线和温度特性

我曾经处理过一个案例:某款血糖仪在冬天频繁报低电量,夏天就正常。查了电池规格书才发现,碱性电池在0℃时容量会下降30%,内阻增大一倍。原来的低电量阈值是按25℃设置的,到了冬天自然就误报了。

解决方案:

  1. 分时检测:只在系统空闲时检测电池电压,避开负载高峰
  2. 温度补偿:加入NTC测温,根据温度调整低电量阈值
  3. 迟滞判断:设置两个阈值——报警阈值和恢复阈值,中间留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%,嗯,那就要靠经验和一点点运气了。