STM32——定时器
说起PWM我们肯定不可避免的谈及定时器,接下来我们来对定时器进行详细的了解.本文章是观看一些视频及文章之后的见解,如有错误请及时指正,文章引载内容有。
说起PWM我们肯定不可避免的谈及定时器,接下来我们来对定时器进行详细的了解.
本文章是观看一些视频及文章之后的见解,如有错误请及时指正,文章引载内容有STM32——TIM定时器(附代码)_定时器程序代码-CSDN博客
1.定时器的工作原理
当定时器开始工作时,定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断或事件。
中断:中断会通往NVIC,再配置NVIC的定时器通道,那么定时器的更新中断就能够得到CPU的响应了。
事件:更新事件不会触发中断,但是会触发其他电路(外设)的工作。不用CPU干预,实现了硬件自动化。
2.定时器的基本单元
定时器的基本单元也称时基单元,由计数器(CNT,Counter)、预分频器(PSC,Prescaler)、自动重装寄存器(ARR,AutoReloadRegister)组成。
自动重装器:就是计数的目标值,计多少个时钟申请中断。当计数值=自动重装寄存器的值时,就是计时时间到了,自动重装寄存器会产生一个中断信号,并且清0计数器。计数器自动开始下一次的计数计时。比如自动重装器设置为10,当计数器累加到10时,申请中断,并且
计数器清0。
时基单元的结构图如下

3.定时器的分类

stm32c8t6的定时器TIM1 TIM2 TIM3 TIM4
时钟源输入
内部时钟(CK_INT):来自APB总线(默认72MHz)
外部时钟:
外部时钟模式2:外部触发输入(ETR)
其他定时器:级联时使用
预分频(PSC)
时钟信号经过预分频器(TIMx_PSC)分频:
分频系数 =
PSC + 1
例如:PSC=71→计数器的频率: 系统时钟/(预分频+1) 72MHz / (71+1) = 1MHz。 72MHz=72000,000Hz预分频写1就是2分频, 若预分频器16位所以最大值位65535
计数器(CNT): 每来一个上升沿就加一
向上计数:从0到ARR值,溢出时触发中断或DMA。
向下计数:从ARR值到0。
中央对齐:先向上到ARR,再向下到0(用于对称PWM)。
若其也为16位65565, 从0加到65535,后面又从0开始
自动重装载(ARR)
计数器达到ARR值时:
自动复位到0(或初始值)。
可触发更新事件(UEV),产生中断/DMA请求。
比较/捕获寄存器(TIMx_CCRx)
输出比较模式:当计数器(CNT)的值与CCR值匹配时,触发引脚电平翻转(生成PWM)。
输入捕获模式:信号边沿到来时,将当前CNT值存入CCR(用于测量脉宽)。
1.基本定时器

基本流程:TIM时钟→预分频器→计数器(计数器计数自增,同时不断地与自动重装寄存器进行比较,它俩值相等时,即计时时间到,这时会产生一个更新中断or更新事件。CPU响应更新中断,就完成了定时中断的任务。)
注:UI表示中断或DMA输出,U表示事件;基本定时器的时钟源只有内部时钟(72MHZ),没有外部时钟。
2.通用定时器


与基本定时器相比,通用定时器的时钟源就比较多了,分别有:RCC内部时钟、ETR外部时钟、ITRx其他定时器、TIx_CHX捕获通道。
TIMx_ETR引脚上的外部时钟
stm32F103的单片机的ETR(External)引脚的位置对应的是PA0。可以在ETR引脚接一个外部方波时钟,然后配置下内部的极性选择、边沿检测、和预分频器,再配置输入滤波电路,对外部时钟电路进行一定的整形。滤波后的信号兵分两路,上面一路ETRF进入触发控制器,紧跟着就可以选择作为时基单元的时钟了,如果想在ETR外部引脚提供时钟,或者想对ETR进行计数,把这个定时器当做计数器来使用,那就可以配置这一路的电路,这一路也叫“外部时钟模式2”(橙色线).
TRGI(Trigger In)
除了外部ETR引脚可以提供时钟外,下面还有一路可以提供时钟,就是TRGI(Trigger In),主要是用作触发输入来使用的,触发输入可以触发定时器的从模式,TRGI也可以作为外部时钟使用,当这个TRGI当做外部时钟来使用的时候,这一路就叫做“外部时钟模式1”(红色线)。
ITR信号
这一部分的时钟信号是来自其他定时器的,图右边可以看出,主模式的TRGO可以通向其他定时器,通向其他定时器的时候,就接到了其他定时器的ITR引脚上了,ITR0~ITR3分别来自其他4个定时器的TRGO输出(定时器与定时器相连,实现定时器级联的功能)(绿色线)。
如:初始化TIM3,使用主模式把TIM3的更新事件映射到TRGO上,接着初始化TIM2,这里选择ITR2,对应的就是TIM3的TRGO。(TIM3的TRGO接到TIM2的ITR2上)这样TIM3的更新事件就可以驱动TIM2的时基单元,就实现了定时器级联。
TI1F_ED
ED(Edge,边沿)连接的是输入捕获单元的CH1引脚,也就是从CH1(channel 1,通道1)引脚获得时钟(紫色线)。
补充:还有两个时钟源:TI1FP1连接到CH1引脚的时钟,TI2FP2连接到CH2引脚的时钟。
4.定时器的关键模式
- 输出比较模式(PWM模式)
- 输入捕获模式
- 编码器接口模式(编码器接口测速)
定时器的整体工作流程
- 开启时钟
- 选择时钟源(内部时钟或外部时钟)
- 配置时基单元(预分配器PSC,计数器-向上计数/向下计数CNT,自动重转载器ARR) (对时钟源进行分频;分频后得到的新的时钟源作为计数器的输入,驱动计数器计数;计数器计数时,不断对比自动重装寄存器的数值,如果计数值=自动重装寄存器的值,计数器清0,产生中断与事件。)
- 清除TIMX的更新标志位
- 配置输出中断控制(用于启用或禁用指定的TIM中断)。
- 配置NVIC
- 启动定时器
下图是定时器中断的简单结构图:

定时器的相关公式
- 计数器计数频率:CK_CNT = CK_PSC / (PSC + 1)
CK_PSC为时钟源的频率,(PSC + 1)分频系数,如:CK_PSC为内部主时钟72Mhz,PSC + 1分频系数为2,得到的计数器计数频率为72Mhz/2=36Mhz。
为什么是PSC+1而不是PSC?因为规定分频是从0开始,如0分频就是不分频,PSC=1代表二分频,依次类推...只是大家都习惯这样,这里需要注意下。
- 定时器计数一次的时间: 1 / CK_CNT
- 计数器溢出频率:CKCNTOV = CK_CNT / (ARR + 1)= CK_PSC / (PSC + 1) / (ARR + 1)
举例:现在预分频PSC=1,即二分频,主频72MHZ,二分频就是36MHZ(1秒跳36M次),ARR+1=10,就表明,跳10次,自动清零,并从零开始重新计数。计数器的溢出频率为72M/2/10=3.6Mhz,溢出时间为1/3.6Mhz。
5.定时器的输出比较模式(OC)
输出PWM波形
1.OC介绍

2.PWM介绍(有单独的一章)
控制舵机,电机
6.定时器的输入捕获模式(IC)
1.IC的介绍

- 指定电平跳变:程序手动设置上升沿还是下降沿触发
- 与OC区别:OC是比较CCR与CNT的值来输出PWM波,IC则是类似于中断一样,出现电平跳变这样的信号就会使CCR=CNT,CNT继续计数,直到下一次电平跳变信号出现,再次使CCR=CNT,使原来的CCR被新的CCR值覆盖,然后对多次不同的CCR处理来测频率,占空比等等数值
2.频率测量法
3.输入捕获电路
7.定时器的编码器接口模式

8.代码部分
1.PWM驱动
2.输入捕获
3.编码器接口测速
更多推荐



所有评论(0)