细说MCU输出互补型PWM波形时设置死区时间的作用

26 篇文章 0 订阅
24 篇文章 0 订阅

目录

一、工程背景

二、死区时间的作用


一、工程背景

         在作者的文章里建立工程时,为配置输出互补型PWM波形曾经设置了死区时间,DEAD=100个定时器的时间周期(简称实例1):细说MCU输出互补型PWM波形的实现方法-CSDN博客  https://wenchm.blog.csdn.net/article/details/139770672

        设置死区时间到底有什么作用呢?

二、死区时间的作用

         

        实例1的看到两路PWM波形除了高低电平互补以外,其他没有什么区别。

        那么,在实例1图中设置的死区时间(Dead Time)参数,体现在何处呢?

        在示波器下,把实例1中的波形图按时间轴展开,仔细看一下两个波形就会发现,它们还是有差别的。波形展开后,就能看到设置死区时间的效果了。

        示波器操作 :开启Cursor,把两条铅垂线Cursor分别调整到通道1、通道2的上升沿和下降沿的的边沿上,左上角的窗体里自动测试两条竖线的差∆x=590ns。

        在截图中,可以清楚地看到,在PA8(通道1)由低电平变为高电平之前,PA7(通道2就已经由高电平变为了低电平,这两个跳变沿之间的时间就是死区时间。

        在这个死区时间之内,两路PWM的输出均为低电平。如果这两路PWM分别控制一个H桥的高、低压臂开关则在此死区时间之内,两个开关均不导通。为什么需要这样呢?因为实际开关的动作(导通和关断)是需要时间的,虽然互补型PWM在理论上能保证两路信号完全互补,但从信号发出到开关实际动作,还是需要一定时间的。死区时间的设置,就可以避免两个开关同时导通的可能性。

        实例1中,设置死区时间参数为100。由于没有设置计数器的预分频因子,所以两次计数的时间间隔为(1/170)μs,这个100所代表的时间就是100个定时器的时钟周期,约为0.588 ns。示波器测量结果为590 ns。

  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

wenchm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值