如何通过4个按键调整TIM1生成PWM的频率与占空比
现有实现方案需要调整
你当前的FreqAdjust函数中,每次调整频率都硬编码将比较寄存器值设为30,后续调整占空比后再切频率会直接覆盖占空比配置,必须先修改这部分逻辑。
第一步:优化现有频率调整逻辑
新增全局变量存储当前PWM比较值,替换硬编码的固定参数:
uint8_t freq_loop = 0; uint16_t pwm_compare = 30; // 存储当前比较值,初始为50%占空比 void FreqAdjust(uint8_t loop) { switch(loop) { case 0: __HAL_TIM_SET_AUTORELOAD(&htim1,60); // 27khz __HAL_TIM_SET_PRESCALER(&htim1,100); __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,pwm_compare); break; case 1: __HAL_TIM_SET_AUTORELOAD(&htim1,60); // 28khz __HAL_TIM_SET_PRESCALER(&htim1,96); __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,pwm_compare); break; case 2: __HAL_TIM_SET_AUTORELOAD(&htim1,60); // 29khz __HAL_TIM_SET_PRESCALER(&htim1,93); __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,pwm_compare); break; case 3: __HAL_TIM_SET_AUTORELOAD(&htim1,60); // 30khz __HAL_TIM_SET_PRESCALER(&htim1,90); __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,pwm_compare); break; case 4: __HAL_TIM_SET_AUTORELOAD(&htim1,60); // 31khz __HAL_TIM_SET_PRESCALER(&htim1,87); // 原代码此处PSC和30kHz档位重复,已修正 __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,pwm_compare); break; } }
注:你原代码中31kHz档位的预分频器参数和30kHz完全一致,不会触发频率变化,上面的代码已经做了修正,你可以根据实际芯片主频校准参数
第二步:实现占空比调整功能
你当前配置下TIM1的自动重装载值固定为60,所以比较值范围为060,对应占空比0%100%,直接修改比较寄存器值即可调整占空比:
- 新增占空比档位变量和调整函数:
uint8_t duty_level = 5; // 初始占空比50%,共11档(0~10),每档对应10%占空比 void DutyAdjust(uint8_t level) { // 比较值=档位*6,6由(ARR+1)/最大档位=61/10约算而来,可根据精度需求调整档位数量 pwm_compare = level * 6; // 限幅防止参数超范围 if(pwm_compare > 60) pwm_compare = 60; if(pwm_compare < 0) pwm_compare = 0; // 更新比较寄存器生效新占空比 __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, pwm_compare); }
- 绑定按键逻辑:
- 占空比加按键按下:
duty_level +=1,限幅最大为10,调用DutyAdjust(duty_level) - 占空比减按键按下:
duty_level -=1,限幅最小为0,调用DutyAdjust(duty_level) - 原有频率加减按键逻辑不变,仅修改
freq_loop后调用FreqAdjust(freq_loop)即可
注意事项
- 按键需要做消抖处理,避免一次按下触发多次调整
- 如果需要长按连续调整,可以增加长按计时判断,每隔固定时间调整一次档位
- 如果后续要修改自动重装载值ARR,需要同步调整占空比计算逻辑,保证占空比不受频率切换影响
内容的提问来源于stack exchange,提问作者Bowman
相关产品推荐
相关产品推荐

