第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控制,有几个问题你一定会遇到:

  1. 死区时间:H桥驱动时,上下管不能同时导通。我习惯加1-2μs死区。
  2. 输出滤波:PWM直接输出会有高频分量,加个RC低通滤波,截止频率设在PWM频率的1/10左右。
  3. 电流检测:别光调占空比,得实时看电流。我遇到过占空比正常但电极接触不良,用户感觉不到刺激。

🔑 核心要点:定时器是骨架,PWM是肌肉,占空比是神经信号。三者配合好了,理疗仪才能精准控制强度。我建议你在调试时,先用示波器看PWM波形,确认频率和占空比都对,再连人体负载。

最后说一句。定时器和PWM的配置,不同芯片差异很大。但原理是相通的。你只要理解了「定时器产生基准时钟,PWM比较输出波形,占空比控制有效值」这条线,换什么芯片都不怕。

下一章我们讲ADC采样和信号处理,到时候会用到这章的定时器知识。嗯,先消化这些吧。