如何在定时器中断中实现PWM波形切换?

张开发
2026/5/30 4:42:07 15 分钟阅读
如何在定时器中断中实现PWM波形切换?
目录1. 方法一软件模拟 PWM适用于无硬件PWM或低频场景2.方法二硬件PWM 更新中断推荐精度高3.两种方案对比在中断中实现 PWM 波形切换核心思路是利用定时器的中断功能在精确的时间点通过软件来控制 GPIO 引脚的电平高低从而“手动”合成出 PWM 波形。主要有两种实现方式它们的复杂度和精度有所不同。1. 方法一软件模拟 PWM适用于无硬件PWM或低频场景这种方法完全依靠中断和软件来翻转 IO 口。你需要配置一个定时器让它以一个固定的、较短的时间间隔我们称之为“节拍”产生中断。核心逻辑定义参数设定 PWM 的总周期total_time和高电平持续时间high_time单位都是“节拍”数。设置中断配置定时器使其每隔一个“节拍”就触发一次中断。在中断中判断在中断服务函数ISR里使用一个计数器pwm_counter来记录当前处于周期的哪个位置。如果pwm_counter小于high_time则将 GPIO 设置为高电平。否则将 GPIO 设置为低电平。周期重置每次中断后pwm_counter加 1。当pwm_counter达到total_time时将其重置为 0开始下一个 PWM 周期。代码示例 (以 51 单片机风格为例):sbit PWM_PIN P1^0; // 定义PWM输出引脚 unsigned int pwm_counter 0; unsigned int high_time 500; // 高电平持续500个节拍 unsigned int total_time 1000; // 总周期1000个节拍 // 定时器中断服务程序假设每10us中断一次一个节拍 void Timer_ISR(void) interrupt 1 { // 1. 根据计数器判断输出高电平还是低电平 if(pwm_counter high_time) { PWM_PIN 1; // 输出高电平 } else { PWM_PIN 0; // 输出低电平 } // 2. 计数器递增 pwm_counter; // 3. 检查是否完成一个完整周期 if(pwm_counter total_time) { pwm_counter 0; // 周期结束重置计数器 } }通过修改high_time的值就可以在不改变频率total_time不变的情况下动态调整 PWM 的占空比。2.方法二硬件PWM 更新中断推荐精度高这是更优的方案。它利用 MCU 内置的硬件 PWM 模块来生成稳定的波形而中断仅用于在特定时刻如每个周期结束时更新 PWM 的参数如占空比或频率。核心逻辑配置硬件PWM首先配置定时器工作在 PWM 模式。设置好自动重装载值ARR决定频率和初始的捕获/比较值CCR决定初始占空比。启动 PWM 后硬件会自动生成波形无需 CPU 干预。使能更新中断开启定时器的“更新中断”Update Interrupt。这个中断会在定时器计数器溢出即一个 PWM 周期结束时触发。在中断中更新参数在中断服务函数中你不再操作 GPIO而是修改定时器的CCR寄存器或ARR寄存器来变频。修改CCR可以平滑地改变下一个周期的占空比。修改ARR可以改变 PWM 的频率。代码示例 (以 STM32 HAL库为例):TIM_HandleTypeDef htim3; // 假设使用 TIM3 // 1. 初始化并启动硬件PWM (在主函数中调用) void PWM_Init() { // ... (此处省略定时器和PWM通道的详细初始化代码) // 假设已配置好频率1kHz, 初始占空比50% (ARR999, CCR500) // 使能更新中断 __HAL_TIM_ENABLE_IT(htim3, TIM_IT_UPDATE); // 启动PWM HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_1); } // 2. 更新中断服务函数 void TIM3_IRQHandler(void) { // 检查是否是更新中断 if (__HAL_TIM_GET_FLAG(htim3, TIM_FLAG_UPDATE) ! RESET) { // 清除中断标志 __HAL_TIM_CLEAR_FLAG(htim3, TIM_FLAG_UPDATE); // --- 在此处实现你的波形切换逻辑 --- // 例如动态改变占空比实现呼吸灯效果 static uint16_t new_duty 500; new_duty (new_duty 10) % 1000; // 占空比在0-100%之间变化 // 安全地更新CCR值改变下一个周期的占空比 __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_1, new_duty); } }3.两种方案对比特性软件模拟 PWM硬件PWM 更新中断CPU占用率高每个节拍都需进入中断极低仅周期更新时进入中断波形精度较低受中断延迟和抖动影响非常高由硬件定时器保证实现复杂度简单逻辑直观稍复杂需理解硬件PWM配置适用场景无硬件PWM模块、低频控制电机控制、精密电源等绝大多数应用除非你的 MCU 没有硬件 PWM 功能或者对频率要求极低如几赫兹否则强烈推荐使用方法二。它能以最小的 CPU 开销获得最稳定、最精确的 PWM 波形。

更多文章