输出比较简介
输出比较简介
主要是用来输出PWM波形,这个波形是驱动电机的(智能车和机器人等)必要条件
OC(Output Compare)输出比较,还有IC,全称是Input Capture,意为输入捕获,还有CC,全称是Capture/Compare,一般表示的是输入捕获和输出比较的单元
输出比较可以通过比较CNT与CCR(捕获/比较寄存器)寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
这个捕获/比较寄存器是输入捕获和输出比校共用的,当使用输入捕获时,它就是捕获寄存器,当使用输出比较时,它就是比较寄存器,那在输出比较这里,这块电路会比较CNT和CCR的值,CNT计数自增,CCR是我们给定的一个值,当CNT大于CCR、小于CCR或者等于CCR时,TIMx_CH1输出就会对应的置1、置0、置1、置0
每个高级定时器和通用定时器都拥有4个输出比较通道
高级定时器的前3个通道额外拥有死区生成和互补输出的功能:驱动三相无刷电机的
PWM波形简介
PWM(Pulse Width Modulation)脉冲宽度调制:是一个数字输出信号,也是由高低电平组成的
在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域
我们让LED不断点亮、熄灭、点亮、熄灭,当这个频率足够大的时候,LED就不会闪烁了,而是呈现一个中等亮度,当我们调控这个点亮和熄灭的时间比例时,就能让LED呈现出不同的亮度级别,对于电机调速也是一样的,我们以一个很快的频率,给电机通电、断电、通电、断电,那么电机的速度就能维持在一个中等速度,这就是PWM的基本思想(天下武功,唯快不破)
PWM的应用场景必须要是一个惯性系统,就是说LED在熄灭的时候,由于余晖和人眼视觉暂留现象,LED不会立马熄灭,而是有一定的惯性,过一小段时间才会熄灭,电机也是,当电机断电时,电机的转动不会立马停止,而是有一定的惯性,过一会儿才停
这种高低电平跳变的数字信号,它是可以等效为中间这个虚线所表示的模拟量的,当这个上面电平时间长一点,下面电平时间短一点的时候,那等效的模拟量就偏向于上面(反之亦然)
PWM的频率越快,那它等效模拟的信号就越平稳,不过同时性能开销就越大
一般来说PWM的频率都在几K到几十KHz,这个频率就已经足够快了
占空比就是高电平时间相对于整个周期时间的比例,占空比决定了PWM等效出来的模拟电压的大小,占空比越大,那等效的模拟电压就越趋近于高电平,占空比越小,那等效的模拟电压就越趋近于低电平,这个等效关系一般来说是线性的,比如高电平是5V,低电平是0V,那50%占空比就等效于中间电压,就是2.5V,20%占空比就等效于,1/5处的电压,就是1V
那最后一个参数就是分辨率,它等于占空比变化步距,比如有的占空比只能是1%、2%、3%等等这样以1%的步距跳变,那它的分辨率就是1%,所以这个分辨率就是占空比变化的精细程度,这个分辨率需要多高,得看你实际项目的需求,如果你即要高频率,又要高分辨率,这就对硬件电路要求比较高了,不过一般要求不高的话,1%的分辨率就已经足够使用了
定时器的输出比较模块是怎么输出PWM波形的呢?
这里这个图是高级定时器前三个通道的输出比较部分电路
这个图是通用定时器的输出比较部分电路,包括高级定时器的第四个通道和这个结构也基本是一样的,这个图是通用定时器下面这个地方的放大版
左边就是CNT计数器和CCR1第一路的捕获/比较寄存器,它俩进行比较,当CNT>CCR1,或者CNT=CCR1时,就会给这个输出模式控制器传一个信号,然后输出模式控制器就会改变它输出OC1REF的高低电平,REF(reference的缩写,意思是参考信号)信号实际上就是指这里信号的高低电平,然后上面这里还有个ETRF输入,这个是定时器的一个小功能,一般不用,不需要了解,接着这个REF信号可以前往主模式控制器,你可以把这个REF映射到主模式的TRGO输出上去,不过REF的主要去向还是下面这一路,通过下面这一路到达一个极性选择,给这个寄存器写0,信号就会往上走,就是信号电平不翻转,进来啥样出去还是啥样,写1的话,信号就会往下走,就是信号通过一个非门取反
极性选择:选择是不是要把高低电平反转一下,接着就是输出使能电路了,选择要不要输出,最后就是OC1引脚,这个引脚就是CH1通道的引脚,在引脚定义表里就可以知道具体是哪个GPIO口了
输出模式控制器具体是怎么工作的呢?什么时候给REF高电平,什么时候给REF低电平?
下面是输出比较的8种模式,也就是输出模式控制寄存器里面的执行逻辑,这个模式控制器的输入CNT和CCR的大小关系,输出是REF的高低电平,里面可以选择多种模式来更加灵活地控制REF输出,这个模式可以通过寄存器来进行配置
模式 | 描述 |
---|---|
冻结 | CNT=CCR时,REF保持为原状态(CNT和CCR无效,REF保持为原状态,比如你正在输出PWM波,突然想暂停一会儿输出,并且高低电平也维持为暂停时刻的状态,保持不变,就可以设置成这个模式) |
匹配时置有效电平 | CNT=CCR时,REF置有效电平(高电平) |
匹配时置无效电平 | CNT=CCR时,REF置无效电平(低电平) |
匹配时电平翻转 | CNT=CCR时,REF电平翻转(这个可以方便地输出一个频率可调,占空比始终为50%的PWM波形,比如你设置CCR为0,那CNT每次更新清0时,就会产生一次CNT=CCR的事件,这就会导致输出电平翻转一次,每更新两次,输出为一个周期,并且高电平和低电平的时间是始终相等的,也就是占空比始终为50%,当你改变定时器更新频率时,输出波形的频率也会随之改变,它俩的关系是输出波形的频率=更新频率/2,因为更新两次输出才为一个周期,这就是匹配时电平翻转模式的用途) |
强制为无效电平 | CNT与CCR无效,REF强制为无效电平 |
强制为有效电平 | CNT与CCR无效,REF强制为有效电平 |
PWM模式1 | 向上计数:CNT<CCR时,REF置有效电平,CNT≥CCR时,REF置无效电平(用这个) 向下计数:CNT>CCR时,REF置无效电平,CNT≤CCR时,REF置有效电平 |
PWM模式2 | 向上计数:CNT<CCR时,REF置无效电平,CNT≥CCR时,REF置有效电平 向下计数:CNT>CCR时,REF置有效电平,CNT≤CCR时,REF置无效电平 |
这个有效电平和无效电平,一般是高级定时器里面的一个说法,是和关断、刹车这些功能配合表述的,它说的比较严谨
为了理解方便,可以直接认为,置有效电平就是置高电平,置无效电平就是置低电平,这样就行了,这三个模式都是当CNT和CCR值相等时,执行操作
上面这两个相等时置高电平和低电平,感觉用途并不是很大,因为他们都只是一次性的,置完高或低电平后,就不管事了,所以这俩模式不适合输出连续变化的波形,如果你想定时输出一个一次性的信号,那就考虑这两个模式
强制为无效电平和强制为有效电平:这两个模式是CNT与CCR无效,REF强制为无效电平或者强制为有效电平,这两个模式和冻结模式差不多,如果你想暂停波形输出,并目在暂停期间保持低电平或者高电平
PWM1和PWM2这两个模式就很重要了,它们可以用于输出频率和占空比都可调的PWM波形,也是我们主要使用的模式
PWM2实际上就是PWM1输出的取反,改变PWM模式1和PWM模式2,就只是改变了REF电平的极性而已
从上面这个图125
里可以看到,REF输出之后还有一个极性的配置,所以使用PWM模式1的正极性和PWM模式2的反极性最终的输出是一样的,这里设计的比较灵活,输出模式里可以设置极性,最终输出之前也可以设置极性,所以使用的话,我们可以只使用PWM模式1,并且是向上计数这一种模式就行了,那这种模式是怎么输出频率和占空比都可调的PWM波形的呢
只是计数器那附近的更新事件的中断申请,我们不需要了,输出PWM暂时还不需要中断
配置好了时基单元,这里的CNT就可以开始不断地自增运行了
下面就是输出比较单元了,总共有4路,输出比较单元的最开始,是CCR(我们自己设置的)捕获/比较寄存器,CNT不断自增运行,同时它俩还在不断进行比较,后面这个就是输出模式控制器了,以PWM模式1为例子来讲解了
这里蓝色线是CNT的值,黄色线是ARR的值,蓝色线从0开始自增,一直增到ARR,也就是99,之后清0继续自增,在这个过程中,我们再设置一条红色线,这条红色线就是CCR,比如我们设置CCR为30,之后再执行输出模式控制器的这个逻辑,下面绿色线就是输出,可以看到,在这一块,CNT<CCR,所以置高电平,之后这里,CNT就≥CCR了,所以就变为低电平,当CNT溢出清0后,CNT又小于CCR,所以置高电平,这样一直持续下去,REF的电平就会不断变化,并且它的占空比是受CCR值的调控的,如果CCR设置高一些,输出的占空比就变大
这里REF,就是一个频率可调,占空比也可调的PWM波形,最终再经过极性选择,输出使能,最终通向GPIO口,这样就能完成PWM波形的输出了
PWM波形参数的计算
PWM频率:
F
r
e
q
=
C
K
_
P
S
C
/
(
P
S
C
+
1
)
/
(
A
R
R
+
1
)
Freq = CK\_PSC / (PSC + 1) / (ARR + 1)
Freq=CK_PSC/(PSC+1)/(ARR+1) 等于计数器的更新频率
PWM占空比:
D
u
t
y
=
C
C
R
/
(
A
R
R
+
1
)
Duty = CCR / (ARR + 1)
Duty=CCR/(ARR+1)
PWM分辨率:
R
e
s
o
=
1
/
(
A
R
R
+
1
)
Reso = 1 / (ARR + 1)
Reso=1/(ARR+1) 占空比最小的变化步距,总之就是占空比变化的越细腻越好
从上面这个图可以看出,CCR的值应该设置在0到ARR+1这个范围里,CCR=ARR+1时,占空比就正好是100%,如果CCR再大一些,那占空比就始终是100%,没有意义了,所以CCR的变化范围取决于ARR的值,ARR越大,CCR的范围就越大,对应的分辨率就越大
上图高级定时器部分自己了解就好
29:00