TIM定时器功能详解
一、TIM
TIM(Timer)定时器。定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断。
时基单元:16位的计数器、预分频器和自动重装寄存器。
定时器类型:高级定时器、通用定时器、基本定时器。
STM32F103C8T6有TIM1、TIM2、TIM3、TIM4四个定时器。
二、定时器结构
1.基本定时器
定时中断:只能选择内部时钟72MHz,直接连接到PSC(预分频器),PSC是16位(0-65535),连接到CNT(计数器),CNT是16位(0-65535),CNT的值与ARR(自动重装寄存器)设定的值比较,大于自动重装寄存器进入更新中断或更新事件,并且自动清零CNT。
主模式触发DAC:进入更新事件直接连到TRGO,然后至DAC触发转换引脚。
2.通用定时器
内外时钟源选择:内部时钟源72MHz;外部时钟源有TIMx_ETR、TRGI。其中TRGI输入有TIMx_ETR引脚、其他定时器、TIMx_CH1引脚边沿、TIMx_CH1引脚、TIMx_CH2引脚。
主从触发模式:主模式将更新事件映射到TRGO上,连接至其他定时器或DAC/ADC。
3.高级定时器
三、定时中断基本结构
四、时序
1.预分频器时序
2.计数器时序
3.RCC时钟树
五、内外时钟源选择实验
1.定时器定时中断
①实验现象
在OLED显示屏,第一行显示Number:数值,数值每隔1秒加1;第二行显示计数器的值。
②硬件设计
③软件设计
用到OLED模块。
Timer.c
Timer.h
main.c
④用到函数
外设时钟使能或失能:RCC_APB1PeriphClockCmd
配置内部时钟:TIM_InternalClockConfig
时基单元初始化:TIM_TimeBaseInit
时基单元结构体重命名:TIM_TimeBaseInitTypeDef
TIM中断标志位清零:TIM_ClearFlag
中断配置:TIM_ITConfig
NVIC优先级分组:NVIC_PrierityGroupConfig
NVIC初始化:NVIC_Init
NVIC结构体重命名:NVIC_InitStructure
定时器使能:TIM_Cmd
定时器是否触发中断:TIM_GetITStatus
定时器清除中断:TIM_ClearITPendingBit
2.定时器外部时钟
①实验现象
OLED第一行显示Number:数值,第二行显示Counte:数值。Counte加到10,Number加1,然后Counte从零开始再加。
②硬件设计
③软件设计
用到OLED模块。
Timer.c
Timer.h
main.c
④用到函数
外设时钟使能:RCC_APB1PeriphClockCmd、RCC_APB2PreiphClockCmd
GPIO初始化:GPIO_Init
GPIO结构体重命名:GPIO_InitStructure
外部时钟模式2配置:TIM_ETRClockMode2Config
时基单元初始化:TIM_TimeBaseInit
时基单元结构体重命名:TIM_TimeBaseInitTypeDef
清除标志位:TIM_ClearFlag
中断配置:TIM_ITConfig
NVIC优先级分组配置:NVIC_PrierityGroupConfig
NVIC初始化:NVIC_Init
NVIC结构体重命名:NVIC_InitTypeDef
定时器使能:TIM_Cmd
定时器是否申请中断:TIM_GetITStatus
清除定时器申请中断:TIM_ClearITPendingBit
六、输出比较实验
1.输出比较简介
OC(Output Compare)输出比较。输出比较可以比较CNT(计数器)和CCR(捕获/比较寄存器)的值,来对输出电平进行置1、置0或翻转操作,用于输出一定频率和占空比的PWM波形。
每个高级定时器和通用定时器都有4个输出比较通道,高级定时器前三个通道额外拥有死区生成和互补输出功能。
2.PWM简介
PWM(Pulse Width Modulation),脉冲宽度调制。在具有惯性系统中,可以通过对一系列脉冲宽度进行调制,来等效获得所需模拟参量。
PWM参数:频率=1/Ts;占空比=Ton/Ts;分辨率=占空比步距变化。
3.捕获/比较通道的输出部分
CNT(计数器)与CCR(捕获/比较寄存器)比较,CNT>=CCR,输出控制寄存器的REF(参考信号),可以至主模式控制器,也可以至从模式,CC1P进行极性选择,然后到输出使能电路,然后输出。
4.输出比较模式
有效电平就是高电平,无效电平就是低电平。
5.PWM基本结构
6.PWM参数计算
7.舵机简介
舵机是一种根据输入PWM信号占空比来控制输出角度的。输入PWM信号的要求周期为20ms,高电平宽度为0.5ms-2.5ms。
舵机硬件电路,如下图所示:
舵机使用说明,如下图所示:
8.直流电机及驱动简介
直流电机是一种将电能转换成机械能的装置。有两个电极,正接正转,反接反转。直流电机属于大功率器件,GPIO口无法直接驱动,需要用到电机驱动电路。TB6612是一款双路H桥型直流电机驱动芯片,可以驱动两个电机的转速和方向。
TB6612芯片硬件电路,如下图所示:
TB6612使用说明,如下图所示:
9.PWM驱动LED呼吸灯
①实验现象
LED灯先逐渐变亮,再逐渐变暗。
②硬件设计
③软件设计
用到Delay模块。
PWM.c
PWM.h
main.c
④用到函数
外设时钟使能:RCC_APB1PeriphClockCmd、RCC_APB2PeriphClockCmd
GPIO初始化:GPIO_Init
GPIO结构体重命名:GPIO_InitTypeDef
内部时钟配置:TIM_IniternalClockConfig
时基单元初始化:TIM_TimeBaseInit
时基单元结构体重命名:TIM_TimeBaseInitTypedef
时基单元结构体初始化:TIM_TimeBaseStructInit
输出比较单元初始化:TIM_OC1Init
输出比较单元结构体重命名:TIM_OCInitTypeDef
输出比较单元结构体初始化:TIM_OCStructInit
设置输出比较寄存器:TIM_SetCompear1
10.PWM驱动舵机
①实验现象
按键按下,舵机旋转30°,当舵机旋转到180°时,舵机回到0°。在OLED上显示Angle:角度。
②硬件设计
③软件设计
用到OLED、Delay模块。
Key.c
Key.h
PWM.c
PWM.h
Servo.c
Servo.h
main.c
④用到函数
外设时钟使能:RCC_APB2PeriphClockCmd、GPIO_APB1PeriphClockCmd
GPIO初始化:GPIO_Init
GPIO结构体重命名:GPIO_InitTypeDef
读取输入数据:GPIO_ReadInputDataBit
内部时钟配置:TIM_InternalClockConfig
时基单元初始化:TIM_TimeBaseInit
时基单元结构体重命名:TIM_TimeBaseInitTypeDef
时基单元结构体初始化:TIM_TimeBaseStructInit
输出比较单元初始化:TIM_OC2Init
输出比较单元结构体重命名:TIM_OCInitTypeDef
输出比较单元结构体初始化:TIM_OCStructInit
定时器使能:TIM_Cmd
设置输出比较寄存器:TIM_SetCompear2
11.PWM驱动直流电机
①实验现象
当按键按下,电机速度加20,到100时,电机反转;按键再按下速度也加20。OLED屏幕显示速度。
②硬件设计
③软件设计
用到OLED、Delay模块。
Key.c
Key.h
PWM.c
PWM.h
Motor.c
Motor.h
main.c
④用到函数
外设时钟使能:RCC_APB2PeriphClockCmd、RCC_APB1PeriphClockCmd
GPIO初始化:GPIO_Init
GPIO结构体重命名:GPIO_InitTypeDef
读取输入数据:GPIO_ReadInputDataBit
内部时钟配置:TIM_InternalClockConfig
时基单元初始化:TIM_TimeBaseInit
时基单元结构体重命名:TIM_TimeBaseInitTypeDef
时基单元结构体初始化:TIM_TimeBaseStructInit
输出比较单元初始化:TIM_OC3Init
输出比较单元结构体重命名:TIM_OCInitTypeDef
输出比较单元结构体初始化:TIM_OCStructInit
定时器使能:TIM_Cmd
设置输出比较寄存器:TIM_SetCompare3
设置GPIO高电平:GPIO_SetBits
设置GPIO低电平:GPIO_ResetBits
七、输入捕获实验
1.输入捕获简介
IC(Input Capture)输入捕获。在输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存在CCR中。可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数。
高级定时器和通用定时器都有4个输入捕获通道。
2.频率测量
测频法:闸门时间T内,对上升沿进行计次,得到N,则fx=N/T。适合高频信号。
测周法:两个上升沿内,以标准频率fc计次,得到N,则fx=fc/N。时候低频信号。
中界频率:测频法与测周法误差相等的频率点。fm=根号下fc/T。
3.输入捕获通道工作原理
TIMx_CHx输入,经过异或(三相无刷电机)给TI1(通道1)。
TIMx_CHx输入,给TIx至输入滤波器和边沿检测器,PWMI模式下可以单独设置输入滤波器和边沿测测器至两个通道,经过ICx至预分频器,产生一个更新事件,使捕获/比较寄存器所存CNT的值。
4.主从触发模式
主模式TIM信号控制别的外设,从模式触发源选择控制自己。
5.输入捕获基本结构
6.PWMI基本结构
7.输入捕获模式测频率
①实验现象
OLED上显示频率。
②硬件设计
③软件设计
用到OLED模块。
PWM.c
PWM.h
IC.c
IC.h
main.c
④用到函数
外设时钟使能:RCC_APB1PeriphClockCmd、RCC_APB2PeriphClockCmd
GPIO初始化:GPIO_Init
GPIO结构体重命名:GPIO_InitTypeDef
内部时钟配置:TIM_InternalClockConfig
时基单元初始化:TIM_TimeBaseInit
时基单元结构体重命名:TIM_TimeBaseInitTypeDef
时基单元结构体赋初值:TIM_TimeBaseStructInit
输出比较单元初始化:TIM_OC1Init
输出比较单元结构体重命名:TIM_OCInitTypeDef
输出比较单元结构体初始化:TIM_OCStructInit
输入捕获单元初始化:TIM_ICInit
输入捕获单元结构体重命名:TIM_ICInitTypeDef
触发源选择:TIM_SelectInputTrigger
从模式选择:TIM_SelectSlaveMode
TIM使能:TIM_Cmd
设置CCR:TIM_SetCompare1
PSC配置:TIM_PrescalerConfig
返回CCR的值:TIM_GetCapture1
8.PWMI模式测量频率和占空比
①实验现象
在OLED上显示频率和占空比。
②硬件设计
③软件设计
用到OLED、PWM模块。
IC.c
IC.h
main.c
④用到函数
外设时钟使能:RCC_APB1PeriphClockCmd、RCC_APB2PeriphClockCmd
GPIO初始化:GPIO_Init
GPIO结构体重命名:GPIO_InitTypeDef
内部时钟配置:TIM_InternalClockConfig
时基单元初始化:TIM_TimeBaseInit
时基单元结构体重命名:TIM_TimeBaseInitTypeDef
时基单元结构体赋初值:TIM_TimeBaseStructInit
输入捕获单元初始化:TIM_ICInit
输入捕获单元结构体重命名:TIM_ICInitTypeDef
PWMI配置:TIM_PWMIConfig
触发源选择:TIM_SelectInputTrigger
从模式选择:TIM_SelectSlaveMode
TIM使能:TIM_Cmd
CCR值返回:TIM_GetCapture1、TIM_GetCapture2
八、编码器接口实验
1.编码器接口简介
编码器接口(Encoder Interface),可以接收正交编码器信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度。
每个高级定时器和通用定时器都拥有1个编码器接口。两个输入引脚借用了输入捕获的通道1和通道2。
2.正交编码器
正转时,A相提前B相90°;反转时,B相提前A相90°。
3.编码器接口工作原理
TIMx_CH1、TIMx_CH2连接编码器A、B相接口输入;输出根据旋转方向使CNT自增或自减。
4.编码器接口基本结构
5.工作模式
一共有三种计数模式。
6.实例
①均不反相
②TI1反相
7.TIM编码器接口测速
①实验现象
OLED上显示旋转编码器速度。
②硬件设计
③软件设计
用到OLED模块。
Timer.c
Timer.h
Encoder.c
Encoder.h
main.c
④用到函数
外设时钟使能:RCC_APB1PeriphClockCmd、RCC_APB2PeriphClockCmd
GPIO初始化:GPIO_Init
GPIO结构体重命名:GPIO_InitTypedef
内部时钟配置:TIM_InternalClockConfig
时基单元初始化:TIM_TimeBaseInit
时基单元结构体重命名:TIM_TimeBaseInitTypeDef
时基单元结构体赋初值:TIM_TimeBaseStructInit
清除标志位:TIM_ClearFlag
中断配置:TIM_ITConfig
NVIC优先级分组:NVIC_PriorityGroupConfig
NVIC初始化:NVIC_Init
NVIC结构体重命名:NVIC_InitTypeDef
输入捕获初始化:TIM_ICInit
输入捕获结构体重命名:TIM_ICInitTypeDef
输入捕获结构体初始化:TIM_ICStructInit
编码器接口配置:TIM_EncoderInterfaceConfig
TIM使能:TIM_Cmd
是否申请中断:TIM_GetITStatus
清除中断:TIM_ClearITPendingBit
作者:嵌入式@小王