欢迎光临
我们一直在努力

STM32F103系列单片机定时器介绍(五)

STM32F103系列单片机定时器介绍(五)

引言

上期内容我们大致了解的通用定时器的一些基础知识和底层原理,如果我们想要通过使用定时器来实现一些较为复杂的功能的话那我们就必须要了解定时器的工作模式,以及这些工作模式适合什么样的工作场景

外部时钟模式

根据前面我们分析的基本定时器的组成模式可得基本的组成和工作流程为:

内部时钟信号(APB1)经过预分频器降频后的脉冲信号会传入到计数器中,计数器每次接收到一个脉冲信号都会自增并且与自动重装载器中的值进行比对,一旦二者中保存的值相等了那么此时就会产生中断事件,触发控制器就会立即做出对应动作:比如打断CPU让它去执行中断回调函数

此时的结构图如下

在这里插入图片描述

假设此时我们想要接收外部的电平信号,那么根据结构图推理此时我们可以将对应的GPIO引脚直接接入触发控制器中,系统内部的实现跟我们目前的想法差不多,但是过程要更加复杂一些,由于通用定时器有四个输入通道,这四个输入通道中通道一和通道二是直接接入到触发控制器中的,但是在信号进入触发控制器之前还会经过输入滤波器和边沿检测器的处理,其中输入滤波器会过滤掉一些微小的抖动,这里的边沿检测器与中断中的边沿检测器类似,可以根据用户的配置来检测输入信号的边沿并输出一个脉冲,极性配置有如下三种选择:

  • 上升沿检测:当电平信号从低电平跳变到高电平时的瞬间才会输出一个触发脉冲
  • 下降沿检测:当电平信号从高电平跳变到低电平时才会输出对应的触发脉冲
  • 双边沿检测:电平不管是从高到低跳变还是从低到高跳变都会触发检测器并输出对应的触发脉冲

其中通道一和通道二的边沿检测器都会输出两个脉冲信号,通道一的两个输出脉冲信号分别为TI1FP1和TI2FP2,通道二的两个输出脉冲信号分别为TI2FP2和TI1FP1
在这里插入图片描述

其中只有TI1FP1和TI2FP2直接接入到了触发控制器中

在这里插入图片描述

与此同时通道一的边沿检测器还会输出一个TI1_ED信号,这个信号与前面两个直接接入到触发控制器中的信号相比无法选择边沿检测器的触发模式,这个信号只能是双边沿触发,这个信号在经过选择器选择之后也可以作为定时器的时钟源

除了来自通道一和通道二的触发信号,定时器还有一个独立的外部时钟信号(ETR),外部触发器内产生的时钟信号会经过极性选择、边沿检测、预分频和输入滤波等处理后才能接入到触发控制器中,其中边沿检测只能进行上升沿检测,但是极性选择器可以将上升沿与下降沿进行互换,因此当极性选择器和边沿检测器配合时就可以实现上升沿检测或下降沿检测。由于硬件规定外部时钟信号的频率最快不能超过系统内部时钟频率的四分之一,因此预分频的作用就是对外部时钟信号进行降频操作,最后的滤波操作作用同样是过滤到一些抖动信号

至此我们已经分析了四种可以直接作为时钟信号的时钟来源:通道一的TI1FP1信号、通道二的TIFP2信号、通道一的TI1_ED信号和外部时钟信号,这四种信号可能同时作为时钟源,因此我们需要进行选择操作,在从模式控制器的左边有一个梯形的选择器,这四个信号通过选择器选择后其中一个会作为时钟源,被触发器选择进入从模式控制器的路径我们称之为外部时钟模式1

外部时钟信号(ETR)的独特之处在于除了通过被触发器选择进入从模式控制器之外它还可以直接进入触发控制器中,这条ETR独享的路径我们称之为外部时钟模式二

从模式

通用定时器的从模式是一种常用的硬件级控制机制,通常情况下定时器器是受内部时钟和CPU指令控制的,但是开启从模式之后定时器的运行状态将直接由外部信号或者其它定时器的输出信号来自动控制,这极大的减轻了CPU的负担,并提高了控制的实时性

信号触发源

要让定时器作为从机被控制首先需要接收触发信号,这个输入信号在内部被称为触发输入(TRGI),它的来源主要有以下几种:

  • 内部触发(ITR0~ITR3):这是来自芯片内部其它定时器的输出信号
  • 外部输入引脚(TI1和TI2):来自定时器自身的通道1或通道2引脚(根据前面的分析,信号源主要有:TI1FP1、TI2FP2和通道一产生的双边沿TI1F_ED)
  • 外部触发引脚(ETR):专门的外部触发引脚上的信号
  • 工作模式

    接收到TRGI信号后模式控制器可以执行不同的动作,在CubeMX的定时器配置界面中我们就可以看到相对应的从模式有哪些

    在这里插入图片描述

    主要分为以下几种模式:

  • 复位模式(Reset Mode):

    当触发信号产生指定的边沿跳变时,定时器的计数器会被硬件自动清零,并重新开始计数,这个时候通常还会产生一个更新事件

  • 门控模式(Gate Mode)

    定时器是否计数取决于触发信号的电平状态,例如配置为高电平有效时,触发信号为高电平,定时器就正常计数,触发信号为低电平,定时器就暂停计数

  • 触发模式(Trigger Mode)

    触发信号的一个特定边沿(上升沿或者下降沿)会被用来启动定时器的计数器,一旦启动即使触发信号消失也会一直计数

  • 了解完从模式的相关内容后我们就可分析以下为什么在定时器内部需要为外部触发器(ETR)单独开设一条完整的通路了:

    • 解决从模式控制器依赖问题:假设我们将通用定时器的外部时钟模式1却读取外部的时钟信号,那么此时从模式控制器就被占用了,我们将无法使用从模式,如果我们将外部时钟模式一设置成从模式,那么我们还可以选择外部触发器(ETR)去接收外部信号
    • 处理超频信号:之前我们提到过外部信号的频率必须小于系统核心频率的四分之一,因此如果我们需要检测外部高速时钟信息,那么我们就需要通过使用外部触发器进行分频,以达到我们的目标频率

    输入捕获模式

    还记得之前我们做过的超声波测距项目吗,在那个项目里我们使用基本定时器进行测距操作,当时我们的核心架构是基本定时器+EXTI外部中断,我们此时在回过头来看看整个项目的运行逻辑:

  • Echo引脚变为高电平->触发EXTI上升沿中断->CPU去执行中断服务函数->在函数中保存此时的时间戳
  • Echo引脚变为低电平->触发EXTI下降沿中断->CPU再次执行中断服务函数->在函数中记录此时的时间戳
  • 通过时间戳计算事件差最后结合公式计算距离
  • 这种测量方法只是为了去演示基本定时器的使用方法才采用的,实际上我们不会真的这样去测量距离,在实际的开发中我们往往会去使用定时器的输入捕获模式,接下来让我们结合原理图进行分析

    在这里插入图片描述

    之前我们提到过通道1和通道2产生的时钟信号会在经过边沿检测器之后输出两个方波信号,通道一对应的是TI1FP1和TI2FP2,通道二对应的是TI2FP1和TI2FP2,以此类推。其中的TI1FP1信号以及TI2FP2信号会在经过预分频处理后接入到捕获寄存器中,此时我们可以配置相对应的捕获模式,假设我们设置通道一为上升沿捕获,那么当通道一种产生了上升沿信号时对应的捕获寄存器就会去读取计数器中的值并将其拷贝到捕获寄存器种,如果我们还配置了相应中断那么还会产生输入捕获中断,通知程序尽快读取捕获寄存器中的数值。

    此时我们就获得了上升沿产生时刻的时间戳,如果我们还能够获得下降沿产生时的事件戳,那么我们就能够很轻松的实现超声波测距程序的优化。但可惜的是一个输入通道的捕获只能进行上升沿捕获或者下降沿捕获,无法进行双边沿捕获,如果我们能够将下降沿的事件戳保存到通道二的捕获寄存器种中那么问题就迎刃而解了。此时仔观察时钟信号的连接方式我们不难发现通道一产生的TI1FP2信号接入到了通道二的选择器中,当外部信号通过通道一引入,在自己的捕获寄存器1上进行输入捕获叫做输入捕获的直接模式,在通道二的捕获寄存器中进行输入捕获叫做输入捕获的间接模式,通道二产生的TI2FP1信号同样交叉接入了通道1的捕获寄存器中,如果信号是从通道二对应的GPIO口引入,则就是输入通道2叫做直接模式,通道一叫做间接模式

    在这里插入图片描述

    通道三和通道四的结构与通道一和通道二相同,唯一的区别就是TI3FP3和TI4FP4没有接入到从模式控制器中以及编码器上

    分析完之后我们稍微总结一下:输入捕获可以在输入信号出现上升沿或者下降沿时将此时计数器的值捕获到捕获寄存器中,并且可以借用另一个输入通道的捕获寄存器进行输入捕获,捕获到自己的捕获寄存器中叫做直接模式,借用另一个通道的捕获寄存器叫做间接模式,其中通道1和通道2是一对可以相互借用,通道3和通道4是一对可以互相借用

    PWM模式

    PWM信号

    在介绍PWM模式之前我们先介绍一下PWM信号,PWM信号主要由以下几个部分组成:

    • 频率:信号从高电平到低电平,再回到高电平,这样一个完整循环所需的事件就是周期T,一秒钟内包含多少个周期就是频率
    • 占空比:在一个完整的周期内高电平的持续时间,占据整个周期时间的百分比,这是PWM的核心参数,它直接决定了输出电压的大小,占空比为100%就是一直输出3.3V,占空比为0%就是输出0V

    分析到此你可能会比较疑惑:PWM的作用是什么,首先我们需要知道电路传递信号的方式可以笼统的分为两类:数字信号和模拟信号,我们目前所使用的只通过高低电平两种状态传递信息的信号就叫做数字信号,比如GPIO口通过高低电平控制小灯的亮灭,而模拟信号是通过电压值来传递信息,就像我们可以通过电压值的高低来控制小灯的亮度,然而模拟信号容易收到电磁干扰导致数字改变,而数字信号由于只有两种状态,除非受到较大干扰否则不会影响对电平的判断。因而数字信号传输数据的速度也就更快更稳,这也就让数字信号在现代通信中占据了主导地位。PWM正是一种可以使用数字信号尽可能地模拟模拟信号效果的技术

    PWM可以控制许多外设,但是这些外设都有一些共同点就是它们都是有惯性的,例如LED灯、舵机等,这种断电之后不会立刻改变状态的外设,这样我们才能实现呼吸灯等效果

    编码器模式

    当我们使用电机或者编码器时,我们就会需要使用到通用定时器的编码器模式,假设此时我们需要使用电机,恰巧这个电机内部还集成了增量型旋转编码器,旋转编码器通常有A相和B相,当电机处于静止状态时A相和B相都稳定的处于高电平或者低电平,当电机转动带动旋转编码器发生转动时A相和B相都会输出方波信号,但是B相的波形会领先A相90度,这意味着B相的波形图相较于A相的波形图会左移四分之一的周期,也就是上升沿和下降沿都是B相先产生A相后产生,此时A相上升沿时B相是高电平,A相是下降沿时B相是低电平。当电机反转带动编码器反转时B相会落后A相90度。但是在这里需要强调的一点是:对于不同旋转方向下A、B相到底谁在前谁在后的问题并没有统一的规定,不同的电机以及不同的编码器对应的前后顺序也可能正好相反

    结合上述的分析我们可以通过编码器对应的电平信息得出编码器的旋转方向和旋转速度,对于编码器的使用一个简单的思路是我们可以任选两个GPIO口,将A相GPIO口设置为上升沿或者下降沿触发中断,然后在中断回调函数中读取B相的电平状态来判断旋转方向,并且根据旋转方向对计数值加一或者减一来记录脉冲数量。但是这种方法存在着严重的缺陷,设想一下如果电机以极高的速度进行转动,那么相对应的编码器的数值也会快速发生变化,其中每次变化都会触发中断,这样CPU就会一直被打断,这样程序就无法正常处理其它逻辑了

    此时我们就只能借助通用定时器中的编码器进行数据的采集了,编码器位于触发控制器中,其直接连接通道一边沿检测器生成的TI1FP1和通道二边沿检测器生成的TI2FP2
    在这里插入图片描述

    此时如果我们想要对编码器中的值进行计算,那么我们可以直接将A相和B相引脚接入到对应的通道一和通道二引脚中去,那么此时我们就可以直接对编码器的值进行计算

    总结

    中…(img-JqXDdNHa-1772288740480)]

    此时如果我们想要对编码器中的值进行计算,那么我们可以直接将A相和B相引脚接入到对应的通道一和通道二引脚中去,那么此时我们就可以直接对编码器的值进行计算

    总结

    至此我们就了解了通用定时器的常见工作模式以及应用场景,同时也对底层组件的作用有了更加深入的了解,接下来我们就会进入到实战环节,通过定时器来实现复杂的外设控制

    赞(0)
    未经允许不得转载:171主机测评 » STM32F103系列单片机定时器介绍(五)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址