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倍,既保护了电源,又不影响用户体验。