深入解析ePWM数字比较子模块:从事件触发到多模块同步

📅 2026/7/18 15:45:04 👁️ 阅读次数 📝 编程学习
深入解析ePWM数字比较子模块:从事件触发到多模块同步

1. 项目概述:为什么我们需要深入理解ePWM的数字比较子模块?

在电机驱动、数字电源或者任何需要精密功率控制的嵌入式系统里,PWM(脉宽调制)信号的质量和可靠性直接决定了整个系统的性能上限。我们常用的微控制器,比如TI的C2000系列,其增强型PWM(ePWM)模块功能之强大,足以让刚接触的工程师感到既兴奋又头疼。兴奋在于它几乎能实现你对PWM波形控制的所有幻想;头疼则在于,其子模块众多,寄存器配置复杂,尤其是数字比较(Digital Compare, DC)子模块,常常是项目从“能跑”到“跑得稳、跑得准”的关键分水岭。

你可能已经会用ePWM的基本功能:设置周期、比较值,生成互补带死区的PWM波。但当系统变得复杂,比如需要根据外部模拟比较器的输出来实时关断PWM(过流保护),或者需要在PWM波形的特定时刻精准触发ADC采样(用于电流环反馈),又或者需要多个PWM模块之间严格同步以控制多相逆变器时,基础功能就显得捉襟见肘了。这时,数字比较子模块就从幕后走到了台前。

简单来说,数字比较子模块的核心价值在于“桥梁”和“哨兵”。它是一座桥,将外部数字信号(如比较器输出、GPIO状态)直接引入到ePWM复杂的事件处理核心中;它也是一个哨兵,对这些外部信号进行“资格审查”(滤波)和“任务分发”(触发不同动作)。不理解它,你就无法实现高可靠性的故障保护、高精度的采样同步,以及复杂的多模块协同工作。我见过不少项目,保护功能不稳定,ADC采样时刻漂移,其根源往往是对DC子模块的事件触发与滤波机制理解不透彻。接下来,我将结合手册中的框图与寄存器,拆解它的工作原理,并分享在实际电机控制和电源项目中配置它的“避坑”经验。

2. 数字比较子模块的核心架构与信号流解析

要驾驭数字比较子模块,不能只死记寄存器位,必须建立起清晰的信号流视图。它不是一个孤立的单元,而是深度嵌入在ePWM的时间基准(TB)、动作限定(AQ)、事件触发(ET)和故障保护(TZ)这几个核心子模块之间的关键枢纽。

2.1 输入信号的来源与选择

数字比较子模块的输入,最典型的是来自芯片引脚的TZ1/TZ2/TZ3这三个故障保护信号。但在数字比较的语境下,它们被赋予了新的角色:作为普通的数字输入信号。通过DCTRIPSEL寄存器,我们可以灵活地将TZ1/TZ2/TZ3信号映射到四路核心的比较信号上:

  • DCAH(Digital Compare A High): 通常映射一个TZn信号,代表“A高事件”的源。
  • DCAL(Digital Compare A Low): 通常映射另一个TZn信号,代表“A低事件”的源。
  • DCBH(Digital Compare B High): 同上,用于B路。
  • DCBL(Digital Compare B Low): 同上,用于B路。

这里有一个非常重要的实操细节:TZ信号在作为数字比较输入时,其有效极性(高有效或低有效)是通过Trip-Zone子模块的TZCTL寄存器来配置的,而不是在DC子模块内。这意味着,你需要统筹考虑故障保护和数字比较两种用途下的极性设置,避免冲突。例如,你可能希望TZ1在过高电平时触发故障保护(高有效),同时也希望它作为DCAH的源。那么TZCTL中TZ1的极性就应配置为高有效。

2.2 事件生成与限定

DCAH/DCAL和DCBH/DCBL这些原始比较信号,并不会直接去触发动作。它们需要经过“事件限定”(Event Qualification)这一步骤,生成最终可供后续模块使用的事件。这个限定逻辑主要由TZDCSEL寄存器控制。

TZDCSEL寄存器为每一路(A和B)分别定义了“事件1”和“事件2”是如何由H和L信号组合产生的。例如,你可以配置:

  • DCAEVT1= DCAH(即仅当DCAH有效时,才产生DCAEVT1事件)。
  • DCAEVT2= DCAH AND DCAL(即DCAH和DCAL同时有效时才产生事件,这常用于需要两个条件同时满足的复杂保护逻辑)。
  • 或者,DCAEVT1= DCAH,DCAEVT2= DCAL,让两个事件独立。

B路(DCBEVT1/2)的配置同理。这种灵活性允许你用最少的硬件资源监控多种外部条件组合。生成的事件(DCAEVT1/2, DCBEVT1/2)就是整个数字比较子模块输出的“产品”,它们将被送往三个目的地:故障保护子模块、事件触发子模块和时间基准子模块。

注意:手册中特别强调,当TZn信号用于数字比较事件时,它被视为普通输入。而ePWM输出的异步故障关断(即硬件强制拉低)是由TZn信号、DCAEVTx.force或DCBEVTx.force信号直接触发的。并且,要使故障条件被锁存,触发脉冲的宽度必须至少为3个TBCLK周期。如果脉冲太窄,可能无法被CBC(逐周期)或OST(单次)锁存器捕获,导致保护失效。这是硬件设计时(如比较器输出电路)必须考虑的时序问题。

2.3 输出动作的“分发中心”

生成的事件能触发哪些具体动作呢?这是数字比较子模块威力最直接的体现。每个事件(如DCAEVT1)可以同时或独立地产生四种类型的输出信号:

  1. 强制信号(.force):直接送到故障保护子模块。它可以被配置为像TZ信号一样,立即强制ePWMxA或ePWMxB输出高、低或高阻态。例如,你可以用外部比较器监控电流,当其输出超过阈值(产生DCAEVT1)时,直接强制PWM输出为低,实现纳秒级的硬件保护,完全无需CPU干预。优先级顺序需要牢记:对于ePWMxA输出,TZA(最高)> DCAEVT1 > DCAEVT2(最低);ePWMxB同理。这避免了多个强制源冲突时的行为不确定性。

  2. 中断信号(.interrupt):送到故障保护子模块的中断逻辑。需要先在TZEINT寄存器中使能对应事件的中断,事件发生后会触发EPWMxTZINT中断,并在中断服务程序中通过写TZCLR寄存器相应位来清除标志。这用于需要CPU介入处理的故障,比如记录故障日志、执行软重启序列等。

  3. ADC启动转换信号(.soc):送到事件触发子模块。这是实现高精度采样同步的关键!DCAEVT1.soc可以被选作触发ADC SOCA的事件,DCBEVT1.soc则可触发SOCB。这意味着,你可以让外部事件(如电流过零点)精确地触发ADC采样,采样时刻与PWM波形完全解耦,实现了真正的“事件驱动型”采样,对于提高数字控制环路的性能至关重要。

  4. 同步信号(.sync):送到时间基准子模块。DCAEVT1.sync和DCBEVT1.sync可以与外部同步输入(EPWMxSYNCI)或软件强制同步信号(SWFSYNC)进行“或”操作,产生一个同步脉冲去复位或同步本模块的TBCTR计数器。这是实现多个ePWM模块之间基于外部事件进行同步的核心机制。

3. 事件滤波(消隐窗口)机制深度剖析与配置实战

在实际的功率电路中,开关噪声、振铃等现象不可避免,可能会在比较器输出端造成短暂的毛刺。如果这些毛刺被数字比较子模块误认为是有效事件,将导致误保护或误触发ADC,系统根本无法稳定工作。因此,事件滤波(Event Filtering)或称为消隐窗口(Blanking Window)功能,是数字比较子模块从“可用”到“可靠”的必备特性。

3.1 滤波原理与时序模型

事件滤波的逻辑可以用一个生活中的例子来理解:假设你家门口有个感应灯(事件),但你不希望飞过的小鸟(噪声)触发它。你可以设置一个规则:只有在每天晚上7点到7点05分(一个时间窗口)之外触发的感应,才点亮灯。在7点到7点05分之内,无论什么触发,灯都不亮。这个“7点到7点05分”就是消隐窗口。

在ePWM中,这个“时间窗口”是锚定在PWM周期内的。如图21-48和21-49所示,其工作流程如下:

  1. 选择滤波源:通过DCFCTL[SRCSEL]位,选择要对哪一个数字比较事件(DCAEVT1/2, DCBEVT1/2)进行滤波。被选中的事件信号将进入滤波逻辑。

  2. 锚点选择:通过DCFCTL[PULSESEL]位,决定消隐窗口以哪个时间点为基准开始计算。有两个选择:

    • 00: 窗口锚定在CTR = PRD时刻(计数器等于周期值,通常是一个PWM周期的结束/开始点,取决于计数模式)。
    • 01: 窗口锚定在CTR = 0时刻(计数器为零点)。
  3. 设置偏移量(Offset):在锚点之后,并不立即开始消隐,而是先等待一个可编程的偏移时间。这个时间值(以TBCLK周期数为单位)写入DCFOFFSET寄存器。例如,在Buck电路中,开关管开通瞬间的电流尖峰噪声最大,我们可以将偏移量设为开关开通后的一段短时间。

  4. 设置窗口宽度(Window):偏移时间结束后,消隐窗口正式开始,其持续时间(同样以TBCLK周期数为单位)由DCFWINDOW寄存器定义。在窗口期内,所有来自选定源的事件都会被忽略。

  5. 窗口的周期性:每个PWM周期都会重复这个“锚点 -> 偏移 -> 消隐窗口”的过程。手册图21-49特别说明,如果计算出的消隐窗口跨越了CTR=0或CTR=PRD的边界,下一个周期的窗口依然会从锚点+偏移量处重新开始。这意味着窗口不会“累积”或“错位”,每个周期都是独立计算的。

3.2 关键寄存器配置步骤与示例

假设在一个峰值电流模式控制的Buck电路中,我们使用一个比较器监控电感电流,输出接TZ1,并配置为DCAH源。我们希望在每个PWM周期开始(CTR=0)后的头2us内忽略任何比较器跳变(因为此时是开关管开通时刻,噪声最大),2us后才允许事件触发ADC采样或保护。

已知系统时钟SYSCLKOUT = 200MHz, ePWM时钟预分频后TBCLK = 100MHz (周期10ns)。

  1. 配置输入选择与事件生成:

    // 假设TZ1接电流比较器输出,高电平表示过流 EALLOW; // 配置TZ1为高有效(针对数字比较功能,故障保护可能另有配置) EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_HI; // 示例,实际保护动作根据需要设置 EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_HI; // 将TZ1映射为DCAH和DCAL的源(这里假设高低事件都用TZ1,通过极性区分,实际可能用不同信号) EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = DC_TZ1; // TZ1作为DCAH源 EPwm1Regs.DCTRIPSEL.bit.DCALCOMPSEL = DC_TZ1; // TZ1也作为DCAL源(可配置为不同) // 定义事件:DCAEVT1由DCAH(高电平)产生,用于触发ADC;DCAEVT2由DCAL(低电平)产生,可用于其他用途 EPwm1Regs.TZDCSEL.bit.DCAEVT1 = TZ_DCAH_HI; // DCAEVT1 = DCAH EPwm1Regs.TZDCSEL.bit.DCAEVT2 = TZ_DCAL_LO; // DCAEVT2 = DCAL EDIS;
  2. 配置事件滤波(消隐窗口):

    EALLOW; // 1. 选择对DCAEVT1事件进行滤波 EPwm1Regs.DCFCTL.bit.SRCSEL = DC_SRC_DCAEVT1; // 2. 选择消隐窗口锚定在CTR=0时刻(每个周期起点) EPwm1Regs.DCFCTL.bit.PULSESEL = DC_PULSESEL_CTR_ZERO; // 3. 计算并设置偏移量。我们希望偏移量为0,即窗口紧接CTR=0开始。 // Offset = 0 TBCLK cycles EPwm1Regs.DCFOFFSET = 0; // 4. 计算并设置窗口宽度。需要屏蔽2us,TBCLK周期=10ns。 // Window Width = 2us / 10ns = 200 cycles // 注意:寄存器值就是周期数,如果计算值为200,直接写入。 EPwm1Regs.DCFWINDOW = 200; // 5. 使能消隐功能 EPwm1Regs.DCFCTL.bit.BLANKE = DC_BLANK_ENABLE; EDIS;
  3. 将滤波后的事件链接到动作:

    EALLOW; // 假设我们使用滤波后的事件(DCEVTFILT)来触发ADC SOCA // 选择事件源为滤波后的信号 EPwm1Regs.DCACTL.bit.EVT1SRCSEL = DC_EVT1_SRC_DCEVTFILT; // 使能DCAEVT1触发SOCA EPwm1Regs.DCACTL.bit.EVT1SOCE = DC_EVT1_SOC_ENABLE; EDIS; // 在事件触发子模块中,选择DCAEVT1.soc作为SOCA的触发源 EPwm1Regs.ETSEL.bit.SOCASEL = ET_SOCA_DCAEVT1; // 根据具体型号的常量名调整

经过以上配置,在每个PWM周期开始的2us内,电流比较器的任何跳变都会被忽略。2us之后,如果比较器输出有效高电平(表示过流),则会产生经过滤波的DCAEVT1事件,并触发ADC SOCA。这样就有效避免了开关噪声引起的误采样。

实操心得DCFOFFSETDCFWINDOW寄存器的值是基于TBCLK的计数值。务必确保你的计算考虑到了ePWM的时钟预分频(TBCTL[HSPCLKDIV, CLKDIV])。一个常见的错误是直接用系统时钟去计算,导致实际的消隐时间远小于或远大于预期。调试时,可以先将窗口设得非常大,观察事件是否被完全抑制,以验证滤波功能是否生效。

4. 多模块同步应用:从独立运行到协同工作的系统级设计

单个ePWM模块的强大已无需赘言,但真正的挑战和魅力在于让多个ePWM模块协同工作,以控制像三相逆变器、交错并联LLC、多相Buck这样的复杂拓扑。数字比较子模块在这里扮演了“联动触发器”的角色。

4.1 同步信号链与主从模式

ePWM模块间的同步依赖于EPWMxSYNCI(同步输入)和EPWMxSYNCO(同步输出)信号。每个模块都可以被配置为以下几种模式,手册图21-50和21-51清晰地展示了这一点:

  • 独立模式(Standalone):SYNCO输出被禁用(连接至‘X’)。模块不同步于任何外部源,也不同步其他模块。这是最简单的模式,用于频率和相位无需关联的场合。
  • 从模式(Slave):模块使能相位加载(TBCTL[PHSEN]=1),并在接收到SYNCI脉冲时,将TBPHS寄存器的值加载到TBCTR计数器。其SYNCO通常配置为“直通”模式(SYNCOSEL = TB_SYNC_IN),将接收到的同步脉冲原样传递给下一个模块,形成链式同步。
  • 主模式(Master):模块的SYNCO输出被配置为在内部特定时刻产生脉冲,例如在CTR=0SYNCOSEL = TB_CTR_ZERO)或CTR=CMPBSYNCOSEL = TB_CTR_CMPB)时。它不同步于外部输入(PHSEN=0或忽略输入),而是作为同步信号的源头。

数字比较事件(DCAEVT1.sync)如何融入这个体系?它被“或”进了模块的同步逻辑。这意味着,一个外部事件(如某个关键传感器的信号)可以通过数字比较子模块,生成一个同步脉冲,强行对齐或复位一个甚至多个ePWM模块的计数器。这在需要与外部事件严格锁相的系统中极其有用。

4.2 典型应用场景配置解析

场景一:多相Buck变换器的交错并联控制对于多相Buck,核心需求是各相PWM波形频率相同,但相位依次均匀错开(如两相错开180°,四相错开90°),以减小输入电流纹波。

假设我们控制一个四相Buck,使用EPWM1~4。

  1. 主模块设置(EPWM1):

    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // 主模式,在CTR=0时发出同步脉冲 EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 主模块自身不加载相位 EPwm1Regs.TBPHS.half.TBPHS = 0; // 主模块相位为0
  2. 从模块设置(EPWM2, EPWM3, EPWM4):

    // EPWM2 相位滞后90° (假设为UP-DOWN计数模式,周期TBPRD=1000) EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // 同步输出直通输入 EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 使能相位加载 EPwm2Regs.TBPHS.half.TBPHS = 250; // 相位值 = (90/360) * TBPRD = 250 // EPWM3 相位滞后180° EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE; EPwm3Regs.TBPHS.half.TBPHS = 500; // 500 // EPWM4 相位滞后270° EPwm4Regs.TBCTL.bit.PHSEN = TB_ENABLE; EPwm4Regs.TBPHS.half.TBPHS = 750; // 750

    这样,当EPWM1在计数器归零时发出同步脉冲,EPWM2/3/4会同时将各自的TBCTR加载为250、500、750,从而实现固定的相位差。

场景二:基于外部事件的同步(利用数字比较)假设一个双有源桥(DAB)变换器,需要副边的PWM波形与原边电流过零点同步。我们可以用副边的电流传感器接比较器,输出接到一个ePWM模块(如EPWM2)的TZ引脚,配置为数字比较事件。

  1. 配置EPWM2的数字比较同步:

    // 配置TZ输入和数字比较事件(假设为DCAEVT1) EPwm2Regs.TZDCSEL.bit.DCAEVT1 = TZ_DCAH_HI; // 电流过零(高电平)产生事件 EPwm2Regs.DCACTL.bit.EVT1SYNCE = DC_EVT1_SYNC_ENABLE; // 使能该事件产生同步脉冲 EPwm2Regs.DCACTL.bit.EVT1FRCSYNCSEL = DC_EVT1_FRC_SYNC_SEL; // 选择同步信号源为事件本身 // 注意:可能需要禁用滤波,或设置合适的滤波窗口,以确保同步时刻精确。
  2. 配置EPWM2为同步源主模式:

    EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // 注意,这里SYNCO由数字比较事件驱动,而非TB事件 // 实际上,DCAEVT1.sync信号会直接注入到同步逻辑。EPWM2本身可以配置为自由运行或从模式。
  3. 配置其他模块(EPWM1, EPWM3)为EPWM2的从模块:

    // 将EPWM2的SYNCO连接到EPWM1和EPWM3的SYNCI(硬件连接) // EPWM1和EPWM3的配置: EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // 同步输出直通 EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 使能相位加载 EPwm1Regs.TBPHS.half.TBPHS = 0; // 设定需要的相位差

    这样,每当副边电流过零(产生DCAEVT1),EPWM2就会发出一个同步脉冲,迫使EPWM1和EPWM3的计数器加载预设相位,从而实现整个系统与原边电流的严格锁相。

4.3 同步配置的常见陷阱与排查

  1. 同步脉冲丢失:检查物理连接和GPIO复用配置,确保SYNCO和SYNCI引脚已正确映射。使用示波器或芯片的GPIO读取功能验证同步脉冲是否产生。

  2. 相位加载不对:首先确认所有相关模块的TBCTL[PHSEN]位已使能。其次,在从模块的计数器运行过程中,同步脉冲到来时才会加载相位。确保在主模块发出同步脉冲时,从模块的计数器正在运行(未停止)。一个可靠的初始化顺序是:先配置所有从模块的相位寄存器(TBPHS)和使能相位加载,再启动主模块的计数器。

  3. 同步后计数器行为异常:确认所有同步模块的计数模式(TBCTL[CTRMODE])和周期值(TBPRD)是否兼容。例如,一个UP模式的模块与一个UP-DOWN模式的模块同步,可能会导致不可预测的行为。通常,需要同步的模块应使用相同的计数模式。

  4. 数字比较同步事件不稳定:检查数字比较事件的滤波设置。如果消隐窗口设置不当,可能会滤除真正的同步事件。调试时,可以暂时关闭滤波,并确保比较器输出信号干净、无抖动。

5. 寄存器配置精要与调试诊断实录

理解了原理和架构,最终都要落到寄存器配置上。数字比较子模块相关的寄存器相对集中,但位域含义交错,需要仔细对待。

5.1 核心寄存器功能速查表

寄存器名称主要功能关键位域配置要点
TZDCSEL数字比较事件选择DCAEVT1/2,DCBEVT1/2定义H/L信号如何组合成事件。是逻辑组合的起点。
DCTRIPSEL数字比较Trip信号选择DCAHCOMPSEL,DCALCOMPSEL,DCBHCOMPSEL,DCBLCOMPSEL将具体的TZn引脚映射到DCAH/DCAL/DCBH/DCBL逻辑信号。
DCACTL/DCBCTL数字比较A/B控制EVT1SRCSEL,EVT1SOCE,EVT1SYNCE,EVT1FRCSYNCSEL控制事件源选择(原始事件/滤波后事件),以及是否使能SOC、SYNC、FORCE输出。A控制寄存器对应EPWMxA相关事件,B对应EPWMxB
DCFCTL滤波控制SRCSEL,PULSESEL,BLANKE,INVERT选择滤波事件源、消隐窗口锚点、使能滤波、是否对滤波前信号取反。
DCFOFFSET滤波偏移量OFFSET消隐窗口起始的延迟TBCLK数。
DCFWINDOW滤波窗口宽度WINDOW消隐窗口持续的TBCLK数。
TZEINTTrip-Zone中断使能DCAEVT1,DCAEVT2,DCBEVT1,DCBEVT2必须在此使能,数字比较事件才能产生EPWMxTZINT中断。
TZCLRTrip-Zone标志清除DCAEVT1,DCAEVT2,DCBEVT1,DCBEVT2在中断服务程序中,必须写1清除对应的标志位,否则中断会持续触发。
ETSEL事件触发选择SOCASEL,SOCBSEL选择ADC SOCA/SOCB的触发源,需设置为ET_SOCA_DCAEVT1等以响应数字比较事件。

5.2 初始化与配置流程模板

一个稳健的配置流程应遵循以下顺序,尤其要关注中断的初始化,避免上电时的伪中断:

  1. 全局中断禁用:在配置开始前,禁用CPU全局中断(DINT或操作INTM位)。
  2. 禁用ePWM特定中断:清除TZEINT等相关中断使能位。
  3. 停止所有ePWM时钟同步(如果有多模块):设置TBCTL[CLKSRCCTL]或全局控制相关位,停止计数器。
  4. 配置寄存器:按照从输入到输出的逻辑顺序配置: a. 配置GPIO复用,将外部信号连接到TZn引脚。 b. 配置TZ子模块相关寄存器(TZCTL),设定TZn引脚作为数字输入时的极性。 c. 配置DCTRIPSEL,选择信号源。 d. 配置TZDCSEL,定义事件逻辑。 e. 配置DCFCTLDCFOFFSETDCFWINDOW,设定滤波参数。 f. 配置DCACTL/DCBCTL,选择事件源并使能需要的功能(SOC/SYNC/FORCE)。 g. 配置动作目标寄存器:如ETSEL(用于SOC),TZSELTZCTL(用于FORCE动作,注意与TZn本身的功能区分)。
  5. 启动ePWM时钟同步:使能计数器运行。
  6. 清除伪标志:读取并清除TZFLGETFLG等任何可能因配置过程产生的伪中断标志。
  7. 使能中断:设置TZEINT等,使能所需的中断。
  8. 使能全局中断:重新开启CPU全局中断。

5.3 调试诊断与常见问题排查

当数字比较功能不按预期工作时,可以按以下步骤排查:

问题1:数字比较事件根本没有产生。

  • 检查信号通路:用示波器测量TZn引脚,确认外部信号是否达到预期电平,极性是否正确。
  • 检查映射关系:确认DCTRIPSEL寄存器是否正确地将TZn引脚映射到了DCAH/DCAL等逻辑信号。
  • 检查事件组合逻辑:确认TZDCSEL寄存器配置是否符合预期。例如,如果你配置DCAEVT1 = DCAH & DCAL,那么必须两个信号同时有效才能产生事件。
  • 检查滤波是否过度:尝试将DCFCTL[BLANKE]设为禁用,排除滤波窗口设置不当屏蔽了所有事件的可能。

问题2:事件产生了,但没有触发ADC(SOC)。

  • 检查SOC使能链路:确认DCACTL[EVT1SOCE]已使能,并且ETSEL[SOCASEL]已正确选择为DCAEVT1(或DCBEVT1对应SOCB)。
  • 检查事件触发子模块配置:确认ETPS[SOCACNT]等预分频计数器配置是否正确,可能事件被分频了。
  • 检查ADC配置:确认ADC的SOC触发源已配置为对应的ePWM SOC。

问题3:事件产生了,但没有触发中断。

  • 检查中断使能:这是最常见的原因!确认TZEINT寄存器中对应的位(DCAEVT1等)已置1。
  • 检查中断标志:在调试器中查看TZFLG寄存器,看对应标志位是否被置起。如果标志位置起但没进中断,检查PIE向量表配置和CPU中断使能。
  • 检查中断清除:在中断服务程序中,是否正确地写TZCLR寄存器清除了标志?如果没清除,只会进入一次中断。

问题4:强制(Force)动作没有生效。

  • 检查强制动作配置:确认TZSEL寄存器中是否将DCAEVT1等选择为CBC或OST的Trip源。
  • 检查输出动作配置:确认TZCTL寄存器中为DCAEVT1等事件配置了非“无操作”的动作(如高、低、高阻)。
  • 注意优先级:如果有多个强制源(如TZ1和DCAEVT1同时生效),检查优先级。高优先级的动作会覆盖低优先级的。

问题5:同步功能混乱。

  • 确认同步源:是使用TB事件(CTR=0)同步,还是数字比较事件同步?DCACTL[EVT1FRCSYNCSEL]配置是否正确?
  • 检查同步脉冲路径:使用示波器测量SYNCO引脚,看预期的同步脉冲是否产生。对于数字比较同步,确保产生同步的事件本身是稳定的。
  • 验证从模块配置:确认从模块的TBCTL[PHSEN]已使能,且TBPHS值设置正确。

调试时,善用CCS的寄存器查看器和实时变量监控功能,可以直观地看到寄存器位的变化。对于时序要求严格的问题,结合芯片的GPIO输出功能,将内部关键信号(如事件信号、同步脉冲)映射到空闲的GPIO上,用示波器观察,是定位问题的终极手段。数字比较子模块的灵活性带来了强大的功能,也要求开发者对信号流有更清晰的把握。耐心地沿着信号路径一步步排查,是解决这类复杂外设问题的唯一捷径。