1 概述
项目中经常使用到STM32来输出PWM,每次配置过后过不了多久就会忘记,稍微需要对配置做出修改时都要翻很久的手册,所以决定结合实例把PWM配置的详细步骤记录下来,这样在下次配置时可以很快的捡起来。
本文档的行文结构如下,首先,说明实际需求,即要输出什么样的PWM信号;然后,根据需求把手册中相关的部分摘抄下来并辅以个人的理解和总结;最后,详细说明在软件中怎么去配置并展示配置后的实验效果。
2 需求
项目中用到4路PWM信号,硬件条件决定了其只能由定时器1和定时器3产生,每个定时器输出两路PWM信号,要求4个PWM信号相位同步,每个PWM信号如图1所示。
图1 PWM输出波形要求
具体要求见表1。
表1 PWM要求
序号 | 名称 | 要求 | 备注 |
1 |
周期 |
100us |
暂定 |
2 |
占空比 |
0~100%可调 |
|
3 |
中断触发时刻 |
计数器下溢点 |
|
4 |
占空比更新时刻 |
计数器下溢点 |
3 STM高级定时器原理
图 2高级定时器的原理框图
图中用红色虚线框出来的部分是输出PWM所需要的部分,包括时钟源、计数器单元、比较寄存器及PWM输出、TRGO输出、外部触发输入,下面依次说明各部分原理。
3.1 时钟源
计数器时钟可由以下时钟源提供:
- 内部时钟(CK_INT)
- 外部时钟模式1:外部输入引脚
- 外部时钟模式2:外部触发输入ETR
- 外部触发输入(ITRx)
输出PWM使用内部时钟(CK_INT),只需要关心怎么配置为内部时钟以及内部时钟的频率。
3.2 计数器单元
时钟源输出的时钟经过预分频器分频后作为计数器的时钟。计数器在时钟下可以增计数、减计数、增/减计数。自动重载寄存器控制计数器的计数范围,即定时器的周期。重复计数器控制更新事件UEV产生的频率。
3.2.1 预分频器
预分频器用于对计数器时钟进行分频,分频系数可配置为1~65536。分频系数可以动态修改,不过其具有缓冲功能,修改后的分频系数只能在下一次更新事件UEV后生效(见3.2.3节)。
3.2.2 计数器
1)计数器可以增计数、减计数、增\减计数。
- 增计数的范围为0~自动重装值(TIMx_ARR寄存器的值),计数值为自动重装值时产生上溢事件,定时器周期=T_CK_CNT*(自动重装值+1);
- 减计数的范围为自动重装值(TIMx_ARR寄存器的值)~0,计数值为0时产生下溢事件,定时器周期=T_CK_CNT*(自动重装值+1);
- 增\减计数的范围为0~自动重装值(TIMx_ARR寄存器的值)~1,计数值为自动重装值-1时生成上溢事件,计数值为1时生成下溢事件。计数器周期=T_CK_CNT*自动重装值*2;
2)自动重装值可以配置为预装载或者不预装载。不预装载时,自动重装值实时生效;预装载时,自动重装值在下一次更新事件UEV后生效(见3.2.3节)。
3)增/减计数有3种,分别为中心对称模式1/2/3,区别在于输出比较中断标志触发的位置不同,具体见手册。
3.2.3 重复计数器及更新事件(UEV)的产生
1.重复计数器
重复计数器仅用来控制更新事件的产生。它是一个自动重装的减计数器,在更新事件UEV时自动重装,重装值为RCR寄存器的值。每次上溢或下溢事件时重复计数器减1。
2.更新事件的产生
更新事件(UEV)可以被屏蔽或者启用(TIM_CR1的UDIS位)。被屏蔽的情况下不会产生任何更新事件;被启用的情况下,有两种情况可以产生更新事件,分别为外部触发和计数器内部触发。
外部触发不受重复计数器的影响,只要触发则立即产生更新事件。外部触发有两种,分别为软件向TIM_EGR的UG位写1和外部触发输入(见3.5节)。
计数器内部触发受重复计数器的影响,只有重复计数器等于0时才可以产生更新事件。在重复计数器等于0时以下三种情况可以产生更新事件:
- 增计数时上溢事件时产生更新事件;
- 减计数时下溢事件时产生更新事件;
- 增\减计数时上溢和下溢均产生更新事件;
结合重复寄存器的原理可知,每N(RCR寄存器的值)+1次上溢或者N+1
次下溢事件产生1次更新事件 。
3.增\减计数模式下如何控制更新事件(UEV)在上溢还是下溢产生?
显然,增\减计数模式时如果配置重复寄存器RCR为奇数,更新事件将只能在上溢或下溢产生,那么该如何控制其在上溢还是在下溢产生呢?手册中写到:在启动计数器前写入RCR,则UEV将在上溢时产生,在计数器启动后写入RCR,则UEV将在下溢时产生。
但经过实测试上述说法并不完全准确。实测结果如下:
- 在启动计数器前对RCR写入1,UEV在上溢产生;
- 在启动计数器前先对RCR写入1,再软件强制触发一个UEV,然后启动计数器,UEV将在下溢产生。(HAL库中有此操作,所以在CubeMx直接配置重复计数器为1,UEV仍在下溢产生);
- 启动计数器后,在增计数过程中对RCR写入1,UEV在上溢产生;
- 启动计数器后,在减计数过程中对RCR写入1,UEV在下溢产生。
可以这么理解,启动计数器后首先触发的是上溢事件,然后是下溢事件。因为重复计数器是一个在更新事件UEV时自动重装载的计数器,在启动计数器前写入的1并没有装载到重复计数器,所以启动计数器后更新事件UEV在上溢产生;如果在启动计数器前软件强制触发一个UEV事件,则在启动计数器时1已经写入重复计数器,所以更新事件UEV在下溢产生。
至于启动计数器后写入RCR的现象则更好解释。因重复计数器只在UEV时更新,写入RCR后不会立马更新,所以增计数在上溢产生UEV事件然后更新重复计数器,减计数在下溢产生UEV事件然后更新重复计数器。
图 3不同模式和配置下的更新事件(UEV)的触发时刻
3.2.3 比较寄存器及PWM输出
比较寄存器(TIM_CCRx)可以配置为预装载和不预装载。预装载时,只有在下一次更新事件UEV时比较寄存器的值才会生效,不预装载时,比较寄存器的值实时生效。配置为PWM模式时必须使能预装载(使用HAL库配置为PWM模式时默认已使能预装载)。
比较寄存器可以配置为PWM模式和其他模式。这里仅介绍PWM模式,其他模式见手册比较输出模式章节。PWM模式分为PWM模式1和PWM模式2。
PWM模式1时:
- 计数器增计数时,计数器<TIM_CCRx则OCxREF输出高电平,否则输出低电平;
- 计数器减计数时,计数器≦TIM_CCRx则OCxREF输出高电平,否则输出低电平。
图 4 PWM模式1、中心对齐模式的PWM波形
PWM模式2时:
- 计数器增计数时,计数器>TIM_CCRx则OCxREF输出高电平,否则输出低电平;
- 计数器减计数时,计数器≧TIM_CCRx则OCxREF输出高电平,否则输出低电平。
注意事项:不建议在运行中心对齐模式(增\减计数)时对计数器执行写操作,使用中心对称模式最为保险的方法为:在启动计数器前通过软件生成更新(对TIM_EGR的UG位写1)来初始化所有寄存器(HAL库中有此操作),并且不要在计数器运行过程中对其执行写操作。
3.4 外部触发输出(TRGO)
TRGO输出受TIM_CR2寄存器MMS位控制,具体如图5。
图 5 TRGO输出配置
MMS为010时,更新事件UEV作为TRGO输出,可用于同步其他定时器。
3.5 外部触发输入
定时器配置为从模式可与外部触发输入同步,有三种同步模式,分别为复位模式、门控模式和触发模式,这里仅介绍复位模式,其他模式见手册。复位模式:触发事件时,计数器和预分频器将重新初始化,同时还会生成更新事件UEV,所有的预装载寄存器将会更新。触发输入可选:
- ITR0:内部触发0
- ITR1:内部触发1
- ITR2:内部触发2
- ITR3:内部触发3
- T1F_ED:TI1的边沿检测器
- TI1FP1:滤波后的定时器输入1
- TI1FP2:滤波后的定时器输入2
- ETRF:外部触发输入
其中ITR0~ITR3是从定时器的内部触发输入,是主定时器的TRGO输出。当定时器3作为从定时器时,它对应的内部触发输入来源如下:
表 2 定时器3作为从定时器时的触发输入来源
从定时器 |
ITR0 |
ITR1 |
ITR2 |
ITR3 |
TIM2 |
TIM1 |
TIM15 |
TIM3 |
TIM14 |
4 软件配置
硬件条件决定了只能使用定时器1和定时器3各输出两路PWM信号。为实现同步,配置定时器3为从模式,使用定时器1的触发输出(TRGO)进行同步复位。
4.1 CubeMx中的配置
4.1.1 定时器1的配置
图 6 CubeMx中定时器1的配置1
图 7 CubeMx中定时器1的配置2
4.1.2 定时器3的配置
图 8 CubeMx中定时器2的配置
4.2 程序中的配置
图 9 程序中的配置1
图 10 程序中的配置2
5 实验效果
实验结果如图10和图11所示,定时器1和定时器3的PWM输出同步,周期为10kHz,占空比为25%;定时器1的更新事件在下溢点触发,每个增\减计数周期触发1次。
图 11 实验效果1-PWM信号周期、占空比、同步关系
图 12 定时器1更新事件UEV触发时刻文章来源:https://www.toymoban.com/news/detail-775501.html
文章来源地址https://www.toymoban.com/news/detail-775501.html
到了这里,关于STM32使用CubeMx配置定时器输出PWM的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!