STM32 TIM高級定時器死區時間的計算


STM32 TIM高級定時器的互補PWM支持插入死區時間,本文將介紹如何計算以及配置正確的死區時間。

什么是死區時間?

死區時間主要是在逆變電路中,防止一個橋臂的上下兩個開關器件同時導通,那么會導致電路電流上升,從而對系統造成損害。因為開關元器件的 t d o n t_{don} t d o f f t_{doff} 嚴格意義並不是相同的。所以在驅動開關元器件門極的時候需要增加一段延時,確保另一個開關管完全關斷之后再去打開這個開關元器件,這里的延時就是需要施加的死區時間。
在這里插入圖片描述

數據手冊的參數

這里看了一下NXPIRF540的數據手冊,門極開關時間如下所示;

在這里插入圖片描述
然后找到相關的 t d o n t_{don} t d f f t_{dff} t r t_r t f t_f 的相關典型參數;
在這里插入圖片描述

  • t d o n t_{don} :門極的開通延遲時間
  • t d o f f t_{doff} :門極的關斷延遲時間
  • t r t_r :門極上升時間
  • t f t_f :門極下降時間

下面是一個IGBT的數據手冊;
在這里插入圖片描述
下圖是IGBT的開關屬性,同樣可以找到 t d o n t_{don} t d f f t_{dff} t r t_r t f t_f 等參數,下面計算的時候會用到;
在這里插入圖片描述

如何計算合理的死區時間?

這里用 t d e a d t_{dead} 表示死區時間,因為門極上升和下降時間通常比延遲時間小很多,所以這里可以不用考慮它們。則死區時間滿足;
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

  • T d o f f m a x T_{doffmax} :最大的關斷延遲時間;
  • T d o n m i n T_{donmin} :最小的開通延遲時間;
  • T p d d m a x T_{pddmax} :最大的驅動信號傳遞延遲時間;
  • T p d d m i n T_{pddmin} :最小的驅動信號傳遞延遲時間;

其中 T d o f f m a x T_{doffmax} T d o n m i n T_{donmin} 正如上文所提到的可以元器件的數據手冊中找到;
T p d d m a x T_{pddmax} T p d d m i n T_{pddmin} 一般由驅動器廠家給出,如果是MCUIO驅動的話,需要考慮IO的上升時間和下降時間,另外一般會加光耦進行隔離,這里還需要考慮到光耦的開關延時。

STM32中配置死區時間

STM32的TIM高級定時器支持互補PWM波形發生,具體可以參考之前的文章《STM32 TIM 多通道互補PWM波形輸出配置快速入門》《STM32 TIM1高級定時器配置快速入門》,同時它支持插入死區時間和剎車的配置。

直接看參考手冊里的寄存器TIMx_BDTR,這是配置剎車和死區時間的寄存器;
在這里插入圖片描述
可以看到死區時間DTUTG[7:0]決定,這里還有一個問題是 T D T S T_{DTS} 是什么?
在TIMx_CR1的寄存器可以得知, t D T S t_{DTS} 由TIMx_CR1寄存器的CKD決定;如果這里配置成
00
,那么 t D T S t_{DTS} 和內部定時器的頻率相同,為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;

如果需要配置死區時間 500ns,系統頻率72,000,000Hz,那么需要配置寄存器的值為;
V R E G = 500 31 = 16 V_{REG} = \cfrac{500}{31} = 16
直接寫成宏定義的形式

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

用示波器驗證了一下,結果正確;當時圖片忘記保存,下次更新的時候再上圖吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM