1. 项目概述与核心价值
在电力电子和电机驱动的世界里,PWM(脉宽调制)信号就像是控制功率开关的“指挥棒”,它的精确与否直接决定了整个系统的效率、性能和寿命。然而,这个看似简单的开关动作背后,却隐藏着两个致命的“雷区”:一个是桥臂直通短路,另一个是突发故障导致的系统崩溃。前者会让你的功率管瞬间“烟花灿烂”,后者则可能让昂贵的电机或负载毁于一旦。今天,我们就来深入拆解TI C2000系列DSP中增强型PWM(ePWM)模块的两大守护神——死区生成(Dead-Band Generator)和故障保护(Trip-Zone)机制。这不仅仅是寄存器配置的罗列,而是结合我多年在伺服驱动和逆变器开发中的实战经验,告诉你它们为何如此设计,以及如何在实际项目中避坑、调优,让你的PWM控制既精准又安全。
简单来说,死区生成是为了防止同一桥臂上下两个开关管(比如MOSFET或IGBT)因开关延迟而同时导通,造成电源直通短路。而故障保护则是系统的“紧急制动”按钮,一旦检测到过流、过压、过热等异常,能在纳秒级时间内强制PWM输出进入安全状态(如强制拉高、拉低或高阻态),保护功率器件和负载。对于从事开关电源、UPS、新能源逆变器或伺服驱动的工程师而言,吃透这两部分,是写出稳定、可靠控制程序的基础。
2. ePWM死区生成模块深度解析
2.1 死区的本质:为何它是必须的?
在讨论如何生成死区之前,我们必须先理解死区为何存在。想象一下H桥或三相逆变器的上下桥臂,理想情况下,我们希望上管关断后,下管立刻导通,反之亦然。但现实是骨感的:功率开关管(如IGBT)的关断存在拖尾电流,驱动电路也有传播延迟。如果上管还没完全关断,下管就导通了,就会形成一条从电源正极到负极的低阻抗通路,产生巨大的直通电流(Shoot-Through Current)。这个电流峰值可能高达数百甚至上千安培,足以在微秒级时间内摧毁功率器件。
因此,死区就是在互补的PWM信号对(例如EPWMxA和EPWMxB)之间插入的一段两者都为无效状态的时间。在这段时间里,确保一个管子完全关断后,另一个管子才被允许开启。这个时间必须大于功率器件的最大关断时间与驱动电路延迟之和,并留有一定裕量。
在ePWM模块中,死区生成(DB)子模块位于动作限定器(AQ)之后。AQ模块生成了原始的、带占空比信息的EPWMxA和EPWMxB信号,DB模块则负责对这两个信号的边沿进行延迟处理,生成最终的、带有死区保护的输出信号。
2.2 死区生成的核心寄存器与配置逻辑
死区模块的配置主要围绕三个核心寄存器展开,它们都是非影子寄存器(即写入立即生效),这在实时性要求高的故障保护场景中至关重要。
1. 死区控制寄存器 (DBCTL)这是死区模块的“大脑”,决定了信号的处理模式。我们需要重点关注其中几个关键位域:
- IN_MODE (输入模式选择):这决定了延迟模块的输入信号来源。默认情况下,EPWMxA In同时作为上升沿延迟(RED)和下降沿延迟(FED)的源。但在一些高级应用中,你可以交叉配置,例如用EPWMxA的上升沿去延迟EPWMxB的下降沿,这为实现非对称死区或特殊保护逻辑提供了可能。不过,在绝大多数经典桥式驱动应用中,我们使用默认模式(EPWMxA In作为双延迟源)即可。
- OUT_MODE (输出模式选择):这个配置决定了哪些延迟会被应用到输出上。你可以选择旁路RED、旁路FED、同时应用两者,或全部旁路(即禁用死区功能)。对于典型的互补PWM,我们需要同时启用上升沿和下降沿延迟。
- POLSEL (极性选择):这是最容易让人困惑但也最强大的功能之一。它决定了经过延迟后的信号,是否需要进行反相,然后再输出。结合OUT_MODE,它能生成四种经典的死区极性模式。
2. 死区上升沿延迟计数寄存器 (DBRED)这是一个10位寄存器,用于设置上升沿延迟的计数值。实际的延迟时间T_RED = DBRED * T_TBCLK。其中,T_TBCLK是时间基准时钟(TBCLK)的周期。TBCLK通常由系统时钟分频得到。
3. 死区下降沿延迟计数寄存器 (DBFED)同样是一个10位寄存器,用于设置下降沿延迟的计数值。实际延迟时间T_FED = DBFED * T_TBCLK。
关键经验:DBRED和DBFED的值是独立的!这意味着你可以为上升沿和下降沿设置不同的延迟时间。这在某些特定拓扑中很有用,例如当上下管采用不同型号的器件,其关断特性差异较大时,可以设置非对称死区来优化效率。但在对称桥臂设计中,通常设置
DBRED = DBFED。
2.3 四种经典死区模式详解与波形分析
根据DBCTL[POLSEL]和DBCTL[OUT_MODE]的配置,可以产生表20-14中列举的几种经典模式。我们结合图20-28的波形,来深入理解每一种模式的应用场景。
假设我们从AQ模块得到的是一个Active High的原始PWM信号(EPWMxA In),高电平有效,占空比介于0%到100%之间。
模式2:高有效互补模式 (Active High Complementary, AHC)
- 配置:
POLSEL=1, OUT_MODE=1(即S3=1, S2=0, S1=1, S0=1)。 - 波形行为:原始信号(EPWMxA In)同时送入RED和FED模块。RED模块输出一个上升沿被延迟的信号,FED模块输出一个下降沿被延迟的信号。然后,POLSEL=1意味着RED路径的信号被反相,FED路径的信号保持不变。最终,EPWMxA输出的是反相后的RED信号,EPWMxB输出的是FED信号。
- 结果:EPWMxA和EPWMxB都是高电平有效,但它们的上升沿之间插入了死区时间。当原始信号从低变高时,EPWMxB(下管)会先变高,经过
T_FED时间后,EPWMxA(上管)才变高。当原始信号从高变低时,EPWMxA(上管)先变低,经过T_RED时间后,EPWMxB(下管)才变低。这确保了任何切换时刻,都有一个死区窗口。 - 典型应用:驱动绝大多数标准的、高电平使能的半桥或全桥栅极驱动器芯片。
模式3:低有效互补模式 (Active Low Complementary, ALC)
- 配置:
POLSEL=0, OUT_MODE=1(即S3=0, S2=1, S1=1, S0=1)。 - 波形行为:与AHC类似,但POLSEL=0意味着RED路径信号不反相,而FED路径信号被反相。最终,EPWMxA输出RED信号,EPWMxB输出反相后的FED信号。
- 结果:EPWMxA和EPWMxB都是低电平有效。其边沿关系与AHC模式本质是相同的,只是有效电平相反。
- 典型应用:驱动低电平使能的栅极驱动器,或者某些需要低电平触发关断的保护电路。
模式4:高有效模式 (Active High, AH)
- 配置:
POLSEL=0, OUT_MODE=1(注意,表20-14中模式4的POLSEL为0,但根据图20-27逻辑,要使两个输出同相且高有效,需要仔细推演。实际上,AH模式通常指两个输出都是同相的高有效信号,但死区模块通常用于生成互补信号,AH模式在此上下文的典型用法是生成两个同步的高有效信号,其中一个带有边沿延迟。更常见的理解是,它生成了一对信号,其中EPWMxA是原始信号,EPWMxB是带有死区延迟的互补信号?这里需要结合具体寄存器配置和波形图理解。根据手册描述和常见实践,AH模式通常用于需要单个PWM信号驱动,但另一个信号用作同步或触发的情况,死区功能可能被用于产生一个固定的相位差)。
模式5:低有效模式 (Active Low, AL)
- 配置:
POLSEL=1, OUT_MODE=1。 - 类比模式4,只是有效电平为低。
实操心得:模式选择速查在实际项目中,你不需要死记硬背这些真值表。我的方法是:
- 确定硬件连接:先看你的栅极驱动器芯片数据手册,明确其输入是高有效还是低有效,是否需要互补输入。
- 使用TI的配置工具:如ControlSUITE中的ePWM配置图形界面,或SysConfig工具。你只需要在图形界面上选择你想要的输出极性(High-Active Complementary, Low-Active Complementary等),工具会自动帮你计算出正确的DBCTL寄存器值。
- 示波器验证:这是最关键的一步。配置好死区后,务必在空载(不接功率管,或接纯阻性负载测试)情况下,用示波器同时测量EPWMxA和EPWMxB引脚的实际波形。确认死区时间是否符合设定,以及两个信号的相位关系是否正确(例如,在AHC模式下,下管信号EPWMxB的上升沿是否领先于上管信号EPWMxA的上升沿)。
2.4 死区时间计算与半周期时钟
死区时间的精度直接由TBCLK决定。计算公式很简单:死区时间 = 延迟计数值 (DBRED或DBFED) × T_TBCLK
例如,系统时钟SYSCLK = 200 MHz,TBCLK分频设置为 /2,则T_TBCLK = 1 / (200MHz / 2) = 10 ns。若设置DBRED = 100,则上升沿死区时间为100 * 10 ns = 1000 ns = 1 μs。
提升分辨率:半周期时钟模式当死区时间需要非常精细的调节时(例如在高开关频率的GaN应用中),10ns的步进可能仍显粗糙。ePWM的DB模块提供了一个“外挂”:半周期时钟模式(DBCTL[HALFCYCLE])。
- 原理:当此位置1时,DBRED和DBFED计数器以2 * TBCLK的频率计数。也就是说,其时间分辨率提高了一倍。
- 计算:此时,
死区时间 = 延迟计数值 × (T_TBCLK / 2)。 - 注意:启用半周期时钟模式后,DBRED和DBFED寄存器的最大值所对应的绝对时间范围会减半。你需要权衡分辨率和最大死区时间需求。
避坑指南:死区时间设置过小或过大
- 过小 (< 器件关断时间):无法防止直通,风险极高。务必根据功率器件数据手册中的“关断延迟时间(td(off))”和“下降时间(tf)”,以及驱动芯片的传播延迟,来估算所需最小死区。通常要留出1.5到2倍的安全裕量。例如,IGBT的关断时间可能是500ns,那么死区至少设为750ns-1μs。
- 过大:会导致输出波形畸变,尤其是在低占空比或高占空比时。过大的死区会“吃掉”有效的脉冲宽度,降低最大输出电压,引入非线性,影响控制环路性能。在电机控制中,过大的死区还会导致电流波形畸变和转矩脉动。因此,死区时间应在安全裕量的基础上尽可能小。
3. Trip-Zone故障保护机制实战精讲
如果说死区是预防性保护,那么Trip-Zone(故障区域)就是抢救性保护。它的设计目标是在硬件层面实现纳秒级的故障响应,完全独立于CPU软件中断服务程序,确保即使软件跑飞,也能强行将系统拉入安全状态。
3.1 故障信号来源与分类
ePWM模块可以响应多达6路故障输入(TZ1~TZ6),它们来自不同的硬件源,优先级和用途各异:
- TZ1, TZ2, TZ3:来自GPIO引脚。这是最常用的故障源,通常连接电流采样比较器的输出、电压检测电路或温度传感器的报警信号。它们是异步的,意味着即使系统时钟失效,这些引脚上的低电平也能触发保护。
- TZ4:由两个正交编码器错误信号(EQEP1ERR和EQEP2ERR)逻辑或产生。常用于电机驱动中编码器信号异常保护。
- TZ5:连接至系统时钟振荡器失败或PLL失锁逻辑。用于检测芯片时钟异常,属于系统级严重故障。
- TZ6:来自CPU的调试模式暂停指示。当芯片进入调试暂停时,可以触发PWM进入安全状态,防止调试时功率部分失控。
此外,故障还可以由数字比较(DC)子模块产生(DCAEVT1/2, DCBEVT1/2)。DC模块可以将内部模拟比较器(CMPSS)的输出与内部DAC设定的阈值进行比较,直接在芯片内部生成故障事件,无需外部引脚,响应速度更快。
3.2 两种核心保护模式:Cycle-By-Cycle vs One-Shot
这是Trip-Zone模块最核心的概念,理解它们的区别是正确配置的关键。
3.2.1 逐周期跳变 (Cycle-By-Cycle, CBC)
- 触发机制:当配置为CBC的故障信号(如TZn或DCAEVT2/DCBEVT2)有效时,立即触发保护动作。
- 清除机制:自动清除。在每个PWM周期开始时(即时间基准计数器TBCTR = 0x0000时),硬件会自动检查故障信号是否依然存在。如果故障已经消失,则保护动作自动解除,PWM输出恢复正常;如果故障依然存在,则保护动作持续。
- 标志位:
TZFLG[CBC]在故障发生时置位,需要软件手动清除(写TZCLR[CBC]=1)。即使故障已消失且PWM已恢复,该标志位仍保持置位,直到被软件清除。 - 典型应用:峰值电流限制。例如在电机驱动中,当相电流超过某个安全阈值时,CBC故障触发,强制PWM关断以限制电流。只要过流消失,下一个PWM周期即可恢复正常工作,实现平滑的限流控制。它像是一个“自动复位”的断路器。
3.2.2 单次跳变 (One-Shot, OSHT)
- 触发机制:当配置为OSHT的故障信号(如TZn或DCAEVT1/DCBEVT1)有效时,立即触发保护动作。
- 清除机制:手动清除。一旦触发,保护动作将一直保持,直到软件显式地写
TZCLR[OST]=1来清除故障标志TZFLG[OST]。即使外部故障信号早已消失,PWM输出也不会自动恢复。 - 标志位:
TZFLG[OST]在故障发生时置位,必须由软件清除。 - 典型应用:严重故障保护,如短路、过压、IGBT直通、散热器过热等。这些故障通常是致命的或需要系统彻底停机检查的。OSHT模式相当于一个“熔断器”,一旦触发就必须人工干预(或由上位机命令)才能复位,防止故障扩大。
经验之谈:如何选择CBC还是OSHT?我遵循一个简单的原则:“可自恢复的故障用CBC,不可自恢复或严重的故障用OSHT”。
- CBC例子:电机启动时的瞬时过流、负载轻微突变。这些情况下,系统有能力在下一个周期自行调整。
- OSHT例子:散热器温度超过85°C、直流母线电压超过最大值、硬件检测到桥臂直通。这些故障必须停机,等待温度下降、电压恢复正常或人工检修。 在实际系统中,我通常将硬件过流比较器输出连接到TZ1(配置为CBC),将温度传感器报警和母线电压过压检测连接到TZ2和TZ3(配置为OSHT)。
3.3 故障响应动作配置
当故障发生时,你可以独立配置每个ePWM通道(EPWMxA和EPWMxB)的输出行为,通过TZCTL寄存器:
- 00: 高阻态 (High-Impedance):这是最安全的模式,直接将输出引脚置为高阻,外部栅极驱动器依靠其内部下拉电阻将功率管关断。适用于需要绝对关断且驱动器有下拉电阻的场景。
- 01: 强制高电平 (Force to High):强制PWM输出为高。如果你的栅极驱动器是低有效使能(例如,输入高电平时关闭��率管),那么这个配置可以强制关断。
- 10: 强制低电平 (Force to Low):强制PWM输出为低。对于高有效使能的驱动器,此配置强制关断功率管。
- 11: 无变化 (No Change):忽略故障,输出保持不变。慎用!仅在调试或特定冗余设计中使用。
配置示例:三相逆变器保护假设我们有一个三相逆变器,使用ePWM1、2、3驱动三个桥臂。我们希望:
- 任何一相的硬件过流(CBC故障)触发时,仅关断该相的上下管(输出强制为低,假设驱动器高有效),其他相继续工作。这可以实现单相限流。
- 当系统检测到严重过热(OSHT故障)时,关断所有三个桥臂(输出强制为低)。
// 假设 TZ1 连接硬件过流比较器(CBC), TZ2 连接温度报警(OSHT) // 驱动器为高有效,低电平关闭功率管 // 配置 ePWM1, 2, 3 对 TZ1 (CBC) 的响应 EPwm1Regs.TZSEL.bit.CBC1 = 1; // 使能 TZ1 作为 CBC 源 EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // TZ1触发时,EPWM1A 强制低 EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO; // TZ1触发时,EPWM1B 强制低 EPwm2Regs.TZSEL.bit.CBC1 = 1; EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_LO; EPwm2Regs.TZCTL.bit.TZB = TZ_FORCE_LO; EPwm3Regs.TZSEL.bit.CBC1 = 1; EPwm3Regs.TZCTL.bit.TZA = TZ_FORCE_LO; EPwm3Regs.TZCTL.bit.TZB = TZ_FORCE_LO; // 配置 ePWM1, 2, 3 对 TZ2 (OSHT) 的响应 EPwm1Regs.TZSEL.bit.OSHT2 = 1; // 使能 TZ2 作为 OSHT 源 EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // TZ2触发时,EPWM1A 强制低 EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO; // TZ2触发时,EPWM1B 强制低 // 注意:TZCTL寄存器对于不同故障源(TZA/TZB vs DCAEVT等)是分开的位域, // 这里为简化说明,实际中TZCTL对TZ1/TZ2等外部信号和DC事件的控制位是独立的。 // 更精确的配置需要分别设置 TZCTL[TZA] 和 TZCTL[DCAEVT1] 等。 // 对于所有TZn信号触发的动作,通常由 TZCTL[TZA] 和 TZCTL[TZB] 统一控制,除非为DC事件单独配置。3.4 数字比较(DC)子模块与高级故障保护
数字比较子模块是Trip-Zone的“智能前哨”。它允许你将内部模拟比较器(CMPSS)的输出直接映射为故障事件,无需CPU干预。
工作原理:
- CMPSS模块持续将采样到的电流/电压信号与内部可编程DAC设定的阈值进行比较。
- 当信号超过阈值时,CMPSS输出数字信号(CMPxH 高阈值, CMPxL 低阈值)。
- 这些数字信号被路由到ePWM的DC子模块,通过
DCTRIPSEL寄存器选择信号源。 - DC子模块根据
TZDCSEL寄存器的配置,将CMPSS的输出逻辑组合(如上升沿、下降沿、电平)生成事件:DCAEVT1,DCAEVT2,DCBEVT1,DCBEVT2。 - 这些DC事件可以直接作为CBC或OSHT故障源,触发Trip-Zone动作。
优势:
- 超快响应:从模拟信号越限到PWM动作,全程由硬件完成,延迟极短(通常在100ns量级)。
- 节省CPU资源:无需软件轮询或ADC中断,减轻CPU负担。
- 高可靠性:独立于软件运行,即使软件死机,硬件保护依然有效。
配置示例:硬件逐周期电流限流假设我们用CMPSS1监控电机U相电流,当电流超过20A时,需要立即关断U相下管(假设下管由EPWM1B控制,高有效),进行逐周期限流。
// 1. 配置CMPSS1: DACVAL设置为对应20A的电压值,配置为比较器输出高有效。 // 2. 配置DCTRIPSEL,将CMPSS1的输出(假设是CMPSS1H)映射到DCAH信号。 EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 1; // 选择CMPSS1H作为DCAH源 // 3. 配置TZDCSEL,定义DCAH信号如何生成DCAEVT事件。 // 例如,当DCAH为高电平时,立即触发DCAEVT1(用于OSHT)和DCAEVT2(用于CBC)。 EPwm1Regs.TZDCSEL.bit.DCAEVT1SRCSEL = DC_EVT_SRC_DCAH; // DCAEVT1源为DCAH EPwm1Regs.TZDCSEL.bit.DCAEVT1FRCSYNCSEL = DC_EVT_FRC_SYNC; // 同步强制 EPwm1Regs.TZDCSEL.bit.DCAEVT2SRCSEL = DC_EVT_SRC_DCAH; // DCAEVT2源也为DCAH EPwm1Regs.TZDCSEL.bit.DCAEVT2FRCSYNCSEL = DC_EVT_FRC_SYNC; // 4. 配置TZSEL,将DCAEVT2事件作为CBC故障源。 EPwm1Regs.TZSEL.bit.DCAEVT2 = 1; // 使能DCAEVT2作为CBC源 // 5. 配置TZCTL,指定当CBC故障(此处由DCAEVT2触发)时,EPWM1B的动作。 // 我们希望仅关断下管(EPWM1B),上管(EPWM1A)保持原状或也关断,根据拓扑决定。 // 假设仅关断EPWM1B,强制为低。 EPwm1Regs.TZCTL.bit.DCAEVT2 = TZ_FORCE_LO; // DCAEVT2触发时,EPWM1B强制低 // 注意:TZCTL中针对DCAEVT2的控制位是独立的,可以单独配置EPWMxA和EPWMxB。 // 这里假设TZCTL.DCAEVT2配置为对EPWM1B有效。4. 死区与故障保护联合调试实战与常见问题
4.1 调试流程与工具
- 静态配置检查:在程序初始化阶段,通过CCS的寄存器观察窗口,仔细核对
DBCTL、DBRED、DBFED、TZSEL、TZCTL、TZDCSEL等关键寄存器的值是否符合预期。一个常见的错误是忘记使能某个故障源(TZSEL位没置1)。 - 死区波形验证:
- 使用示波器,测量EPWMxA和EPWMxB引脚。
- 先在不带负载(或接小电阻)的情况下测试。
- 测量上升沿到上升沿、下降沿到下降沿之间的时间,确认死区时间与计算值一致。
- 切换不同的占空比(0%, 50%, 100%),观察死区是否稳定存在,特别是在极窄脉冲时。
- 故障保护触发测试:
- CBC测试:模拟一个瞬时故障(例如,短暂拉低TZ1引脚)。观察PWM输出是否立即被强制为预设的安全状态(如低电平),并在下一个PWM周期开始(TBCTR=0)时是否自动恢复。同时检查
TZFLG[CBC]标志是否被置位。 - OSHT测试:模拟一个持续故障(拉低TZ2引脚)。观察PWM输出是否进入安全状态并保持,即使故障信号随后消失。只有软件写
TZCLR[OST]=1后,PWM才应恢复。检查TZFLG[OST]标志。 - DC模块测试:通过改变CMPSS的DAC值或输入电压,使其输出翻转,验证是否能触发对应的PWM保护动作。
- CBC测试:模拟一个瞬时故障(例如,短暂拉低TZ1引脚)。观察PWM输出是否立即被强制为预设的安全状态(如低电平),并在下一个PWM周期开始(TBCTR=0)时是否自动恢复。同时检查
4.2 常见问题与排查技巧
问题1:设置了死区,但示波器上看不到间隔,或者间隔时间不对。
- 可能原因1:
DBCTL[OUT_MODE]配置错误,没有同时使能RED和FED。检查寄存器值。 - 可能原因2:TBCLK频率计算错误。确认系统时钟SYSCLK和TBCTL[CLKDIV]分频设置。使用示波器测量一个PWM周期的实际时间,反推TBCLK频率。
- 可能原因3:在增计数模式下,死区表现正常;但在增-减计数模式下,死区行为可能因对称PWM而看起来不同。确保你理解在对称PWM下,死区是如何在波形的两侧插入的。
- 排查:先将死区时间设为一个很大的值(如对应5μs),用示波器看是否出现明显间隔。然后逐步减小,确认线性关系。
问题2:故障保护不动作,或者误动作。
- 可能原因1:故障输入引脚(TZn)的GPIO复用功能未正确配置。必须将相应引脚配置为ePWM的Trip-Zone功能,而非普通GPIO。
- 可能原因2:故障信号脉宽太短。手册要求TZn输入低电平脉宽至少持续3个TBCLK周期才能被可靠锁存。如果故障信号是毛刺,可能无法触发。需要在硬件前端增加RC滤波或施密特触发器整形。
- 可能原因3:
TZCTL配置的安全状态与外部驱动器逻辑不匹配。例如,配置了“强制高”,但你的驱动器是高有效,这反而会导通功率管!务必根据驱动器数据手册确认安全状态。最保险的方式通常是“强制低”或“高阻态”(前提是驱动器有下拉电阻)。 - 可能原因4:多个ePWM模块的故障响应冲突。例如,你希望TZ1触发时只关断ePWM1,但ePWM2也被错误配置为响应TZ1。仔细检查每个ePWM模块的
TZSEL寄存器。 - 排查:使用软件强制故��功能
TZFRC寄存器。写TZFRC[CBC]=1或TZFRC[OST]=1,可以模拟一个故障事件。如果软件强制能触发保护,但外部引脚不能,问题就在外部信号或GPIO配置上。
问题3:CBC故障后,PWM无法自动恢复。
- 可能原因:故障信号是电平有效,且一直保持低电平。CBC模式只在每个PWM周期开始时(TBCTR=0)检查故障状态。如果故障信号持续为低,保护动作就会持续。确认你的故障检测电路是否在故障消失后能及时将信号拉高。
- 排查:用示波器同时监控故障引脚和PWM输出。确认故障引脚的电平是否在下一个PWM周期开始前已经恢复为高。
问题4:使用DC模块保护,但响应似乎有延迟。
- 可能原因1:CMPSS模块的DAC输出稳定时间或比较器响应时间。检查CMPSS的配置,特别是DAC参考电压的稳定时间。
- 可能原因2:DC事件的选择逻辑
TZDCSEL配置有误。例如,配置为“上升沿触发”,但你的信号是电平触发。 - 可能原因3:数字路径同步延迟。虽然DC是硬件路径,但信号从CMPSS到ePWM内部仍需要几个时钟周期的同步。对于极高开关频率的应用(如>500kHz),这个延迟可能需要考虑。
- 排查:用另一个DAC生成一个快速变化的斜坡电压作为CMPSS输入,用示波器测量从输入电压超过阈值到PWM输出动作之间的延迟。这个延迟应基本恒定,且远小于软件中断响应时间(通常<200ns)。
5. 高级应用与设计考量
5.1 死区补偿策略
死区虽然防止了直通,但也引入了非线性失真,尤其是在低电压输出时,会导致电流波形畸变和零电流钳位现象。在高性能电机矢量控制(FOC)中,通常需要软件死区补偿。
- 基本思想:根据电流方向,判断电流是流经上管二极管还是下管二极管续流,从而判断实际施加在电机上的电压是高于还是低于PWM命令电压。然后在软件中,对PWM占空比命令进行微调(增加或减少一个等效的死区时间)。
- 实现难点:需要精确的电流极性检测。在电流过零点附近,检测容易出错,可能引起振荡。通常需要结合观测器或滤波器进行平滑处理。
5.2 多级故障保护架构
在一个可靠的系统中,故障保护应该是多层次的:
- 硬件第一级(Trip-Zone):针对最紧急、最危险的故障(短路、严重过流),响应时间<1μs。完全由硬件实现。
- 硬件第二级(DC模块+CBC):针对可恢复的过流、过压,实现快速的逐周期限流,响应时间在几个μs内。
- 软件保护(ADC采样+中断):针对变化较慢的故障,如平均过流、过热、通信故障等。响应时间在几十到几百μs。
- 上位机/系统级保护:最高层的逻辑保护,如顺序启停、连锁逻辑等。
ePWM的Trip-Zone和DC模块完美覆盖了前两级,是构建安全电力电子系统的基石。
5.3 与事件触发(ET)模块的联动
Trip-Zone在触发保护动作的同时,还可以产生中断(EPWMx_TZINT)。你可以通过TZEINT寄存器使能这些中断。在中断服务程序(ISR)中,你可以:
- 读取
TZFLG寄存器,判断是哪个故障源触发的(CBC还是OSHT?是TZ1还是DC事件?)。 - 执行更复杂的故障处理逻辑,如记录故障日志、通知上位机、尝试安全重启序列等。
- 清除相应的故障标志(
TZCLR)。
重要提示:对于OSHT故障,必须在ISR中手动清除TZFLG[OST]标志,PWM输出才会被释放。这是一个常见的软件bug来源——故障处理后忘了清除标志,导致系统无法重启。
最后,再分享一个调试小技巧:在开发初期,可以故意在代码中插入对TZFRC寄存器的写操作,来模拟各种故障,从而在不连接真实功率电路的情况下,全面测试你的保护逻辑和软件响应是否正确。这能极大提高开发效率和安全性。记住,在电力电子领域,保护电路的可靠性永远排在第一位,没有“差不多”,必须“百分百”。