[STM32] 实时修改PWM波的输出频率

本文探讨了在PWM电机控制中,通过修改PWM频率控制电机速度的方法。作者遇到PWM输出偶尔消失的问题,并发现这与定时器的ARR值更新有关。通过使能定时器的Preload功能,即先将ARR值暂存于影子寄存器,待ARR溢出后再更新,成功解决了这一问题。

    最近在做PWM的电机控制,需要通过修改PWM的频率来控制电机的速度。

    使用如下的函数:

    void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint32_t Autoreload);

    该函数可修改定时器的ARR值,使得定时器的周期改变。

    在使用时,总是会随机的出现PWM输出消失的情况,通过排查,在调用TIM_SetAutoreload()函数时,需要初始化使能定时器的Preload功能,调用如下函数:

    void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState)

    TIM_ARRPreloadConfig(TIM2,ENABLE);

    该功能使能是,ARR的值先暂存在影子寄存器,带ARR溢出后再更新ARR的值。

    使能该功能后,该问题解决。

### 如何在STM32CubeMX中配置和调整PWM形的输出频率 #### 定义PWM频率的基础概念 PWM信号的频率由定时器的自动重装载值决定。如果将自动重装载值设为100,则意味着每秒会有一万次从0数到99的过程,即一秒内会有1万组PWM形被输出,这代表PWM频率为10kHz[^4]。 #### 修改PWM频率的具体操作方法 为了改变PWM形的输出频率,在STM32CubeMX软件界面里需进入对应定时器的参数设定页面: - **选择定时器**:点击项目中的TIMx(其中x表示具体的定时器编号),比如用于PWM输出的TIM1、TIM2等。 - **设置时钟源与时基单元**: - 进入`Timer Base Configuration`选项卡; - 调整`Prescaler`预分频系数来控制计数周期长度;此数值越大则计数越慢,反之亦然; - 设置`Counter Period (ARR)`自动重载寄存器值,该值决定了每次溢出所需的时间间隔,从而影响最终产生的PWM脉冲宽度变化速率。 通过上述两个参数的不同组合即可灵活调节PWM的实际工作频率。例如要降低PWM频率,可以通过增加`Prescaler`或减少`Counter Period (ARR)`的方式实现;而提高PWM频率则相反[^1]。 ```cpp // 假定已初始化好相应外设并开启中断服务函数 void adjust_PWM_frequency(TIM_HandleTypeDef *htim, uint32_t newFrequency){ // 计算新的预分频系数与自动重装值 uint32_t prescalerValue = SystemCoreClock / ((newFrequency)*65536)-1; __HAL_TIM_SET_PRESCALER(htim,prescalerValue); } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值