死区时间主要是在逆变电路中,防止一个桥臂的上下两个开关器件同时导通,那么会导致电路电流上升,从而对系统造成损害。因为开关元器件的tdont_{don}tdon和tdofft_{doff}tdoff严格意义并不是相同的。所以在驱动开关元器件门极的时候需要增加一段延时,确保另一个开关管完全关断之后再去打开这个开关元器件,这里的延时就是需要施加的死区时间。
这里看了一下NXP
的IRF540
的数据手册,门极开关时间如下所示;
tdont_{don}tdon:门极的开通延迟时间
tdofft_{doff}tdoff:门极的关断延迟时间
trt_rtr:门极上升时间
tft_ftf:门极下降时间
下面是一个IGBT
的数据手册;
IGBT
的开关属性,同样可以找到tdont_{don}tdon,tdfft_{dff}tdff,trt_rtr,tft_ftf等参数,下面计算的时候会用到;这里用tdeadt_{dead}tdead表示死区时间,因为门极上升和下降时间通常比延迟时间小很多,所以这里可以不用考虑它们。则死区时间满足;
Tdead=[(Tdoffmax−Tdonmin)+(Tpddmax−Tpddmin)]∗1.2T_{dead}=[(T_{doffmax}-T_{donmin})+(T_{pddmax}-T_{pddmin})]*1.2Tdead=[(Tdoffmax−Tdonmin)+(Tpddmax−Tpddmin)]∗1.2
TdoffmaxT_{doffmax}Tdoffmax :最大的关断延迟时间;
TdonminT_{donmin}Tdonmin :最小的开通延迟时间;
TpddmaxT_{pddmax}Tpddmax :最大的驱动信号传递延迟时间;
TpddminT_{pddmin}Tpddmin :最小的驱动信号传递延迟时间;
其中TdoffmaxT_{doffmax}Tdoffmax 和TdonminT_{donmin}Tdonmin正如上文所提到的可以元器件的数据手册中找到;
TpddmaxT_{pddmax}Tpddmax 和 TpddminT_{pddmin}Tpddmin 一般由驱动器厂家给出,如果是MCU
的IO
驱动的话,需要考虑IO
的上升时间和下降时间,另外一般会加光耦进行隔离,这里还需要考虑到光耦的开关延时。
STM32的TIM
高级定时器支持互补PWM
波形发生,具体可以参考之前的文章《STM32 TIM 多通道互补PWM波形输出配置快速入门》和《STM32 TIM1高级定时器配置快速入门》,同时它支持插入死区时间和刹车的配置。
直接看参考手册里的寄存器TIMx_BDTR,这是配置刹车和死区时间的寄存器;
8M
;#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
,那么需要配置寄存器的值为;
VREG=50031=16V_{REG} = \cfrac{500}{31} = 16VREG=31500=16
直接写成宏定义的形式
#define DEADTIME (u16)((unsigned long long)CKTIM/2 *(unsigned long long)DEADTIME_NS/1000 000 000uL)
用示波器验证了一下,结果正确;当时图片忘记保存,下次更新的时候再上图吧。
联系客服