STM32F407单片机有2个高级定时器(TIM1和TIM8)。本文重点叙述使用高级定时器输出互补PWM时,PWM的频率以及互补PWM的死区时间的计算方法。
一、PWM频率计算
PWM频率或周期由自动重载寄存器(TIMx_ARR)的值决定(下文将用“arr”代表),其占空比由捕获/比较寄存器(TIMx_CCRx)的值决定(下文将用“ccr”代表)。
定时器的本质是计数器,定时器的时钟频率也就是计数器的计数频率,假设定时器的时钟频率为f,则计数器每(1/f)秒计数一次,例如,若定时器的时钟频率为1MHz,则意味着计数器每1us计数一次。
因此,若arr的值为1000,则定时器输出的PWM的周期为(1000*1us=1ms),其频率为1kHz。若arr的值为500,则定时器输出的PWM的周期为(500*1us=0.5ms),其频率为2kHz。
#注意:定时器输出的PWM的频率,是在定时器的时钟频率已确定的前提下进行的计算。实际上定时器输出的PWM的频率由定时器的时钟频率和arr的值共同决定,这在上文的计算过程中也可以看出。
如何设置PWM的输出频率将在另一篇文章重点叙述,本篇文章重点叙述计算方法,充分了解计算方法后才能有的放矢的设置相关参数。
二、死区时间计算
定时器输出的互补PWM波的死区时间由 TIMx_CR1 寄存器的 CKD[1:0]位和 TIMx_BDTR 寄存器的 DTG[7:0]位决定。
其中,TIMx_BDTR 寄存器的 DTG[7:0]位直接决定死区时间(DT),
DGT[7:0]=[xxxxxxxx](x=0或1),从右到左依次是第0位到第7位,共有8个位,其中x=0或1,
因此DTG[7:0]位根据x的不同,共有2^8个数,即0~255(00000000~11111111)。
其中DTG[7:5]位决定死区时间(DT)的计算公式,其公式如下图所示,
①当DTG[7:5]=“0xx”,即DGT[7:0]=[00000000]~[01111111],即DGT[7:0]=0~127时,
DT=DGT[7:0] x t_dtg,其中 t_dtg=t_DTS;
②当DTG[7:5]=“10x”,即DGT[7:0]=[10000000]~[10111111],即DGT[7:0]=128~191时,
DT=( 64+DGT[5:0] )x t_dtg,其中 t_dtg=2xt_DTS;
③当DTG[7:5]=“110”,即DGT[7:0]=[11000000]~[11011111],即DGT[7:0]=192~223时,
DT=( 32+DGT[4:0] )x t_dtg,其中 t_dtg=8xt_DTS;
④当DTG[7:5]=“111”,即DGT[7:0]=[11100000]~[11111111],即DGT[7:0]=224~255时,
DT=( 32+DGT[4:0] )x t_dtg,其中 t_dtg=16xt_DTS;
上式中,t_DTS的值就取决于TIMx_CR1 寄存器的 CKD[1:0]位,计算公式如下图所示:
其中,“t_CK_INT”为计数器的计数周期,即定时器时钟频率的倒数,例如,若定时器的时钟频率为1MHz,则意味着计数器每1us计数一次,则t_CK_INT=1us。(可回顾上文中的“PWM频率计算”的内容分)
①当CKD[1:0]=00时,t_DTS=t_CK_INT;
②当CKD[1:0]=01时,t_DTS=2 x t_CK_INT;
③当CKD[1:0]=10时,t_DTS=4 x t_CK_INT;
④当CKD[1:0]=11时,不设此值;
#注意:死区时间的计算和频率计算一样,都是在定时器时钟频率已确定的前提下完成的计算。本文重点叙述计算过程,同样是为了在设置死区时间时,能够有的放矢的设置相关参数。
三、总结
1、高级定时器输出的互补PWM的频率由arr值直接决定,改变arr值便可以直接改变其输出的PWM频率;
2、高级定时器输出的互补PWM的死区是时间由TIMx_CR1寄存器的CKD[1:0]位和TIMx_BDTR 寄存器的DTG[7:0]位共同决定,其中DTG[7:0]位直接决定死区时间计算公式,CKD[1:0]位决定公式中t_dtg的值,从而间接控制死区时间;