4、充气泵驱动设计:PWM调速原理、恒流驱动与恒压驱动对比、启动电流抑制策略

充气泵的驱动,说白了就是怎么让电机转起来、转多快、什么时候停。这块要是没做好,血压计测出来的数据能飘到天上去。我这些年调试过的泵驱动方案少说也有几十种,踩过的坑真不少。今天咱们就把这几个核心问题掰开揉碎了讲。

4.1 PWM调速原理

PWM调速,全称是脉冲宽度调制。你想想看,给电机通电,通一会儿断一会儿,平均电压就降下来了。占空比越高,电机转得越快。

为什么会这样?因为电机是个感性负载,电流不会突变。PWM频率选对了,电流波形就平滑,电机运行就稳。

关键参数:

  • 频率:我个人习惯选20kHz左右。低于人耳可听范围会嗡嗡响,高于50kHz开关损耗就上来了。
  • 占空比范围:一般10%~90%比较实用。太低了电机不转,太高了容易饱和。
  • 死区时间:如果用了半桥驱动,死区必须留。我见过有人忘了这个,上下管直通,MOS管直接冒烟。

嗯,这里要注意:PWM频率不是越高越好。频率高了,MOS管的开关损耗会显著增加。我做过一个项目,为了追求静音把频率提到40kHz,结果驱动芯片烫得能煎鸡蛋。

// 典型的PWM初始化代码(基于STM32)
void Pump_PWM_Init(void) {
    TIM_HandleTypeDef htim;
    TIM_OC_InitTypeDef sConfigOC = {0};
    
    __HAL_RCC_TIM2_CLK_ENABLE();
    
    htim.Instance = TIM2;
    htim.Init.Prescaler = 72 - 1;        // 72MHz / 72 = 1MHz
    htim.Init.Period = 50 - 1;           // 1MHz / 50 = 20kHz
    htim.Init.CounterMode = TIM_COUNTERMODE_UP;
    HAL_TIM_PWM_Init(&htim);
    
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 25;                // 初始占空比50%
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1);
    
    HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1);
}

4.2 恒流驱动与恒压驱动对比

这个问题,我当年刚入行时也纠结过。恒压驱动简单,给个固定电压就行。但电机启动时电流会很大,容易把电源拉垮。恒流驱动呢,电流可控,但电路复杂些。

对比项 恒压驱动 恒流驱动
电路复杂度 低,一个MOS管+续流二极管就行 高,需要电流采样+反馈环路
启动电流 大,可能达到额定电流的5~10倍 可控,可以设定软启动
转速稳定性 随负载变化大 负载变化时转速相对稳定
成本 高(需要运放或专用驱动IC)
适用场景 低成本、对精度要求不高的产品 医疗级、需要精确控制的产品

我在项目中遇到过这样的情况:用恒压驱动做了一款血压计,充气到180mmHg时电机转速明显下降,导致充气时间过长。后来换成恒流驱动,问题就解决了。说白了,恒流驱动更适合对压力控制精度要求高的场景。

我的建议:如果产品定位是家用入门级,恒压驱动够用。如果是医用级或者高端产品,老老实实用恒流驱动。别为了省几毛钱把产品口碑做砸了。

4.3 启动电流抑制策略

启动电流大,是直流电机的通病。电机静止时,反电动势为零,绕组电阻又小,电流瞬间就能冲到好几安培。我曾经见过一个项目,电源设计余量留得不够,一启动就把3.3V拉到了2.8V,MCU直接复位。

怎么抑制?我总结了三种实用方法:

4.3.1 软启动(PWM渐变)

这是最常用的方法。启动时占空比从0慢慢往上加,让电流有个缓冲过程。

// 软启动实现示例
void Pump_SoftStart(void) {
    uint8_t duty = 0;
    for (duty = 0; duty <= TARGET_DUTY; duty += 2) {
        __HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, duty);
        HAL_Delay(10);  // 每步延时10ms
    }
}

嗯,这里要注意:步进值和延时时间要根据电机参数调整。步进太大,软启动效果不明显;步进太小,启动时间太长。我一般用2%的步进,每步10ms,总共500ms完成启动。

4.3.2 限流电阻法

在电机回路串一个功率电阻,启动后通过MOS管短路掉。这个方法简单粗暴,但电阻会发热,不适合长时间工作。

避坑提醒:我曾经试过用PTC热敏电阻做限流,想着它能自动恢复。结果连续启动几次后,PTC温度升高,电阻变大,电机转速上不去了。后来还是老老实实用了MOS管旁路方案。

4.3.3 电流闭环控制

这是最专业的方案。实时采样电机电流,通过PID调节PWM占空比,把电流限制在设定值以内。

// 电流闭环控制伪代码
void Pump_CurrentControl(void) {
    uint16_t current = ADC_GetCurrent();  // 读取电流采样值
    int16_t error = TARGET_CURRENT - current;
    
    // 简单的PI控制
    static int32_t integral = 0;
    integral += error;
    if (integral > INTEGRAL_LIMIT) integral = INTEGRAL_LIMIT;
    if (integral < -INTEGRAL_LIMIT) integral = -INTEGRAL_LIMIT;
    
    int32_t output = Kp * error + Ki * integral;
    if (output > MAX_DUTY) output = MAX_DUTY;
    if (output < 0) output = 0;
    
    __HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, output);
}

这个方案我是在做一款高端血压计时用的。当时客户要求充气时间不超过5秒,但又要保证压力控制精度。用电流闭环后,启动电流被稳稳控制在1.5A以内,充气速度还比之前快了30%。

三种方案对比总结:

  • 软启动:实现最简单,适合大多数场景。我推荐作为首选方案。
  • 限流电阻:成本最低,但发热问题要处理好。适合极低成本产品。
  • 电流闭环:效果最好,但开发难度大。适合对性能有极致要求的产品。

最后说一句,启动电流抑制不是越狠越好。抑制得太厉害,电机启动慢,充气时间就长。用户等得不耐烦,血压还没测就紧张了,数据能准吗?所以要在抑制电流和启动速度之间找个平衡点。我个人习惯是把启动电流控制在额定电流的2~3倍,既保护了电源,又不影响用户体验。