文章目录
前言
提示:本文主要用作在学习江科大自化协STM32入门教程后做的归纳总结笔记,旨在学习记录,如有侵权请联系作者
本文主要探讨STM32定时器的输出比较功能。它主要是用来输出PWM波形的,PWM波形又是驱动电机的必要条件,我们可以利用这一特性做一些电机相关的项目,比如智能车、机器人等。
一、TIM输出比较简介
输出比较,它的英文是OC,全称是Output Compare,直译就是输出比较的意思(另外,还有IC,全称是Input Capture,意为输入捕获。还有CC,全称为Capture/Compare,一般表示的是输入捕获和输出比较的单元)。输出比较可以通过比较CNT计数器与CCR捕获/比较寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形,这就是输出比较模块最主要的功能。
每个高级定时器和通用定时器都拥有4个输出比较的通道,可以同时输出4路PWM波形,并且高级定时器的前3个通道额外拥有死区生成电路和互补输出的功能(用于驱动三相无刷电机)。4个输出比较通道都有独立的CCR寄存器,但是它们共用同一个CNT计数器。
二、PWM简介
2.1 PWM基本概念
PWM(Pulse Width Modulation),即脉冲宽度调制。PWM波形是一个数字输出信号,是由高低电平组成的,是一种对模拟电平信号进行数字编码的方法。在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制来等效地获得所需要的模拟参量,常应用于电机控速等领域。也就是说,使用PWM波形可以用来等效地实现一个模拟信号的输出。
以LED呼吸灯为例,按理来说LED只能有完全亮和完全灭两种状态,怎么来实现控制亮度大小呢?那通过这个PWM波形就能实现。我们可以让LED不断点亮、熄灭、点亮、熄灭。当点亮、熄灭的频率足够大时,由于LED的余晖和人眼的视觉暂留效应,LED就会呈现出一个中等亮度,当调控点亮和熄灭的时间比例时就能让LED呈现出不同的亮度级别,这就是通过控制PWM输出频率以及占空比实现LED呼吸灯的原理。对于电机调速也是一样的,我们以一个很快的频率给电机通电、断电、通电、断电,那么电机的速度就能维持在一个中等速度,这就是PWM的基本思想。
使用PWM波形,就可以在数字系统等效输出模拟量,就能实现LED控制亮度、电机控速等功能了。PWM的秘诀就是:天下武功,唯快不破(注意:只有在具有惯性的系统中,才能用PWM对模拟信号进行编码)
如下图所示,高低电平跳变的数字信号可以被等效地表示为中间虚线所表示的模拟量。当上面电平时间长一点,下面电平短一点的时候,等效的模拟量就偏向于上面。当下面电平时间长一点,上面电平时间短一点的时候,等效的模拟量就偏向于下面。也就是说,占空比越大,等效的模拟量就越趋近于数字量的高电平。占空比越小,等效的模拟量就越趋近于数字量的低电平,且这个等效关系一般而言是线性一一对应的。
2.2 PWM参数
如下图所示,Ts代表一个高低电平变换周期的时间。
在使用PWM对模拟量进行编码时,以下三个参数尤其重要:
频率 :f = 1 / Ts(周期的倒数就是频率),PWM的频率越快,它等效模拟的信号就越平稳,不过同时性能开销就越大,一般来说PWM的频率在几KHz到几十KHz之间。
占空比:q = Ton / Ts( Ton是高电平的时间,Ts是一个周期的时间。q就是高电平时间相对于整个周期时间的比例),占空比决定了PWM等效出的模拟电压的大小。一般用百分比表示。
分辨率:占空比的变化步距。分辨率就是占空比变化的精细程度,比如占空比变化为1%、1.1%、1,2%、1.3%这样子,那分辨率就是0.1%。
2.3 PWM波形
接下来我们就来分析一下定时器的输出比较模块是怎么来输出PWM波形的。下图红圈位置就是通用定时器的输出比较部分电路,左边就是CNT计数器和CCR1比较的结果,然后经过红圈位置的输出比较电路,最后通过TIMx_CH1输出到GPIO引脚上。然后下面还有三个同样的单元,分别输出到TIMx_CH2、TIMx_CH3以及TIMx_CH4。
那我们重点来看一下输出比较部分电路,如下所示就是通用定时器的输出比较部分电路。
如上图所示,左边是CNT计数器和CCR1第一路的捕获/比较寄存器,它俩进行比较。当CNT = CCR1或者CNT > CCR1时,就会给这个输出模式控制器传递一个信号,然后输出模式控制器就会改变它输出oc1REF的高低电平。接着这个REF信号可以前往主模式控制器(你可以把这个REF映射到主模式的TRGO输出上去),不过REF的主要去向还是下面这一路,通过下面这一路到达极性选择。给这个极性选择寄存器写0,信号就会往上走,就是信号电平不翻转,进来是什么样,出去还是什么样。写1的话,信号就会往下走,就是信号通过一个非门取反,那输出的信号就是输入信号高低电平反转的信号,这就是极性选择,就是选择是不是要把高低电平反转一下。那接着就是输出使能电路了,选择要不要输出。最后就是OC1引脚,这个引脚就是CH1通道的引脚,在引脚定义表里就可以知道具体是哪个GPIO口了。
接下来我们还需要看一下这个输出模式控制器,它具体是怎么工作的呢?什么时候给REF高电平,什么时候给低电平呢?我们来看一下下面这个表,这就是输出比较的8种模式,也就是这个输出模式控制器里面的执行逻辑。
这个模式控制器的输入是CNT和CCR的大小关系,输出是REF的高低电平,里面可以选择多种模式来更加灵活地控制REF输出。这个模块可以通过寄存器来配置。这个有效电平和无效电平为了方便理解可以直接认为有效电平就是高电平,无效电平是低电平。一般我们使用比较多的是PWM1模式、向上计数。
2.4 PWM基本结构
以PWM模式1、向上计数模式为例,PWM波形产生原理(输出PWM的基本结构)如下图所示
如图右上角所示,假如ARR的值为99,CCR为30。CNT计数器从0开始自增,当CNT < CCR时,REF置有效电平,当CNT >= CCR时,REF置无效电平,当CNT自增至99然后清零又开始下一个周期。下面对应的绿色线就是实际的REF输出的电平信号,可以看到REF的输出电平信号占空比是受到CCR值影响的。如果CCR设置大一些,输出的占空比就大一点,反之就小一点,这就是PWM模式的工作流程。这里的REF就是一个频率可调,占空比也可调的PWM波形,再经过极性选择,输出使能,最终通向GPIO口,这样就能完成PWM波形的输出了。
那接下来,我们就来看一下PWM的参数是如何计算的吧。
2.5 PWM参数计算
其中,假设CCR为30,ARR为99。
- PWM频率: 即计数器的更新频率 Freq = CK_PSC / (PSC + 1) / (ARR + 1)
- PWM占空比: Duty = CCR / (ARR + 1)
- PWM分辨率: Reso = 1 / (ARR + 1)
三、舵机简介
3.1 舵机的工作原理
舵机是一种根据输入PWM信号占空比来控制输出角度的装置。它有三根输入线,其中两根是电源线,一根是PWM信号输入线。白色输出轴会固定在一个指定的角度不动,固定的位置是由信号线的PWM信号来决定的,这就是舵机的工作方式。
从上边右图中可以看出,舵机其实并不是一种单独的电机,可以发现它是由一个直流电机、一个减速齿轮组、一个电位器(电压编码器)和一个控制板组成的整体。舵机并不是一种单独的电机,它的内部是由直流电机驱动的,内部的控制电路板是一个电机的控制系统,整个舵机内部形成了一个闭环的控制系统。
大概得执行逻辑是,PWM信号输入到控制板,给控制板一个指定的目标角度,然后这个电位器检测输出轴的当前角度,如果大于目标角度,电机就会反转,如果小于目标角度,电机就会正转,最终使输出轴固定在指定的角度,这就是舵机的内部工作流程。
简而言之:输入一个PWM波形,输出轴固定在一个角度。
3.2 输入PWM信号的要求
舵机对输入的PWM信号的要求如下:周期为20ms(对应频率为50Hz),高电平宽度为0.5 ~ 2.5ms(占空比取值范围,对应的输出角度如下所示)。那如何理解在STM32中周期为20ms对应的频率就是50Hz呢?
首先需要明确PWM(脉冲宽度调制)的频率是指1秒钟内信号从高电平到低电平再回到高电平的次数。换句话说,频率表示的是单位时间内PWM周期的重复次数。因此,如果PWM的周期为20ms,那么在一秒钟(1000ms)内,这样的周期会重复出现50次,即频率为50Hz。这是因为1秒除以每个周期的时间(20ms)等于50,所以周期为20ms的PWM信号对应的频率就是50Hz。频率的计算公式为:f = 1 / Ts(其中Ts单位为秒)
3.3 硬件电路
上图所示是舵机的引脚定义图,在舵机上有三根线,分别是黑(电源负极GND)、红(电源正极+5V)、黄(PWM信号线)。
如上所示为舵机电路图,在实际应用中,GND就接GND,电源+5V是电机的驱动电源(一般电机都是大功率设备,驱动电源也必须是大功率的输出设备,我们可以直接从STLINK的5v输出脚引一根线使用USB的5V供电),信号线PWM就直接接到STM32任意一个GPIO引脚上就行了,PWM只是一个通信线,是不需要大功率的。
四、直流电机及驱动简介
4.1 直流电机
上图所示的电机是130直流电机,直流电机是一种将电能转换为机械能的装置。它有两个电极,当电极正接时,电机正转,当电极反接时,电机反转。(注意:直流电机是一个单独的电机,里面是没有驱动电路的,所以我们就要外挂一个驱动电路来控制。直流电机属于大功率器件,GPIO口无法直接驱动,需要配合电机驱动电路来操作,本次我们将使用TB6612电机驱动芯片来驱动电机)
4.2 TB6612电机驱动芯片
TB6612是一款双路H桥型的直流电机驱动芯片,其中有两个驱动电路,可以独立地驱动两个直流电机并且控制其转速和方向。如上左图,是电机驱动板,芯片是TB6612,外围电路只需三个滤波电容就行了。如上右图是H桥电路的基本结构,是由两路推挽电路组成的。比如左边上管导通,下管断开,那左边输出就是接在VM的电机电源正极。下管导通,上管断开,那就是接在PGND的电源负极。如果有两路推挽电路,中间接一个电机,左上和右下导通,电流就是从左流向右,右上和左下导通,电流的方向就反过来从右边流向左边,H桥可以控制电流流过的方向,所以它能控制电机的正反转。
TB6612电机驱动模块的连接电路图和引脚定义图如下所示:
- VM就是电机电源的正极。和舵机的电源要求是一样的,要接一个可以输出大电流的电源,电压和电机的额定电压保持一致,比如是5v的电机就接5v电压。
- VCC是逻辑电平输入端,一般和控制器的电源保持一致。比如使用STM32,是3.3v的器件,就接3.3v。
- GND直接接系统的负极就行。
- AO1、AO2、BO1、BO2是两路电机的输出,可以分别接两个电机。AO1和AO2就是A路的两个输出,它的控制端是上面的三个PWMA、AIN1和AIN2。这三个引脚控制下面的A路电机,对应关系如上图的灰色填充,其中PWMA引脚要接PWM信号输出端,AIN1和AIN2引脚可以任意接两个普通的GPIO口。这三个引脚给一个低功率的控制信号,驱动电路就会从VM汲取电流来输出到电机,这样就能完成低功率的控制信号控制大功率设备的目的。同理,右边的BO1及BO2也是一样的道理。
- STBY引脚意为StandBy,为待机控制引脚。如果接GND,芯片就不工作,处于待机状态。如果接到逻辑高电平VCC(3.3V)芯片就正常工作。如果不需要待机模式的话可以直接接VCC 3.3v,如果需要控制可以接入任意一个GPIO口,给高低电平就可以进行控制。
我们以A路驱动电路为例,那PWMA、AIN1、AIN2这三个引脚是怎么控制正反转和速度的呢?我们先来看一下下面这个表。
在这里,如果IN1和IN2都接高电平,两个输出O1、O2就都为低电平。这样两个输出没有电压差,电机是不会转的。如果IN1和IN2都接低电平,输出直接关闭,这样电机也是不会转的。
假如说IN1给低电平,IN2给高电平,那转还是不转就取决于PWM了。如果PWM给高电平,那输出就是一低一高,这时候电机反转。如果PWM给低电平,那两个输出都是电平,电机就不转了。
总结一下就是,IN1给低、IN2给高。PWM高转低不转。如果PWM是一个不断翻转的电平信号,那电机不就是快速地反转、停止、反转、停止了吗?如果PWM频率足够快,那电机就可以持续稳定地反转了,并且速度取决于PWM信号的占空比,这就是反转的工作流程。这里讲的PWM就是我们之前讲过的使用PWM来等效一个模拟量的功能了。正转的道理也是一样的,这里就不再累述了。