TI C2000 eCAP模块深度解析:从捕获到PWM生成的嵌入式时序控制 📅 2026/7/22 2:11:01 1. 项目概述从“捕获”到“生成”的瑞士军刀在嵌入式开发尤其是电机控制、数字电源和精密测量领域我们常常面临两个看似对立的核心需求一是精确地“感知”外部世界的时间比如测量一个脉冲的宽度、一个编码器的转速二是精确地“控制”外部世界的时间比如生成一个特定频率和占空比的PWM波去驱动电机或开关管。传统上这可能需要两个独立的外设一个输入捕获单元和一个PWM发生器。但德州仪器TI在其C2000等系列微控制器中提供的增强型捕获eCAP模块巧妙地将这两者融合在了一起成为了一款功能强大的“瑞士军刀”。简单来说eCAP模块是一个高度可配置的定时器系统。它的核心是一个32位的自由运行计数器TSCTR为所有操作提供统一的时间基准。这个模块最精妙的设计在于其双模式架构捕获模式和辅助PWM模式。在捕获模式下它像一位严谨的记录员可以按照预设的规则如上升沿、下降沿将外部输入引脚上事件发生瞬间的计数器值时间戳精准地“捕捉”并存入四个32位的捕获寄存器CAP1-CAP4中供CPU读取分析。而在APWM模式下它摇身一变成为一位精准的指挥家利用同样的计数器、比较器和影子寄存器机制在输出引脚上生成稳定、可动态调整的PWM波形。这种二合一的设计带来了巨大的灵活性。例如在一个风机控制系统中你可以先用一个eCAP模块的捕获模式来测量霍尔传感器给出的转速再用另一个或同一个模块切换模式后的APWM模式来生成驱动电机的PWM信号。更强大的是多个eCAP模块之间可以通过同步信号链在一起实现多路PWM的严格同步和相位控制这对于三相逆变器、交错并联DC/DC变换器等需要多路协调信号的应用至关重要。理解eCAP就等于掌握了一把解决高精度时序问题的万能钥匙。2. eCAP模块架构深度解析要玩转eCAP模块不能只停留在调用API的层面必须深入其内部架构理解各个功能单元是如何协同工作的。这就像开车知道油门和刹车在哪能上路但了解发动机和变速箱的原理才能应对复杂路况。2.1 核心引擎32位时间戳计数器与相位控制所有eCAP功能的基石是那个32位的时间戳计数器。它由系统时钟驱动不断向上计数从0x00000000到0xFFFFFFFF然后溢出归零周而复始。这个计数器的值就是模块内所有事件的绝对时间参考。相位控制寄存器的存在是eCAP模块支持多模块协同工作的关键。你可以为每个eCAP模块的计数器设置一个初始的相位偏移值。当同步事件发生时计数器的值不会被清零而是会被加载为这个预设的相位值。这就允许你精确地控制多个PWM通道之间的相对相位差。例如在一个三相系统中你可以将三个eCAP模块的相位分别设置为0、120°和240°对应的计数值从而实现精确的120度相位差。2.2 捕获模式的核心逻辑链在捕获模式下信号流是这样的事件检测外部信号通过eCAP输入引脚进入经过一个可配置的边沿检测电路。你可以独立为四个捕获事件CEVT1-CEVT4选择是检测上升沿还是下降沿。事件排序与滤波检测到的事件首先进入一个4状态Mod4的序列器。这个序列器确保事件被严格地按顺序1-2-3-4-1...处理防止事件重叠或错序。事件还可以先经过一个可编程的预分频器进行滤波以消除毛刺。时间戳记录与计数器操作当某个事件被确认有效后当前32位计数器TSCTR的值会被锁存到对应的捕获寄存器中。这里有一个至关重要的配置项CTRRSTx。如果设置为“绝对时间”模式计数器在捕获后继续自由运行如果设置为“差值”模式则在捕获完成后计数器会立即复位到0。差值模式直接给出了相邻事件的时间间隔省去了CPU做减法的计算开销。中断生成每个捕获事件以及计数器溢出事件都可以独立配置为中断源。通常我们会在第四个事件CEVT4或第一个事件CEVT1触发中断此时四个捕获寄存器都已更新CPU可以一次性安全地读取所有时间戳数据进行处理。2.3 APWM模式的工作原理当模块切换到APWM模式内部逻辑会发生重定向角色转换CAP1和CAP2寄存器不再用于捕获而是分别变成了周期活动寄存器和比较活动寄存器。CAP3和CAP4则成为它们的影子寄存器分别对应周期影子寄存器APRD和比较影子寄存器ACMP。PWM生成机制32位计数器不断累加并与CAP1周期值和CAP2比较值进行比较。当计数器小于比较值时输出一种电平高或低由极性位决定当计数器介于比较值和周期值之间时输出相反的电平当计数器等于周期值时产生一个“周期匹配”事件计数器复位或从相位寄存器重载开始下一个PWM周期。影子寄存器的价值这是实现PWM参数无毛刺更新的核心。在运行时你只需要更新影子寄存器CAP3/CAP4的值。这个新值会在下一个PWM周期开始时CTRPRD时刻自动加载到活动寄存器CAP1/CAP2中生效。这样可以确保PWM波形的连续性和完整性避免在周期中间更新比较值可能导致的脉冲宽度异常。2.4 同步与中断系统同步和中断是eCAP模块从“独立单元”升级为“交响乐团”的指挥系统。同步链每个eCAP模块可以接收一个外部同步输入并产生一个同步输出。同步输出可以选择为直接转发同步输入或者选择本模块的“CTRPRD”事件。通过将主模块的同步输出连接到从模块的同步输入可以将多个eCAP模块的计数器在特定时刻对齐这对于需要严格同步的多通道PWM至关重要。中断控制中断系统非常灵活。你可以通过中断使能寄存器精确控制哪个事件能触发中断。中断标志寄存器记录了未处理的事件而中断清除寄存器用于在中断服务程序中清除标志位。一个关键细节在APWM模式下只有CTRPRD和CTRCMP这两个事件的中断标志是有效的而在捕获模式下只有CEVT1-4和CNTOVF有效。编程时必须注意模式切换后对中断的重新配置。3. 捕获模式实战从配置到数据解读理论说再多不如一行代码。我们直接进入实战看看如何配置eCAP模块来完成具体的测量任务。这里以最常用的两种场景为例测量方波周期仅上升沿以及同时测量周期和占空比上升沿下降沿。3.1 绝对时间戳模式测量信号周期假设我们需要测量一个未知频率的方波信号周期精度要求高我们选择绝对时间戳、仅上升沿触发、连续捕获模式。配置步骤与寄存器详解选择模式与基本设置首先通过ECCTL2[CAP/APWM]位将模块设置为捕获模式。将ECCTL2[CONT/ONESHT]设置为连续模式这样在捕获4个事件后序列器会自动回到状态1继续循环捕获。配置边沿极性因为我们只关心上升沿所以将ECCTL1中的CAP1POL、CAP2POL、CAP3POL、CAP4POL全部设置为上升沿触发。这样每个捕获事件都对应输入信号的一个上升沿。设置计数器模式将ECCTL1中的CTRRST1至CTRRST4全部设置为绝对模式。这意味着每次捕获后32位计数器继续自由运行不会复位。使能捕获加载将ECCTL1[CAPLDEN]置1允许捕获事件发生时将时间戳加载到CAP1-CAP4寄存器。配置中断我们希望在捕获到第4个事件即CAP4寄存器更新时触发中断以便一次性读取四个时间戳。因此在ECEINT寄存器中使能CEVT4中断。同时使能eCAP模块的总中断。启动计数器最后将ECCTL2[TSCTRSTOP]置1释放计数器让其开始自由运行。对应的初始化代码结构如下以TI的C2000系列为例void ECAP1_Capture_Init(void) { // 停止计数器进行安全配置 ECap1Regs.ECCTL2.bit.TSCTRSTOP 0; // 1. 配置捕获控制寄存器1 (ECCTL1) ECap1Regs.ECCTL1.bit.CAP1POL 0; // 上升沿 ECap1Regs.ECCTL1.bit.CAP2POL 0; // 上升沿 ECap1Regs.ECCTL1.bit.CAP3POL 0; // 上升沿 ECap1Regs.ECCTL1.bit.CAP4POL 0; // 上升沿 ECap1Regs.ECCTL1.bit.CTRRST1 0; // 绝对模式 ECap1Regs.ECCTL1.bit.CTRRST2 0; ECap1Regs.ECCTL1.bit.CTRRST3 0; ECap1Regs.ECCTL1.bit.CTRRST4 0; ECap1Regs.ECCTL1.bit.CAPLDEN 1; // 使能捕获加载 ECap1Regs.ECCTL1.bit.PRESCALE 0; // 预分频设为1不分频 // 2. 配置捕获控制寄存器2 (ECCTL2) ECap1Regs.ECCTL2.bit.CAP_APWM 0; // 捕获模式 ECap1Regs.ECCTL2.bit.CONT_ONESHT 0; // 连续模式 ECap1Regs.ECCTL2.bit.SYNCO_SEL 2; // 禁止同步输出 ECap1Regs.ECCTL2.bit.SYNCI_EN 0; // 禁止同步输入 ECap1Regs.ECCTL2.bit.TSCTRSTOP 1; // 启动计数器 // 3. 配置中断 ECap1Regs.ECEINT.bit.CEVT4 1; // 使能CEVT4中断 // 注意还需要在PIE控制器中使能对应的eCAP中断 }数据处理与计算在CEVT4中断服务程序中我们可以安全地读取四个捕获值__interrupt void ECAP1_ISR(void) { Uint32 t1, t2, t3, t4; Uint32 period1, period2, period3; t1 ECap1Regs.CAP1; // 第一个上升沿的时间戳 t2 ECap1Regs.CAP2; // 第二个上升沿的时间戳 t3 ECap1Regs.CAP3; // 第三个上升沿的时间戳 t4 ECap1Regs.CAP4; // 第四个上升沿的时间戳 // 计算周期相邻上升沿的时间差 period1 t2 - t1; period2 t3 - t2; period3 t4 - t3; // 这里可以进行进一步处理如求平均、更新控制算法等 // ... // 清除中断标志这是最易忽略的关键步骤 ECap1Regs.ECCLR.bit.CEVT4 1; ECap1Regs.ECCLR.bit.INT 1; // 清除全局中断标志 // 应答PIE中断 PieCtrlRegs.PIEACK.all PIEACK_GROUP4; }关键提示在绝对时间模式下必须处理32位计数器的溢出问题。如果t2小于t1说明在t1到t2之间计数器发生了溢出。正确的计算方式是period (t2 - t1) 0xFFFFFFFF或者使用C语言的无符号数减法它会自动进行模运算。更好的做法是在中断中检查ECFLG寄存器的CTROVF标志如果置位说明发生了溢出计算周期时需要加上0x100000000即2^32。3.2 差值模式直接获取脉冲宽度如果你需要测量的是连续脉冲的宽度例如来自转速传感器的脉冲差值模式更为高效。在此模式下计数器在每次捕获事件后自动复位因此捕获寄存器中存储的值直接就是上一个脉冲的宽度以时钟周期数为单位无需CPU再做减法。配置差异与绝对时间模式相比唯一的配置区别在于ECCTL1中的CTRRSTx位需要全部设置为1差值模式。这样每次捕获事件发生后TSCTR计数器都会复位到0。中断策略调整在差值模式下由于每个捕获值本身就是一个完整的间隔时间你可以在任何一个捕获事件中断中读取数据。例如在CEVT1中断中你可以读取CAP1获得第一个间隔CAP2获得第二个间隔依此类推。但要注意此时CAP1存储的是本次CEVT1事件与上一次CEVT4事件或初始状态之间的间隔。为了获得连贯的四个脉冲宽度通常还是在CEVT4中断中一次性读取CAP1-CAP4最为清晰。代码片段示例差值模式CEVT4中断// 在差值模式初始化中仅CTRRSTx位配置不同 ECap1Regs.ECCTL1.bit.CTRRST1 1; // 差值模式 ECap1Regs.ECCTL1.bit.CTRRST2 1; ECap1Regs.ECCTL1.bit.CTRRST3 1; ECap1Regs.ECCTL1.bit.CTRRST4 1; // 中断服务程序 __interrupt void ECAP1_ISR(void) { Uint32 width1, width2, width3, width4; // 注意在差值模式下CAP1对应的是CEVT1事件发生前计数器运行的值即上一个间隔 // 读取顺序需结合序列器状态理解。通常按寄存器顺序读取即可。 width4 ECap1Regs.CAP1; // 通常CEVT4后CAP1存的是T4间隔 width1 ECap1Regs.CAP2; // CAP2存的是T1间隔 width2 ECap1Regs.CAP3; // CAP3存的是T2间隔 width3 ECap1Regs.CAP4; // CAP4存的是T3间隔 // 此时 width1, width2, width3, width4 直接就是四个连续的脉冲宽度时钟数 // 无需做减法运算 // ... 清除中断标志 }3.3 捕获模式下的注意事项与高级技巧输入信号滤波ECCTL1[PRESCALE]位提供的预分频器实际上是一个简单的去抖动滤波器。它要求输入信号在N个系统时钟周期内保持稳定才会被认定为有效边沿。对于有噪声的环境适当设置预分频值如EC_DIV2或EC_DIV4可以显著提高抗干扰能力但会损失一些时间分辨率。单次模式的应用除了连续模式eCAP还支持单次模式ECCTL2[CONT/ONESHT]1。在此模式下捕获序列在达到设定的停止值如捕获4个事件后会自动停止并等待软件重新触发。这对于捕获特定数量的突发脉冲串非常有用。计数器溢出的处理即使是在差值模式下如果脉冲间隔非常长计数器也可能在下一个边沿到来前就从0xFFFFFFFF溢出归零。ECFLG寄存器中的CTROVF标志位会置1。在精度要求极高的场合你需要结合这个溢出标志和捕获值来计算真实的长时间间隔。例如如果发生了一次溢出真实间隔 捕获值 0x100000000。读取顺序的陷阱在捕获模式下CPU读取CAP1-CAP4寄存器的时机非常重要。硬件是在每个事件发生时依次更新这些寄存器。如果你在CEVT2中断中尝试读取CAP3和CAP4它们可能还是旧值对应于更早的事件。最佳实践是在序列器完成一个完整循环如CEVT4的中断中一次性读取所有四个寄存器。此时四个寄存器都已被更新数据是完整且一致的。4. APWM模式实战从单通道到多相系统APWM模式将eCAP变成了一个功能完整的PWM发生器。让我们从最简单的单通道PWM开始逐步深入到复杂的多通道同步与相位控制。4.1 单通道PWM生成生成一个固定频率和占空比的PWM波是最基本的操作。假设我们需要在eCAP1引脚上输出一个频率为10kHz周期100us占空比为30%的PWM波系统时钟为100MHz。计算与配置步骤计算周期值PWM周期 (PRD 1) * T_sysclk。其中T_sysclk是系统时钟周期10ns 100MHz。所以PRD (PWM周期 / T_sysclk) - 1 (100us / 10ns) - 1 10000 - 1 9999 (0x270F)。计算比较值对于高电平有效模式比较值代表高电平时间。高电平时间 周期 * 占空比 100us * 30% 30us。所以CMP (高电平时间 / T_sysclk) - 1 (30us / 10ns) - 1 3000 - 1 2999 (0x0BB7)。注意如果CMP为0则输出始终为低如果CMP PRD则输出始终为高。配置APWM模式设置ECCTL2[CAP/APWM] 1切换到APWM模式。设置ECCTL2[APWMPOL]选择极性0为高电平有效。禁用同步输入SYNCI_EN0禁用或配置同步输出SYNCO_SEL。启动计数器TSCTRSTOP1。初始化寄存器这是关键一步在APWM模式下初始化时必须直接写入活动寄存器CAP1和CAP2。写入CAP1周期和CAP2比较值的同时硬件会自动将相同的值拷贝到影子寄存器CAP3和CAP4中。这相当于初始化时工作在“立即更新”模式。初始化代码示例void ECAP1_APWM_Init(void) { Uint32 period_val 9999; // 对应10kHz 100MHz Uint32 cmp_val 2999; // 对应30%占空比 // 停止计数器 ECap1Regs.ECCTL2.bit.TSCTRSTOP 0; // 配置为APWM模式高电平有效 ECap1Regs.ECCTL2.bit.CAP_APWM 1; // APWM模式 ECap1Regs.ECCTL2.bit.APWMPOL 0; // 高电平有效 ECap1Regs.ECCTL2.bit.SYNCI_EN 0; // 禁用同步输入 ECap1Regs.ECCTL2.bit.SYNCO_SEL 2; // 禁用同步输出 // !!! 初始化必须直接写入活动寄存器 CAP1 和 CAP2 !!! ECap1Regs.CAP1 period_val; // 写入周期值同时会拷贝到CAP3(APRD) ECap1Regs.CAP2 cmp_val; // 写入比较值同时会拷贝到CAP4(ACMP) // 相位寄存器通常设为0除非需要相位偏移 ECap1Regs.CTRPHS 0; // 启动计数器 ECap1Regs.ECCTL2.bit.TSCTRSTOP 1; }运行时动态更新占空比初始化后若要动态改变占空比必须通过写入影子寄存器CAP4来实现以实现无毛刺更新。void Update_ECAP1_DutyCycle(Uint32 new_cmp_val) { // 安全更新写入影子寄存器 CAP4 (ACMP) ECap1Regs.CAP4 new_cmp_val; // 新比较值将在下一个PWM周期开始时CTRPRD时刻生效 }核心要点在APWM模式下CAP1/CAP2是只读的活动寄存器由硬件根据影子寄存器更新CAP3/CAP4是可写的影子寄存器。初始化时写CAP1/CAP2是特例它会触发一次影子加载。之后的所有运行时更新都必须通过CAP3改周期或CAP4改占空比进行。4.2 多通道PWM同步在许多功率电子应用中如驱动三相电机需要多个严格同步的PWM通道。eCAP的同步功能可以完美实现这一点。假设我们需要四个PWM通道主通道频率为5kHz从通道2、3、4的频率分别为10kHz、20kHz和25kHz即1倍、2倍、4倍、5倍关系。设计思路选择主模块将频率最低的eCAP1设为主模块。其SYNCO_SEL设置为EC_CTR_PRD这样每当它的计数器达到周期值CTRPRD时就会产生一个同步输出脉冲。配置从模块将eCAP2、eCAP3、eCAP4的SYNCI_EN使能并将它们的SYNCO_SEL设置为EC_SYNCI意味着它们接收主模块的同步信号作为自己的同步输入并将此信号转发出去形成链式或星形同步。设置相位所有从模块的CTRPHS寄存器通常设置为0这样它们在收到同步信号时计数器会从0开始计数实现完全对齐。计算周期值假设系统时钟为100MHz。eCAP1 (主 5kHz): PRD1 (1/5kHz) / 10ns - 1 20000 - 1 19999eCAP2 (10kHz): PRD2 (1/10kHz) / 10ns - 1 10000 - 1 9999eCAP3 (20kHz): PRD3 (1/20kHz) / 10ns - 1 5000 - 1 4999eCAP4 (25kHz): PRD4 (1/25kHz) / 10ns - 1 4000 - 1 3999主模块(eCAP1)初始化代码片段ECap1Regs.ECCTL2.bit.CAP_APWM 1; ECap1Regs.ECCTL2.bit.SYNCO_SEL 1; // 同步输出源选择 CTRPRD ECap1Regs.ECCTL2.bit.SYNCI_EN 0; // 主模块通常不需要同步输入 ECap1Regs.CAP1 19999; // 设置周期 ECap1Regs.CTRPHS 0;从模块(eCAP2)初始化代码片段ECap2Regs.ECCTL2.bit.CAP_APWM 1; ECap2Regs.ECCTL2.bit.SYNCO_SEL 0; // 同步输出选择为同步输入传递同步信号 ECap2Regs.ECCTL2.bit.SYNCI_EN 1; // 使能同步输入 ECap2Regs.CAP1 9999; // 设置自身周期 ECap2Regs.CTRPHS 0; // 相位与主模块对齐eCAP3和eCAP4的配置类似只需修改各自的CAP1周期值。这样每当主模块eCAP1的计数器达到19999时它会发出一个同步脉冲。eCAP2、eCAP3、eCAP4在收到这个脉冲的瞬间会将自己的计数器重载为CTRPHS的值这里是0从而实现所有通道的计数器在同一个时刻从0开始计数尽管它们的计数频率和周期不同但它们的周期起点被严格锁相消除了随机相位差导致的“拍频”干扰。4.3 多通道PWM相位控制同步解决了对齐问题而相位控制则允许我们精确地错开多个PWM通道的开关时刻。这在交错并联DC/DC变换器中至关重要可以减小输入输出电流纹波。假设我们需要三个相位互差120度的PWM通道。设计思路统一频率所有通道必须具有相同的PWM频率。假设为100kHz系统时钟100MHz则PRD (1/100kHz)/10ns - 1 100 - 1 99。计算相位值相位偏移量由CTRPHS寄存器设定。当同步事件发生时计数器会被加载为CTRPHS的值而非0。主通道eCAP1相位为0度CTRPHS1 0从通道1eCAP2相位为120度一个周期360度对应PRD1100个计数。120度对应 (120/360)*100 ≈ 33.33。取整为33。因此CTRPHS2 33从通道2eCAP3相位为240度对应 (240/360)*100 ≈ 66.67。取整为67。因此CTRPHS3 67连接与配置eCAP1作为主模块在CTRPRD时发出同步信号。eCAP2和eCAP3使能同步输入。在同步信号到来时eCAP1计数器重载为0eCAP2重载为33eCAP3重载为67。这样三个通道的PWM波形就产生了固定的120度相位差。从模块(eCAP2)带相位偏移的初始化ECap2Regs.ECCTL2.bit.CAP_APWM 1; ECap2Regs.ECCTL2.bit.SYNCO_SEL 0; // 同步输出选择为同步输入 ECap2Regs.ECCTL2.bit.SYNCI_EN 1; // 使能同步输入 ECap2Regs.CAP1 99; // 所有通道周期相同 ECap2Regs.CTRPHS 33; // 关键设置120度相位偏移4.4 APWM模式下的陷阱与最佳实践影子寄存器更新时机影子寄存器CAP3/CAP4的加载有两种模式立即模式和周期匹配模式。通过ECCTL2[APWMSHADOW]位控制部分型号。周期匹配模式是默认且最安全的选择它确保新参数只在周期边界生效避免产生畸变的PWM脉冲。除非有特殊需求否则不要使用立即模式。死区时间的生成eCAP模块本身不集成硬件死区生成模块。如果需要死区时间在电机驱动和半桥/全桥电路中必不可少你需要使用另一个eCAP或ePWM模块生成互补带死区的PWM对。或者在软件中通过计算用两个独立的eCAP通道输出带有固定延迟的PWM再通过外部逻辑门电路组合生成带死区的信号。这通常更复杂因此对于需要死区的应用TI的ePWM模块是更合适的选择。初始化顺序的重要性务必遵循“先配置控制位后写周期/比较值最后启动计数器”的顺序。错误的顺序可能导致不可预测的PWM输出。一个稳健的流程是停止计数器 - 配置ECCTL2模式 - 配置ECCTL1滤波等- 写CTRPHS - 写CAP1/CAP2初始化- 启动计数器。高频PWM的精度当PWM频率很高时周期寄存器PRD的值会很小。此时占空比调节的精度分辨率会下降。分辨率 1 / (PRD1)。例如PRD99时占空比最小步进是1%。如果需要更高的分辨率必须降低PWM频率或提高系统时钟频率。5. 混合应用与高级调试技巧eCAP的强大之处在于其模式的可动态切换能力以及灵活的中断系统这使得它可以应对更复杂的场景。5.1 捕获与APWM模式的动态切换在某些应用中你可能需要同一个引脚在不同时间段执行不同的功能。例如在电机启动阶段使用捕获模式测量反电动势过零点在正常运行阶段切换到APWM模式输出驱动信号。切换时需要特别注意切换前停止计数器在改变ECCTL2[CAP/APWM]位之前务必先将TSCTRSTOP置0停止计数器。重新配置寄存器模式切换后许多寄存器的功能发生了变化如CAP1-CAP4。你需要根据目标模式重新配置ECCTL1、ECCTL2的相关位并重新初始化周期/比较值或捕获设置。重新配置中断如前所述捕获模式和APWM模式的有效中断源不同。切换模式后必须重新配置ECEINT中断使能寄存器。引脚功能模式切换会自动改变引脚功能输入/输出。确保外部电路能适应这种变化。模式切换代码框架void Switch_ECAP_Mode(Uint16 target_mode) { // target_mode: 0捕获 1APWM // 1. 停止计数器 ECap1Regs.ECCTL2.bit.TSCTRSTOP 0; // 2. 清除可能挂起的中断标志 ECap1Regs.ECCLR.all 0xFFFF; // 3. 禁用所有中断 ECap1Regs.ECEINT.all 0; // 4. 切换模式 ECap1Regs.ECCTL2.bit.CAP_APWM target_mode; // 5. 根据目标模式进行完全重新配置 if (target_mode 0) { // 重新配置为捕获模式 Config_ECAP_Capture_Mode(); } else { // 重新配置为APWM模式 Config_ECAP_APWM_Mode(); } // 6. 重新使能中断根据新模式 // 7. 启动计数器 ECap1Regs.ECCTL2.bit.TSCTRSTOP 1; }5.2 利用中断进行精确控制eCAP丰富的中断事件可以让你实现非常精细的控制逻辑在APWM模式下使能CTRPRD中断可以在每个PWM周期开始时安全地更新影子寄存器实现复杂的波形序列生成。使能CTRCMP中断可以在比较匹配点执行特定操作例如在中心对称PWM中用于触发ADC采样。在捕获模式下除了用CEVT4中断批量处理数据你也可以使用CEVT1中断来实现更快的响应。例如在测量电机转速时每次捕获到第一个事件就计算一次周期虽然计算量稍大但转速反馈的延迟更小。5.3 调试实战常见问题与排查方法在实际开发中eCAP模块不出波形或者测量不准是家常便饭。以下是一些排查思路问题APWM模式没有输出。检查1引脚复用配置。这是最容易被忽略的一步MCU的引脚通常有多种功能。你需要通过GPIO多路复用器寄存器将对应引脚配置为eCAP功能而不是普通的GPIO。检查2计数器是否启动。确认ECCTL2[TSCTRSTOP]位是否为1。检查3模式是否正确。确认ECCTL2[CAP/APWM]位是否为1。检查4输出极性。用示波器查看可能输出是反相的。检查APWMPOL位。检查5周期和比较值是否合理。确保CAP1PRD不为0且CAP2CMP小于等于CAP1。如果CMP为0输出常低如果CMP PRD输出常高。问题捕获模式读不到数据或者数据全为0。检查1输入信号是否连接正确。用示波器确认信号确实到达了MCU引脚。检查2边沿极性配置。确认CAPxPOL位设置与你的信号边沿一致。检查3捕获加载使能。确认ECCTL1[CAPLDEN]位是否为1。检查4中断是否使能并正确清除。检查ECEINT和ECFLG寄存器确保中断已使能并且在服务程序中正确清除了标志位。忘记清除中断标志会导致中断只触发一次。检查5滤波器设置是否过严。如果PRESCALE值设得太大窄脉冲可能被过滤掉。尝试将其设为0旁路测试。问题多通道PWM不同步。检查1同步链连接。确认主模块的同步输出引脚ECAPnSYNCO是否物理连接到了从模块的同步输入引脚ECAPnSYNCI。检查2同步配置。确认主模块SYNCO_SEL设置为CTRPRD从模块SYNCI_EN使能且SYNCO_SEL设置为SYNCI。检查3软件同步。在初始化所有模块后可以通过向主模块的ECCTL2[SWSYNC]位写1来触发一次软件强制同步确保所有计数器从对齐的起点开始。问题测量或生成的频率/占空比不准。检查1系统时钟频率。确认你计算周期和比较值所使用的系统时钟频率SYSCLKOUT是否与实际MCU配置一致。这是误差的主要来源。检查2计数器溢出。在捕获模式下测量长间隔时没有处理计数器溢出CTROVF标志。检查3影子寄存器更新机制。在APWM模式下动态更新参数时错误地写入了活动寄存器CAP1/CAP2而不是影子寄存器CAP3/CAP4导致更新时机混乱。调试时充分利用寄存器的读取功能。在调试器中实时查看TSCTR计数器的值、CAPx寄存器的值以及ECFLG中断标志位是定位问题最快的方法。把eCAP模块理解为一个由计数器、比较器、影子寄存器和同步逻辑构成的精密状态机按照信号流和数据流一步步检查大部分问题都能迎刃而解。