PWM两种模式区分以及公式Tout=(ARR+1)(PSC+1)/Tclk的理解

本文深入解析STM32的PWM输出工作原理,包括模式一和模式二的区别,计数器模式及其对输出的影响,以及如何通过寄存器设置高低电平的有效状态。同时,详细解释了定时器中断配置中常用公式的含义,帮助读者理解如何精确控制PWM信号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文两个概念:

  1. 之前学这块的时候就对什么PWM模式一模式二 有效无效 高低电平什么的概念很模糊 最近又重温了一遍 决定还是记录下来 以下是STM32 PWM输出的工作过程(以向上计数为例)
    这是PWM的工作过程图
    CCRX的值位于0——ARR之间,若0——CCRX为低电平,则CCRX——ARR为高电平,如上图所示。ARR的大小决定周期,CCRX的大小决定占空比。
    因为怕有人把高电平和有效电平这块弄混,此处有必要提一下占空比这个概念,占空比是高电平在一个周期内所占的时间比率,即 占空比=高电平持续时间/ARR的值
    PWM有模式一和模式二,具体使用哪个模式由CCMRX寄存器相关位的值来决定
    计数器模式有向上计数,向下计数,向上向下双向计数(中央对齐)模式。具体区别通过字面意思就可理解。
    PWM模式一(110):如果是向上计数,当TIMX_CNT<TIMX_CCRX时通道X为有效电平,否则为无效电平。向下计数时相反,当TIMX_CNT>TIMX_CCRX时通道X为无效电平,否则为有效电平
    PWM模式二(111):如果是向上计数,当TIMX_CNT<TIMX_CCRX时通道X为无效电平,否则为有效电平。向下计数时相反,当TIMX_CNT>TIMX_CCRX时通道X为有效电平,否则为无效电平
    这里的高低电平可以通过设置定时器的寄存器CCER的CC1P位决定高电平有效还是低电平有效。0:高电平有效 1:低电平有效,一般默认为高电平有效
    说了这么点,相信已经有人懵了,没事 ,有总结呢。

/*************************************************************************************************************************************/
总结出------不用考虑计数模式问题,以上提出只是为了增添一个新的概念,PWM模式一:只要TIMX_CNT<TIMX_CCRX,即为有效电平,PWM模式二刚好相反
/********************************************************************************************************************************/

2.此处顺便解释一下一个很常用的公式:
Tout=(ARR+1)(PSC+1)/Tclk(ARR为自动重装载值,PSC为预分频系数)
只要写过定时器中断实验的同学一定见过这个公式,初始化需要往进填值,不过大多数人只知道怎么算,却不知道为什么,我尽量说的让大家在最短的时间内明白这个公式的含义。
先说一点基本概念(还是需要了解一下的):
定时器时钟选择(fcx_psc)
以下为时钟源:
内部时钟CK_INT (此处用的是内部时钟)
外部时钟模式1:外部输入脚 (TIx )
外部时钟模式2:外部触发输入(ETR)
内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器
计数器时钟频率CK_INT=fcx_psc/(PSC(15:0)+1)
举例
定时器中断配置:每500ms中断一次
时钟计算方法:
(如果选择内部时钟)

STM32 AHB时钟=72M APB1时钟=36M
APB1的分频系数=AHB/APB1时钟=2
通用定时器时钟(CK_INT)=APB1的时钟*分频系数=72M
fcx_psc=CK_INT 最终时钟等于fcx_psc/N 此处N=PSC+1
Tclk就是上面所说的CK_INT 为72M
PSC若设置为7199
定时器时钟为Tclk/(PSC+1)=10k
1/10k=0.1ms即一个时钟周期
所以配置ARR为4999 即ARR+1=5000个周期完成500ms中断

具体实现参考https://blog.csdn.net/weixin_43796192/article/details/84866368
参考链接(OCX和OCXREF之间关系):http://www.openedv.com/forum.php?mod=viewthread&tid=140&highlight=REF%2B%2B%B9%D8%CF%B5

### 预分频系数(PSC)和自动重装载值(ARR)与信号周期不匹配的影响 当预分频系数(PSC)和自动重装载值(ARR)设置不当,无法精确匹配待测信号周期时,会对系统的测量精度以及正常运行造成显著影响。 #### 测量精度的影响 如果PSCARR未能正确配置以适应目标信号的周期,则计数器可能无法准确捕捉到完整的信号波形。这可能导致计算得出的时间间隔(Tout)存在误差[^1]。具体来说: - **分辨率不足**:由于Tout公式 $ Tout=\frac{(ARR+1)\times (PSC+1)}{Tclk} $ 计算得到,若PSC过小或者ARR过大,可能会导致时间基数变得粗糙,从而降低可分辨最小时间段的能力。 - **量化错误**:即使能够大致覆盖所需范围内的任何给定频率或脉宽,但如果所选参数组合不能整除实际输入信号周期长度的话,就会引入额外的舍入偏差。 这些因素共同作用下使得最终获得的数据偏离真实情况,进而降低了整个应用中的准确性需求标准。 #### 对正常工作的潜在危害 除了上述提到关于数据采集方面的失准之外,在某些特定应用场景里还可能出现更严重后果: - 如果用于控制电机速度或其他硬件设备运转状态下的PWM生成过程中出现问题,则很可能引起驱动异常甚至损坏连接部件的风险; - 当作为通信协议同步机制的一部分时(比如UART波特率设定),微小差异也可能累积成为帧错乱现象而破坏消息传递可靠性;另外还有诸如RTOS任务调度延迟估计失误等情况都属于此类范畴之内[^2]. 综上所述,合理调整并校验PSCARR对于保障嵌入式系统稳定高效运作至关重要。 ```python def calculate_tout(arr, psc, tclk): """ Calculate the timer overflow time based on given parameters. Parameters: arr : int Auto-reload register value ranging from 1 to 65535. psc : int Prescaler coefficient. tclk : float Input clock frequency in MHz. Returns: tout : float Timer output period calculated using formula provided earlier. """ return ((arr + 1) * (psc + 1)) / tclk # Example usage of function with hypothetical values example_arr = 999 # Hypothetical auto reload value within valid range example_psc = 10 # Arbitrary prescale factor chosen here example_tclk = 8.0 # Assuming an input clock speed at 8MHz calculated_time_period = calculate_tout(example_arr , example_psc , example_tclk ) print(f"Theoretical Time Period:{calculated_time_period:.4f}s") ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值