1. 为什么需要死区时间?
在Buck-Boost这类开关电源电路中,我们经常使用互补PWM信号来控制上下桥臂的MOS管。理想情况下,两个MOS管应该严格交替导通,但实际上MOS管从导通到完全关闭需要一定时间(通常是几十纳秒)。如果没有死区时间保护,就可能出现两个MOS管同时导通的危险情况。
我遇到过最惨痛的教训是在调试一个降压电路时,因为忘记设置死区时间,连续烧毁了3个MOS管。用示波器观察发现,虽然肉眼看不到明显的重叠,但在纳秒级时间尺度上确实存在同时导通的情况。这种瞬间短路会导致MOS管急剧发热,严重时甚至会炸裂。
2. 硬件死区与软件模拟的区别
STM32的高级定时器(如TIM1/TIM8)内置了硬件死区发生器,通过配置BDTR寄存器就能自动插入死区时间。但像STM32F103C8T6这样的基础型号,定时器并不支持这个功能。这时候就需要用软件来模拟死区效果。
硬件死区的优势是精度高、不占用CPU资源。而软件模拟虽然灵活性高,但需要考虑以下几个关键点:
- 延时精度受系统时钟限制
- 需要精确计算占空比补偿
- 要考虑中断响应带来的时序抖动
3. 软件死区的实现原理
3.1 基本思路
通过调整两路PWM的占空比和插入精确延时,确保在任何时刻都不会出现两路信号同时为高电平的情况。具体来说:
- 在T1时刻(PWM1由低变高),先让PWM2提前变低
- 在T2时刻(PWM1由高变低),延迟PWM2的上升沿
- 保持整体占空比基本不变
3.2 关键参数计算
假设:
- PWM周期T=5μs(200kHz)
- MOS管开关时间Tr=50ns
- 系统时钟16MHz(每个nop指令约62.5ns)
那么需要满足:
- T1时刻:1-Duty1-Duty2 > Tr
- T2时刻:Delay > Tr 且 Delay < (Duty1-Duty2)*T
4. 具体实现步骤
4.1 定时器配置
void PWM_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 时基配置 TIM_TimeBaseStructure.TIM_Period = 80-1; // 200kHz PWM TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // PWM通道1配置 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 40; // 50%占空比 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM1, &TIM_OCInitStructure); // PWM通道2配置(互补输出) TIM_OCInitStructure.TIM_Pulse = 38; // 47.5%占空比 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OC2Init(TIM1, &TIM_OCInitStructure); TIM_Cmd(TIM1, ENABLE); }4.2 死区时间插入
void Generate_PWM(void) { PWM_Init(); // T1时刻处理 TIM_SetCompare2(TIM1, 38); // PWM2占空比减小2.5% // T2时刻处理 __asm("nop"); // 约62.5ns延时 __asm("nop"); // 总共约125ns延时 TIM_SetCompare1(TIM1, 40); }5. 实测波形分析
在实际测试中,使用16MHz的STM32F103,得到了以下结果:
- T1时刻时间差:实测约171ns(理论计算125ns)
- T2时刻时间差:实测约50ns
- 占空比损失:约5%
这些差异主要来自:
- nop指令执行时间的不确定性
- 函数调用带来的额外时钟周期
- 示波器测量误差
6. 优化建议
- 时钟频率选择:尽量使用更高的系统时钟(如72MHz),可以提升时间分辨率
- 延时补偿:通过校准测试,建立实际延时与nop指令数的对应关系表
- 占空比动态调整:根据输出电压反馈实时微调占空比,补偿死区带来的损失
- 使用定时器中断:对于更精确的控制,可以在比较匹配中断中手动操作IO口
7. 常见问题排查
问题1:死区时间不足
- 现象:MOS管发热严重
- 解决方法:增加nop指令数量或进一步减小占空比差值
问题2:输出波形畸变
- 现象:PWM波形出现毛刺
- 解决方法:检查GPIO配置是否正确,确保没有其他外设干扰
问题3:频率漂移
- 现象:实际PWM频率与设定值不符
- 解决方法:重新计算定时器分频值,考虑死区引入的周期损失
8. 进阶技巧
对于需要更高精度的场合,可以尝试以下方法:
- 使用DMA控制PWM:通过DMA自动更新CCR寄存器,减少CPU干预
- 汇编级优化:用精确计算的汇编指令序列替代nop延时
- 硬件辅助:虽然主定时器没有死区功能,但可以配合基本定时器产生同步信号
我在一个太阳能充电项目中就采用了第三种方案,使用TIM2产生同步信号来协调TIM1和TIM3的输出,最终实现了ns级精度的死区控制。