4、定时器与PWM:定时器基础配置、PWM 波形生成原理、理疗仪中 PWM 控制强度
好,咱们今天聊聊定时器和PWM。说实话,这两个东西在嵌入式开发里,就像炒菜用的盐和油——太基础了,但没它们还真不行。尤其是在理疗仪这种设备里,PWM几乎就是控制强度的灵魂。
4.1 定时器基础配置:别小看这步
很多新手一上来就急着调PWM,结果波形出不来,回头一看——定时器时钟没开。嗯,这种坑我踩过不止一次。
定时器说白了就是一个会数数的计数器。它靠时钟源驱动,每来一个脉冲,计数值就加1。当计数值达到我们设定的上限,就会触发中断或者产生事件。
配置定时器,我个人习惯按这三步走:
- 使能时钟——别笑,这是最容易忘的。比如STM32的TIM2挂在APB1上,你得先调用
__HAL_RCC_TIM2_CLK_ENABLE()。 - 设置预分频器(PSC)和自动重装载值(ARR)——这两个决定了定时器的溢出频率。
- 选择计数模式——向上、向下、还是中央对齐。大部分场景用向上计数就够了。
举个例子,我想让定时器每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); // 启动定时器
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的要求也不一样:
| 模式 | PWM频率 | 占空比范围 | 说明 |
|---|---|---|---|
| 放松模式 | 100Hz | 20%~60% | 低频低强度,适合日常放松 |
| 理疗模式 | 150Hz | 30%~80% | 中等强度,用于肌肉刺激 |
| 强化模式 | 200Hz | 50%~95% | 高强度,需配合安全保护 |
我个人习惯在代码里加一个软启动逻辑。每次开机或者切换模式时,占空比从0开始,以每100ms增加5%的速度慢慢升到目标值。这样用户不会突然被电一下,体验好很多。
最后说一句,定时器和PWM的配置其实不难,难的是怎么让它们安全、平滑地控制理疗强度。你想想看,用户把设备贴在身上,强度调得不对,那可是真会疼的。所以,做理疗仪驱动,安全第一,渐变第二,频率第三。这个顺序,我建议你记下来。