4、定时器与PWM:定时器基础配置、PWM 波形生成原理、理疗仪中 PWM 控制强度

好,咱们今天聊聊定时器和PWM。说实话,这两个东西在嵌入式开发里,就像炒菜用的盐和油——太基础了,但没它们还真不行。尤其是在理疗仪这种设备里,PWM几乎就是控制强度的灵魂。

4.1 定时器基础配置:别小看这步

很多新手一上来就急着调PWM,结果波形出不来,回头一看——定时器时钟没开。嗯,这种坑我踩过不止一次。

定时器说白了就是一个会数数的计数器。它靠时钟源驱动,每来一个脉冲,计数值就加1。当计数值达到我们设定的上限,就会触发中断或者产生事件。

配置定时器,我个人习惯按这三步走:

  1. 使能时钟——别笑,这是最容易忘的。比如STM32的TIM2挂在APB1上,你得先调用 __HAL_RCC_TIM2_CLK_ENABLE()
  2. 设置预分频器(PSC)和自动重装载值(ARR)——这两个决定了定时器的溢出频率。
  3. 选择计数模式——向上、向下、还是中央对齐。大部分场景用向上计数就够了。

举个例子,我想让定时器每1ms溢出一次。假设时钟频率是72MHz:

// 定时器基础配置示例(HAL库)
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 72 - 1;          // 72MHz / 72 = 1MHz
htim2.Init.Period = 1000 - 1;           // 1MHz / 1000 = 1kHz → 1ms
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_Base_Init(&htim2);
HAL_TIM_Base_Start(&htim2);             // 启动定时器
我的小技巧:预分频器和自动重装载值最好都减1。因为寄存器是从0开始计数的。你设成1000,实际计数值是0~999,共1000个脉冲。这个细节我曾经在项目里吃过亏,波形频率总是差那么一点点。

4.2 PWM 波形生成原理:说白了就是占空比

PWM的全称是脉冲宽度调制。你想想看,一个方波信号,高电平的时间占整个周期的比例,就是占空比。理疗仪里调节电疗强度,本质上就是在调这个比例。

定时器怎么产生PWM?其实很简单:

  • 定时器不断从0计数到ARR。
  • 我们设置一个比较值(CCR)。
  • 当计数值 < CCR时,输出高电平;当计数值 ≥ CCR时,输出低电平。

这样,改变CCR的值,就改变了高电平的宽度——占空比变了,有效电压也就变了。

核心公式:

PWM频率 = 定时器时钟 / (PSC + 1) / (ARR + 1)

占空比 = CCR / (ARR + 1) × 100%

举个例子,ARR设成999,CCR设成500,占空比就是50%。如果CCR设成750,占空比就是75%。电疗强度从弱到强,其实就是CCR从0慢慢增加到ARR的过程。

4.3 理疗仪中 PWM 控制强度:电疗调节实战

理疗仪的电疗强度调节,我做过好几个项目了。说白了,就是通过PWM控制输出到电极上的有效电压。强度越大,占空比越高,用户感受到的刺激就越强。

但这里有个坑——不能直接从0%跳到100%。我曾经在早期的一个项目里,用户一按强度加,占空比直接跳了20%。结果用户被电得跳起来……嗯,从那以后我再也不敢这么干了。

正确的做法是渐变调节

// 电疗强度渐变调节示例
void adjust_intensity(uint8_t target_percent) {
    static uint8_t current_percent = 0;
    int step = (target_percent > current_percent) ? 1 : -1;
    
    while (current_percent != target_percent) {
        current_percent += step;
        __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 
                              (uint16_t)(current_percent * 10.0f));
        HAL_Delay(20);  // 每20ms调整1%,让用户有适应时间
    }
}
注意:理疗仪是直接接触人体的设备。PWM频率不能太低,否则用户会感觉到「一抖一抖」的刺痛感。我一般建议频率设在100Hz~200Hz之间。低于50Hz会有明显的不适感,高于500Hz则对MOS管驱动要求更高。

另外,不同理疗模式对PWM的要求也不一样:

模式 PWM频率 占空比范围 说明
放松模式 100Hz 20%~60% 低频低强度,适合日常放松
理疗模式 150Hz 30%~80% 中等强度,用于肌肉刺激
强化模式 200Hz 50%~95% 高强度,需配合安全保护

我个人习惯在代码里加一个软启动逻辑。每次开机或者切换模式时,占空比从0开始,以每100ms增加5%的速度慢慢升到目标值。这样用户不会突然被电一下,体验好很多。

避坑指南:我曾经遇到过一个问题——PWM输出正常,但电极上的电压就是上不去。查了半天,发现是MOS管的驱动电压不够。PWM的幅值只有3.3V,而MOS管需要10V才能完全导通。后来加了一级电平转换电路才解决。所以,调PWM之前,先确认你的驱动电路能不能跟上。

最后说一句,定时器和PWM的配置其实不难,难的是怎么让它们安全、平滑地控制理疗强度。你想想看,用户把设备贴在身上,强度调得不对,那可是真会疼的。所以,做理疗仪驱动,安全第一,渐变第二,频率第三。这个顺序,我建议你记下来。