【FOC】01_PWM配置
网络上对STM32系列MCU的高级定时器输出PWM的配置层出不穷,本篇文章主要用于笔者的记录。
一、FOC中的常用配置项
1、PWM生成通道和PWM互补生成通道
在CUBEMX选中高级定时器后,右侧会出现定时器的通道配置。以TIM1为例,通道1、2、3均可 PWM Generation CHx 和 PWM Generation CHxN 以及 PWM Generation CHx CHxN 。
其中,PWM Generation CHx 代表将定时器的通道1配置为仅PWM输出,即只在定时器通道对应的PWM输出引脚输出PWM波。
PWM Generation CHxN代表将定时器的通道1配置为仅PWM互补输出,即只在定时器通道对应的PWM互补引脚输出PWM波,这个波形是一个与你的配置项互补的方波。
PWM Generation CHx CHxN则代表在定时器通道对应的PWM输出引脚和PWM互补输出引脚均输出PWM波,且二者的PWM波是互补的。
一般来说,很少会有单独配置PWM Generation CHxN的情况,在FOC控制中,在线性调制区内进行矢量控制时,每一个半桥不是上管打开就是下管打开,为了控制的简单,最好的方法就是输入到MOS的开关信号是两个互补的方波信号,使用高级定时器的PWM互补输出这个功能就可以很好的解决这个问题。当然针对于一些栅极驱动芯片,我们甚至只需要输出一个PWM信号到驱动芯片,驱动芯片会自动的输出一对互补的开关信号用于MOS上下管子的开关,使得控制更加简单。

2、计数配置
定时器生成PWM的原理是很简单的,在此之前我们先回顾一下定时器的定时模式。
首先有一个叫ARR的寄存器,也叫自动重载值寄存器,它的存在决定了定时器的周期长度,例如定时器的频率为170Mhz,并且我并不选择分频,当我设置ARR为4250-1时,说明本次计数值(CNT)最多计数到4250。
那么就很明确了,当CNT从0加到4250,或CNT从4250减到0,甚至先从0加到4250再从4250减到0也是可以的。由此可以知道,对于定时器的定时而言,存在三种模式,分别是向上模式、向下模式以及向上向下模式(或称中心对齐模式)。
- 对于向上模式,CNT从0加到4250,产生一次上溢出,周期等于 1/170Mhz *
4250,那么定时器溢出的频率为170Mhz/4250 = 40Khz。 - 对于向下模式,CNT从4250减到0,产生一次下溢出,周期等于 1/170Mhz *
4250,那么定时器溢出的频率为170Mhz/4250 = 40Khz。 - 对于中心对齐模式,CNT从0加到4250再减回到0(一次上溢、一次下溢出),周期等于 1/170Mhz *
4250,那么定时器溢出的频率为170Mhz/4250 = 40Khz。
当然,还有一个问题,如果在运行过程中,我们对ARR值进行改动,这个改动的值是在当前周期生效,还是等到产生了Update事件,也就是下一个周期后生效呢?很显然,这两种情况对波形的影响是不同的,在STM32中,定时器有一个配置项叫做预装载(auto -reload preload),如果使能了预装载,那么对ARR的改动会在Update事件产生后才会生效;如果关闭了,ARR的改动会实时生效。
默认情况下,每一次上溢、下溢都会产生一次Update事件,如果我们不希望Update事件的频率过高,在不修改定时器频率、自动装载值、分频器的情况下,我们还可以通过RCR寄存器来对其限制,也就是说 产生上溢、下溢时,必须要RCR也为0,才会产生Upadte事件。
例如,中心对齐模式下,假设设置RCR=1,那么就会有如下流程:
- CNT 加到 ARR 产生上溢事件,此时RCR=1,不产生Update,同时RCR-1
- CNT 从 ARR 减到 0 产生下溢事件,此时RCR=0,产生Update,同时让RCR再次等于1
可以发现,现在产生Update的频率变为了定时器上下溢出频率的1/2,由以前的40khz变为了20khz,也就是说
产生Update的频率 = 溢出频率/RCR + 1。
上述提到的配置如下图所示:

3、PWM配置
通过前面的计数配置,我们了解了定时器的定时原理,那么PWM在其基础上又是如何实现的呢?
以向上计数为例,当CNT加到ARR时,一个周期的计数就完成了,如果我可以在计数过程中选择一个点CCR,并且给这个点赋予一些意义。例如,当CNT大于0且小于CCR时,引脚输出搞电平。当CNT小于ARR且大于CCR时,引脚输出低电平。那么我们是不是就可以得到一个0~CCR为高,这个CCR~ARR为低的方波。同时我的CCR可以在0~ARR间滑动,当CMP逐渐增大时,方波的高电平时间会跟随着变长;当CCR逐渐减小时,方波的低电平时间会随着变短。这就是PWM的工作原理。
这个CCR,在CUBEMX中,叫做Pulse,它的取值范围为0~ARR,而CCR和CNT的关系和一个叫做PWM Mode的配置项是有关的,关系如下:
- PWM Mode1 当0 < CNT < CCR时,输出有效电平;当CCR < CNT < ARR时,输出无效电平,这和我们前面的例子是一样的
- PWM Mode2 当0 < CNT < CCR时,输出无效电平;当CCR < CNT < ARR时,输出有效电平
这里之所以称有效电平/无效电平,是因为PWM的通道还存在一个概念叫做极性(Polarity),当我们设置极性为高时,对应着有效电平就是高电平。所以在极性为高电平时,我们可以知道:
- PWM Mode1 下的占空比为:(CCR / ARR + 1) 这里加1是因为配置ARR时我们一般会-1写入
- PWM Mode2 下的占空比为:((ARR + 1-CCR) / ARR + 1)
当然,在中心对称模式下,由于CNT会经历向上和向下两个阶段,那么不难想象产生的方波将会是中心对称的。
例如:
- 极性为高时,PWM Mode1的情况下,高电平将位于PWM周期的两侧,低电平位于中心。
- 极性为高时,PWM Mode2的情况下,低电平将位于PWM周期的两侧,高电平位于中心,FOC一般用这个模式。
这也是中心对称模式的由来。
最后,在运行过程中对PWM通道的CCR寄存器进行改动和对定时器的ARR寄存器进行改动都存在何时应用到波形上的问题,是立即应用到还是等到下一个Update事件,PWM的通道也可以进行preload的配置,FOC一般会打开预装载。
具体的配置项如下图所示:

4、刹车和死区配置
未完待续...