这个输出比较功能是非常重要的,它主要是用来输出PWM波形,PWM波形又是驱动电机的必要条件,所以你如果想用STM32做一些有电机的项目,比如智能车,机器人等。
IC: Input Capture 输入捕获
CC:Capture/Compare一般表示输入捕获和输出比较的单元
CNT和CCR在哪里呢?下图所示就是我们的输出比较电路。
这个输入/比较寄存器是输入捕获和输出比较共用的,当输入捕获时,它就是捕获寄存器,当使用输出比较时,他就是比较寄存器,那在输出比较这里,这块电路会比较CNT和CCR(输入捕获和输出比较寄存器)的值。CNT计数自增,CCR是我们给定的一个值,当CNT大于CCR,小于CCR,或者等于CCR时,这里的输出就会对应的置1,置0,置1,置0.这样就可以输出一个电平不断跳变的PWM波形了,这就是输出比较的基本功能。
由图知,高级定时器和通用定时器都有四个输出比较的通道,可以同时输出四路PWM波形。这四个通道有各自的CCR寄存器,但是他们是共用一个CNT计数器的,
高级定时器还拥有额外死区生成,互补输出,这个是用于驱动三相无刷电机。
什么事PWM波形:
这个PWM波形是一个数字输出信号,也是由高低电平组成的。使用这个PWM波形,是用来等效地实现一个模拟信号的输出。
PWM的秘诀就是,天武功,唯快不破,只要我闪的足够快,你就发现不了我到底是闪着亮着。还是一个正常的,平稳的亮度。当然,PWM的应用场景必须要是一个惯性系统,就是说LED在熄灭的时候,由于余晖和人眼视觉暂留现象。LED不会立马熄灭,而是有一定的惯性,过一段时间才会熄灭,电机也是,当电机断电时,电机的转动不会立马停止,而是有一定的惯性,过一会才停。
PWM的频率越快,那它等效模拟的信号就越平稳,性能开销也就越大,一般来说PWM的频率都是在几K到几十KHz,这个频率就已经足够快了,
分辨率:比如有的占空比只能以1%,2%,3%等这样以1%的步距跳变,那它的分辨率就是1%,所以这个分辨率就是占空比变化的精细程度。这个分辨率需要多高,得看你实际项目的需求。
如果你既要高频率,又要高分辨率,这就对硬件电路要求比较高了。
不过一般要求不高的话,1%的分辨率就已经够用了。
定时器的输出比较模块是怎么来输出PWM波形的。
在这个图里,左边就是CNT计数器和CCR1第一路的捕获/比较寄存器。他俩进行比较,当CNT>CCR1,或者相等时,它俩进行比较,就会给输出模式控制器传一个信号,然后输出模式控制器就会改变oc1ref的高低电平。REF信号实际上就是指这里信号的高低电平。REF是reference的缩写,意思是参考信号
上面有一个ETRF输入,这个是定时器的一个小功能,一般不用,不需要了解
接在这个REF信号可以前往主模式控制器,你可以把这个REF映射到主模式的TRGO输出上面。不过REF的主要去向还是下面那一条路。下图是一个极性选择。给这个寄存器写0,信号就会往上走,就是信号电平不翻转。进来啥用,出去也是啥样,写一的话,信号就会往下走,就是信号通过一个非门取反,那输出信号就是输入信号高低电平反转的信号这就是极性选择,就是选择是不是要把高低电平翻转一下。后面接的就是输出使能模式。决定要不要输出。最后就是OC1引脚,这个引脚就是CH1通道的引脚。在引脚定义表里就可以知道具体是哪个GPIO口了,
我们看一下输出模式控制器,它具体是怎么工作的,什么时候给REF高电平,什么时候给REF低电平,下面是八种模式,这个模式可以通过寄存器控制来进行配置。你需要哪个模式,就选择哪个模式,
第一个状态,冻结:维持原状态,就是CNT与CRR没有用,可以理解为CNT和CRR无效,REF保持为原状态。比如你正在输出PWM波,突然想暂停一会儿输出,那就可以设置成这个模式,一旦切换为冻结模式,输出就暂停了。并且高低电平也维持为暂停时刻的状态,保持不变。
下面三个模式,这个有效电平和无效电平,一般是高级定时器里面的一个说法,是和关断,刹车这些功能配合表述的,它说的比较严谨,所以叫有效电平和无效电平。为了理解方便,置有效电平就是置高电平,置无效电平就是置低电平这三个模式都是当CNT与CRR值相等时,执行操作,这些模式就可以用做波形输出了,比如相等时电平翻转这个模式,这个可以方便的输出一个频率可调,占空比始终为50%的PWM波形,比如你设置CCR为0时,那当CNT每次清零时,就会产生一次CNT =CCR的事件,这就会导致输出电平翻转一次,每更新两次,输出为一个周期。并且高电平和低电平的时间是始终相等的,也就是占空比始终为50%。当你改变定时器更新频率时,输出波形的频率也会随之改变。它俩的关系是输出波形的频率=更新频率/2;因为更新两次输出才为一个周期。这个就是匹配时电平翻转模式的用途。
强制为无效电平和强制为有效电平,这两个模式和冻结模式差不多,如果你想暂停波形输出,并且在暂停期间保持低电平和高电平,那你就可以设置这两个强制输出模式。
最后两个模式很重要,PWM模式1,PWM模式2,它们可以用来输出频率和占空比都可调的PWM波形。也是我们主要使用的模式,
一般我们只使用向上计数,PWM2实际就是PWM1输出取反。 有下图可知,REF输出之后还有一个极性的配置,所以使用PWM模式1的正极性和使用PWM模式2的反极性最终输出结果是一样的。
所以使用的话,我们可以只使用PWM模式1,并且向上计数,这一种模式就OK了,那这个模式是如何输出频率和占空比都可调的PWM波形的呢?
看下图:左上角是时基单元和运行控制部分,黑色箭头左边是时钟源选择,我们省略了,然后更新事件的中断申请,我们不需要了。输出PWM暂时还不需要中断,这就是时基单元的部分,配置好了时基单元,这里的CNT就可以开始不断地自增运行了。下面绿色的就是输出比较部分,总共四路,
这里是PWM模式1的执行逻辑
占空比是受CCR调控的,CCR高一些,,输出的占空比就变大,CCR低一些,输出的占空比就变小,
这里的REF就是一个频率可调,占空比也可调的PWM波形,最终经过极性选择,输出使能,最终通向GPIO口,这样就能完成PWM波形的输出了。
我们看一下PWM的参数是如何计算的吧,
首先是PWM频率,它始终对应着计数器的一个溢出更新周期,所以PWM的频率就等于计数器的更新频率,
ARR越大,CCR的范围就越大,对应的分辨率就越大。定义的分辨率是占空比最小的变化步距。所以这个值越小越好。也可以吧CCR的值定义为分辨率,那就是值越大越好。总之,就是占空比变化越细腻越好。
如果我要求输出一个频率为1KHz,占空比课任意调节,且分辨率为1%的PWM波形,可以利用上面公式思考一下。
STM32的外部设备:
可以用PWM信号来控制舵机输出轴的角度,直流电机,可以用PWM来控制电机的速度。
舵机有三根线,两根是电源线,一个是信号线,我们的PWM就是输如到这个信号线的,来控制舵机。有一个白色的输出轴,它的轴会固定在一个指定的角度不动,至于固定在哪个位置,是由信号线的PWM信号来决定的。低舵机还有个控制电路板,是一个电机控制系统,大概的执行逻辑是:PWM信号输入到控制板,给控制板一个指定的目标角度,然后电位器检测输出轴的当前角度,如果大于目标角度,电机就会反转,最终使输出轴固定在指定角度。
舵机的PWM波形,实际是当做一个通信协议来使用的,
一般电机都是大功率设备,它的驱动设备也必须是一个大功率的输出设备
TB6612驱动芯片:
VM电机电源的正极,要接一个可以输出大电流的电源。
AO1,AO2,BO1,BO2就是两路电机的输出了。AO1,AO2就是A路的两个输出,它的控制端就是上面的这三个,PWMA.AIN2,AIN1,这三个引脚控制A路的一个电机。那这三个引脚就直接接到单片机的GPIO口就行了,其中PWMA引脚要接PWM信号输出端,其他两个引脚可以接任意两个普通的GPIO口。那这三个给一个低功率的控制信号,驱动电路就会从VM汲取电流,来输出到电机。这样就能完成低功率的控制信号控制大功率设备了。
STBY(Stand By),待机控制脚。如果接GND,芯片就不工作,处于待机状态,接VCC,正常工作。
那这三个脚是如何控制电机正反转和速度的呢?
下图,输入必须为一高一低才行,有电压差,电机可以转,但是还是要看PWM的波形,PWM给低电平,输出两个低电平,电机还是不转,如果PWM是一个不断翻转的电平信号那电机不就是快速的反转,停止,反转,停止,如果PWM频率足够快,那电机就可以稳定的反转。并且速度取决于PWM信号的占空比。这里的PWM相当于一个模拟量的功能。