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.如此而已!