第4章 定时器与PWM生成:从原理到实战
各位同学,欢迎来到第四章。这一章我们聊聊定时器和PWM。说实话,这两个东西在理疗仪里太重要了。强度控制靠它,波形生成靠它,甚至有些安全逻辑也得靠它。我刚开始做理疗仪那会儿,就在PWM上栽过跟头——后面会细说。
4.1 定时器中断配置——别小看这个基础
定时器中断,说白了就是让芯片每隔一段时间自动跳进中断服务函数。你想想看,理疗仪需要精确控制脉冲宽度,没有定时器根本玩不转。
我个人习惯用STM32的通用定时器。配置其实不复杂,但有几个坑要注意。
// 定时器中断初始化示例(STM32 HAL库)
void Timer_Init(void)
{
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 72 - 1; // 72MHz / 72 = 1MHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 1000 - 1; // 1MHz / 1000 = 1kHz
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&htim2);
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
HAL_TIM_Base_Start_IT(&htim2);
}
void TIM2_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim2);
// 用户代码:每1ms执行一次
// 比如更新占空比、检测按键等
}
⚠️ 我曾经踩过的坑:中断服务函数里千万别做耗时操作。有一次我在中断里调了个printf,结果整个系统卡死。中断里只做标志位设置,具体处理放主循环。
定时器中断频率怎么选?我一般遵循这个原则:
- 按键扫描:5-10ms一次,太快反而容易误判
- LED呼吸灯:10-20ms更新一次,人眼感觉平滑
- 理疗仪脉冲控制:50-100μs一次,这个后面会细讲
4.2 PWM输出原理——其实没那么玄乎
PWM,脉冲宽度调制。你把它想象成一个开关,不停地开、关、开、关。开的时间长,平均电压就高;开的时间短,平均电压就低。
理疗仪里怎么用?说白了就是控制输出强度。占空比越大,刺激强度越强。但这里有个关键点——频率不能乱选。
| 理疗模式 | 推荐PWM频率 | 说明 |
|---|---|---|
| 低频镇痛 | 2-100Hz | 模拟神经脉冲 |
| 中频干扰 | 1000-5000Hz | 穿透更深 |
| 高频热疗 | 20kHz以上 | 避免肌肉收缩 |
嗯,这里要注意。PWM频率太低,肌肉会一抽一抽的,用户体验极差。频率太高,MOS管开关损耗变大,发热严重。我一般取中间值,比如中频模式用2.5kHz。
4.3 占空比调节——强度控制的核心
占空比调节,就是强度控制。理疗仪上那个旋钮,或者触摸滑条,最终都在调这个值。
直接上代码,看看怎么动态调占空比:
// PWM占空比动态调节
void Set_PWM_Duty(uint16_t duty)
{
// duty范围:0-1000,对应0%-100%
if(duty > 1000) duty = 1000;
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, duty);
}
// 用户调节回调(比如旋钮中断)
void Knob_Value_Changed(uint16_t adc_value)
{
// 将ADC值映射到占空比
uint16_t duty = (adc_value * 1000) / 4096;
// 加个软启动,防止突变
static uint16_t last_duty = 0;
if(duty > last_duty + 10) duty = last_duty + 10;
if(duty < last_duty - 10) duty = last_duty - 10;
last_duty = duty;
Set_PWM_Duty(duty);
}
💡 我的经验:占空比变化一定要加缓启动。直接跳变会让用户感觉被电了一下。我一般每10ms调整不超过5%,这样用户感觉是平滑上升的。
4.4 实战中的那些坑
做理疗仪PWM控制,有几个问题你一定会遇到:
- 死区时间:H桥驱动时,上下管不能同时导通。我习惯加1-2μs死区。
- 输出滤波:PWM直接输出会有高频分量,加个RC低通滤波,截止频率设在PWM频率的1/10左右。
- 电流检测:别光调占空比,得实时看电流。我遇到过占空比正常但电极接触不良,用户感觉不到刺激。
🔑 核心要点:定时器是骨架,PWM是肌肉,占空比是神经信号。三者配合好了,理疗仪才能精准控制强度。我建议你在调试时,先用示波器看PWM波形,确认频率和占空比都对,再连人体负载。
最后说一句。定时器和PWM的配置,不同芯片差异很大。但原理是相通的。你只要理解了「定时器产生基准时钟,PWM比较输出波形,占空比控制有效值」这条线,换什么芯片都不怕。
下一章我们讲ADC采样和信号处理,到时候会用到这章的定时器知识。嗯,先消化这些吧。