STM32TIM定时器外设学习,输出比较模式(舵机,驱动直流电机)

此次记录的是STM32定时器的输出比较模式,后面我们会记录一下程序及其现象。

我们的输出比较模式主要是用来产生PWM波形。PWM可以驱动电机,制作呼吸灯。所以如果想用STM32进行一些有电机的项目,比如说智能车,机器人等。

我们的PWM可以将GPIO口的高,低电平信号,变为可以连续变化的信号,使其可以变为PWM效果。

一.总览

1. 输出比较模式核心概念

输出比较模式 的核心思想是:将定时器的计数器(CNT)的值与一个预先设定的捕获/比较寄存器(CCR)的值进行比较,根据比较结果在对应的输出通道上产生一个指定的电平或事件。

简单来说,就是:"当计数器的值达到我设定的这个值时,请在那个引脚上做点事情(比如翻转电平)"。

2. STM32F103C8T6的定时器资源

STM32F103C8T6("蓝莓派"核心型号)拥有丰富的定时器:

  • 高级控制定时器:TIM1

  • 通用定时器:TIM2, TIM3, TIM4

  • 基本定时器:TIM6, TIM7

其中,输出比较功能 主要在 TIM1、TIM2、TIM3、TIM4 上可用。每个定时器通常有4个独立的通道(TIM2/TIM3/TIM4),每个通道对应一个特定的GPIO引脚。

3. 输出比较模式的几种工作方式

在输出比较模式下,通过配置捕获/比较模式寄存器(TIMx_CCMR1/2) 中的 OCxM[2:0] 位,可以设置为以下几种具体模式:

模式 功能描述 典型应用
冻结 比较匹配时,通道输出无任何反应。 一般不用于输出,而是用于内部触发。
匹配时设置通道为有效电平 当CNT=CCR时,强制输出高电平(或低电平,取决于极性配置)。 生成固定宽度的脉冲。
匹配时设置通道为无效电平 当CNT=CCR时,强制输出低电平(或高电平,取决于极性配置)。 生成固定宽度的脉冲。
匹配时翻转 当CNT=CCR时,输出电平自动翻转。 生成PWM波、方波。
强制为无效电平 手动强制输出为低电平(或高电平)。 强制关闭输出。
强制为有效电平 手动强制输出为高电平(或低电平)。 强制开启输出。
PWM模式1 在向上计数时,当CNT<CCR时通道为有效电平,否则为无效电平。 生成PWM信号(最常用)。
PWM模式2 在向上计数时,当CNT<CCR时通道为无效电平,否则为有效电平。 生成PWM信号。

注意 :我们常说的"输出比较"通常泛指这些模式的集合,而PWM模式是其中应用最广泛的一种特殊形式。

4. 关键寄存器介绍

配置输出比较模式,主要涉及以下几个寄存器:

  1. TIMx_ARR(自动重装载寄存器):决定计数器的周期,即定时器溢出的值。

  2. TIMx_PSC(预分频器):对定时器的时钟源进行分频,用于调整计数频率。

  3. TIMx_CCRx(捕获/比较寄存器) :这是核心!你设定的比较值,决定了输出波形特征(如PWM的占空比)。

  4. TIMx_CCMRx(捕获/比较模式寄存器)

    • 配置通道为输出模式 (CCxS位)。

    • 选择上述8种输出比较模式之一 (OCxM位)。

    • 配置输出预装载功能等。

  5. TIMx_CCER(捕获/比较使能寄存器)

    • 使能输出通道 (CCxE位)。

    • 配置输出极性 (CCxP位),决定何为有效电平(高/低)。

  6. TIMx_CR1(控制寄存器1)

    • 使能定时器计数器 (CEN位)。

    • 设置计数方向 (DIR位) 等。

5. 配置步骤(以生成PWM为例)

以下是使用库函数(如标准库或HAL库)配置输出比较为PWM模式的一般步骤:

步骤1:初始化GPIO

  • 将定时器通道对应的GPIO引脚配置为复用推挽输出模式。

  • 例如:TIM3_CH2 对应 PA7。

步骤2:初始化定时器基础时基

  • 配置 TIMx_PSC(预分频器),确定计数时钟 CK_CNT = F_CLK / (PSC + 1)

  • 配置 TIMx_ARR(自动重装载值),确定计数周期和PWM频率。

    • PWM频率 = CK_CNT / (ARR + 1)

步骤3:配置输出比较通道

  • 设置通道为输出模式 (CCxS=00)。

  • 设置模式为 PWM模式1PWM模式2 (OCxM)。

  • 使能输出的预装载功能 (OCxPE),保证更改CCR值在下次更新时才生效,避免毛刺。

步骤4:使能通道输出

  • TIMx_CCER 寄存器中,使能输出 (CCxE=1),并配置极性 (CCxP)。

步骤5:启动定时器

  • 使能定时器计数器 (CEN=1)。

  • 如果需要,使能ARR的预装载器 (ARPE=1)。

二.逐条分析

1.输出比较(oc)

(1)简介

在这里我们可以看到这里就是我们的输出比较寄存器。

CNT就是时基单元里面的计数器,CCR就是捕获比较寄存器(CC是捕获比较的意思,R是register是寄存器意思)这个寄存器是输入捕获和输出比较共用的,当使用输入捕获时,就是输入捕获寄存器,让使用输出比较时,就是输出比较寄存器。

(2)工作原理

在输出比较这里,这块会比较,CNT和CCR的值,CNT计数自增CCR是我们给定的一个值。

当CNT大于CCR,小于CCR,等于CCR的值的时候

这里会固定的置1,置0这样子就可以输出一个不断跳变的PWM波形了。这就是输出比较的基本功能。

我们这里有四个输出比较通道,可以同时输出四个PWM波形。

这四个通道有他们各自的CCR寄存器但是CNT计数器时公用的。然而高级定时器,前三个输出比较通道还具备死区生成,互补输出的功能。这个是用来驱动三相无刷电机的,我们这暂时不用。

2.PWM波形简介

PWM的应用场景需要是惯性场景,也就是说LED在熄灭的时候,由于余晖,以及人眼视觉暂留现象。LED不会立马熄灭而是有一定的惯性过一小段时间才会熄灭。电机同理,当电机断电时候电机的转动不会立马停止,而是由一定的惯性,过一会才停。

从第一个图可以看出,这种高低电平跳变的数字信号,可以等效为,中间虚线模拟量信号的。当上面的电平长一点,下面电平时间短一点,那么等效的模拟量,就会偏上面。

反之,下面电平时间长一点,上面电平时间短一点,产生的模拟量信号就会偏向于下面。

1.几个重要参数

所以使用PWM时候会有几个重要的参数

(1)频率

1.频率 = 1/Ts Ts就是这里,代表一个高低电平变换周期的时间,周期倒数就是频率。

PWM频率越快,表示等效的模拟信号越平稳,不过性能开销就越大。一般来说PWM的频率在几K或者几十KHz左右,这个频率就已经足够快了。

(2)占空比

占空比 = Ton/Ts Ton是这里高电平的期间,Ts是一个周期的时间,那么Ton/Ts就是高电平时间相对于我们整个周期时间的比例。一般用%表示,

比如占空比是50%,也就是说高,低电平各占一半。占空比为20%那么就是高电平占比20%,低电平占比80%.

占空比决定了PWM等效出来的模拟电压大小,占空比越大,那么等效出来的模拟电压就越趋近于高电平。占空比越小,等效的模拟电压就越趋近于低电平。

比如说高电平时5V低电平是5V,低电平是0V,那么50%的占空比就等效于中间电压,2.5V。

如果是20%占空比就是1V。

(3)分辨率

分辨率 = 占空比变化的布距。比如说占空比以1%的布距跳变,那么分辨率就为1%。

分辨率就是占空比的最小变化量,也就是占空比精度。

2.高级定时器输出比较通道

3.通用定时器输出比较通道

这个就是我们这条通道的电路。

他的输入时CNT和CCR比较电路,右边就是输出比较电路,通过TIM_CH1输出到我们的GPIO引脚上。

左边的就是CNT计数器和CCR1第一路的捕获比较寄存器,他俩进行比较,当CNT>CCR1或者CNT=CCR1时候,就会给这个输出模式控制器传递一个信号,然后输入模式控制器,就会改变它OC1REF高低电平。REF是reference的缩写意思是参考信号。

上面的ETRF是定时器的一个小功能,一般不用。

接着这个REF信号可以前往主模式控制器,可以把这个REF映射到主模式的TRGO上面去。

但是REF常走的是这里。给这个寄存器写0信号就会往上走,使信号不翻转,进来什么信号,出去什么信号,

写1的话,信号就会往下走,经过一个非门取反,那输出的信号就会翻转,输入高电平,输出低电平。

接下来时输出使能电路,决定要不要输出。最后就是OC1引脚,这个引脚就是CH1通道引脚。在引脚定义表里就可以知道是哪个GPIO了。

4.输出比较的八种模式

这八种状态也就是,输入模式控制器里面的执行逻辑。

(1)冻结

会暂停PWM的输出,PWM的输出保持不变。

接着的两个模式都是暂时输出一下,不会连续。

(2)翻转

可以用来产生占空比50%,频率可调的PWM波形。假设把CCR的值设置为0,CNT每次更新清0时候,都会产生一次CNT=CCR的事件。这就会导致输出电平翻转一次,每更新两次输出为一个周期,并且高,低电平所持续的时间,都是始终相等的。也就是占空比50%。

输出波形的频率=更新频率/2,因为每两个波形,才能产生一个周期。

(3)PWM1和PWM2

如图,PWM2就相当于PWM1取反。

5.PWM的基本结构

左面是时钟源选择,时基单元配置,只是不需要中断了,因为我们配置好时基单元,CNT就会开始计数。下面是我们CCR捕获/比较器,然后是两个PWM模式选择,接着是使能选择,到最后的GPIO。

6.PWM产生的过程

这里我们蓝色线是CNT的值,黄色线是ARR的值。红色线是CCR的值。

蓝色线从0开始自增,增加到ARR的值,也就是99,然后清零,继续自增,周而复始

比如我们设置红色线的CCR为30。之后执行PWM1里面的逻辑,把CNT和CCR进行比较。

下面的绿色线就是我们的输出。

在这一块,我们可以看到CNT小于CCR的值,所以置高电平。

到后面CNT大于等于CCR的值就变为了低电平。

当CNT自增清零后,CNT又小于CCR的值,所以置高电平。在之后又是CNT大于等于CCR的值,置高电平,一直重复,这样REF的电平就会不断变化,并且他的占空比是受CCR值调控的。

如果CCR设置的高一些,输出占空比就会变大,反之占空比就会变小。

这里的REF是输出可调,占空比也可调的PWM波形。

7.PWM参数的计算

这里是PWM的一个周期,可以看到,他始终对应着,CNT计数器溢出的一个周期。所以PWM的频率就等于计数器的更新频率。

PWM的频率=CK_PSC/(PSC+1)/(ARR+1)

PWM的占空比=CCR/(ARR+1)

PWM的分辨率=1/(ARR+1)

三.PWM驱动案例

1.PWM驱动舵机

SG90型号舵机。有三根输入线,两根电源线,一根控制线,就是我们PWM控制。

执行逻辑是:PWM信号给到控制板给控制板一个指定的角度。然后电位器检测输出轴当前的角度。如果大于目标角度,电机就会反转,小于目标角度,电机就会正转。最终使输出轴固定在目标角度。

PWM信号的要求,周期为20ms也就是50Hz,高电平宽度是0.5-2.5ms也就是占空比是这个范围。

输出角度对应我们右边的图,因为我们的舵机是180°的舵机。

这句话的意思是这个上升沿到下一个上升沿,到来之间的时间是20ms。

实际应用的话,比如说,机器人,机械臂,可以用舵机控制关节,遥控车,遥控船可以用舵机控制方向。这里的PWM波形,相当于一个通讯协议。因为很多控制器都有PWM输出的功能,而且PWM只需要一根控制线。

舵机的硬件电路。

2.直流电机的PWM驱动

(1)了解直流电机

因为这个直流电机是一个单独的电机,没有驱动电路,所以我们就要外挂一个驱动电路进行驱动。

因为直流电机是大功率器件,GPIO口无法直接驱动。

这里我们使用的是130型号电机。

我们使用的是TB6612这款电机驱动芯片,这款芯片是有两路驱动电路的可以独立控制两个电机。

又因为他是H桥型的驱动电路里面一路有四个开关管,就可以控制正反转。

这个是我们H桥电路基本结构,是由两个推挽电路组成

比如说左边的,上管导通,下管断开,我们的D1就是接在VM电机的电源正极。

下管导通上管断开,那就是接在PGND的电源负极。

如果是两路推挽电路,左上和右下导通,电流从左流向右边。

如果右上和左下导通,电流方向就反过来了,电流从右流向左边。

(2)硬件电路讲解

H桥可以控制电机电流的方向,就可以控制电机正反转。

硬件电路。

VM是电机电源的正极。范围是4.5-10V,根据电机额定电压确定。

VCC是逻辑电平输入端。范围是2.7-5.5V,跟控制器电源保持一致,比如说我们是用STM32控制,所以我们因该接3.3V。

GND直接接入系统GND就可以

AO1,AO2。BO1,BO2是两路电机的输出。

他们的控制端就是上面的这三个。PWMA,AIN1,AIN2,控制我们AO1,AO2这一路输出端。这三个口直接接到单片机的输出端就行,

PWMA要接PWM输出角。其他两个引脚可以接任意两个普通的GPIO口。这三个引脚给一个微弱的控制信号,驱动电路就会从VM汲取电流来输出到电机。这样就能完成低功率的控制信号。控制大功率设备的目的了。

右边的和我们左边的一样。BO1,BO2。他们的控制端是上面的PWMB,BIN1,BIN2。

两路的操作和功能是一样的。

最后的是我们一个STBY(stand by)引脚,这个是待机控制角。如果接GNE芯片就不工作,处于待机状态。如果接逻辑电源VCC,就可以正常工作了。这个引脚如果不需要待机模式的情况下,可以直接接入3.3V。如果需要的话可以接任意一个GPIO,用我们GPIO高低电平进行控制就可以了。

(3)电机工作模式讲解

这个表讲述了如何控制电机正反转。STBY高电平工作,低电平待机,这个就不用看了。右边是输出,O1,O2和模式状态。

(1)在这里如果IN1和IN2都接高电平,那么两个输入没有电压差,电机就不会转动。

(2)如果IN1和IN2都接低电平,那么直接没有输入,电机也不会转动。

(3)只有IN1和IN2一个给高电平,一个给低电平电机才会转动,但是此时转动还要看PWM,如果PWM给高电平输出就是一低一高,电机有了电压差,就会转动。这时定义的时反转。

如果PWM给低电平那么输出还是两个低电平,电机还是不会转动。

如果PWM是一个快速翻转的信号,那么电机就会,反转-停止-反转-停止。如果PWM足够块那么电机就可以连续平稳的反转了。并且速度取决于PWM信号的占空比。

(4)正转就是给IN1高电平IN2低电平。电机是正传状态,转还是不转,取决于PWM信号,

如果PWM给高电平输出就是一低一高,电机有了电压差,就会转动。这时定义的时正转。

如果PWM给低电平那么输出还是两个低电平,电机还是不会转动。

如果PWM是一个快速翻转的信号,那么电机就会,正转-停止-正转-停止。如果PWM足够块那么电机就可以连续平稳的正转了。并且速度取决于PWM信号的占空比。

3.手册观看

最后我们可以看一下手册

强制输出,输出比较。

以及PWM模式。到这里我们就结束了,代码部分会在下次博客进行更新讲解。

相关推荐
立志成为大牛的小牛2 小时前
数据结构——四十、折半查找(王道408)
数据结构·学习·程序人生·考研·算法
东方欲晓w2 小时前
Git高效开发:常用命令速查指南
git·stm32·学习
zxb@hny2 小时前
stm32 的isr向量位置问题,不然跑飞了,程序跑到异常地址,main都没进去
stm32·单片机·嵌入式硬件
m0_690780522 小时前
STM32各时钟的介绍,中断
stm32·单片机·嵌入式硬件
nenchoumi31193 小时前
ROS2 Humble 笔记(十)多机分布式通讯 DDS 与宿主机和Docker容器
笔记·机器人·ros2
清钟沁桐3 小时前
mlir 编译器学习笔记之六 -- 经典实现
笔记·学习·mlir
权泽谦3 小时前
从0到1:基于STM32与FreeRTOS的智能家居中控系统设计实录
stm32·嵌入式硬件·智能家居
云山工作室3 小时前
基于单片机的智能家居窗帘控制系统设计(论文+源码)
stm32·单片机·嵌入式硬件·物联网·课程设计
李boyang3 小时前
单片机通信协议--USART(串口通信)
单片机·嵌入式硬件·usart