MCAL Pwm互补输出死区插入问题分析
-
PWM信号的死区概念与作用
PWM 信号的死区是指在 PWM 信号的切换过程中,由于电子元件(如晶体管、场效应管等开关元件)的响应时间和延迟,导致上一通道关闭与下一通道开启之间存在的时间间隔。在这段时间内,PWM 信号输出将暂时中断,两个通道同时处于关闭状态,从而避免在同一时刻两个相邻的 PWM 信号(通常是互补的)同时处于高电平或低电平状态。
PWM 死区在电力电子设备和电机控制系统中起着至关重要的作用,主要包括以下几个方面:
- 保护电路元件:在 PWM 控制中,如果没有死区时间,当两个互补的 PWM 信号在切换时,可能会因为开关元件的响应延迟而导致短暂的同时导通,从而产生极大的电流冲击。这种电流冲击不仅会损坏开关元件,还可能对整个电路系统造成严重的损害。死区时间的引入可以在一定程度上避免这种情况的发生,从而保护电路元件免受损坏。
- 防止短路故障:在一些特殊情况下,如电机控制中的 H 桥电路,如果两个相邻的开关元件同时导通,将会导致短路故障。这种故障不仅会损坏电路元件,还可能引发更严重的安全问题。死区时间的设置可以确保在任何时刻都只有一个开关元件处于导通状态,从而有效防止短路故障的发生。
- 提高系统稳定性:死区时间的引入还可以减少由于开关元件切换过快而产生的电流和电压突变,从而降低系统的噪声和纹波。这有助于提高系统的稳定性和可靠性,特别是在对精度要求较高的应用中。
PWM信号死区时间要求
- 考虑因素
- 开关器件特性:不同的开关器件,如IGBT、MOSFET等,其开通和关断时间不同。一般来说,开关速度越快的器件,死区时间可以相对设置得短一些;而开关速度较慢的器件,则需要较长的死区时间来确保其可靠关断和避免直通现象。例如,IGBT的关断时间相对较长,通常需要几十纳秒到几百纳秒的死区时间,具体取决于其型号和工作条件。
- 工作频率:PWM信号的工作频率越高,开关器件在单位时间内的开关次数就越多,死区时间对系统性能的影响就越显著。为了保证在高频率下开关器件能够正常工作且不发生直通,需要根据频率的变化适当调整死区时间。通常,频率每增加一倍,死区时间可能需要增加20% - 50%左右,具体比例取决于电路的具体情况。
- 电源电压和电流:电源电压越高,一旦发生直通现象,产生的短路电流就越大,对电路的危害也就越严重,因此需要更长的死区时间来确保安全。同时,负载电流的大小也会影响死区时间的设置。较大的负载电流在开关切换时会产生较大的电流变化率,为了避免电流过冲和开关器件的损坏,也需要适当增加死区时间。例如,在一些高电压、大电流的电力电子系统中,死区时间可能会达到数微秒甚至更长。
两个互补通道死区要求
在实际应用中,两个互补通道的死区要求通常是相同的。原因如下:
- 保证对称性:互补PWM信号的主要目的是控制桥臂上下两个开关器件交替导通,以实现对负载的有效控制。如果两个通道的死区时间不同,会导致上下桥臂导通时间的不对称,从而使输出电压或电流产生直流偏置分量。这不仅会影响负载的正常工作,还可能导致电机等感性负载出现额外的损耗和发热,甚至影响系统的稳定性。
- 简化控制:采用相同的死区时间可以简化控制系统的设计和实现。在硬件电路上,不需要为两个通道分别设置不同的死区时间生成电路;在软件算法上,也可以采用统一的死区时间参数进行计算和控制,降低了系统的复杂性和设计成本,同时也便于系统的调试和维护。
当然,在某些特殊情况下,如考虑到电路中存在的一些非理想因素,如元件参数的不对称性、寄生参数的影响等,可能会对两个互补通道的死区时间进行微调,但这种调整通常是在保证基本对称的前提下进行的微小修正,而不是完全不同的死区要求。
云途YTM32系列车规MCU eTMR定时器模块对PWM的死区支持
云途YTM32系列车规MCU eTMR定时器模块仅在配置为互补模式(Complementary Mode)PWM时可以支持死区插入功能。
Notes:在互补模式(左对齐、右对齐和中间对齐模式均可支持)下,通道n+1输出PWM与通道n输出互补(n为偶数,取指范围是0,2,4,6)。该互补PWM对的周期和占空比由通道n的CH_VAL0[VAL0]和CH_VAL1[VAL1]配置决定,通道n+1的CH_VAL0[VAL0]和CH_VAL1[VAL1]配置无效。
具体来看,不同系列芯片使用的eTMR版本对PWM死区插入的支持有所不同:
- 对于使用eTMR模块的芯片,每个通道的死区时间可以独立配置,死区时间计算为:
- 各通道死区时间 = CH_DT[DTVAL] * bus clock period:
- 对于使用eTMR_Lite模块的芯片,只有奇偶通道可以独立配置,死区时间计算为:
- 奇数通道(1,3,5,7)= DT[DTODD] * bus clock period/(2^CTRL[DTPRS]);
- 偶数通道(0,2,4,6)= DT[DTEVEN] * bus clock period/(2^CTRL[DTPRS]);
代码实现修改
原有代码的死区配置在通道初始化函数中,实现代码如下,每次调用仅配置指定通道的死区时间,这样就会出现如果在互补输出PWM模式下仅配置偶数通道(因为互补模式下PWM的占空比和周期仅由偶数通道决定),则相邻的互补奇数通道的死区时间未配置,为默认值0:
PWM_FUNC void Pwm_Lld_Etmr_InitChannel(uint8 Instance, const Pwm_Lld_Etmr_ChCfgType *ChCfg) { ... /* Configure the default dead time. */ #ifndef eTMR_DT_IS_DEPENDENT Base->CH[ChCfg->ChannelId].DT = ChCfg->DeadTime; #else if (0U == (ChCfg->ChannelId & 0x1U)) { Base->DT &= ~eTMR_DT_DTEVEN_MASK; Base->DT |= (uint32)ChCfg->DeadTime & eTMR_DT_DTEVEN_MASK; } else { Base->DT &= ~eTMR_DT_DTODD_MASK; Base->DT |= eTMR_DT_DTODD(ChCfg->DeadTime); } #endif ... }
新版本代码修改如下,当初始化配置通道为偶数通道时,会将相邻互补的奇数通道的死区时间也配置为当前偶数通道的死区时间,从而修复这个问题:
PWM_FUNC void Pwm_Lld_Etmr_InitChannel(uint8 Instance, const Pwm_Lld_Etmr_ChCfgType *ChCfg) { ... /* Configure the default dead time. */ #ifndef eTMR_DT_IS_DEPENDENT if (0U == (ChCfg->ChannelId & 0x1U)) { /* configure the deadtime of the even PWM channel */ Base->CH[ChCfg->ChannelId].DT = ChCfg->DeadTime; /* configure the deadtime of the complementary odd PWM channel */ Base->CH[ChCfg->ChannelId + 1].DT = ChCfg->DeadTime; } else { /* configure the deadtime of the odd PWM channel */ Base->CH[ChCfg->ChannelId].DT = ChCfg->DeadTime; } #else if (0U == (ChCfg->ChannelId & 0x1U)) { /* configure the deadtime of the even PWM channel */ Base->DT &= ~eTMR_DT_DTEVEN_MASK; Base->DT |= (uint32)ChCfg->DeadTime & eTMR_DT_DTEVEN_MASK; /* configure the deadtime of the complementary odd PWM channel */ Base->DT &= ~eTMR_DT_DTODD_MASK; Base->DT |= eTMR_DT_DTODD(ChCfg->DeadTime); } else { /* configure the deadtime of the odd PWM channel */ Base->DT &= ~eTMR_DT_DTODD_MASK; Base->DT |= eTMR_DT_DTODD(ChCfg->DeadTime); } #endif ... }
如何实现互补PWM奇偶通道的死区不同?
从以上代码实现,可以看到,若要实现互补PWM奇偶通道的死区不同,则只需要多配置一个当前互补PWM队的奇数通道(当然,两个通道都需要配置为互补模式),将其死区配置为与偶数通道不同即可:
将eTMR0的CH0和CH1配置为互补输出中间对齐模式PWM,两个通道的死区时间配置为2us和4us:
输出波形,死区时间如下图:
仅配置eTMR0_CH0,死区时间设置为2us:
修改前,测得PWM互补输出波形如下, CH0死区如设置为2us,CH1死区则为默认0us:
修改后,测得PWM互补输出波形如下, CH0和CH1的死区都为设置的2us:
不升级情况(MD1/ME0 MCAL v2.2和MC0/HA0 MCAL v1.0版本)下如何实现死区配置?
有以上分析可知,只需要增加互补PWM对的奇数通道配置,使能互补和设置与偶数通道相同/不同的死区,在Pwm_Init() API中会依次初始每个配置的PWM通道,也就能够实现想要的功能了:
注意:对于使用eTMR_Lite IP的MC0,一个eTMR模块的所有偶数通道/奇数通道的死区都是相同的(因为只有一个配置寄存器),因此若配置了多个偶数/奇数通道的死区,仅最后一个通道(以配置逻辑通道对应的硬件物理通道为准)的配置生效(前面通道的配置被覆盖)
-
E Enwei 从 MCAL Private Issues 移动了该主题
-
J jiankang_wang 被引用 于这个主题
-
J jiankang_wang 被引用 于这个主题
快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...