1. 项目概述与核心价值
在开发高性能电机驱动、数字电源或者任何需要精确时序控制的嵌入式系统时,我们常常会遇到一个核心矛盾:软件处理的灵活性与硬件响应的实时性、确定性难以兼得。比如,你想在PWM波形的某个精确时刻(例如峰值电流点)启动一次ADC采样,或者当某个外部故障信号(如过流)出现时,立即关闭PWM输出并进入中断服务程序。如果全靠CPU轮询去判断这些条件,不仅会消耗大量计算资源,更致命的是会引入不可预测的延迟(jitter),这在开关频率动辄几十KHz甚至上百KHz的功率应用中是不可接受的。
这时,硬件事件触发机制就成了解决问题的“银弹”。它的核心思想是“条件驱动,硬件自治”:由专用的硬件模块(如ePWM中的事件触发ET和数字比较DC子模块)持续监控预设的条件,一旦条件满足,立刻在硬件层面自动执行预定动作(如产生中断脉冲、发出ADC启动信号、甚至直接改变PWM输出状态),整个过程无需CPU干预,延迟是纳秒级的、确定性的。
我手头正在做的基于TI AM263x的伺服驱动器项目,就对ePWM的事件触发与数字比较功能有着极高的依赖。AM263x作为TI Sitara™家族中面向实时控制的高性能MCU,其增强型脉宽调制器(ePWM)模块的功能异常强大,尤其是其事件触发(ET)和数字比较(DC)子模块,堪称实现复杂、可靠功率控制的“瑞士军刀”。但官方技术手册(TRM)内容浩如烟海,寄存器位域错综复杂,初次接触时很容易迷失在细节里,不知从何配置起。
本文将结合我实际在电机控制与LLC谐振变换器项目中的踩坑经验,为你深入拆解AM263x ePWM模块中事件触发(ET)与数字比较(DC)子模块的工作原理、配置流程和实战技巧。我不会照本宣科地罗列寄存器,而是聚焦于“为什么这么设计”以及“如何安全高效地用起来”,目标是让你读完就能在自己的项目中设计出可靠的事件触发逻辑,避开那些我曾经掉进去的“坑”。
2. 事件触发(ET)子模块:从事件到行动的精确管道
你可以把事件触发子模块想象成一个高度可配置的“事件分发中心”或“硬件自动化流水线”。它的输入端连接着ePWM内部各种可能的事件源,输出端则产生两种最重要的动作:中断(INT)和ADC启动转换(SOC)。其核心价值在于,它提供了一套完整的“事件预处理”机制,包括事件选择、分频(Prescale)和计数,让你能精细地控制“在什么条件下”、“以何种频率”来触发后续动作。
2.1 核心工作流程与寄存器地图
事件触发子模块的工作流程可以概括为:事件源选择 -> 事件计数与分频 -> 动作生成。整个过程由一组关键寄存器控制,理解它们的关系是正确配置的前提。
事件选择寄存器(ETSEL):这是流水线的“源头开关”。你需要在这里指定,究竟哪些ePWM内部事件能够进入这个触发流水线。可选的事件非常丰富,主要包括:
- 时基事件:计数器等于零(TBCTR=0)、计数器等于周期值(TBCTR=TBPRD)。这两个事件标志着PWM周期的开始和结束,常用于周期性的同步或采样。
- 比较匹配事件:这是最常用的触发源。当递增/递减的计数器与比较寄存器CMPA/CMPB/CMPC/CMPD的值相等时,就会产生事件。例如,在对称PWM模式下,CMPA匹配点通常对应着功率管的开通或关断时刻,在此刻触发ADC采样电流,是电流环控制的基石。
- 数字比较事件:来自数字比较子模块的
DCAEVT1.soc和DCBEVT1.soc信号。这允许外部信号(如比较器输出)直接触发ADC,是实现硬件保护或峰值电流模式控制的关键。
事件分频寄存器(ETPS)与增强分频寄存器(ETINTPS/ETSOCPS):这是流水线的“流量控制器”。不是每一个事件都需要立刻触发动作。比如,你可能希望每2个CMPA匹配事件才产生一次中断,或者每5个周期才启动一次ADC采样以降低CPU负载。ETPS寄存器提供了基础的分频功能(INT和SOC各有一套INTCNT/INTPRD和SOCxCNT/SOCxPRD)。 更强大的是,AM263x的ePWM Type 5引入了增强分频寄存器(ETINTPS用于中断,ETSOCPS用于SOC)。基础分频只能设置“每1、2、3次事件”触发,而增强分频允许你设置1到15之间任意整数次事件才触发一次动作(通过INTPRD2/SOCxPRD2配置)。这提供了极大的灵活性。通过ETPS[INTPSSEL]或ETPS[SOCPSSEL]位,你可以选择使用基础分频还是增强分频逻辑。
事件标志与强制寄存器(ETFLG, ETCLR, ETFRC):这是流水线的“状态监控与手动控制面板”。
ETFLG:标志位。当事件计数器达到预设周期值并成功触发动作(如发出中断脉冲)后,相应的标志位(如INT)会被硬件置1。这是判断触发是否发生的直接依据。ETCLR:清除位。软件通过写1到相应位来清除ETFLG中的标志。务必在中断服务程序(ISR)中及时清除标志,否则无法响应下一次触发。ETFRC:强制位。软件通过写1可以手动“模拟”一次事件输入,使事件计数器加1。这在调试阶段极其有用,你可以不依赖真实的硬件事件,手动测试中断或SOC触发逻辑是否正确。
计数器初始化控制(ETCNTINITCTL, ETCNTINIT):这是流水线的“初始化设定器”。它允许你在特定的同步事件(如PWMSYNC)发生时,或者通过软件强制,将事件计数器(INTCNT2, SOCACNT2, SOCBCNT2)初始化为一个自定义的值,而不是默认的0。这在需要多个ePWM模块间进行复杂相位同步的系统中非常有用。
2.2 中断(INT)与SOC触发流程详解
理解了寄存器,我们来看两个核心输出:中断和SOC的具体生成逻辑。手册中的图7-193和7-194是精华,我们将其转化为可操作的逻辑步骤。
中断生成流程:
- 事件选择:通过
ETSEL[INTSEL]和ETSEL[INTSELCMP],选定一个事件源(例如,CTR=CMPA)。 - 事件输入:每当选定的事件发生时,信号进入中断生成逻辑。
- 分频计数:
- 根据
ETPS[INTPSSEL]的选择,决定使用ETPS[INTCNT]还是ETINTPS[INTCNT2]作为计数器。 - 事件每发生一次,对应的计数器加1。
- 根据
- 条件判断与触发:
- 当计数器值等于对应的周期值(
ETPS[INTPRD]或ETINTPS[INTPRD2])时,硬件检查两个条件:中断是否使能(ETSEL[INTEN]=1)?中断标志是否已清除(ETFLG[INT]=0)? - 如果两个条件都满足,则:a) 产生一个中断脉冲送到PIE;b) 将
ETFLG[INT]置1;c) 将事件计数器清零,重新开始计数。 - 如果中断未使能或标志位已置1(表示上一个中断尚未被处理),则计数器会停止在周期值,等待条件满足。
- 当计数器值等于对应的周期值(
- 软件响应:CPU进入中断服务程序,执行相应操作(如运行控制算法),最后必须写
ETCLR[INT]=1来清除中断标志,否则后续中断将被阻塞。
SOC(ADC启动转换)生成流程:SOCA和SOCB的流程与中断类似,但有三个关键区别:
- 事件源扩展:除了时基和比较匹配事件,SOC可以选择
DCAEVT1.soc和DCBEVT1.soc作为触发源,实现了外部事件直接触发ADC。 - 连续触发:与中断不同,SOC触发是“连续”的。即使
ETFLG[SOCA]标志位因为上一次触发而已被置起,只要事件计数器再次达到周期值,并且SOC使能��ETSEL[SOCAEN]=1),就会再次产生一个SOC脉冲,同时计数器清零重启。这意味着ADC可以被周期性地、自动地触发,无需软件干预清除标志。 - 输出目标:产生的SOC脉冲直接连接到ADC模块的SOCA或SOCB输入,启动一次ADC转换序列。
实操心得:中断与SOC的标志位处理差异这是最容易混淆和出错的地方。对于中断,你必须“消费”掉它(在ISR中清除标志),系统才能响应下一个中断。而对于SOC,其标志位更像一个“状态指示器”,告诉你最近一次SOC是由谁触发的,但不影响下一次SOC的触发。在设计ADC采样逻辑时,可以利用
ETFLG[SOCA]来判断采样是否由预期的事件触发,但不要试图通过不清除它来阻止下一次采样。
2.3 混合事件信号(ETxMIX)的应用
AM263x的ePWM Type 5引入了ETINTMIX、ETSOCAMIX、ETSOCBMIX这三个混合信号。它们本质上是多个事件源的逻辑或(OR)输出。
ETINTMIX:由ETINTMIXEN寄存器选择的事件源OR而成,可作为EPWMxINT中断的源。ETSOCAMIX/ETSOCBMIX:由ETSOCAMIXEN/ETSOCBMIXEN选择的事件源OR而成,可作为EPWMxSOCA/SOCB的触发源。
这有什么用?它实现了多条件触发。例如,在一个LLC变换器中,你可能希望在以下任一条件满足时都触发ADC采样进行过流保护:1) 原边电流采样值达到CMPA匹配点;2) 外部比较器检测到过流(通过DC子模块产生DCAEVT1.soc)。在没有MIX功能时,你需要配置两个独立的SOC通道并处理可能的冲突。有了MIX功能,你只需将这两个事件源都使能到ETSOCAMIXEN中,那么任何一个事件发生,都会产生同一个SOCA脉冲。这简化了逻辑,提高了响应的灵活性。
3. 数字比较(DC)子模块:连接外部世界的智能哨兵
如果说事件触发子模块是处理内部事件的流水线,那么数字比较子模块就是ePWM与外部模拟世界交互的“前沿哨所”。它的核心功能是将外部数字信号(主要是来自片内模拟比较器模块CMPSS的输出)转化为ePWM内部可识别的事件,进而触发保护、同步或ADC采样。
3.1 信号通路与核心功能
数字比较子模块的输入非常灵活,如图7-196所示,包括:
- 模拟比较器输出:通过Input X-BAR和EPWM X-BAR路由过来的CMPSSx信号,这是最常用的输入,用于实时比较电流、电压等模拟量。
- GPIO引脚:任何GPIO都可以配置为数字比较输入,接收外部数字信号。
- 其他内部信号:如中断控制器信号、ECC错误信号等。
这些输入信号被映射为四组核心信号:数字比较A高/低(DCAH,DCAL)和数字比较B高/低(DCBH,DCBL)。通过DCTRIPSEL等寄存器,你可以将多达15个外部Trip输入信号进行组合(逻辑或),生成最终的DCAH/L和DCBH/L信号。这为复杂的多条件保护逻辑提供了硬件基础。
DCAH/L和DCBH/L信号随后被送入事件生成逻辑,产生两类事件,每类又分两个子事件(EVT1和EVT2):
- DCAEVT1/2 和 DCBEVT1/2:这是经过基本处理(可选滤波)后的事件信号。
- DCEVTFILT:这是经过事件滤波(空白窗口)或谷底开关处理后的滤波事件信号。
这些事件信号可以触发四种类型的动作,这也是DC子模块价值的核心体现:
- 强制信号(.force):直接强制PWM输出进入特定状态(高、低、高阻)。这是最高优先级、最快速的硬件保护路径。例如,当
DCAEVT1.force有效时,可以立即将EPWMxA输出拉低,关断上管,响应时间在几十纳秒内。 - 中断信号(.interrupt):产生一个Trip区域中断(
EPWMxTZINT)。用于通知CPU发生了需要软件干预的故障或事件。 - SOC信号(.soc):作为事件源输入到ET子模块,用于触发ADC转换。实现了外部事件与ADC采样的硬连接。
- 同步信号(.sync):产生一个同步脉冲,可以用于同步本模块或其他ePWM模块的时基计数器(TBCTR)。这在需要多个PWM通道严格同步或相位移动的应用中至关重要。
3.2 高级功能一:事件滤波与空白窗口
在功率电路中,比较器信号极易受到开关噪声的干扰,产生毛刺。如果不加处理,这些毛刺会误触发保护,导致系统误关机。DC子模块的事件滤波(空白窗口)功能就是用来解决这个问题的。
其原理如图7-201所示。你可以定义一个“空白窗口”,在这个窗口期内,来自DCAEVT1/2或DCBEVT1/2的事件会被完全忽略。窗口的开启和关闭由PWM时基精确控制。
配置关键点:
- 窗口对齐:通过
DCFCTL[PULSESEL]选择空白窗口对齐到CTR=PRD脉冲、CTR=0脉冲,或两者都对齐。这通常与你的保护逻辑相关。例如,在Buck电路中,高端MOSFET开通瞬间(PWM上升沿)电流噪声最大,可以将窗口对齐到此时刻。 - 窗口偏移:
DCFOFFSET寄存器设置一个偏移量(以TBCLK周期为单位),决定在对齐脉冲后延迟多少个时钟才开始空白窗口。 - 窗口宽度:
DCFWINDOW寄存器设置空白窗口持续的TBCLK周期数。
实战配置示例(防止Buck上管开通噪声误触发过流保护):假设PWM频率100kHz(周期10us),TBCLK=100MHz(10ns)。上管在CTR=0时开通。开通后前500ns(50个TBCLK)噪声严重。
DCFCTL[PULSESEL] = 01(对齐到CTR=0)DCFOFFSET = 0(窗口立即开始)DCFWINDOW = 50(窗口持续50个TBCLK,即500ns)DCFCTL[BLANKE] = 1(使能空白窗口)
这样,在每个PWM周期开始后的500ns内,来自比较器的过流信号将被忽略,有效滤除开通噪声。
3.3 高级功能二:谷底开关与周期捕获
在谐振变换器(如LLC)或某些软开关电路中,为了实现零电压开关(ZVS),需要在电流或电压振荡的“谷底”时刻开启开关管,以最小化开通损耗。传统方法需要复杂的模拟电路或高带宽的软件检测。AM263x的DC子模块内置了谷底开关硬件,可以自动检测振荡周期并计算最佳开通延迟。
如图7-200所示,谷底开关逻辑的核心是一个16位计数器和一个边沿捕获逻辑。其工作流程如下:
- 选择输入与边沿滤波:通过
DCFCTL[SRCSEL]选择一个DCxEVTy事件作为输入,并配置边沿滤波(EDGEMODE,EDGECOUNT)来捕获特定的第N个边沿,以跳过初始噪声。 - 触发与捕获:通过
VCAPCTL[TRIGSEL]选择一个事件(如软件触发)来“武装”捕获逻辑。当指定的“开始边沿”(STARTEDGE)到来时,16位计数器开始以TBCLK频率计数。 - 停止与计算:当指定的“停止边沿”(
STOPEDGE)到来时,计数器停止。捕获到的计数值(CNTVAL)就代表了振荡的半个周期(或一个周期,取决于边沿选择)。 - 延迟应用:硬件会自动将这个捕获到的
CNTVAL值(或它的分数,由VCAPCTL[VDELAYDIV]控制),作为一个延迟量,应用到原始的DCxEVTy事件上。最终产生的DCEVTFILT信号,其边沿就被精确地延迟到了振荡的谷底点。 - 同步PWM:将这个
DCEVTFILT信号作为同步源(.sync)输出给时基子模块,就可以让PWM的开关时刻自动跟踪并锁定在谷底。
避坑指南:谷底开关的启动与稳定性谷底开关逻辑需要先捕获一个完整的振荡周期才能计算出延迟。在系统启动初期或负载剧烈变化时,振荡可能不稳定,导致捕获值错误。因此,在软件初始化阶段,通常先使用固定的频率或时间驱动PWM��待系统稳定(如输出电压建立)后,再使能谷底开关功能。同时,软件需要持续监控
CNTVAL寄存器,如果其值超出合理范围(例如,小于最小死区时间或大于PWM周期的一半),则应禁用谷底开关,回退到固定频率模式,并触发故障处理。
3.4 高级功能三:事件锁存与清除机制
在相移全桥(PSFB)等拓扑中,可能需要对周期循环(CBC)故障和单次触发(OST)故障采取不同的保护动作。DC子模块为DCxEVT1提供了事件锁存功能(见图7-198中的DCxEVT1LAT)。
- 锁存选择:通过
DCxCTL[EVT1LATSEL],可以选择DCxEVT1.force信号是直接使用原始事件,还是使用其锁存后的版本。 - 锁存清除:通过
DCxCTL[EVT1LATCLRSEL],可以配置锁存器在何种条件下自动清除,例如在CNT=0、CTR=PRD或两者发生时清除。这模仿了CBC故障的自动清除机制。
应用场景:假设DCAEVT1由过流比较器触发。你可以配置为:当DCAEVT1发生时,其锁存版本DCxEVT1LAT被置位,并产生一个CBC类型的保护(如周期性关断),同时DCxEVT1LAT的状态可以被软件读取。如果故障是暂时的,锁存器会在下一个PWM周期开始时(CNT=0)自动清除,系统自动恢复。如果故障是持续的(锁存器无法清除),则可以升级为OST故障,执行更严格的保护(如完全关断并锁存)。这实现了分级的故障响应策略。
4. 实战配置:构建一个完整的电机相电流采样与保护系统
理论说了这么多,我们来看一个在永磁同步电机(PMSM)FOC控制中典型的实战案例:如何利用ePWM的ET和DC子模块,实现双电阻电流采样和硬件过流保护。
系统目标:
- 电流采样:在PWM周期的特定时刻(通常在下桥臂导通的中点,以获得准确的相电流)触发ADC,采样两相电流。
- 过流保护:当任意一相电流超过硬件设定阈值时,在下一个PWM开关周期内(CBC)立即关闭该相上下桥臂,并在中断中记录故障。
硬件连接:
- 电机三相电流经采样电阻和运放调理后,送入AM263x的ADCIN-A1和ADCIN-A2。
- 运放输出同时连接到片内比较器CMPSS1和CMPSS2的负输入端,正输入端接一个由DAC设定的过流阈值电压。
软件配置步骤:
4.1 ePWM1配置(用于产生PWM并触发ADC)
- 时基与计数模式:配置为向上-向下计数模式(对称PWM),中心对齐。设置合适的
TBPRD以得到所需的开关频率。 - 动作限定器:配置
CMPA和CMPB以产生带死区的互补PWM波形。假设我们希望在CTR=CMPA且计数器递增时(即PWM上升沿)触发ADC采样。 - 事件触发(ET)子模块配置:
ETSEL[SOCASEL] = 100(选择CTRU=CMPA作为SOCA事件源)。ETPS[SOCPSSEL] = 0(使用基础分频)。ETPS[SOCACNT] = 0(计数器初始为0)。ETPS[SOCAPRD] = 1(每1个事件触发一次SOCA)。ETSEL[SOCAEN] = 1(使能SOCA生成)。- 这样,每个PWM周期,当计数器递增到与
CMPA匹配时,就会产生一个EPWM1SOCA脉冲。
- ADC配置:将
EPWM1SOCA连接到ADC的SOC0,配置ADC在SOC0触发下对ADCIN-A1和ADCIN-A2进行顺序采样。
4.2 数字比较与硬件保护配置(以A相为例)
- 信号路由:配置Input X-BAR,将CMPSS1的输出(对应A相过流信号)路由到ePWM1的
DCAH输入。 - 数字比较(DC)子模块配置:
DCTRIPSEL:配置选择CMPSS1作为DCAH的信号源。TZDCSEL:配置DCAEVT1由DCAH信号产生(例如,高电平有效)。DCFCTL:强烈建议使能空白窗口,对齐到PWM开关时刻,滤除开关噪声,窗口宽度根据实际噪声情况调整。
- Trip-Zone子模块配置:
TZSEL:将DCAEVT1配置为周期循环(CBC)Trip源。TZCTL:配置当CBC Trip发生时,EPWM1A和EPWM1B输出强制为低电平(主动关断上下桥臂)。TZEINT:使能DCAEVT1中断,这样当过流发生时,不仅硬件自动关断PWM,还会产生一个EPWM1_TZINT中断,让CPU能够记录故障日志、判断是否需要完全停机等。
4.3 中断服务程序(ISR)编写要点
// ePWM1 的 Trip-Zone 中断服务例程 __interrupt void epwm1TzIsr(void) { // 1. 读取故障源 uint32_t tzFlag = EPWM_getTripZoneFlagStatus(EPWM1_BASE); if (tzFlag & EPWM_TZ_FLAG_DCAEVT1) { // 处理A相过流 systemFaultLog.phaseAOverCurrent = true; // 可能的操作:置位全局故障标志,准备安全停机 g_systemFault = true; } // 检查其他故障源... // 2. 清除中断标志!!!这是必须的。 EPWM_clearTripZoneFlag(EPWM1_BASE, EPWM_TZ_FLAG_DCAEVT1 | EPWM_TZ_FLAG_DCBEVT1 | EPWM_TZ_FLAG_CBC); // 3. 清除Trip-Zone子模块的锁存状态,为恢复做准备 // 注意:对于CBC故障,硬件通常会在下一个PWM周期自动清除。 // 但软件清除可以确保状态机复位。对于OST故障,必须软件清除才能恢复。 EPWM_clearTripZoneFlag(EPWM1_BASE, EPWM_TZ_INTERRUPT); // 清除TZ中断标志 // 如果需要手动恢复CBC故障(而不是等待下周期),可能需要操作TZCLR // EPWM_forceTripZoneEvent(EPWM1_BASE, EPWM_TZ_FORCE_EVENT_CBC); // 谨慎使用 // 4. 确认中断已处理 Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3); // 假设ePWM1 TZ INT在Group3 }关键注意事项:中断与硬件保护的协同在这个系统中,保护动作是分层的,且由硬件最高优先级保证。当发生过流时:
- 纳秒级:DC子模块产生
DCAEVT1.force信号。- 微秒级:Trip-Zone子模块立即将PWM输出强制为安全状态(低电平)。这个动作完全不依赖CPU,是确保功率器件安全的最后防线。
- 数十微秒级:CPU进入
EPWM1_TZINT中断服务程序,进行故障记录、系统状态管理等“事后处理”。绝对不要在中断服务程序里才去关闭PWM输出,那太慢了。硬件保护路径必须独立于软件。
5. 调试技巧与常见问题排查
即使理解了原理和配置,在实际调试中依然会遇到各种问题。以下是我总结的几个常见“坑点”和排查方法。
5.1 问题一:ADC没有被触发,或者触发时机不对
可能原因1:SOC事件源选择错误或未使能。
- 排查:检查
ETSEL[SOCASEL]和ETSEL[SOCAEN]寄存器。确保你选择的事件(如CTRU=CMPA)确实会在你的PWM计数模式下发生。例如,在向上计数模式下,CTRD=CMPA(递减匹配)永远不会发生。 - 技巧:使用
ETFRC[SOCA]位进行软件强制触发。如果强制触发能启动ADC,说明ADC和SOC通路是好的,问题出在事件源或分频计数器上。
- 排查:检查
可能原因2:事件分频计数器(SOCACNT)未达到周期值(SOCAPRD)。
- 排查:在调试器中实时观察
ETPS[SOCACNT]的值。它是否在事件发生时递增?是否在达到ETPS[SOCAPRD]后被清零?如果计数器不递增,检查事件源;如果递增但不清零,检查SOCAPRD是否被误设为0(禁用)。
- 排查:在调试器中实时观察
可能原因3:ADC模块配置问题。
- 排查:确认ADC的SOC配置是否已正确映射到ePWM的SOC输出。例如,
ADCSOC0CTL寄存器的TRIGSEL字段是否选择了正确的EPWMxSOCA?ADC的SOC优先级和采样窗口是否配置合理?
- 排查:确认ADC的SOC配置是否已正确映射到ePWM的SOC输出。例如,
5.2 问题二:数字比较保护不动作,或误动作
可能原因1:信号未正确路由到DC子模块。
- 排查:这是最复杂的一步。使用TI的SysConfig工具可以直观检查X-BAR的路由配置。务必确认:GPIO复用是否正确?Input X-BAR选择是否正确?EPWM X-BAR是否将信号送到了目标ePWM模块的
DCAH/DCAL输入? - 技巧:先将GPIO配置为普通输入,用软件读取其状态,确认外部比较器或信号的电平变化能正确反映到GPIO数据寄存器中。这能隔离ePWM配置问题。
- 排查:这是最复杂的一步。使用TI的SysConfig工具可以直观检查X-BAR的路由配置。务必确认:GPIO复用是否正确?Input X-BAR选择是否正确?EPWM X-BAR是否将信号送到了目标ePWM模块的
可能原因2:空白窗口配置不当,滤除了真实故障或未能滤除噪声。
- 现象:真实过流时保护不动作(窗口太宽或位置不对),或者没有过流时频繁误触发(窗口太窄或未使能)。
- 排查:计算并核对
DCFOFFSET和DCFWINDOW的值。它们是以TBCLK为单位的。确保空白窗口覆盖了噪声最大的时段(通常是开关瞬间),但又不能覆盖需要检测故障的时段(如电流峰值附近)。 - 调试方法:可以暂时禁用空白窗口(
DCFCTL[BLANKE]=0),看故障信号是否能正常触发。如果能,则问题在窗口配置;如果不能,则问题在信号路由或事件生成逻辑。
可能原因3:Trip-Zone动作配置错误。
- 排查:检查
TZSEL寄存器,是否将DCAEVT1或DCAEVT2使能为CBC或OST源?检查TZCTL、TZCTLDCA寄存器,配置的强制动作(高、低、高阻)是否符合你的硬件保护需求(例如,对于半桥,通常需要同时将上下管强制为低)。
- 排查:检查
5.3 问题三:中断进不去,或者只进一次
可能原因1:中断标志未清除。
- 这是最常见的原因!对于ET子模块产生的中断(
EPWMx_INT),必须在ISR中写ETCLR[INT]=1。对于DC子模块通过Trip-Zone产生的中断(EPWMx_TZINT),必须在ISR中清除TZCLR中相应的位以及PIE组ACK位。 - 排查:在ISR入口设置断点,单步执行,确认清除标志的代码被执行到。检查数据手册,确认清除标志的正确操作是写1还是写0(通常是写1清除)。
- 这是最常见的原因!对于ET子模块产生的中断(
可能原因2:中断未在PIE或CPU级使能。
- 排查:ePWM中断是外设中断,需要三级使能:外设级(如
ETSEL[INTEN]=1)、PIE级(配置PIE向量表并使能相应PIE组和位)、CPU级(使能全局中断INTM位和相应IER位)。缺一不可。 - 技巧:使用CCS的“Interrupt Viewer”工具,可以直观看到各级中断的使能和标志状态。
- 排查:ePWM中断是外设中断,需要三级使能:外设级(如
可能原因3:事件分频导致中断频率低于预期。
- 排查:检查
ETPS[INTPRD]或ETINTPS[INTPRD2]的值。如果设为大于1,则不是每个事件都会产生中断。如果你期望每个PWM周期都进中断,但INTPRD被设成了2,那就只会每两个周期进一次。
- 排查:检查
5.4 高级调试工具:利用寄存器视图与强制功能
现代的IDE(如Code Composer Studio)和仿真器(如XDS系列)是强大的调试伙伴。
- 寄存器实时查看:在CCS的寄存器视图中,添加并监控关键寄存器,如
ETFLG、ETPS(看计数器)、TZFLG、DCCAP(如果使能了捕获)等。观察它们在运行时的变化,是理解硬件行为最直接的方式。 - 软件强制(Software Force):
ETFRC和TZFRC寄存器是你的好朋友。在调试初期,你可以:- 不接任何外部信号,通过写
ETFRC[SOCA]=1来手动触发ADC,验证整个ADC采样链路。 - 通过写
TZFRC[DCAEVT1]=1来手动模拟一个过流故障,观察PWM输出是否被正确强制,中断是否产生。这能极大简化硬件依赖的调试过程。
- 不接任何外部信号,通过写
- 信号跟踪:如果条件允许,使用高端示波器或逻辑分析仪,同时测量PWM输出、比较器输入/输出、以及MCU的ADC触发引脚或故障引脚。通过观察这些信号的时序关系,可以精准定位是信号问题、配置问题还是延迟问题。
深入理解并熟练运用AM263x ePWM的事件触发与数字比较子模块,能够将大量实时性要求极高的任务从CPU卸载到硬件,构建出响应迅速、确定性高、可靠性强的电力电子控制系统。这不仅仅是配置几个寄存器,更是设计思想的转变:从“软件监控一切”到“硬件处理实时,软件管理策略”。希望本文的拆解和实战经验,能帮助你少走弯路,更快地驾驭这颗强大的芯片,打造出更出色的产品。