You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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%,直接修改比较寄存器值即可调整占空比:

  1. 新增占空比档位变量和调整函数:
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);
}
  1. 绑定按键逻辑:
  • 占空比加按键按下:duty_level +=1,限幅最大为10,调用DutyAdjust(duty_level)
  • 占空比减按键按下:duty_level -=1,限幅最小为0,调用DutyAdjust(duty_level)
  • 原有频率加减按键逻辑不变,仅修改freq_loop后调用FreqAdjust(freq_loop)即可

注意事项

  • 按键需要做消抖处理,避免一次按下触发多次调整
  • 如果需要长按连续调整,可以增加长按计时判断,每隔固定时间调整一次档位
  • 如果后续要修改自动重装载值ARR,需要同步调整占空比计算逻辑,保证占空比不受频率切换影响

内容的提问来源于stack exchange,提问作者Bowman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:00:00