STM32 TIM高级定时器死区时间的计算

STM32 TIM高级定时器的互补PWM支持插入死区时间,本文将介绍如何计算以及配置正确的死区时间。

什么是死区时间?

PWM是脉冲宽度调制,在电力电子中,最常用的就是整流和逆变。这就需要用到整流桥和逆变桥。

对三相电来说,就需要三个桥臂。以两电平为例,每个桥臂上有两个电力电子器件,比如IGBT。大致如下图所示;

这两个IGBT不能同时导通,否则就会出现短路的情况,从而对系统造成损害。

那为什么会出现同时导通的情况呢?

因为开关元器件的 t d o n t_{don} tdon t d o f f t_{doff} tdoff严格意义并不是相同的。

所以在驱动开关元器件门极的时候需要增加一段延时,确保另一个开关管完全关断之后再去打开这个开关元器件,通常存在两种情况;

  • 上半桥关断后,延迟一段时间再打开下半桥;
  • 下半桥关断后,延迟一段时间再打开上半桥;

这样就不会同时导通,从而避免功率元件烧毁;死区时间控制在通常的单片机所配备的PWM中都有这样的功能,下面会进一步介绍。
互补PWM的死区时间

相对于PWM来说,死区时间是在PWM输出的这个时间,上下管都不会有输出,当然会使波形输出中断,死区时间一般只占百分之几的周期。但是当PWM波本身占空比小时,空出的部分要比死区还大,所以死区会影响输出的纹波,但应该不是起到决定性作用的。

另外如果死区设置过小,但是仍然出现上下管同时导通,因为导通时间较短,电流较小,不足以烧毁,此时会导致开关元器件发热严重,所以选择合适的死区时间尤为重要;

数据手册的参数

这里看了一下NXPIRF540的数据手册,栅极开关时间如下所示;

IRF540
然后找到相关的 t d o n t_{don} tdon t d f f t_{dff} tdff t r t_r tr t f t_f tf的相关典型参数;
典型参数

  • t d o n t_{don} tdon:门极的开通延迟时间
  • t d o f f t_{doff} tdoff:门极的关断延迟时间
  • t r t_r tr:门极上升时间
  • t f t_f tf:门极下降时间

下面是一个IGBT的数据手册;
IGBT
下图是IGBT的开关属性,同样可以找到 t d o n t_{don} tdon t d f f t_{dff} tdff t r t_r tr t f t_f tf等参数,下面计算的时候会用到;
开关属性

如何计算合理的死区时间?

这里用 t d e a d t_{dead} tdead表示死区时间,因为门极上升和下降时间通常比延迟时间小很多,所以这里可以不用考虑它们。则死区时间满足;
T d e a d = [ ( T d o f f m a x − T d o n m i n ) + ( T p d d m a x − T p d d m i n ) ] ∗ 1.2 T_{dead}=[(T_{doffmax}-T_{donmin})+(T_{pddmax}-T_{pddmin})]*1.2 Tdead=[(TdoffmaxTdonmin)+(TpddmaxTpddmin)]1.2

  • T d o f f m a x T_{doffmax} Tdoffmax :最大的关断延迟时间;
  • T d o n m i n T_{donmin} Tdonmin :最小的开通延迟时间;
  • T p d d m a x T_{pddmax} Tpddmax :最大的驱动信号传递延迟时间;
  • T p d d m i n T_{pddmin} Tpddmin :最小的驱动信号传递延迟时间;

其中 T d o f f m a x T_{doffmax} Tdoffmax T d o n m i n T_{donmin} Tdonmin正如上文所提到的可以元器件的数据手册中找到;
T p d d m a x T_{pddmax} Tpddmax T p d d m i n T_{pddmin} Tpddmin 一般由驱动器厂家给出,如果是MCUIO驱动的话,需要考虑IO的上升时间和下降时间,另外一般会加光耦进行隔离,这里还需要考虑到光耦的开关延时。

STM32中配置死区时间

STM32的TIM高级定时器支持互补PWM波形发生,同时它支持插入死区时间和刹车的配置。

直接看参考手册里的寄存器TIMx_BDTR,这是配置刹车和死区时间的寄存器;
在这里插入图片描述
可以看到死区时间DTUTG[7:0]决定,这里还有一个问题是 T D T S T_{DTS} TDTS是什么?
在TIMx_CR1的寄存器可以得知, t D T S t_{DTS} tDTS由TIMx_CR1寄存器的CKD决定;如果这里配置成
00
,那么 t D T S t_{DTS} tDTS和内部定时器的频率相同,为8M

结合代码做一下计算;系统频率为72M,下面是时基单元的配置;

#define PWM_FREQ ((u16) 16000) // in Hz  (N.b.: pattern type is center aligned)
#define PWM_PRSC ((u8)0)
#define PWM_PERIOD ((u16) (CKTIM / (u32)(2 * PWM_FREQ *(PWM_PRSC+1)))) 
  TIM_TimeBaseStructInit(&TIM1_TimeBaseStructure);
  /* Time Base configuration */
  TIM1_TimeBaseStructure.TIM_Prescaler = 0x0;
  TIM1_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
  TIM1_TimeBaseStructure.TIM_Period = PWM_PERIOD;
  TIM1_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2;

PWM的频率是16K注意这里的PWM是中央对齐模式,因此配置的时钟频率为32K;

下面时刹车和死区时间,BDTR寄存器的配置,因此这里的CK_INT为32M

#define CKTIM	((u32)72000000uL) 	/* Silicon running at 72MHz Resolution: 1Hz */
#define DEADTIME_NS	((u16) 500)  //in nsec; range is [0...3500]
#define DEADTIME  (u16)((unsigned long long)CKTIM/2 \
          *(unsigned long long)DEADTIME_NS/1000 000 000uL)
  TIM1_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  TIM1_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  TIM1_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1; 
  TIM1_BDTRInitStructure.TIM_DeadTime = DEADTIME;
  TIM1_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
  TIM1_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  TIM1_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;

例:若TDTS = 31ns(32MHZ),可能的死区时间为:
0到3970ns,若步长时间为31ns;
4000us到8us,若步长时间为62ns;
8us到16us,若步长时间为250ns;
16us到32us,若步长时间为500ns;

如果需要配置死区时间 1000ns,系统频率72,000,000Hz,那么需要配置寄存器的值为;
V R E G = 1000 n s 31 = 32 V_{REG} = \cfrac{1000ns}{31} = 32 VREG=311000ns=32
直接写成宏定义的形式

#define DEADTIME  (u16)((unsigned long long)CKTIM/2 \
          *(unsigned long long)DEADTIME_NS/1000 000 000uL)

用示波器验证了一下,结果正确;

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小麦大叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值