1. 项目概述与核心价值
在电力电子和电机驱动的世界里,PWM(脉冲宽度调制)信号就像是给功率开关器件下达的精确指令。我们通常关注占空比,用它来控制电压或电流的平均值。然而,当电路拓扑从简单的单管升压/降压,升级到需要两个开关管交替导通的半桥、全桥或三相桥式结构时,一个看似微小但致命的问题就浮出水面:如何确保上下两个开关管不会因为微小的延迟而同时导通,导致电源直通短路,瞬间烧毁昂贵的IGBT或MOSFET?这就是“死区时间”存在的根本原因。它不是一个可有可无的选项,而是高压大电流应用中的生命线。
传统的微控制器生成互补PWM时,往往需要软件介入,通过复杂的定时器中断来手动插入这段保护间隔,不仅消耗宝贵的CPU资源,更在动态调整时引入不确定性和风险。而像TI C2000系列DSP中的增强型高分辨率脉宽调制器(eHRPWM),则将死区生成硬件化、模块化,变成了一个只需配置几个寄存器就能搞定的“黑匣子”操作。这不仅仅是方便,更是将系统的可靠性从软件算法的可靠性,提升到了硬件时序的确定性层面。
更进一步,当你需要驱动一个隔离型的、基于脉冲变压器的栅极驱动器时,问题又来了。一个简单的直流PWM信号无法通过变压器传递,你需要的是一个高频的交流载波来“驮着”你的PWM指令。这就是PWM斩波(Chopper)模块的用武之地。它能将你的基波PWM信号,调制到一个可编程的高频载波上,生成一串脉冲序列,完美适配变压器耦合。更妙的是,它还能单独设定第一个“启动”脉冲的宽度,以及后续“维持”脉冲的占空比,这直接关系到变压器磁芯能否被正确复位、避免饱和,是驱动电路稳定工作的关键。
因此,深入理解eHRPWM中的死区生成与PWM斩波,绝非纸上谈兵。它是连接数字控制器与物理功率世界的关键桥梁,是每一个从事开关电源、伺服驱动、新能源逆变器开发的工程师必须掌握的内功。本文将带你穿透数据手册的图表和寄存器描述,从实际应用场景出发,拆解这两个核心子模块的工作原理、配置要点以及那些手册上不会写的实战避坑指南。
2. 死区生成模块(DB)深度解析与实战配置
死区,顾名思义,就是在互补的一对PWM信号(例如驱动半桥上管的EPWMxA和下管的EPWMxB)的切换过程中,人为插入的一段两者都为无效状态(通常为低电平)的时间。它的核心目的是确保一个管子完全关断后,另一个管子才被允许开启。
2.1 死区模块的架构与信号流
eHRPWM的死区模块位于动作限定器(AQ)之后。AQ模块输出了原始的、边缘对齐的EPWMxA和EPWMxB信号。死区模块以这两路信号作为输入源,经过内部的可编程延迟线和极性控制逻辑,最终输出带死区的EPWMxA和EPWMxB。
模块的核心是两个独立的10位延迟计数器:上升沿延迟(RED)和下降沿延迟(FED)。它们的工作时钟是TBCLK(时间基准时钟,由系统时钟分频而来)。延迟时间计算公式非常直观:延迟时间 = 延迟寄存器值 (DBRED/DBFED) × TBCLK周期
例如,若系统时钟SYSCLKOUT为100MHz,TBCLK不分频(即TBCLK周期为10ns),将DBRED设置为50,则上升沿延迟时间就是 50 * 10ns = 500ns。
注意:这里的“上升沿延迟”和“下降沿延迟”是相对于输入信号的边沿而言的,而不是最终输出信号的边沿。理解这一点对后续配置模式至关重要。
模块的配置灵活性主要体现在三个控制维度上,通过DBCTL寄存器设置:
- 输入源选择 (
IN_MODE):决定RED和FED延迟块分别对哪个输入信号进行延迟。最常见的是模式0:EPWMxA In作为RED和FED共同的源。但也可以交叉配置,例如用EPWMxA的下降沿去延迟EPWMxB的上升沿,实现非对称或特殊逻辑。 - 输出模式控制 (
OUT_MODE):决定是否将RED和/或FED延迟应用到输出上。可以全应用、只应用一个、或全旁路(禁用死区)。 - 极性选择 (
POLSEL):决定经过延迟后的信号,在输出前是否进行反相。这用于匹配不同栅极驱动器所需的主动电平(高有效或低有效)。
2.2 经典死区工作模式详解与波形生成
数据手册中列出了7种模式,但实际工程中,我们最常用的是模式2到模式5,它们对应了四种经典的极性配置。我们假设一个最典型的场景:AQ模块产生一对互补的、高电平有效的原始PWM(EPWMxA In),用来驱动一个“高电平导通,低电平关断”的栅极驱动器。
模式2:高有效互补 (AHC)
- 配置:
POLSEL=1,OUT_MODE使能RED和FED。 - 行为:对EPWMxA In的上升沿进行RED延迟,对下降沿进行FED延迟,然后将两个延迟后的信号都取反输出。
- 波形效果:最终输出的EPWMxA和EPWMxB依然是互补的,但整体被反相了,变成了“低电平导通,高电平关断”。同时,在每次电平切换时,会插入一段两者都为高电平(无效)的死区。这种模式适用于栅极驱动器需要低电平触发的场景。死区表现为一段“共同高电平”的时间。
- 配置:
模式3:低有效互补 (ALC)
- 配置:
POLSEL=0,OUT_MODE使能RED和FED。 - 行为:对EPWMxA In的上升沿进行RED延迟,对下降沿进行FED延迟,输出信号不反相。
- 波形效果:输出与输入极性相同(高有效)。死区插入后,表现为一段“共同低电平”的时间。这是最常用的模式,直接匹配高电平导通的驱动器。
- 配置:
模式4:高有效 (AH)
- 配置:
POLSEL=0,OUT_MODE使能RED和FED。 - 行为:听起来和模式3一样?关键在于
IN_MODE的隐含假设和实际输出。在此模式下,它通常用于生成两路独立的、带边沿延迟但并非严格互补的信号。例如,EPWMxA输出是原始信号经RED延迟后的版本,而EPWMxB输出是原始信号经FED延迟后的版本。两者可能同时为高或为低,并非互补关系。适用于某些需要错开导通时序的特殊拓扑。
- 配置:
模式5:低有效 (AL)
- 配置:
POLSEL=1,OUT_MODE使能RED和FED。 - 行为:与模式4类似,但对两个延迟后的信号都进行了反相。
- 配置:
为了更直观地理解模式2和模式3(最常用),我们来看一个具体的寄存器配置和波形示例:
假设我们需要生成一对频率为20kHz,占空比30%,死区时间为1us的互补PWM,栅极驱动器为高电平有效。
- 计算周期和比较值:若TBCLK = 100MHz (10ns),PWM周期 = 1/20kHz = 50us。则
TBPRD = 50us / 10ns = 5000。CMPA = 5000 * 30% = 1500(用于生成EPWMxA In的占空比)。 - 配置AQ模块:设置AQCTLA寄存器,使CTR=0时置高EPWMxA,CTR=CMPA时拉低EPWMxA;设置AQCTLB寄存器,使CTR=CMPA时置高EPWMxB,CTR=TBPRD时拉低EPWMxB。这样得到一对原始互补信号。
- 配置死区模块:
- 选择模式3 (ALC):
DBCTL = 0x0000(POLSEL=0, OUT_MODE=0b11, IN_MODE=0b00)。 - 计算死区计数值:死区时间1us / 10ns = 100。设置
DBRED = DBFED = 100。
- 选择模式3 (ALC):
- 最终波形:EPWMxA输出会在原始上升沿后延迟100个TBCLK再变高,在原始下降沿后延迟100个TBCLK再变低。EPWMxB行为互补。最终在每次切换点,你会看到一段持续1us的、两路输出均为低电平的死区窗口。
实操心得:死区时间并非越大越好。过长的死区会降低输出电压基波幅值,引入波形畸变,特别是在低调制比时影响显著。通常根据所选用功率器件的开关特性(关断延迟时间
t_fall或t_off与存储时间t_stg)来确定,一般取器件最大关断延迟时间的1.5到2倍,并留有一定裕量。例如,一个IGBT的关断延迟为500ns,那么设置1us的死区是合理的。务必查阅器件数据手册。
2.3 高级配置与输入源选择妙用
IN_MODE的灵活性常被忽视,但它能解决一些棘手问题。考虑一个场景:你希望上管(EPWMxA)的关断和下管(EPWMxB)的开启之间的死区,与下管关断和上管开启之间的死区不同。即不对称死区。
通过配置IN_MODE为0x1(EPWMxA In作为FED源,EPWMxB In作为RED源),你可以实现:
DBFED控制以EPWMxA下降沿为起点的延迟(影响上管关断到下管开启)。DBRED控制以EPWMxB下降沿为起点的延迟(影响下管关断到上管开启)。
这样,通过设置不同的DBFED和DBRED值,就能精细控制不对称死区,优化特定拓扑下的开关损耗和EMI。
3. PWM斩波模块(PC)原理与应用场景剖析
如果说死区模块是“安全卫士”,那么PWM斩波模块就是“信号翻译官”。它的主要任务是将直流或低频的PWM信号,调制到一个高频载波上,变成一串脉冲序列。这主要服务于脉冲变压器隔离驱动。
3.1 为什么需要斩波?脉冲变压器驱动的挑战
在高压或需要电气隔离的场合,脉冲变压器因其简单、可靠、成本低而被广泛用于栅极驱动。但变压器无法传递直流或低频信号。如果你直接把一个占空比为50%的PWM波(其直流分量为0.5*Vcc)加在变压器原边,由于伏秒积不平衡,变压器磁芯会很快饱和并烧毁。
解决方案就是用高频载波对PWM信号进行幅度调制。当PWM为高时,载波信号通过变压器;当PWM为低时,没有信号。这样,变压器副边通过整流,就能恢复出原始的PWM电平。斩波模块自动化了这个过程。
3.2 斩波模块的工作机制与寄存器配置
模块的核心是一个由系统时钟SYSCLKOUT分频得到的载波时钟PSCLK。其频率由PCCTL[CHPFREQ]控制,分频系数可选(如/1, /2, /4等)。载波的占空比由PCCTL[CHPDUTY]控制,提供从12.5%到87.5%共7档选择。
工作流程如下:
- 首脉冲生成:当输入信号EPWMxA In(来自死区模块输出)的上升沿到来时,触发一个“单次脉冲”(One-Shot)。这个脉冲的宽度是独立可编程的,由
PCCTL[OSHTWTH](4位)控制,计算公式为:T_first_pulse = 8 * OSHTWTH * T_sysclkout。这个宽脉冲提供了额外的能量,确保能够快速、可靠地开启功率器件。 - 维持脉冲序列:首脉冲结束后,只要输入信号保持高电平,就会持续输出频率为PSCLK、占空比为
CHPDUTY设定值的脉冲串,直到输入信号变低。这些“维持脉冲”的作用是提供足够的平均功率,保持功率器件处于导通状态。 - 输入变低:当输入信号EPWMxA In变低时,斩波输出立即停止,保持低电平。
整个模块可以通过PCCTL[CHPEN]位全局使能或旁路。
3.3 关键参数计算与设计实例
假设系统时钟SYSCLKOUT = 100MHz (10ns),我们需要设计一个斩波器来驱动一个脉冲变压器。
- 目标:载波频率约500kHz,维持脉冲占空比33%,首脉冲宽度500ns。
- 计算与配置:
- 载波频率:目标周期 = 1/500kHz = 2us。SYSCLKOUT周期为10ns,所需分频数 = 2us / 10ns = 200。
CHPFREQ是分频系数选择,没有直接200的选项。我们需要选择一个接近的分频比。例如,选择CHPFREQ=0(分频系数为1)显然不对。查看寄存器,分频选项可能是1, 2, 4, 8等。假设我们选择分频系数为4,则PSCLK频率 = 100MHz / 4 = 25MHz,周期40ns。这太高了。实际上,手册中CHPFREQ定义的是对SYSCLKOUT/8后的时钟进行分频。基础时钟是SYSCLKOUT/8 = 12.5MHz。如果我们再选择分频系数为1,得到的就是12.5MHz的载波。这更常见。所以,通常斩波载波频率在几MHz到十几MHz量级。我们假设配置后得到PSCLK=4MHz(周期250ns)。 - 维持脉冲占空比:
CHPDUTY选择33%最接近的档位,可能是3/8=37.5%或2/8=25%。根据变压器复位需求选择。假设选37.5%。 - 首脉冲宽度:公式
T_first = 8 * OSHTWTH * 10ns。要求500ns,则OSHTWTH = 500ns / (8*10ns) = 6.25,取整为6。实际宽度 = 8 * 6 * 10ns = 480ns。这个值通常需要根据变压器一次侧电感和驱动芯片的峰值电流能力来调整,确保能建立足够的磁化电流。
- 载波频率:目标周期 = 1/500kHz = 2us。SYSCLKOUT周期为10ns,所需分频数 = 2us / 10ns = 200。
注意事项:维持脉冲的占空比选择是门学问。占空比太小,平均驱动功率不足,可能导致MOSFET导通电阻增大;占空比太大,变压器磁通复位时间不足,容易导致饱和。通常需要根据变压器匝数、磁芯参数和电源电压计算伏秒积,确保在PWM最大导通时间内,磁芯不会饱和。一个经验法则是,在最高工作占空比和最高输入电压下,维持脉冲的占空比不要超过50%,通常设置在30%-40%较为安全。
3.4 结合死区与斩波的完整信号链示例
让我们串联起整个流程:一个用于半桥的PWM信号是如何产生的?
- TB模块:产生时基计数器,设定PWM频率(如20kHz)。
- CC模块:根据CMPA值(决定占空比)产生比较事件。
- AQ模块:根据比较事件和计数方向,生成原始的、互补的EPWMxA In和EPWMxB In数字波形。
- DB模块:接收AQ的输出,插入可编程的死区时间,并配置为合适的极性模式(如ALC),输出带死区的EPWMxA_DB和EPWMxB_DB。
- PC模块:接收DB模块的输出(例如EPWMxA_DB),对其进行高频斩波调制,生成最终用于驱动脉冲变压器的EPWMxA_CHOP信号。EPWMxB_DB同样经过另一个PC模块(如果使能)生成EPWMxB_CHOP。
至此,一个安全、隔离的栅极驱动信号就准备好了。
4. 寄存器级配置指南与代码片段
理解了原理,最终要落地到代码。以下以TI C2000的DriverLib库函数为例,展示关键配置步骤。假设使用EPWM1模块。
4.1 死区生成模块配置
// 假设系统时钟已初始化,TBCLK = SYSCLKOUT = 100MHz #include "driverlib.h" void configureEPWM1DeadBand(void) { // 1. 初始化时基和CC模块(略) EPWM_setTimeBasePeriod(EPWM1_BASE, 5000); // 20kHz, 100MHz时钟 EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 1500); // 30%占空比 EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, 3500); // 互补信号,用于生成EPWMxB // 2. 配置AQ模块生成互补输出 EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD); // 3. 配置死区模块 - 模式3 (Active Low Complementary), 1us死区 uint16_t deadbandDelayCounts = 100; // 1us / 10ns EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_RED, EPWM_DB_MODE_DELAY); EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_FED, EPWM_DB_MODE_DELAY); EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_RED, EPWM_DB_POLARITY_ACTIVE_LOW); EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW); EPWM_setDeadBandDelay(EPWM1_BASE, EPWM_DB_RED, deadbandDelayCounts); EPWM_setDeadBandDelay(EPWM1_BASE, EPWM_DB_FED, deadbandDelayCounts); // 设置输出模式:对A和B输出都应用RED和FED延迟 EPWM_setDeadBandOutputPolarity(EPWM1_BASE, EPWM_DB_OUTPUT_A, EPWM_DB_OUTPUT_ACTIVE_LOW); EPWM_setDeadBandOutputPolarity(EPWM1_BASE, EPWM_DB_OUTPUT_B, EPWM_DB_OUTPUT_ACTIVE_LOW); EPWM_setDeadBandCounterClock(EPWM1_BASE, EPWM_DB_COUNTER_CLOCK_FULL_CYCLE); }4.2 PWM斩波模块配置
void configureEPWM1Chopper(void) { // 使能PWM斩波器 EPWM_enableChopper(EPWM1_BASE); // 设置斩波器时钟频率:SYSCLKOUT / 8 后再进行分频 // 假设我们想要约 4MHz 的载波频率。SYSCLKOUT/8 = 12.5MHz。 // 分频系数选择 3 (0b011) 表示除以4,得到 12.5MHz / 4 = 3.125MHz EPWM_setChopperClockFreq(EPWM1_BASE, EPWM_CHOPPER_CLOCK_FREQ_SYSCLKOUT_DIV_4); // 注意:此函数参数可能因库版本而异,需查证 // 设置维持脉冲占空比:选择 3/8 = 37.5% EPWM_setChopperDutyCycle(EPWM1_BASE, EPWM_CHOPPER_DUTY_3_8); // 设置首脉冲宽度:OSHTWTH = 6, 宽度 = 8 * 6 * T_sysclkout = 48 * 10ns = 480ns EPWM_setOneShotPulseWidth(EPWM1_BASE, 6); }代码避坑指南:
- 时序依赖:务必按照TB -> CC -> AQ -> DB -> PC的顺序进行配置。在配置DB和PC之前,确保AQ已经输出了正确的原始波形。可以通过仿真器实时查看EPWMxA/B引脚波形来验证。
- 影子寄存器加载:CMPA、CMPB、TBPRD等寄存器有影子寄存器。如果你在运行时动态修改占空比(CMPA),要确保在安全的时刻(如CTR=0)加载。使用
EPWM_setCounterCompareShadowLoadMode函数配置加载模式。- 斩波模块使能时机:建议在PWM输出使能(
EPWM_enableOutput)之前配置并使能斩波模块。如果顺序反了,可能会在输出端看到毛刺。
5. 实战调试技巧与常见问题排查
理论完美,调试抓狂。以下是几个现场调试中高频出现的问题和解决方法。
5.1 问题1:死区时间不生效或效果不对
- 现象:测量硬件引脚,发现上下管驱动信号仍有重叠,或根本没有死区。
- 排查步骤:
- 检查配置顺序:确认DB模块的配置代码在AQ模块配置之后、输出使能之前执行。
- 验证寄存器值:在调试器中,直接查看
DBCTL、DBRED、DBFED寄存器的值是否与预期一致。特别是DBCTL[OUT_MODE],必须设置为0x3(二进制11)才能同时使能RED和FED。 - 检查输入源:默认
IN_MODE=0(EPWMxA In作为双延迟源)。如果你的互补信号逻辑是反的,或者你想用EPWMxB作为基准,需要修改IN_MODE。 - 检查极性:用示波器同时测量AQ模块输出后(即DB模块输入前)的波形和最终的EPWMxA/B波形。确认
POLSEL设置是否正确。一个快速判断方法是:如果最终输出波形与AQ输出波形反相,说明POLSEL可能配成了1。 - 计算时钟:确认你计算死区计数值时使用的TBCLK周期是正确的。如果TBCTL寄存器中对SYSCLKOUT进行了分频,TBCLK会变慢,同样的计数值对应的死区时间会变长。
5.2 问题2:PWM斩波输出异常,变压器发热或驱动不足
- 现象:变压器发热严重,或功率器件无法完全导通。
- 排查步骤:
- 测量载波:用示波器测量最终EPWMx_CHOP引脚。首先确认是否有高频载波出现。如果没有,检查
PCCTL[CHPEN]是否使能,以及CHPFREQ配置是否合理(避免分频系数过大导致载波频率过低,看起来像直流)。 - 检查首脉冲:放大观察PWM上升沿后的第一个脉冲。其宽度是否与
OSHTWTH计算值相符?如果太窄,可能导致开启能量不足,器件工作在放大区,发热剧增。适当增加OSHTWTH。 - 检查维持脉冲占空比:测量维持脉冲阶段的高电平时间与载波周期的比例,是否与
CHPDUTY设置相符?占空比过低会导致平均驱动电压不足,MOSFET的Vgs可能无法维持在米勒平台之上,导致导通损耗增加。 - 评估变压器设计:这是最根本的。计算变压器一次侧电压伏秒积:
V_in * Duty_chopper * T_chopper。确保这个值远小于变压器磁芯的饱和伏秒积(B_sat * A_e * N_pri)。如果接近或超过,磁芯会在每个PWM周期内饱和,表现为驱动波形畸变、变压器初级电流急剧增大、发热。此时需要减少CHPDUTY,或增加变压器一次侧匝数N_pri。
- 测量载波:用示波器测量最终EPWMx_CHOP引脚。首先确认是否有高频载波出现。如果没有,检查
5.3 问题3:eHRPWM输出引脚无信号
- 现象:配置了一切,但GPIO引脚上没有波形。
- 排查清单:
- GPIO复用功能:这是新手最常踩的坑!C2000的引脚功能是复用的。你必须将对应的GPIO引脚配置为EPWM功能。例如,对于EPWM1A,需要调用
GPIO_setPinConfig(GPIO_0_EPWM1A)(具体函数和参数因器件而异)。 - 输出使能:eHRPWM模块有独立的输出使能位。确认调用了
EPWM_enableOutput(EPWM1_BASE, EPWM_OUTPUT_A)和EPWM_enableOutput(EPWM1_BASE, EPWM_OUTPUT_B)。 - 时基计数器状态:检查TBCTL寄存器,确认计数器是否已启动(
FREE_SOFT位不是停止模式)。通常配置完成后,计数器会自动开始运行。 - Trip-Zone保护:检查TZ模块是否意外触发,将输出强制为高阻、高或低电平。检查
TZCTL寄存器以及相关的故障输入引脚状态。在调试初期,可以暂时禁用TZ功能或将其配置为“无动作”。
- GPIO复用功能:这是新手最常踩的坑!C2000的引脚功能是复用的。你必须将对应的GPIO引脚配置为EPWM功能。例如,对于EPWM1A,需要调用
5.4 高级调试:利用影子寄存器实现平滑切换
在电机控制或数字电源中,我们经常需要在线改变PWM占空比。如果直接写入CMPA寄存器,可能会在计数器运行到一半时发生写入,导致当前周期波形出现毛刺或畸变。
解决方案:使用影子寄存器+周期加载点。
// 配置CMPA在CTR=0时从影子寄存器加载到活动寄存器 EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTER_ZERO); // 当需要更新占空比时,写入CMPA的影子寄存器(CMPA:HRPWM) uint16_t newCompareValue = calculateNewDutyCycle(); EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, newCompareValue); // 写入操作会更新影子寄存器。真正的生效时刻,是在下一个PWM周期开始时(CTR=0)。这种机制确保了PWM占空比的变化总是发生在周期的边界,输出波形连续平滑,这对于闭环控制的稳定性至关重要。
6. 设计考量与选型建议
理解了模块功能后,在系统设计初期就需要做出正确选择。
6.1 何时必须使用硬件死区?
必须使用:任何基于半桥、全桥、三相全桥等桥式电路的、开关频率高于1kHz的功率变换器。软件死区在高速开关下不可靠,且占用CPU资源。可以不使用:单管拓扑(如Boost、Buck)、或开关频率极低(如几Hz)的场合。但即使如此���使用硬件死区也能让代码更简洁。
6.2 何时需要PWM斩波?
必须使用:当栅极驱动电路采用无源脉冲变压器或自举电容供电受限的隔离驱动芯片时。这是将直流PWM信息通过交流耦合传递过去的唯一标准方法。无需使用:当使用有源隔离驱动芯片(如Si823x, ADuM4135等)或非隔离驱动时。这些芯片内部自带电平转换和放大,直接接受直流PWM信号。
6.3 eHRPWM与其他方案的对比
- vs 通用定时器+GPIO模拟:通用定时器灵活性高,但生成带死区的互补PWM极其复杂,且死区精度和一致性差。eHRPWM是专为功率控制设计的ASIC,精度高,不占用CPU。
- vs 专用驱动芯片内置死区:一些高级栅极驱动芯片(如LM5113)也内置可调死区。其优势是死区位置更贴近功率管,但调整范围有限,且无法实现eHRPWM的复杂模式(如不对称死区、与斩波联动)。通常两者结合使用:eHRPWM产生带基础死区的信号,驱动芯片可能再添加一点硬件死区作为最终保障。
- vs FPGA实现:FPGA可以实现任意复杂度的PWM发生器,包括超高分辨率死区和任意波形斩波。但其开发难度、成本和功耗远高于使用集成了eHRPWM的MCU/DSP。eHRPWM提供了一个性能与易用性俱佳的折中方案。
6.4 性能边界与计算
- 死区分辨率:取决于TBCLK频率。100MHz系统时钟下,死区时间最小步进为10ns。对于多数硅基器件(IGBT/MOSFET开关时间在几十到几百ns),这完全足够。对于GaN等超快器件(开关时间<10ns),则需要更高的系统时钟或更精细的时钟配置。
- 斩波频率上限:受限于SYSCLKOUT和MEP逻辑。载波频率通常可达系统时钟的1/8到1/16。对于100MHz系统,载波频率在6-12MHz是可行的。这决定了脉冲变压器可以做到多小的尺寸。
- CPU开销:eHRPWM一旦配置完成,全硬件自动运行,零CPU开销。CPU仅在需要动态改变占空比、频率或保护响应时介入。
最后,再分享一个调试中的小技巧:在初期硬件调试时,可以先将死区时间设置得非常大(例如几个us),用示波器观察上下管驱动信号,确保死区逻辑正确,完全没有重叠。然后再逐步减小到设计值。对于斩波电路,可以先不接变压器和功率管,直接在驱动芯片的输入侧测量斩波后的PWM信号,验证载波频率、首脉冲和维持脉冲都符合预期,然后再接入实际负载。这种分步验证的方法,能极大降低炸管的风险,把问题隔离在信号层面解决。