[麦麦茶水间] 【每周分享】MCU定时器PWM输出的计算方法

[复制链接]
 楼主| dffzh 发表于 2025-7-18 10:06 | 显示全部楼层 |阅读模式
本帖最后由 dffzh 于 2025-7-18 10:07 编辑

在日常的嵌入式软件开发中,我们会经常使用MCU硬件定时器的PWM(脉冲宽度调制)模式来输出PWM脉冲,用于电机控制、LED调光和比例阀调节等等,那怎么样计算PWM输出频率以及占空比的值呢?看完本文以后,你就知道怎么操作了。
1、PWM频率的计算方法
PWM频率主要由定时器的时钟和分频系数决定,公式如下:
各个参数的说明如下:
fCLK:定时器的时钟频率,由MCU主时钟频率经过分频得到,比如STM32上的分频值就是由下面这个TIM_ClockDivision参数进行配置:
TIM_TimeBaseInitStructure.TIM_ClockDivision= TIM_CKD_DIV1;
Prescaler:预分频系数,一般是用PSC来命名,比如STM32上的预分频系数值就是由下面这个TIM_Prescaler参数进行配置:
TIM_TimeBaseInitStructure.TIM_Prescaler =23999+1 - 1;
TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler;
ARR(Auto-Reload Register):自动重装载值,决定PWM周期,比如STM32上的ARR值就是由下面这个TIM_Period参数进行配置:
TIM_TimeBaseInitStructure.TIM_Period = 1;
TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;
以上的参数在很多MCU上的命名基本相似。

2、PWM占空比的计算方法
PWM占空比主要由比较寄存器CCR的值决定,公式如下:
各个参数的说明如下:
CCR(Capture/Compare Register):比较寄存器的值,决定PWM脉冲宽度,也就是高电平时间,比如STM32上的CCR值就是由下面这个TIM_Pulse参数进行配置:
TIM_OCInitStructure.TIM_Pulse =48000*10/100;
TIMx->CCR1 = TIM_OCInitStruct->TIM_Pulse;
ARR:同上,决定周期。

通过动态调整CCR,Prescaler和ARR,可灵活控制PWM频率与占空比,输出你需要的PWM数据。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
wahahaheihei 发表于 2025-7-19 18:20 | 显示全部楼层
对于微芯的产品不需要计算啊,MCC自动计算。方便

评论

知其然知其所以然。  发表于 2025-7-21 09:00
快乐制造机 发表于 2025-7-24 14:07 | 显示全部楼层
感谢分享!这个帖子对于我们这些嵌入式开发者来说太有用了,特别是对于PWM频率和占空比的计算部分,非常详细。
yiyigirl2014 发表于 2025-7-27 10:17 | 显示全部楼层
就是定时器加比较器实现的。

评论

是的。  发表于 2025-7-28 08:53
暗夜幽灵骑士 发表于 2025-7-28 08:33 | 显示全部楼层
这篇文章对于我们这些嵌入式开发人员来说真的很有帮助,特别是在处理电机控制和LED调光时。感谢分享这些基本的计算方法和参数配置!

评论

是的,有时候理解的比较模拟两可。  发表于 2025-7-28 08:54
彩虹捕手 发表于 2025-7-29 09:00 | 显示全部楼层
非常实用的分享!在实际项目中经常需要调整PWM来控制硬件设备,这篇文章提供了清晰的计算方法和步骤,感谢楼主!

评论

你们主要使用PWM来控制什么设备呢?好奇一下  发表于 2025-7-29 09:08
逆鳞风暴 发表于 2025-7-29 22:51 | 显示全部楼层
这篇文章对于我们这些嵌入式开发者来说太有用了,特别是对于PWM的计算方法的讲解,非常详细!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

109

主题

1165

帖子

22

粉丝
快速回复 在线客服 返回列表 返回顶部