STM32 TIM高級定時器的互補PWM支持插入死區時間,本文將介紹如何計算以及配置正確的死區時間。
什么是死區時間?
死區時間主要是在逆變電路中,防止一個橋臂的上下兩個開關器件同時導通,那么會導致電路電流上升,從而對系統造成損害。因為開關元器件的
和
嚴格意義並不是相同的。所以在驅動開關元器件門極的時候需要增加一段延時,確保另一個開關管完全關斷之后再去打開這個開關元器件,這里的延時就是需要施加的死區時間。
數據手冊的參數
這里看了一下NXP
的IRF540
的數據手冊,門極開關時間如下所示;
然后找到相關的
,
,
,
的相關典型參數;
- :門極的開通延遲時間
- :門極的關斷延遲時間
- :門極上升時間
- :門極下降時間
下面是一個IGBT
的數據手冊;
下圖是IGBT
的開關屬性,同樣可以找到
,
,
,
等參數,下面計算的時候會用到;
如何計算合理的死區時間?
這里用
表示死區時間,因為門極上升和下降時間通常比延遲時間小很多,所以這里可以不用考慮它們。則死區時間滿足;
- :最大的關斷延遲時間;
- :最小的開通延遲時間;
- :最大的驅動信號傳遞延遲時間;
- :最小的驅動信號傳遞延遲時間;
其中
和
正如上文所提到的可以元器件的數據手冊中找到;
和
一般由驅動器廠家給出,如果是MCU
的IO
驅動的話,需要考慮IO
的上升時間和下降時間,另外一般會加光耦進行隔離,這里還需要考慮到光耦的開關延時。
STM32中配置死區時間
STM32的TIM
高級定時器支持互補PWM
波形發生,具體可以參考之前的文章《STM32 TIM 多通道互補PWM波形輸出配置快速入門》和《STM32 TIM1高級定時器配置快速入門》,同時它支持插入死區時間和剎車的配置。
直接看參考手冊里的寄存器TIMx_BDTR,這是配置剎車和死區時間的寄存器;
可以看到死區時間DT由UTG[7:0]決定,這里還有一個問題是
是什么?
在TIMx_CR1的寄存器可以得知,
由TIMx_CR1寄存器的CKD決定;如果這里配置成00,那么
和內部定時器的頻率相同,為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
,那么需要配置寄存器的值為;
直接寫成宏定義的形式
#define DEADTIME (u16)((unsigned long long)CKTIM/2 \ *(unsigned long long)DEADTIME_NS/1000 000 000uL)
用示波器驗證了一下,結果正確;當時圖片忘記保存,下次更新的時候再上圖吧。