问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

太难了,炸机后才去注意PWM的死区时间

创作时间:
作者:
@小白创作中心

太难了,炸机后才去注意PWM的死区时间

引用
CSDN
1.
https://blog.csdn.net/u010632165/article/details/116024588

在电力电子系统中,PWM(脉冲宽度调制)是常用的控制方式,特别是在逆变器和整流器中。然而,如果不正确设置死区时间,可能会导致功率器件损坏。本文将详细介绍死区时间的概念、计算方法以及在STM32微控制器中的具体配置。

什么是死区时间?

PWM(脉冲宽度调制)在电力电子中最常用的是整流和逆变。这就需要用到整流桥和逆变桥。对三相电来说,就需要三个桥臂。以两电平为例,每个桥臂上有两个电力电子器件,比如IGBT。大致如下图所示:

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

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

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

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

这样就不会同时导通,从而避免功率元件烧毁。

数据手册的参数

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

IRF540

然后找到相关的,,,的相关典型参数:

  • :门极的开通延迟时间
  • :门极的关断延迟时间
  • :门极上升时间
  • :门极下降时间

下面是一个IGBT的数据手册:

IGBT

下图是IGBT的开关属性,同样可以找到,,,等参数,下面计算的时候会用到:

开关属性

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

这里用表示死区时间,因为门极上升和下降时间通常比延迟时间小很多,所以这里可以不用考虑它们。则死区时间满足:

  • :最大的关断延迟时间
  • :最小的开通延迟时间
  • :最大的驱动信号传递延迟时间
  • :最小的驱动信号传递延迟时间

其中和正如上文所提到的可以元器件的数据手册中找到;和一般由驱动器厂家给出;

如果是MCU的IO驱动的话,需要考虑IO的上升时间和下降时间,另外一般会加光耦进行隔离,这里还需要考虑到光耦的开关延时。

STM32中配置死区时间

STM32的TIM高级定时器支持互补PWM波形发生,同时它支持插入死区时间和刹车的配置。直接看参考手册里的寄存器TIMx_BDTR,这是配置刹车和死区时间的寄存器:

TIMx_BDTR

可以看到死区时间DT由UTG[7:0]决定,这里还有一个问题是是什么?在TIMx_CR1的寄存器可以得知,由TIMx_CR1寄存器的CKD决定:

如果这里配置成00,那么和内部定时器的频率相同,为8M;

CKD

结合代码做一下计算;系统频率为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,那么需要配置寄存器的值为;

直接写成宏定义的形式;

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

用示波器验证了一下;具体如下图所示:

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号