详解单片机定时器工作原理
扫描二维码
随时随地手机看文章
单片机定时器是一种用于计时和定时操作的功能模块。它通常用于生成延时、计数事件以及产生精确的时间间隔信号。其工作原理可以从以下几个方面来理解:
1. 基本结构
计数器:定时器内有一个计数器(通常是一个寄存器),用于计数时钟脉冲。
时钟源:定时器依赖于一个时钟源,通常是系统时钟,还可以是外部时钟信号。
预分频器:在某些单片机中,定时器可以有一个预分频器,将系统时钟频率降低,以适应所需的计时时间。
2. 计数方式
向上计数:定时器从0开始向上计数,直到达到设定值(上限)。
向下计数:从一个设定的初始值向下计数到0。
双向计数:有些定时器支持同时计数。
3. 启动与停止
用户可以通过设置控制寄存器来启动或停止定时器的计数。定时器开始计数后,会根据设定的模式和值进行运行。
4. 溢出和中断
当计数器达到设定的最大值时,会发生溢出。此时,定时器可以产生一个中断信号,通知CPU定时器的工作状态已完成。程序可以在中断服务例程(ISR)中执行某些操作。
有些定时器还支持比较模式,在指定的时间点生成输出信号。
5. 精度
定时器的精度取决于系统时钟的频率和预分频设置。通过调整这些参数,可以在不同的应用场景中实现所需的时间间隔。
6. 应用场景
产生延时:在需要等待一段时间的操作中。
计时功能:计数事件发生的次数,比如脉冲计数。
PWM(脉宽调制):用于控制电机和调节亮度。
时间戳:记录事件发生的精确时间。
定时器功能比较 :
1)计数器三种计数模式
向上计数模式:从0开始,计到arr预设值,产生溢出事件,返回重新计时
向下计数模式:从arr预设值开始,计到0,产生溢出事件,返回重新计时
中央对齐模式:从0开始向上计数,计到arr产生溢出事件,然后向下计数,计数到1以后,又产生溢出,然后再从0开始向上计数。(此种技术方法也可叫向上/向下计数)
2)高级控制定时器(TIM1和TIM8)
两个高级控制定时器(TIM1和TIM8)可以被看成是分配到6个通的三三相PWM发生器,它具有带死区插入的互补PWM输出,还可以被当成完整的通用定时器。四个独立的通道可以用于:
(1)输入捕获
(2)输出比较
(3)产生PWM(边缘或中心对齐模式)
(4)单脉冲输出
配置为16位标准定时器时,它与TIMX定时器具有相同的功能。配置为16位PWM发生器时,它具有全调制能力(0~100%)。在调试模式下,计数器可以被冻结,同时PWM输出被禁止,从而切断由这些输出所控制的开关。很多功能都与标准的TIM定时器相同,内部结构也相同,因此高级控制定时器可以通过定时器链接功能与TIM定时器协同操作,提供步或事件链接功能。
3)通用定时器(TlMx)
STM32F103XC、STM32F103XD和STM32F103XE增强型系列产品中,内置了多达4 个可同步运行的标准定时器(TIM2、TIM3、TIM4和TIM5)。每个定时器都有一个16位的自动加载递加/递减计数器、一个16位的预分频器和4个独立的通道,每个通道都可用于输入捕获、输出比较、PWM和单脉冲模式输出,在最大的封装配置中可提供最多16个输入捕获、输出比较或PWM通道。它们还能通过定时器链接功能与高级控制定时器共同工作,提供同步或事件链接功能。在调试模式下,计数器可以被冻结。任一标准定时器都能用于产生:PWM输出。每个定时器都有独立的DMA请求机制。
这些定时器还能够处理增量编码器的信号,也能处理1至3个霍尔传感器的数字输出。
4)基本定时器-TlM6和TIM7
这2个定时器主要是用于产生:DAC触发信号,也可当成通用的16位时基计数器。独立看门 狗独立的看门狗是基于一个12位的递减计数器和一个8位的预分频器,它由一个内部独立的40kHz的RC振荡器提供时钟; 因为这个RC振荡器独立于主时钟,所以它可运行于停机和待机模式。它可以被当成看门狗用于在发生问题时复位整个系统,或作为一个自由定时器为应用程序提供超时管理。通过选项字节可以配置成是软件或硬件启动看门狗。在调试模式下,计数器可以被冻结。
5)窗口看门狗
窗口看门狗内有一个7位的递减计数器,并可以设置成自由运行。它可以被当成看门狗用于在发生问题时复位整个系统。它由主时钟驱动,具有早期预警中断功能; 在调试模式下,计数器可以被冻结。
6)系统时基定时器
这个定时器是专用于实时操作系统,也可当成一个标准的递减计数器。它具有下述特性:
(1)24位的递减计数器
(2)自动重加载功能
(3)当计数器为0时能产生一个可屏蔽系统中断
(4)可编程时钟源
7)通用定时器的时钟来源;
a:内部时钟(CK_INT)
b:外部时钟模式1:外部输入脚(TIx)
c:外部时钟模式2:外部触发输入(ETR)
d:内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器
8)通用定时期内部时钟的产生:
从截图可以看到通用定时器(TIM2-7)的时钟不是直接来自APB1,而是通过APB1的预分频器以后才到达定时器模块。
当APB1的预分频器系数为1时,这个倍频器就不起作用了,定时器的时钟频率等于APB1的频率;
当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1时钟频率的两倍。
这里要分析一下几个概念,也是理解定时器的功能的核心概念,通用定时器有些类似于操作系统的定时器节拍,可以在定时器采用的时钟源的基础上再进行分频,然后再设定溢出大小,进而实现定时的功能,当然自动重载功能更不再话下。
预分频的功能是使定时器在APB时钟的基础上再一次分频,使其独立的运行。就像上述代码中举例,预分频系数设定为36000-1,则表示该定时器的 时钟频率就变成了72MHz/36000 = 2KHz,而“计数溢出大小”可以理解为自动装载数值,表示每隔x个计数溢出一次,可以产生1次中断,当然这个频率是经过预分频后的频率。
所以从上述的分析可知,定时器的定时时间计算为:
Tout = (TIM_Period+1)*(TIM_Prescaler+1)/72000000
在本程序案例中:Tout= 2000*36000/72000000=1s
需要注意的是,公式中的72000000的使用,是因为该定时器采用的时钟源为72MHz,如果配置成别的时钟源,则相应公式也应该改变。
另外TIM_ClockDivision为时钟分割,这个简单的讲,就是定时器的数字滤波功能,设置成默认即可。
综上所述,单片机定时器是基于一个计数器和时钟源运作的模块,通过设置寄存器和控制信号来实现精确的时间控制和事件计数。其广泛应用于各种实时控制和计时需求的场景中。