定时器是单片机中重要的功能,有着定时器可以控制很多,例如常见的延时信号,可以更加精准的进行延时,还可以控制PWM发送脉冲信号,通过同时定时器的时长调整发送占空比达到不同的频率,波特率的发送也需要定时器来进行时钟,所以基本上在使用单片机上面定时器是必不可少的重要功能,因此,为了防止忘记当前定时器功能的使用和配置,写下当前学习总结。
单片机定时器TIM定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断,,
16位计数器,预分频器,自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大的58.62S的定时,不仅具备基本的定时中断功能,而且还包含内外时钟源选择,输入捕获、输出比较、编码器接口、主从触发模式等多种功能,
可以根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型
如图所示上述的定时器功能就是当前的编号,高级定时器用的TIM1、TIM8总线是APB2,有这通用定时器的全部功能。通用定时器是TIM2、TIM3、TIM4、TIM5 , 总线是APB1有这基本定时器的全部功能,还有这内外时钟源选择等。在STM32F103C8T6中有定时器TIM1、TIM2、TIM3、TIM4。
定时器时钟等于=时钟\预分配器值+1\自动重装器
实际分配系数=预分频器的值+1,最大值就是65535+1
自动重装寄存器=16位65535
这张图表示位可以定时器的触发方式,从第一的内部时钟触发和外部时钟,以及其他定时器,TIX捕获通道,表示当前定时器可以使用的时钟源
然后就通过不同的时钟模式,进入时基单元,时钟源先是进入PSC预分频器,然后进入计数器这时进行16位分频,然后ARR自动重装,接着就是中断输出控制
其中还有影子寄存器用于缓冲,让值得变化和事件可以同步发生,防止在运行途中更改发生错误
计数器计数频率:CK_CNT=CK_PSC/(PSC+1),ck_psc表示时钟源的例如72mhz
计数器溢出频率:CK_CNT_OV=CK_CNT/(ARR+1)=CK_PSC/(PSC+1)/(ARR+1)
配置定时器代码
主要讲解就是库函数的代码
第一就是TIM_DeInit()恢复初始化,
第二TIM_TimBaseInit()时基单元初始化
TIM_TimBaseStructInit()结构体变量
TIM_Cmd()使能或者失能定时器
TIM_ITConfig()使能中断输出信号
void TIM_TIxExternalClockConfig(选择其他定时器时钟
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);选择内部时钟
void TIM_ITRxExternalClockConfig选择TIX捕获通道时钟
void TIM_ETRClockMode2Config选择ETR外部时钟输入
void TIM_ETRConfig()配置外部时钟的
void TIM_PrescalerConfig用来写预分配值函数
void TIM_CounterModeConfig选择新的预分频值
void TIM_ARRPreloadConfig自动重装器预装功能
TIM_SetCounter 给计数器写入一个值
uint16_t TIM_GetCounter 获取当前计数器的值
输出比较
输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或者翻转的操作,用于输出一定的频率和占空比的PWM波形
PWM脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,
PWM参数:频率=1/ts 占空比=ton/ts 分辨率=占空比变化步距
捕获比较通道的输出部分,当CNT>CCR时或者CNT=CCR就会给输出模式控制器一个信号,接着输出模式控制器就会输出oc1ref信号,这个REF信号就可以前往主模式控制器或者下面的的路,有一个双路选择,当选择0,信号就会往上走,信号电平不翻转,选择1就会通过一个非门去反,就会翻转信号。
上述表很清晰的讲解了当前输出比较的模式,分别为8种模式,一般常用PWM模式,
接着就是PWM的基本结构,这个结构从来是的时基单元那就从预分频器到计数器自动重装器,接着就是PWM的输出比较单元,通过选择PWM模式来确定当前输出频率。表示为当CTN<CCR时REF为高电平,当CNT大于或等于CCR时就置0,输出波形就是低电平,所以就可以通过调整CNT来改变当前输出波形。
上述的波形图可以表示为当前的运行原理
黄色的线表示为ARR自动重装,蓝色的线表示CNT计数器,红色的线表示CCR捕获,下方的矩形图就是REF输出的波形,当CNT小于CCR就置高电平,当CNT大于或等于CCR时就置低电平。
所以当设置的CCR数值小一点,输出的占空比也会小,输出大占空比也会大
因此可以的出当前的PWM数值
PWM频率:CK_PSC/(PSC+1)/(ARR+1)这里就表示当前定时器的是时钟频率
PWM占空比:CRR/(ARR+1)
PWM分辨率:1/(ARR+1)
输入捕获模式
输入捕获模式下,当通道输入引脚出现指定电平跳动时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数
每一个高级定时器和通用定时器都拥有4个输入捕获通道
可配置PWMI模式,同时测量频率和占空比
可配合主从触发模式,实现硬件全自动测量
上面的输出比较不同,这里是输入捕获,输出比较是比较当前定时器CCR和CNT之间的数值然后根据设置的数值输出对应的波形,而输入捕获则是接受到输入信号,执行CNT锁存到CCR的动作。用于测量PWM波形的频率、占空比
测量频率的方法
测频法:在闸门时间T内,对上升沿计次,得到N,则频率FX=N/T,测量高频
测周法:两个上升沿内,以标准频率FC计次,得到N,则频率FX=fc/N,测量低频
中界频率:测频法与测周法误差相等的频率点,FM=根号FC/T,测量中频
从模式就是用于清零当前计数器的CNT
上图原理就是输入到进来的波形,通过边沿检测到上升沿触发,在此期间定时器CNT是一直计数的就是FC时钟频率,当TI1FP1触发上升沿,就会吧CNT当前的计数值转运到CCR1中,然后触发从模式CNT清零。
简单理解就是上图的正弦波就是输入信号,当信号出入进来前CNT是已经开始计数,当边沿检测到上升沿就会触发CCR1将CNT的计数值转运,接着从模式就会将CNT清零,继续开始计数,依次类推。测周法最大就是65535
相比上面多了一个CCR,例如上升沿是CCR1捕获清零,而CCR2则是捕获当前的CNT不会触发清零就会捕获当前的下降沿,因此上升沿的时间频率就知道,通过CCR2/CCR1就可以得出当前的频率的占空比。