PWM互补输出死区时间设定

一、互补PWM输出

下图1:Q1和Q2两MOS管组成了一个桥臂,两个管子不能同时导通。那么,如果两个管子都用PWM波控制的话,则两个PWM波形极性相反,图1中红色圈内的波形,高低电平相反,我们把这种波形称为互补PWM波形。

图片

图片

图1

二、添加死区原因

上图1红圈里的互补PWM输出会造成问题的,首先,半导体器件内部都有结电容的,列如MOS管,MOS管导通,需要对MOS管的GS电容进行充电,只用GS电压大于阈值电压,MOS管才能导通;反之,MOS管关闭,GS电容放电,当GS电压小于阈值电压时,MOS管才能关闭。所以,在控制波形沿跳变时刻,一个MOS管GS电容在充电,一个MOS管GS电容在放电,这样会存在两个管子同时导通的情况,一个管子还没关断,另一个管子就开通了,从而造成VCC和GND短路。

解决上述问题,只需确保一个管子导通前,另一个管子已经是关闭了。下图2,控制波形沿跳变时刻,只需让高电平的提前一段时间为低,低电平的延迟一段为高,就可以避免两个管子同时导通情况,我们称同时为低电平的时间为死区时间。

图片

图片

图2

三、死区时间设定

在确保两个管子不发生同时导通的情况下,死区时间越短越好。死区时间越长,最大占空比越小,输出最大功率越小。具体的死区时间需要实际测试的,刚开始可以设置一个初始值,比如4us左右,然后结合示波器调试最终的死区时间。下图3是示波器上下桥GS波形(载波频率20kHz,死区时间2us)。

图片

图片

图3

死区时间的设定和载波频率有关,这里载波频率建议15K-20KHz。因为不同的载波频率,相同的死区时间,影响最大占空比。假如死区时间2us。载波频率20KHz时,周期时50us,那最大占空比是48/50=96%;载波频率是100kHz时,周期是10us,那最大占空比是8/10=80%,最大占空比只有80%是不是不能接受了。所以死区时间1-2us,是需要载波频率在15k-20kHz。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在STM32的高级定时器中,可以通过配置定时器的输出比较模式来实现PWM输出。而互补输出则是指使用两个定时器通道来实现互补输出,其中一个通道输出PWM波的高电平部分,另一个通道输出PWM波的低电平部分,从而实现互补输出的效果。同时,为了避免MOS管同时导通,可以设置死区时间来控制两个通道的输出时间间隔。 以下是一个简单的代码示例,实现了使用TIM1作为高级定时器,PA8和PA9作为互补输出通道,同时设置了死区时间为100个时钟周期: ```c #include "stm32f4xx.h" void TIM1_PWM_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_TIM1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_TIM1); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = 8399; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_Pulse = 4199; TIM_OC1Init(TIM1, &TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_Pulse = 4199; TIM_OC2Init(TIM1, &TIM_OCInitStructure); TIM_BDTRInitTypeDef TIM_BDTRInitStructure; TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Disable; TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable; TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; TIM_BDTRInitStructure.TIM_DeadTime = 100; TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low; TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure); TIM_Cmd(TIM1, ENABLE); } ``` 在该代码中,首先开启了TIM1和GPIOA的时钟,然后配置了PA8和PA9为复用输出模式,并将它们的复用引脚分别与TIM1的通道1和通道2相连。接着,配置了TIM1的计数器周期为8399,即定时器频率为84MHz/8400=10kHz。通道1和通道2都选择了PWM模式1,输出极性为高电平,占空比均为50%。最后,通过TIM_BDTRInitStructure结构体设置了死区时间为100个时钟周期,并启用了自动输出功能。 需要注意的是,该例程中使用的是STM32F407VG开发板,所以使用的是TIM1定时器。如果使用其他型号的开发板,需要根据具体情况修改代码中使用的定时器和GPIO引脚。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值