STM32F103定时器详解

发布者:码农侠最新更新时间:2017-09-28 来源: eefocus关键字:STM32F103  定时器 手机看文章 扫描二维码
随时随地手机看文章

STM32F103系列的单片机一共有11个定时器,其中:
2个高级定时器
4个普通定时器
2个基本定时器
2个看门狗定时器

1个系统嘀嗒定时器


除去看门狗定时器和系统滴答定时器的八个定时器列表;



8个定时器分成3个组;
TIM1和TIM8是高级定时器
TIM2-TIM5是通用定时器
TIM6和TIM7是基本的定时器
这8个定时器都是16位的,它们的计数器的类型除了基本定时器TIM6和TIM7都支持向上,向下,向上/向下这3种计数模式

计数器三种计数模式
向上计数模式:从0开始,计到arr预设值,产生溢出事件,返回重新计时
向下计数模式:从arr预设值开始,计到0,产生溢出事件,返回重新计时
中央对齐模式:从0开始向上计数,计到arr产生溢出事件,然后向下计数,计数到1以后,又产生溢出,然后再从0开始向上计数。(此种技术方法也可叫向上/向下计数)

基本定时器(TIM6,TIM7)的主要功能:
只有最基本的定时功能,。基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动

通用定时器(TIM2~TIM5)的主要功能:
除了基本的定时器的功能外,还具有测量输入信号的脉冲长度( 输入捕获) 或者产生输出波形( 输出比较和PWM)

高级定时器(TIM1,TIM8)的主要功能:
高级定时器不但具有基本,通用定时器的所有的功能,还具有控制交直流电动机所有的功能,你比如它可以输出6路互补带死区的信号,刹车功能等等

通用定时器的时钟来源;
a:内部时钟(CK_INT)
b:外部时钟模式1:外部输入脚(TIx)
c:外部时钟模式2:外部触发输入(ETR)
d:内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器

通用定时期内部时钟的产生:

从截图可以看到通用定时器(TIM2-7)的时钟不是直接来自APB1,而是通过APB1的预分频器以后才到达定时器模块。
当APB1的预分频器系数为1时,这个倍频器就不起作用了,定时器的时钟频率等于APB1的频率;
当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1时钟频率的两倍。

自动装在寄存器arr值的计算:
Tout= ((arr+1)*(psc+1))/Tclk;
Tclk:TIM3的输入时钟频率(单位为Mhz)。
Tout:TIM3溢出时间(单位为us)。
计时1S,输入时钟频率为72MHz,加入PSC预分频器的值为35999,那么:
((1+psc )/72M)*(1+arr )=((1+35999)/72M)*(1+arr)=1秒
则可计算得出自动窗装载寄存器arr=1999

通用定时器PWM工作原理
以PWM模式2,定时器3向上计数,有效电平是高电平,定时器3的第3个PWM通道为例:

定时器3的第3个PWM通道对应是PB0这引脚,三角顶点的值就是TIM3_ARR寄存器的值,上图这条红线的值就TIM3_CCR3
当定时器3的计数器(TIM3_CNT)刚开始计数的时候是小于捕获/比较寄存器(TIM3_CCR3)的值,
此时PB0输出低电平,随着计数器(TIM3_CNT)值慢慢的增加,
当计数器(TIM3_CNT)大于捕获/比较寄存器(TIM3_CCR3)的值时,这时PB0电平就会翻转,输出高电平,计数器(TIM3_CNT)的值继续增加,
当TIM3_CNT=TIM3_ARR的值时,TIM3_CNT重新回到0继续计数,PB0电平翻转,输出低电平,此时一个完整的PWM信号就诞生了。

PWM输出模式;
STM32的PWM输出有两种模式:
模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。区别如下:
110:PWM模式1,在向上计数时,一旦TIMx_CNT
在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
111:PWM模式2-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。
由以上可知:
模式1和模式2正好互补,互为相反,所以在运用起来差别也并不太大。而从计数模式上来看,PWM也和TIMx在作定时器时一样,也有向上计数模式、向下计数模式和中心对齐模式

PWM的输出管脚:
不同的TIMx输出的引脚是不同(此处设计管脚重映射)
TIM3复用功能重映射:

注:重映射是为了PCB的设计方便。值得一提的是,其分为部分映射和全部映射

PWM输出频率的计算:
PWM输出的是一个方波信号,信号的频率是由TIMx的时钟频率和TIMx_ARR这个寄存器所决定的
输出信号的占空比则是由TIMx_CRRx寄存器确:
占空比=(TIMx_CRRx/TIMx_ARR)*100%
PWM频率的计算公式为:

其中
F就是PWM输出的频率,单位是:HZ;
ARR就是自动重装载寄存器(TIMx_ARR);
PSC 就是预分频器(TIMx_PSC);
72M就是系统的频率;

STM32 高级定时器PWM的输出

一路带死区时间的互补PWM的波形图


STM32F103VC这款单片机一共有2个高级定时器TIM1和TIM8
这2个高级定时器都可以同时产生3路互补带死区时间的PWM信号和一路单独的PWM信号,
具有刹车输入功能,在紧急的情况下这个刹车功能可以切断PWM信号的输出
还具有支持针对定位的增量(正交)编码器和霍尔传感器电路
高级控制定时器(TIM1 和TIM8) 由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动

它适合多种用途,包含测量输入信号的脉冲宽度( 输入捕获) ,或者产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM等)。
使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。
高级控制定时器(TIM1 和TIM8) 和通用定时器(TIMx) 是完全独立的,它们不共享任何资源

死区时间
H桥电路为避免由于关断延迟效应造成上下桥臂直通,有必要设置死区时间
死区时间可有效地避免延迟效应所造成的一个桥臂未完全关断,而另一桥臂又处于导通状态,避免直通炸开关管。
死区时间越大,电路的工作也就越可靠,但会带来输出波形的失真以及降低输出效率。
死区时间小,输出波形要好一些,但是会降低系统的可靠性,一般这个死区时间设置为us级

元器件死区时间是不可以改变的,它主要是取决于元器件的制作工艺和材料!

原则上死区时间当然越小越好。设置死区时间的目的,其实说白了就是为了电路的安全。最佳的设置方法是:在保证安全的前提下,设置的死区时间越小越好。以不炸功率管、输出不短路为目的。

STM32死区时间探究
设置寄存器:就是刹车和死区控制寄存器(TIMx_BDTR)

这个寄存器的第0—7位,这8个位就是用来设置死区时间的,使用如下:

以TIM1为例说明其频率是如何产生的。

定时器1适中产生路线:
系统时钟-> AHB预分频 -> APB2预分频 –> TIM1倍频器–> 产生TIM1的时钟系统
流程图看可以看出,要想知道TIM1的时钟,就的知道系统时钟,AHB预分频器的值,还有APB2预分频器的值,只要知道了这几个值,即可算出TIM1的时钟频率?
这些值从何来,在“SystemInit()”这个时钟的初始化函数中已经给我们答案了,在这个函数中设置的系统时钟是72MZ,AHB预分频器和APB2预分频器值都是设置为1,由此可算出:TIM1时钟频率:
72MHZ了,TDTS=1/72MHZ=13.89ns

Tdtg死区时间步进值,它的值是定时器的周期乘以相应的数字得到的

下面看看官方给的公式如何使用,如下:
DTG[7:5]=0xx=>DT=DTG[6:0]×Tdtg,Tdtg=TDTS
首先由DTG[7:5]=0xx可以知道的是:DTG的第7位必须为0,剩余的0~6这7位可配置死区时间,假如TIM1的时钟为72M的话,那么由公式Tdtg=TDTS可计算出:TDTS=1/72MHZ=13.89ns。
有了这个值,然后通过公式DT=DTG[6:0]×Tdtg即可计算出DT的值。

如果DTG的第0~6位均为0的话,DT=0
如果DTG的第0~6位均为1的话,DT=127*13.89ns=1764ns
如果TIM1的时钟为72M的话,
公式1可设置的死区时间0~1764ns,也就是说:
如果你的项目需要输出的PWM信号要求的死区时间是0——1764ns的时候你就可以用公式1

同样可计算出4个公式的死去区间,如下:
公式1:DT=0~1764ns
公式2:DT=1777.9ns~3528.88ns
公式3:DT=3555.84ns~7000.56ns
公式4:DT=7111.68ns~14001.12ns

死区时间的设置:

假如我们设计了一个项目要求输出的PWM信号中加入一个3us的死区时间因为3us这个值在第二个公式决定的死区范围之内所以选择第二个公式。3000/(13.89*2)=108,
所以DTG[5:0]=108-64=44
所以DTG=127+44+32=203=0XCB,TIM1->BDTR|=0Xcb
这里为什么要在加上一个32那?在公式2中DTG的第5位是一个X,也就是说这一位可以设置为高电平,也可以设置为低电平,在这里我们将这一位设置为了高电平,所有要在加上一个32.如此而已!


关键字:STM32F103  定时器 引用地址:STM32F103定时器详解

上一篇:stm32f103c8v6多路PWM输出
下一篇:STM32用SysTick来做定时器

推荐阅读最新更新时间:2024-03-16 15:39

神舟IV学习笔记(七)定时器中断流水灯
通用定时器的功能非常强大,能够测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM),也能够用于定时中断任务。其实系统滴答和实时时钟功能类似于定时器。51单片机也有定时器,可以使用软件的方式实现实时时钟的功能,就是断电后会到初始状态了。 神舟IV开发板采用的是STM32F107VCT,内部含有多达10个定时器,其中TIM1和TIM8是高级控制定时器在APB2总线上,TIM2—TIM7是挂在APB1上的,所以使用起来要注意的是,开启不同的时钟。 我们就用通用定时器TIM2实现LED以1s速度流水灯的功能。首先我们看看时钟,TIM2挂在APB1总线上,而APB1的最大时钟速度为36MHZ。由于系统初始化将APB1的分
[单片机]
神舟IV学习笔记(七)<font color='red'>定时器</font>中断流水灯
STM32的TIMx如何设置成普通定时器
实现的功能是让开发板上的LED周期性的发光 下面以stm32的TIM2作为实例一步步配置成为定时器: 1:对定时器的基本配置 TIM_TimeBaseStructure.TIM_Period = 65535; //设置自动装载寄存器 TIM_TimeBaseStructure.TIM_Prescaler = 100; //分频计数 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //选择向上计数 TIM_TimeBaseInit(TIM2,
[单片机]
51单片机---定时器/计数器的配置
1.CPU时序 振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)。比如开发板的时钟电路上的12MHZ晶振,它就提供了单片机的振荡周期。周期T=1/12M,单位为秒。 状态周期: 两个振荡周期为1个状态周期,用S表示。振荡周期又称为S周期或时钟周期。 机器周期:6个状态周期,即12个振荡周期。以12MHZ晶振为例,机器周期=12*(1/12M)=1/M=1us. 指令周期:完成一条指令所占用的全部时间,以机器周期为单位。以12MHZ为例,指令周期为1~4us. 2.定时器绪论 51单片机有2组定时器/计数器,既可以定时又可以计数。 定时器/计数器和单片机的CPU是相互独立的,定时器/计数器工作时不需要C
[单片机]
51单片机---<font color='red'>定时器</font>/计数器的配置
STM8的TIM1定时器简单使用
STM8的TIM1是16位高级控制定时器,简单的定时溢出中断。功能实现LED1亮500ms,灭500ms,循环往复。 #i nclude iostm8s103f3.h void CLK_init(void) { CLK_CKDIVR = 0x08; // 16M内部RC经2分频后系统时钟为8M } void GPIO_init(void) { PD_DDR = 0x08; // 配置PD端口的方向寄存器PD3输出 PD_CR1 = 0x08; // 设置PD3为推挽输出 } void TIM1_init(void) { TIM1_PSCRH = 0x1F; // 8M系统时钟经预分频f=fck/(PSCR+1) TIM1_PS
[单片机]
STM32 定时器实现红外遥控数据接收
一、原理 1、红外发射协议 红外通信的协议有很多种。这个实验使用的是NEC协议。这个协议采用PWM的方法进行调制,利用脉冲宽度来表示 0 和 1 。 NEC 遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步码由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制反码均是 8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性。因此,每帧的数据为 32 位,包括地址码,地址反码,控制码,控制反码。反码可用于解码时进行校验比对。 NEC码的位定义:一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms(560us 脉冲+16
[单片机]
STM32F103试用体验:OLED显示及DHT11温湿度测量实验
1.实验简述 之前做了在GD32开发板上的温湿度测量实验,现在在精英STM32开发板上调整代码重新实现. 用到的材料工具如下: (1)精英STM32开发板 (2)0.96寸OLED模块 (3)DHT11模块 (4)Keil项目程序 2.连接方式 利用开发板的OLED/Camera接口,直接将模块插入到此接口内,从原理图中得出接口对应的单片机引脚后,在程序中修改相应引脚,如图: 3.实验过程 单片机通电后,先显示基本信息至OLED屏,然后每1秒通过DHT11获取温湿度数据,并实时在OLED屏上显示. 开始时测得温度26.6度,湿度91%,如图: 对DHT11模块吹口仙气(效果不明显可以多吹几口^_^),可看到温度
[单片机]
<font color='red'>STM32F103</font>试用体验:OLED显示及DHT11温湿度测量实验
利用单片机定时中断实现软定时器
以下是代码实现已经测试并用到项目上课放心使用 Author : 吾本杞人 #include reg52.h #include Intrins.h #include TypeDef.h #include CPUPin_Def.h #include VarDef.h #define TIME_BASE_2MS 2 #define TIME_BASE_500MS 250 #define TIME_BASE_10MS 5 #define F_OSC 110592 //定义这个是默认按照11.0592MHZ的晶振算的 TH0 TL0的值 方式1 16位定时器 //注意这种写法只
[单片机]
采用WDM的精确定时器及其在冗余技术中的应用
0  引 言     高可靠性是现代军用电子设备和某些控制系统的首要需求。冗余技术是计算机系统可靠性设计中常采用的一种技术, 是提高计算机系统可靠性的最有效方法之一。合理的冗余设计将大大提高系统的可靠性, 但同时也增加了系统的复杂度和设计的难度, 应用冗余配置的系统还增加了用户投资。因此, 如何对冗余设计进行合理有效的设计, 是值得深入研究的课题。     1:1 热冗余也就是所谓的双重化, 是其中一种有效的冗余方式, 但它并不是两个部件简单的并联运行,而是需要硬件、软件、通信等协同工作来实现。将互为冗余的两个部件构成一个有机的整体, 通常包括以下多个技术要点: 信息同步技术、故障检测技术、故障仲裁技术和切换技术、热插拔技术和
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved