在buck-boost电路中,如果不为互补PWM加死区时间,在电平翻转时,可能会出现同时为高电平。同时高电平的时间很短,示波器难以捕捉。在极短时间内(30ns左右),上下两个MOS管同时导通,导致MOS管烧毁,为解决该问题,需要引入死区时间。但是,部分芯片没有死区时间功能,为此需要开发者自己实现死区功能。
不互补PWM
在T1时刻可以通过,减小PWM2占空比,给PWM电平翻转流出足够的时间,避免出现同时高电平现象。为尽可能保证Vout=VinDuty1(Duty1:PWM1占空比;Duty2:PWM2占空比),需要合理的设置PWM占空比Duty2,既要保证T(1-Duty1-Duty2)>Tr(Tr:PWM电平翻转所需最小时间,包含MOS管开断时间;T:PWM周期),又要时1-Duty1-Duty2尽可能小。这样可以保证T1时刻PWM工作正常,不会同时高电平,T2时刻有待继续处理。
延时
为保证T2时刻,PWM工作正常,需要为PWM1添加延时。延时需要大于Tr(50ns),小于PWM1,PWM2高电平持续时间差值(n62.5ns),且n62.5-Delay>50ns,这样可以产生类似死区时间的效果。下图比较夸张,实际要做时,可能PW2占空比50%,PWM2占空比为48%,前后各延时1%占空比即可满足需求。
实操结果
最后,放两张实际的PWM波形图及代码。使用nop语句做的延时,与预估时间有些出入,T2时刻时间差171ns,T1时刻时间差50ns,1-Duty1-Duty2=5%。16M时钟频率,定时器分频1,定时器计数上限80,16MHz/80=200KHz,周期5us,差值时间250ns,PWM1,PWM2极性相反。200KHz PWM,64MHz时钟频率,STM32F103生成的死区时间比较漂亮,T1,T2时间差值几乎相等。
hal_pwm_module_init();
pwm_ch_t pwm_channel[3];
for(int i = 0; i < 2; i++)
{
pwm_channel[i].pwmN = (PWMN_e)(PWM_CH0 + (PWMN_e)i);
pwm_channel[i].pwmDiv = PWM_CLK_NO_DIV;
pwm_channel[i].pwmMode = PWM_CNT_UP;
pwm_channel[i].pwmPolarity = PWM_POLARITY_RISING;
pwm_channel[i].cntTopVal = 80; // 256 ybz 8000*62.5ns=500us 80*62.5ns=5us
}
pwm_channel[0].pwmPin = 0;
pwm_channel[1].pwmPin = 4;
pwm_channel[0].cmpVal = 22; // 24-20 171.88ns 62.48ns 250ns
pwm_channel[0].pwmPolarity = PWM_POLARITY_RISING;
pwm_channel[1].pwmPolarity = PWM_POLARITY_FALLING;
pwm_channel[1].cmpVal = 18;
hal_pwm_ch_start(pwm_channel[0]);
__asm("nop"); //ideal:62.5ns, in fact:171ns
// __asm("nop");
hal_pwm_ch_start(pwm_channel[1]);