目录
声明:本专栏是本人跟着B站江科大的视频的学习过程中记录下来的笔记,我之所以记录下来是为了方便自己日后复习。如果你也是跟着江科大的视频学习的,可以配套本专栏食用,如有问题可以QQ交流群:963138186
本节我们来继续学习STM32定时器的输出比较功能,这个输出比较功能还是非常重要的。它主要是用来输出PWM波形的。PWM波形又是驱动电机的必要条件。所以如果想用STM32做一些有电机的项目,比如智能车机器人等,这个输出比较功能就要好好学。
输出比较简介
OC(Output Compare)输出比较(另外还有IC全称是input capture输入捕获,CC全称是capture/compare表示输入捕获和输出比较单元)
输出比较可以通过比较CNT(时基单元的计数器)与CCR(R是register寄存器)寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
CNT与CCR就是在这里
这个捕获/比较寄存器是输入捕获和输出比较共用的
当使用输入捕获时,它就是捕获寄存器。当使用输出比较时,它就是比较寄存器。
在输出比较这里,这块电路会比较CNT和CCR的值,CNT计数自增,CCR是我们给定的一个值。当CNT大于CCR、小于CCR或者等于CCR时,这里输出就会对应的置1、置0、置1、置0。这样就可以输出一个电平不断跳变的PWM波形了,这就是输出比较的基本功能。
每个高级定时器和通用定时器都拥有4个输出比较通道
高级定时器的前3个通道额外拥有死区生成和互补输出的功能
基本定时器并没有输入捕获和输出比较的功能,所以我们本节的功能不能在基本定时器上使用。然后通用定时器和高级定时器,这里都有四个输出比较的通道,可以同时输出四路PWM波形。这四个通道有各自的CCR寄存器,但是他们是共用一个CNT计数器的。
然后高级定时器这里前三个输出比较通道,还额外具有死区生成和互补输出的功能,这个是用于驱动三项无刷电机的。
本节我们主要学习的是这个通用定时器的输出比较功能。
PWM简介
什么是PWM波形?
简单一句话PWM就是脉冲宽度调制,关于PWM的介绍我之前在51单片机专栏有详细写过,没有基础的可以先去看看再回来:
单片机学习笔记---直流电机驱动(PWM)_pwm波可以直接驱动电机嘛-CSDN博客
单片机学习笔记---LED呼吸灯&直流电机调速-CSDN博客
数字输出端口控制led按理说LED只能完全亮和完全灭两种状态。怎能实现控制亮度大小?
这里简单概括就是:通过这个PWM波形就可以实现。我们让led不断点亮熄灭,点亮熄灭。当这个点亮熄灭的频率足够大时,led就不会闪烁了,而是呈现出一个中等亮度。当我们调控这个点亮和熄灭的时间比例时,就能让led呈现出不同的亮度级别。对于电机调速也是一样,以一个很快的频率给电机通电断电,通电断电,电机的速度就能维持在一个中等速度,这就是PWM的基本思想。
我们直接把之前学51单片机的时候的结论搬过来:
Ton的时间长Toff时间短电机会快,Ton的时间短Toff时间长电机会慢;
LED亮的时长比LED灭的时长要久,那么灯看上去就比较亮
我们再补充一下,之前学51的时候我们所说的精度就是分辨率,这里的分辨率就是占空比变化步距,比如有的占空比只能是1%,2%,3%等等。这样以1%的步距跳变,它的分辨率就是1%。所以这个分辨率就是占空比变化的细腻程度。这个分辨率需要多高,得看你实际项目的需求,如果你既要高频率又要高分辨率,这又对硬件电路要求比较高了。不过一般要求不高的话,1%的分辨率就也已经足够使用了。
使用PWM波形就可以在数字系统等效输出模拟量,就能实现led控制亮度、电机控速等功能了。
接下来我们就来具体的分析一下,定时器的输出比较模块是怎么来输出PWM波形的。
定时器的输出比较模块是怎么来输出PWM波形
高级定时器前三个通道的输出比较部分电路
这个图是高级定时器前三个通道的输出比较部分电路:
通用定时器的输出比较部分电路
下面这个图是通用定时器的输出比较部分电路,包括高级定时器的第四个通道,结构也基本是一样的。
这个图对应的就是这部分电路:
左边是CNT和CCR比较的结果,右边就是输出比较电路。最后通过TIM_CH1输出到GPIO引脚上。
然后下面还有三个同样的单元,分别输出到CH2、CH3、Ch4
在这个图里,左边就是CNT计数器和CCR1第一路的捕获/比较计算器。
当CNT>CCR1或者CNT=CCR1时,就会给这个输出模式控制器传一个信号。然后输出模式控制器就会改变它输出OC1REF的高低电平,REF(REFerence)意思是参考信号。
然后上面还有个ETRF输入,这是定时器的一个小功能,一般不用不需要了解。
接着这个REF信号可以前往主模式控制器,可以把这个REF映射到主模式的TRGO输出上。
不过REF的主要去向还是下面这一路。通过下面这一路到达极性选择,给这个寄存器写0,信号就会往上走,就是信号电平不翻转,进来啥样出去还是啥样,写1的话,信号就会往下走,就是信号通过一个非门取反,输出的信号就是输入信号,高低电平反转的信号,这就是极限选择,就是选择是不是要把高低电平反转一下。
选择后接着就是输出使能电路了,选择要不要输出。
最后就是OC1引脚,这个引脚就是CH1通道的引脚。在引脚定义表里就可以知道具体是哪个GPIO口了。
输出模式控制器具体是怎么工作
接下来我们还需要看一下这个输出模式控制器具体是怎么工作的,什么时候给REF高电平,什么时候给REF低电平。
我们看一下下面的这个表,这就是输出比较的八种模式,也就是这个输出模式控制器里面的执行逻辑。
这个模式控制器的输入是CNT和CCR的大小关系,输出是REF的高低电平,里面可以选择多种模式来更加灵活的控制REF输出。
这个模式可以通过寄存器来进行配置,你需要哪个模式就可以选哪个模式。
具体都是怎操作的?
第一个模式是冻结,描述是CNT等于CCR时,REF保持为原状态,CNT等于CCR时维持原状态。其实这个CNT和CCR就根本没有用,所以你也可以把它理解成CNT和CCR无效。REF保持为原状态。这个模式也比较简单,根本就不管CNT谁大谁小,直接REF保持不变,维持上一个状态就行了。这有什么用?比如正在输出PWM波形,突然想暂停一会儿输出,就可以设置成这个模式。一旦切换为冻结模式后输出就暂停了。并且高低电平也维持为暂停时刻的状态,保持不变,这就是冻结模式的作用。
然后接着看下面这三个模式
有效电平和无效电平一般是高级定时器里面的一个说法,是和关断、刹车这些功能配合表述的,说的比较严谨,所以叫有效电平和无效电平。在这里为了理解方便,可以直接认为是有效电平就是置高电平,无效电平就是置低电平。这三个模式都是当CNT与CCR值相等时执行操作。这些模式就可以用作波形输出了。
比如相等时电平翻转这个模式可以方便的输出一个频率可调,占空比始终为50%的PWM波形。比如设置CCR为零,CNT每次更新清零时,就会产生一次CNT等于CCR的事件,这就会导致输出电平翻转一次。每更新两次输出为一个周期,并且高电平和低电平的时间是始终相等的,也就是占空比始终为百分之五十。
当你改变定时器更新频率时,输出波形的频率也会随之改变,它俩的关系是输出波形的频率=更新频率/2,因为更新两次输出才为一个周期(周期等于2倍,频率等于一半)这就是这个匹配时电平翻转模式的用途。
上面这两个模式用途并不是很大,因为它们都只是一次性的,置完高或低电平后就不管事了。所以这俩模式不适合输出连续变化的波形。如果你想定时输出一个一次性的信号,可以考虑一下这两个模式。
然后继续看一下下面这里的两个模式
这两个模式是CNT与CCR无效,REF强制为无效电平或者强制为有效电平。这里这两个模式和冻结模式也差不多。如果想暂停波形输出,并且在暂停期间保持低电平或者高电平,就可以设置这两个强制输出模式。
接下来看一下最后两个模式,
他们可以用于输出频率和占空比都可调的PWM波形,也是我们主要使用的模式。
一般我们都只使用向上计数。所以这里向下计数的描述我们就暂时不看,其实基本思想都是一样的。
PWM模式2实际上就是PWM模式1输出的取反。改变PWM模式1和PWM模式2,就只是改变了REF电平的极性而已。
从这个图里可以看到,REF输出之后,还有一个极性的配置,所以使用PWM模式1的正极性和PWM模式2的反极性,最终的输出是一样的。
我们可以只使用PWM模式1并且是向上计数这一种模式就行了。
这种模式是怎么输出频率和占空比都可调的PWM波形?
PWM的基本结构
左边是时钟源选择,这里省略了。
这里更新事件的中断申请,我们不需要,输出PWM暂时还不需要中断。
配置好时基单元CNT就可以开始不断的自增运行了。然后下面这里就是输出比较单元了,总共有四路。
CCR是我们自己设置的,CNT不断自增运行,同时它俩还在不断进行比较。后面就是输出模式控制器,以PWM模式1为例子来讲解,所以图中是PWM模式1的执行逻辑。
回归我们的问题:这种模式是怎么输出频率和占空比都可调的PWM波形?
先看这个图:
比如我们设置CCR为30,之后再执行这里的这个逻辑下面
之后这样一直持续下去,REF的电平就会不断变化,并且它的占空比是受CCR值调控的。如果CCR设置高一些,输出的占空比就变大。CCR设置低一些,输出的占用比就变小,这就是PWM模式的工作流程。
这里REF就是一个频率可调,占空比也可调的PWM波形,最终再经过极限选择,输出是使能,最终通向GPIO口,这样就能完成PWM波形的输出了。
接下来我们就再来看一下PWM的参数是如何计算的。
因为计数器的计数周期时钟等于PWM波形输出的周期,所以PWM的频率就等于计数器的更新频率。
所以这个式子PWM频率:Freq = CK_PSC / (PSC + 1) / (ARR + 1)也就是计数器的更新频率公式。
这个式子PWM分辨率:Reso = 1 / (ARR + 1)定义的是占空比最小的变化步距,这个值越小越好。
也可以把CCR的范围定义成分辨率,那就是值越大越好。总之就是占空比变化的越细腻越好。
最后我们简单的看一下高级定时器的输出比较电路。这个电路大家仅做了解即可,不需要掌握。从这里画一个圈,把这个圈里面的东西去去掉,它就跟通用定时器的电路是一样的了,这里就不再赘述了。
接下来我们就来看一下STM32的外部设备。
STM32的外部设备
舵机简介
舵机是一种根据输入PWM信号占空比来控制输出角度的装置
输入PWM信号要求:周期为20ms,高电平宽度为0.5ms~2.5ms(即占空比范围)
上图就是我们学习用的舵机,型号SG90,它有三根输入线,两根是电源线,一根是信号线。我们的PWM就是输入的这个信号线来控制舵机的。
在这边有一个白色的输出轴,它的轴会固定在一个指定的角度不动。至于固定在哪个位置,是由信号线的PWM信号来决定的,这个是舵机的工作方式。
然后中间这个是舵机的一个拆解图,舵机其实并不是一种单独的电机,它的内部是由直流电机驱动的,它里面还有一个控制电路板,是一个电机的控制系统。
大概的执行逻辑是PWM信号输入到控制板,给控制板一个指定的目标角度,然后这个电位器检测输出轴的当前角度,如果大于目标角度,电机就会反转,如果小于目标角度,电机就会正转。最终使输出轴固定在指定角度,这就是舵机的内部工作流程,但不管怎样,我们就只需要知道输入一个PWM波形输出轴固定在一个角度就行了。
这个范围对应的输出角度,看一下右边的这个图:
这里PWM波形它其实是当做一个通信协议来使用的。跟之前说的用PWM等效一个模拟输出关系不大,把PWM当成一个通信协议,也是一个比较常见的应用。因为很多控制器都有PWM输出的功能,而且PWM只需要一根信号线就行了,这也是一种应用形式。
实际应用的话,比如机器人、机械臂,可以用舵机来控制关节,遥控车,遥控船,可以用舵机来控制方向。还有一些其他的机械结构,都可以考虑用一下这个舵机。这些就是舵机的大概介绍了。
舵机的硬件电路
5V舵机就接+5V,黄色是信号线接PWM信号。
这里的线和我们上面这个舵机线的颜色不太一样。这里是棕色是电源负,红色是电源正,橙色是信号线,但引脚顺序是一样的。
+5V是电机的驱动电源,一般电机都是大功率设备,它的驱动电源也必须是一个大功率的输出设备。如果能像这样单独提供供电,就再好不过了。如果不能,也要注意电源的功率是不是能达标,如果单独供电的话,供电的负极要和STM32供地,然后正极接在5V供电引脚上。
对于我们学习用的套件的话,可以直接从stlink或者DAP的5V输出脚引一根线接到这里,这样就是使用usb的5V供电,也是可以带得动的,这就是供电。最后就是信号线PWM就直接接到STM32引脚上就行了,比如PA0。因为这个舵机内部是有驱动电路的,所以我们单片机的引脚就可以直接接到这里来。我们这个PWM只是一个通信线,是不需要大功率的。
直流电机及驱动简介
直流电机是一种将电能转换为机械能的装置,有两个电极,当电极正接时,电机正转,当电极反接时,电机反转。
直流电机属于大功率器件,GPIO口无法直接驱动,需要配合电机驱动电路来操作。
注意:电机这类器件基本上都属于大功率设备,必须要加驱动电路才能控制。、
现在市面上也有很多驱动电路可以选择,比如TB6612,DRV8833,L9110,L298N等等这些都是比较常见的电机驱动芯片。另外还有一些用分离元件MOS管搭建的电路,这个功率可以做的更大一些。
我们本课程就直接使用TB6612这款电机驱动芯片来驱动电机的。TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速和方向
这个芯片里面是有两路驱动电路的,可以独立的控制两个电机。又因为它是h桥型的驱动电路,里面一路有四个开关管,所以就可以控制正反转。有些芯片只能控制电机在一个方向转。
然后这个就是h桥电路的基本结构
它是由两路推挽电路组成的。
左边这个,上管导通下管断开,左边输出就是接待VM的电机电源正极。下管道通从上管断开,就是接在PGND的电源负极。
如果有两路推挽电路中间,这里接一个电机。左上和右下导通,电流就是从左流向右边。右上和左下导通,电流就反过来了,从右边流向左边。h桥可以控制电流流过的方向,所以它能控制电极正反转。
这就是这个电机驱动芯片内部的部分电路。
我们接下来就来看一下怎么用这个驱动芯片,看一下硬件电路。
左下角vm就是电机电源的正极了,这个和刚才舵机的电源要求是一样的,要接一个可以输出大电流的电源。vm是驱动电压输入端,范围是4.5V到10V,这个电压一般和电机额定电压保持一致。比如如果是5V的电机,这里就接5V。如果你是7.2V的电机,这里就接7.2V。
这个VCC这个要和控制器的电源保持一致。比如使用STM32是3.3V的器件,就接3.3V,如果是51单片机5V,就接5V。这个引脚并不需要大功率,所以可以和控制器共用一个电源。
然后第三个引脚是GND这个就接系统的负极就行了。
然后板子右边还有两个GND,这个都是一样的,应该在板子内部都是连通的,随便选一个GND就可以。
AO1、AO2、BO1、BO2就是两路电机的输出了,可以像这样分别接两个电机
AO1、AO2就是a路的两个输出,它的控制端就是上面的这三个:
控制关系这里对应关系用灰色填充标出来了。
这三个引脚就直接接到单片机的GPIO口就行了,其中PWMA引脚要接PWM信号输出端。其他两个硬件可以任意接两个普通的GPIO口。这三个引脚给一个低功率的控制信号,驱动电路就会从vm汲取电流来输出到电机,这样就能完成低功率的控制信号控制大功率设备的目的了。
然后右边这一路也是一样,两路的功能和操作方法是完全一样的。
STBY引脚是待机控制脚,如果接GND芯片就不工作处于待机状态。如果接逻辑电源VCC,芯片就正常工作。这个引脚如果不需要待机模式的话,可以直接接VCC 3.3V。如果需要的话,可以任意接一个GPIO,给高低电平就可以控制了。
这就是这个电机驱动板的硬件链路。
这三个引脚是如何控制电机正反转和速度的?
我们看一下这个表:
如果IN1和IN2全都接高电平,两个输出O1和O2就都为低电平,这样两个输出没有电压差,电机是不会转的。
如果IN1和IN2全都接低电平,输出O1和O2直接关闭,这样电机也是不会转的。
全高或全低,电机都不能转,剩下的就只有一高一低了。
如果IN1给低电平,IN2给高电平,电机就是处于反转状态,转还是不转要取决于PWM。
如果PWM给高电平,输出就是一低一高有电压差了,电机可以转,这时候定义的是反转,开始转了。
如果PWM给低电平,输出两个低电平,电机还是不转,这就是反转的逻辑。
如果PWM是一个不断翻转的电平信号,电机就快速的反转、停止、反转、停止了,如果PWM频率足够快,电机就可以连续稳定的反转了,并且速度取决于PWM信号的占空比,这就是反转的工作流程。在这里的PWM就是我们之前讲的使用PWM来等效一个模拟量的功能。
然后看正转也是差不多,这里给IN1高电平IN2低电平,这样电机就是正转状态,是转还是不转要取决于PWM信号,PWM高则正转,低则停止。
有关这个电机驱动模块的介绍到这里就讲完了。
如果想要了解更多可以查看手册的这一章
我们本小节讲的是输出比较的部分,输入捕获这部分之后再讲。
本节到这里就结束,我们下节再来学习一下PWM的代码部分。
QQ交流群:963138186
本篇就到这里,下篇继续!欢迎点击下方订阅本专栏↓↓↓