STM32TIM高级定时器死区时间的计算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32TIM⾼级定时器死区时间的计算STM32 TIM⾼级定时器的互补PWM⽀持插⼊死区时间,本⽂将介绍如何计算以及配置正确的死区时间。
⽂章⽬录
什么是死区时间?
死区时间主要是在逆变电路中,防⽌⼀个桥臂的上下两个开关器件同时导通,那么会导致电路电流上升,从⽽对系统造成损害。
因为开关元器件的t don tdon和t doff tdoff严格意义并不是相同的。
所以在驱动开关元器件门极的时候需要增加⼀段延时,确保另⼀个开关管完全关断之后再去打开这个开关元器件,这⾥的延时就是需要施加的死区时间。
数据⼿册的参数
这⾥看了⼀下NXP的IRF540的数据⼿册,门极开关时间如下所⽰;
然后找到相关的t don tdon,t dff tdff,t r tr,t f tf的相关典型参数;
t don tdon:门极的开通延迟时间
t doff tdoff:门极的关断延迟时间
t r tr:门极上升时间
t f tf:门极下降时间
下⾯是⼀个IGBT的数据⼿册;
下图是IGBT的开关属性,同样可以找到t don tdon,t dff tdff,t r tr,t f tf等参数,下⾯计算的时候会⽤到;
如何计算合理的死区时间?
这⾥⽤t dead tdead表⽰死区时间,因为门极上升和下降时间通常⽐延迟时间⼩很多,所以这⾥可以不⽤考虑它们。
则死区时间满⾜;
T dead=[(T doffmax−T donmin)+(T pddmax−T pddmin)]∗1.2Tdead=[(Tdoffmax−Tdonmin)+(Tpddmax−Tpddmin)]∗1.2 T doffmax Tdoffmax:最⼤的关断延迟时间;
T donmin Tdonmin:最⼩的开通延迟时间;
T pddmax Tpddmax:最⼤的驱动信号传递延迟时间;
T pddmin Tpddmin:最⼩的驱动信号传递延迟时间;
其中T doffmax Tdoffmax和T donmin Tdonmin正如上⽂所提到的可以元器件的数据⼿册中找到;
T pddmax Tpddmax和T pddmin Tpddmin⼀般由驱动器⼚家给出,如果是MCU的IO驱动的话,需要考虑IO的上升时间和下降时间,另外⼀般会加光耦进⾏隔离,这⾥还需要考虑到光耦的开关延时。
STM32中配置死区时间
STM32的TIM⾼级定时器⽀持互补PWM波形发⽣,具体可以参考之前的⽂章和,同时它⽀持插⼊死区时间和刹车的配置。
直接看参考⼿册⾥的寄存器TIMx_BDTR,这是配置刹车和死区时间的寄存器;
可以看到死区时间DT由UTG[7:0]决定,这⾥还有⼀个问题是T DTS TDT S是什么?
在TIMx_CR1的寄存器可以得知,t DTS tDT S由TIMx_CR1寄存器的CKD决定;如果这⾥配置成00,那么t DTS tDT S和内部定时器的频率相同,为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 REG=500
31=16VREG=31500=16
直接写成宏定义的形式
#define DEADTIME (u16)((unsigned long long)CKTIM/2 \
*(unsigned long long)DEADTIME_NS/1000 000 000uL)
⽤⽰波器验证了⼀下,结果正确;当时图⽚忘记保存,下次更新的时候再上图吧。
Loading [MathJax]/jax/output/HTML-CSS/jax.js。