🚀write in front🚀
🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝💬本系列哔哩哔哩江科大STM32的视频为主以及自己的总结梳理📚
🚀Projeet source code🚀
💾工程代码放在了本人的Gitee仓库:iPickCan (iPickCan) - Gitee.com
引用:
STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili
Keil5 MDK版 下载与安装教程(STM32单片机编程软件)_mdk528-CSDN博客
STM32之Keil5 MDK的安装与下载_keil5下载程序到单片机stm32-CSDN博客
0. 江协科技/江科大-STM32入门教程-各章节详细笔记-查阅传送门-STM32标准库开发_江协科技stm32笔记-CSDN博客
江科大STM32学习笔记(上)_stm32博客-CSDN博客
STM32学习笔记一(基于标准库学习)_电平输出推免-CSDN博客
STM32 MCU学习资源-CSDN博客
术语:
英文缩写 | 描述 |
GPIO:General Purpose Input Onuput | 通用输入输出 |
AFIO:Alternate Function Input Output | 复用输入输出 |
AO:Analog Output | 模拟输出 |
DO:Digital Output | 数字输出 |
内部时钟源 CK_INT:Clock Internal | 内部时钟源 |
外部时钟源 ETR:External clock | 时钟源 External clock |
外部时钟源 ETR:External clock mode 1 | 外部时钟源 Extern Input pin 时钟模式1 |
外部时钟源 ETR:External clock mode 2 | 外部时钟源 Extern Trigger 时钟模式2 |
外部时钟源 ITRx:Internal trigger inputs | 外部时钟源,ITRx (Internal trigger inputs)内部触发输入 |
外部时钟源 TIx:external input pin | 外部时钟源 TIx (external input pin)外部输入引脚 |
CCR:Capture/Comapre Register | 捕获/比较寄存器 |
正文:
0. 概述
从 2024/06/12 定下计划开始学习下江协科技STM32课程,接下来将会按照哔站上江协科技STM32的教学视频来学习入门STM32 开发,本文是视频教程 P2 STM32简介一讲的笔记。
定时器共四个部分,分为八个小节笔记。本小节为第一部分第一节。
🌳在第一部分,是定时器的基本定时的功能:定时中断功能、内外时钟源选择
🌳在第二部分,是定时器的输出比较功能,最常见的用途是产生PWM波形,用于驱动电机等设备
🌳在第三部分,是定时器的输入捕获功能和主从触发模式,来实现测量方波频率
🌳在第四部分,是定时器的编码器接口,能够更加方便读取正交编码器的输出波形,编码电机测速
1. 🚢输出比较功能简介
输出比较概述
- 输出比较,英文全称Output Compare,简称OC。它最主要的功能是 可以通过比较计数器CNT和捕获/比较寄存器(Capture/Compare Register)CCR值的关系,来输出电平进行置1、置0的翻转操作,用于输出一定频率和占空比的PWM波形。
- 每个高级定时器和通用定时器都拥有4个输出比较的通道,可以同时输出4路PWM波形,且高级定时器的前3个通道额外拥有死区生成电路和互补输出的功能(用于驱动三相无刷电机)。4个输出比较通道都有独立的CCR寄存器,但是它们共用同一个CNT计数器。
2.🚢PWM简介
PWM概述
- PWM(Pulse Width Modulation),即脉冲宽度调制,PWM波形是一个数字输出信号,是由高低电平组成的,是一种对模拟电平信号进行数字编码的方法。在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域。也就是说,使用PWM波形,是用来等效地实现一个模拟信号的输出。(例如,led呼吸灯,电机调速,如下解释)
- 🌵以LED为例:GPIO的输出信号只能是数字信号,如果想通过数字信号输出模拟量,可以通过以下的方法实现:让LED不断点亮、熄灭、点亮、熄灭,当点亮、熄灭的频率足够大时,由于LED的余晖和人眼的视觉暂留效应,LED就会呈现出一个中等亮度。当调控点亮和熄灭的时间比例时就能让LED呈现出不同的亮度级别。
- 🌵对于电机调速也类似:在高频率下不断让电机交替通断,由于电机断电后不会立刻停止,而是由于惯性转动后停下,电机的速度就能维持在一个中等速度。
- 🌵PWM的秘诀是:天下武功,唯快不破! 需要注意的是:只有在具有惯性的系统中,才能用PWM对模拟信号进行编码。
- 🌵从下图可以看出,高低电平跳变的数字信号可以被等效地表示为中间虚线所表示的模拟量。当上面电平时间长一点,下面电平短一点的时候,等效地模拟量就偏向于上面;当下面电平时间长一点,上面电平时间短一点的时候,等效地模拟量就偏向于下面。也就是说,占空比越大,等效的模拟量就越趋近于数字量的高电平;占空比越小,等效的模拟量就越趋近于数字量的低电平,且这个等效关系一般而言是线性一一对应的。
使用PWM波形,就可以在数字系统等效输出模拟量,就能实现LED控制亮度、电机控速等功能了。
PWM参数
首先,明白Ts就是下图这里,Ts代表一个高低电平变换周期的时间
在使用PWM对模拟量进行编码时,以下三个参数尤其重要:
- 🌵频率 :f = 1 / Ts(周期的倒数就是频率);变换越快=频率越大(PWM的频率越快,它等效模拟的信号就越平稳,不过同时性能开销就越大;一般来说PWM的频率在几kHz到几十kHz之间。)
- 🌵 占空比:q=Ton/Ts( Ton是高电平的时间,Ts是一个周期的时间。q就是高电平时间相对于整个周期时间的比例);占空比决定了PWM等效出的模拟电压的大小。一般用百分比表示。
- 🌵分辨率:占空比的变化步距;分辨率就是占空比变化的精细程度。即,占空比最小能以百分之多少的精度变化,它的值可以是1%、0.1%。分辨率的大小要看实际项目的需求定。如果既要高频率,又要高分辨率,就需要硬件电路要有足够的性能。要求不高的情况下,1%的分辨率就足够使用了。
3.🚢输出比较通道(通用定时器)
通用定时器的输出比较部分电路如下图所示:
上图对应的是通用定时器电路里的下图红框部分电路,左边是CNT和CCR比较的结果,右边是输出比较电路,最后通过TIM_CH1输出到GPIO引脚上,然后下面还有三个同样的单元,分别输出到CH2、CH3、CH4。
如上图125所示,图的左边是CNT计数器和CCR1第一路的捕获/比较寄存器,它俩进行比较,当CNT = CCR1或者CNT > CCR1时,输出模式控制器就会收到一个信号,输出模式控制器就会改变它输出的OC1REF的高低电平。REF是Reference的缩写,意为参考信号。上面有个ETRF输入(是定时器的一个小功能,一般不用,不需要了解)
接下来OC1REF信号兵分两路:
- 😎一路以将REF信号映射到主模式控制器的TRGO上,去触发其他外设的功能;
- 😎不过REF的主要去向还是下面这一路,通往一个极性选择电路,通过控制TIMx_CCER寄存器的值(0或1),可以选择是否将REF信号翻转(写0信号就会往上走,就是信号电平不翻转,进来哈样出去还是哈样;写1信号就会往下走,就是信号通过一个非门取反,输出的信号就是输入信号高低电平反转的信号,这就是极性选择,就是选择是不是要把高低电平反转一下),之后通往输出使能电路,可以控制是否输出,最后通往OC1引脚,即TIMx_CH1通道的引脚(在引脚定义表中即可找到具体的GPIO口)。
补充:
极性选择电路
非门取反
4.🚢输出模式控制器的执行逻辑(工作流程)
- 🤠什么时候给REF高电平,什么时候给REF低电平?
- 🤠输出比较拥有8种工作模式 ,其对应了输出模式控制器中的执行逻辑,这个模式控制器的😄输入是CNT和CCR的大小关系,输出是REF的高低电平😄,里面可以选择8种模式来更灵活地控制REF输出,8种输出模式可以通过TIM_CCMR1k寄存器进行配置,需要哪个模式就可以选哪个模式。输出模式控制器的执行逻辑如下表所示:
- 😎 冻结:CNT = CCR时维持原状态,实际上此时REF与CNT和CCR都无关,即CNT和CCR无效,REF保持为上一个状态。在输出PWM波形时,如果要暂停波形输出,且对暂停时的高低电平没有要求,就可以设置为这个模式。
- 😎匹配时置无效/有效电平:CNT = CCR时REF置无效/有效电平。这两个模式不适合输出连续变化的波形。如果想定时输出一个“一次性”的信号,则可以考虑这两个模式。有效电平和无效电平是高级定时器中的表述,与关断、刹车等功能配合表述的,这里表述的比较严谨。在这里为了理解方便,可以直接认为有效电平就是高电平,无效电平就是低电平。
- 😎 匹配时电平翻转:CNT = CCR时REF电平翻转。这个模式可以方便地输出一个频率可调,占空比稳定为50%的PWM波形。比如:你设置CCR为0,那CNT每次更新清0时,就会产生一次CNT=CCR的事件,这就会导致输出电平翻转一次,每更新两次,输出为一个周期并且高电平和低电平的时间是始终相等的,也就是占空比始终为50%,当你改变定时器更新频率时,输出波形的频率也会随之改变。改变计数器的更新频率时,输出波形的频率 = 更新频率 / 2(因为更新两次输出才为一个周期,这就是匹配时电平翻转的用途)
- 😎 强制为无效/有效电平:与冻结模式类似。如果想暂停波形输出,并且在暂停期间保持低电平或者高电平,可以考虑这两个模式。
- 😎 PWM模式1/2:可以用于输出频率和占空比都可调的PWM波形。是我们主要使用的模式。一般我们都只使用PWM模式1向上计数。向上/向下计数之间也只有大小关系、极性不用,基本思想都是一样的。PWM模式1/2的向上计数区别就是输出的高低电平反过来了, PWM模式2就是PWM模式1取反得到的。改变PWM模式1/2,只是改变了REF电平的极性而已。(REF输出之后还有一个极性的配置(极性选择电路),所以使用PWM模式1的正极性和PWM模式2的反极性最终的输出是一样的,输出模式中可以设置极性,最终输出前也可以设置极性)
5.🚢输出PWM波形及参数计算
以PWM模式1、向上计数模式为例,PWM波形产生原理(输出PWM的基本结构)如下图所示:
在上图中,首先左上角是时间单元和运行控制部分,再左边是时钟源选择(省略上一小节内容),在这里我们不需要使用更新事件的中断申请(输出PWM暂时还不需要中断)这就是时基单元的部分。配置好了时基单元,这里的CNT就可以开始不断地自增运行了。
然后,下面粉红区域就是输出比较单元了,总共有四路,输出比较单元的最开始是CCR捕获/比较寄存器,CCR是我们自己设定的,CNT不断自增运行,同时它俩还在不断进行比较;CCR捕获/比较寄存器后面是输出模式控制器,在这里以PWM模式1为例,是PWM模式1的执行逻辑,那它是怎么输出PWM波形的,解释如下:
右上角图中,蓝色线是CNT的值,黄色线是ARR的值,蓝色线从0开始自增,一直增到ARR也就是99,之后清0继续自增,在这个过程中红色线是CCR,比如设置CCR为30,执行输出模式控制器里的逻辑,下面的绿色线就是输出,可以看到CNT<CCR时置高电平,之后CNT>=CCR就变为低电平,当CNT溢出清0后,CNT又小于CCR所以置高电平...这样一直持续下去,REF的电平就会不断变化,并且它的占空比是受CCR的值的调控的,如果CCR的值设置的高一些,输出的占空比就会变大,CCR设置的低一点,输出的占空比就会变小,以上就是PWM的工作流程。(这里REF就是一个频率可调,占空比也可调的PWM波形),最终再经过极性选择,输出使能,最终通向GPIO口,这样就能完成PWM波形的输出了。需要注意的是: 设置的CCR值越接近ARR,输出的PWM波形的占空比就越大。
PWM的一个周期如上图中的下面绿色区段的红线区间,可以看出它始终对应着计数器的一个溢出更新周期,所以PWM的频率就等于计数器的更新频率
当CNT = CCR时电路已经置为低电平,故REF为高电平的时间为CNT从0变到29(30个数)的时间。
CCR的值应设置在0到ARR+1的范围里,CCR=ARR+1时占空比是100%,ARR越大,CCR的范围就越大,对应的分辨率就越大
6.🚢输出比较通道(高级定时器)
这个电路仅作了解即可,不需掌握。
7.🚢舵机和直流电机
舵机是小型直流伺服电机的一种,是一种根据输入PWM信号占空比来控制舵机输出轴的角度的装置。它有三根输入线,其中两根是电源线,一根是PWM信号输入线。白色输出轴会固定在一个指定的角度不动,固定的位置是由信号线的PWM信号来决定的,这就是舵机的工作方式。
上边右图中可以看出,舵机其实并不是一种单独的电机,可以发现它是由一个直流电机、一个减速齿轮组、一个电位器(电压编码器)和一个控制板 4部分组成的整体。舵机不是一种单独的电机,它的内部是由直流电机驱动的。内部的控制电路板是一个电机的控制系统,整个舵机内部形成了一个闭环的控制系统。
PWM信号输入到控制板,给控制板一个指定的目标角度,然后这个电位器检测输出轴的当前角度,如果大于目标角度,电机就会反转,如果小于目标角度,电机就会正转,最终使输出轴固定在指定的角度,这就是舵机的内部工作流程(简而言之:输入一个PWM波形,输出轴固定在一个角度)。
“伺服”—词源于希腊语“奴隶”的意思,英文为Servo。人们想把某一个结构或系统当作一个得心应手的驯服工具,服从控制信号的要求而动作。伺服的主要任务是按照控制命令的要求,对输出信号和输出功率进行放大、变换与调控等处理,使驱动装置输出的力矩、速度和位置控制得非常灵活方便。由于它的“伺服”性能,因此而得名——伺服系统。它的优势在于:可以非常灵活地控制输出装置的力矩、速度和位置等物理参量。
交流伺服电机和直流伺服电机的共同点是:利用传感器(编码器)对转子的位置、转速、力矩、转向进行检测,并且将得到的信号经由伺服驱动器反馈给伺服控制器,从而达到调节转子位置、转速、力矩、转向的目的; 二者的不同点在于,一般而言,交流伺服电机相较于直流伺服电机对转子有更高的控制精度。
输入信号脉冲宽度,周期是20ms,也就是一个上升沿到下一个上升沿之间的时间是20ms。
舵机对输入的PWM信号的要求如下:周期为20ms(对应50Hz),高电平宽度为0.5 ~ 2.5ms(就是占空比是这个范围,对应的输出角度如上图)。这时一个180° 的舵机,输出轴的角度是-90° 到+90° 或者你规定是0° 到180°,输入信号脉冲宽度与舵机输出轴转角的对应关系都是线性一一对应的,给个PWM,输出轴就会固定在一个角度。实际应用中,比如机器人、机械臂可以用舵机来控制关节,遥控车、遥控船可以用舵机来控制方向。这里的PWM波形实际上是作为一个通信协议来使用的,与用PWM波形等效出一个模拟输出的关系不大,将PWM当成一个通信协议也是一个比较常见的应用,因为很多控制器都有PWM输出的功能,而且PWM只需要一根信号线就行了,这也是一种应用形式。
接下来,看一下舵机的硬件电路,上图第一个是引脚定义图,在舵机上有三根线,分别是黑(电源负极GND)、红(电源正极+5V)、黄(PWM信号线)。上图第二个图中,在实际应用中,GND就接GND,电源+5V是电机的驱动电源(一般电机都是大功率设备,驱动电源也必须是大功率的输出设备,对于套件中,可以直接从STLINK的5v输出脚引一根线使用USB的5V供电),信号线PWM就直接接到STM32引脚上就行了,PWM只是一个通信线,是不需要大功率的。
直流电机及驱动
可以用PWM来控制电机的速度。直流电机是一个单独的电机,里面是没有驱动电路的,所以我们就要外挂一个驱动电路来控制。直流电机是一种能将电能转换为机械能的装置,有两个电极。有两个电极,当电极正接时,电机正转,当电极反接时,电机反转。上图所示的电机是130直流电机。直流电机属于大功率器件,GPIO口无法直接驱动,需要配合电机驱动电路来操作。本课程使用TB6612电机驱动芯片来驱动电机。
TB6612是一款双路H桥型的直流电机驱动芯片,其中有两个驱动电路,可以独立地驱动两个直流电机并且控制其转速和方向。如上左图,是电机驱动板,芯片是TB6612,外围电路只需三个滤波电容就行了。如上右图是H桥电路的基本结构,是由两路推挽电路组成的,比如左边上管导通,下管断开,那左边输出就是接在VM的电机电源正极;下管导通,上管断开,那就是接在PGND的电源负极;如果有两路推挽电路,中间接一个电机,左上和右下导通,电流就是从左流向右,右上和左下导通,电流的方向就反过来从右边流向左边,H桥可以控制电流流过的方向,所以它能控制电机的正反转。