
1. 从硬件计时器到系统核心eCAP模块的双重角色解析在嵌入式开发尤其是电机控制、数字电源和精密测量领域时间就是一切。一个脉冲的宽度、两个边沿的间隔、多个信号之间的相位关系这些毫秒乃至微秒级的时序信息直接决定了系统的性能、效率与稳定性。早年做项目为了测量一个高频PWM的占空比要么得用CPU频繁中断去采样GPIO大量消耗算力要么得外挂专门的计时芯片增加了成本和板子面积。直到后来用上了TI的C2000系列微控制器其内置的增强型捕获eCAP模块才真正让我体会到了“硬件加速”的爽快感——它就像一个专为时间而生的小型协处理器能独立、精确地完成时间戳记录和波形生成把CPU彻底解放出来。简单来说eCAP模块是一个高度集成的外设它身兼两职高精度捕获器和灵活PWM发生器。在捕获模式下它能像高速录像机一样记录下输入信号每个边沿发生的精确时刻时间戳无论是测量频率、周期还是占空比都手到擒来。而在APWM模式下它又摇身一变成为一个可同步、可调相位的PWM信号源特别适合需要多个严格同步的PWM通道的应用比如三相逆变器或者交错式Boost电路。它的价值在于将复杂的时序逻辑和计算固化在硬件中实现了确定性极高的实时响应这是纯软件方案难以企及的。如果你正在开发需要精密时序控制的应用比如无刷电机FOC控制、开关电源、超声波测距或者编码器信号处理那么深入理解eCAP模块将是提升你系统设计水平的关键一步。它不仅仅是配置几个寄存器更关乎如何将硬件特性与系统架构深度融合。接下来我将结合手册原理和实际项目经验为你层层拆解eCAP的工作机制、配置要点以及那些手册上不会写的避坑技巧。2. eCAP模块架构深度拆解不止是计时器初次接触eCAP的数据手册那一堆寄存器框图和控制位可能会让人望而生畏。但如果我们把它想象成一个功能明确的“时间处理单元”其架构就清晰多了。它的核心是一个32位的自由运行计数器TSCTR这是所有功能的“心跳”。这个计数器由系统时钟驱动不断累加直到溢出后归零重新开始。围绕这个核心计数器eCAP搭建了两套独立的处理流水线一套用于捕获Capture一套用于比较并生成PWMAPWM。2.1 捕获模式的核心流水线四级流水与工作模式捕获模式的精髓在于其“四级顺序器”Mod4 Sequencer和四组对应的捕获寄存器CAP1-CAP4。你可以把它理解为一个有四层货架的自动化仓库。当外部输入引脚ECAPx上发生一个符合预设极性上升沿或下降沿的事件时这个事件会进入流水线。首先当前32位计数器TSCTR的值会被瞬间“抓拍”下来。然后这个被抓拍的时间戳值会被存放到当前激活的捕获寄存器中比如第一次事件存到CAP1。紧接着顺序器状态加1比如从0变为1指向下一个捕获寄存器CAP2为下一次捕获做好准备。这个过程会连续进行四次完成一个完整的循环CAP1 - CAP2 - CAP3 - CAP4然后顺序器归零重新从CAP1开始。这种设计的好处是它可以连续、无丢失地捕获最多四个事件的时间戳而无需CPU立即干预。这里的关键控制位是ECCTL1寄存器中的CTRRSTxx1,2,3,4。它决定了每次捕获事件发生后那个核心的32位计数器TSCTR该如何行动从而衍生出两种根本性的工作模式绝对时间戳模式CTRRSTx 0 在此模式下TSCTR像一个永不停止的跑表。每次捕获只是读取这个跑表的当前时刻。要计算两个事件之间的时间间隔比如周期需要CPU用后一个时间戳减去前一个时间戳。例如Period1 CAP2 - CAP1。这种模式适合测量绝对时间点或当信号周期可能长于计数器溢出周期的情况。差值Delta模式CTRRSTx 1 这是更常用、也更高效的模式。每次捕获事件发生后硬件在读取时间戳后会自动将TSCTR复位为0。这意味着每个捕获寄存器里存储的直接就是上一个事件到当前事件所经过的时间差。例如在连续上升沿触发下CAP1里存的就是第一个周期长度CAP2里存的就是第二个周期长度依此类推。CPU读取的就是直接的周期值省去了减法运算减少了软件开销和潜在的错误。注意选择“差值模式”时你必须确保信号的周期小于TSCTR从0计数到溢出0xFFFFFFFF的时间。否则在下一个事件到来前计数器就溢出了这会置位溢出标志CTROVF并且捕获到的时间值将是错误的因为计数器归零了。设计时需要根据系统时钟和信号最大周期来核算。2.2 APWM模式的变身逻辑从捕获到比较当ECCTL2[CAP/APWM]位设置为1时eCAP模块就进入了APWM模式。这时它的内部逻辑会发生一次巧妙的“角色转换”引脚功能反转 ECAPx引脚从输入变为输出直接输出PWM波形。寄存器功能重映射CAP1寄存器变成了周期活动寄存器APRD定义了PWM波的周期。CAP2寄存器变成了比较活动寄存器ACMP定义了输出电平翻转的时刻对于主动高电平模式即高电平的宽度。CAP3和CAP4寄存器则分别成为上述两个活动寄存器的影子寄存器。这是实现PWM参数无毛刺更新的关键。工作原理 32位计数器TSCTR从0开始累加并与CAP1周期值和CAP2比较值实时比较。当TSCTR CAP2时输出有效电平由APWMPOL位定义是高有效还是低有效。当TSCTR CAP2且TSCTR CAP1时输出无效电平。当TSCTR等于CAP1即CTR PRD时在一个时钟周期内TSCTR被复位为0同时产生一个周期匹配事件。这个事件是同步和影子加载的关键触发器。影子寄存器机制是工业级PWM控制的核心。它允许CPU在任何时候更新CAP3影子周期寄存器或CAP4影子比较寄存器但这个新值不会立即影响正在输出的PWM波形。只有当TSCTR下一次计数到周期值CTR PRD事件时影子寄存器的内容才会被安全地、同步地加载到活动寄存器CAP1和CAP2中。这确保了PWM周期和占空比的改变发生在波形的边界完全避免了在脉冲中间切换可能产生的“毛刺”或“窄脉冲”这对于电机和电源控制是性命攸关的。2.3 同步与相位控制多模块协同的基石单个eCAP模块已经很强大了但TI的设计远不止于此。多个eCAP模块或与ePWM模块之间可以通过同步链Sync Chain协同工作这是实现复杂多通道系统的关键。同步输入SYNCI与同步输出SYNCO 每个eCAP模块都有一个同步输入信号SYNCI和一个同步输出信号SYNCO。SYNCI可以来自外部引脚也可以来自其他eCAP/ePWM模块的SYNCO。相位控制寄存器CTRPHS 这是一个“相位偏移值”寄存器。当使能同步SYNCI_EN1且发生同步事件硬件SYNCI信号或软件强制同步SWSYNC时TSCTR不会简单地被复位为0而是会被加载为CTRPHS寄存器中的值。这就实现了硬件级的精确相位偏移。工作流程 假设我们有一个主模块Master和两个从模块Slave1, Slave2。我们将Master的SYNCO配置为在CTRPRD周期匹配时产生同步脉冲并连接到两个Slave的SYNCI。Slave使能同步输入并设置各自的CTRPHS为不同的值比如0 1200 2400。当Master的计数器达到周期值并发出同步脉冲时所有Slave的TSCTR会同时被加载为各自CTRPHS的值然后开始计数。这样三个模块的PWM波形就具有了精确的、固定的相位差。这在三相电机驱动或交错式电源中至关重要可以有效地平滑电流纹波。3. 从理论到实践eCAP双模式配置与代码实现理解了架构我们来看如何动手配置。手册上的表格虽然全面但直接套用往往不知其所以然。下面我将结合代码片段解释每个关键配置背后的意图并分享一些调试中积累的实用技巧。3.1 捕获模式实战测量PWM频率与占空比假设我们需要测量一个输入PWM信号的频率和占空比信号频率大约10kHz系统时钟SYSCLK为100MHz。我们选择差值模式并利用全部四个捕获寄存器以连续捕获上升沿和下降沿。第一步模式与时钟配置我们目标是测量周期和占空比因此需要捕获上升沿和下降沿。差值模式能直接给出时间差更高效。系统时钟100MHz计数器每个计数代表10ns。对于10kHz信号周期100us计数器需要计数值为100us / 10ns 10000远小于32位计数器的最大值差值模式完全安全。// 首先停止计数器以确保安全配置 ECap1Regs.ECCTL2.bit.TSCTRSTOP EC_FREEZE; // 停止TSCTR计数器 // 配置ECCTL1事件极性、计数器复位模式、预分频 ECap1Regs.ECCTL1.bit.CAP1POL EC_RISING; // 事件1上升沿触发 ECap1Regs.ECCTL1.bit.CTRRST1 EC_DELTA_MODE; // 事件1后复位计数器 ECap1Regs.ECCTL1.bit.CAP2POL EC_FALLING; // 事件2下降沿触发 ECap1Regs.ECCTL1.bit.CTRRST2 EC_DELTA_MODE; // 事件2后复位计数器 ECap1Regs.ECCTL1.bit.CAP3POL EC_RISING; // 事件3上升沿触发 ECap1Regs.ECCTL1.bit.CTRRST3 EC_DELTA_MODE; // 事件3后复位计数器 ECap1Regs.ECCTL1.bit.CAP4POL EC_FALLING; // 事件4下降沿触发 ECap1Regs.ECCTL1.bit.CTRRST4 EC_DELTA_MODE; // 事件4后复位计数器 ECap1Regs.ECCTL1.bit.CAPLDEN EC_ENABLE; // 使能捕获寄存器加载 ECap1Regs.ECCTL1.bit.PRESCALE EC_DIV1; // 事件滤波器预分频设为1直通 // 如果输入信号有毛刺可以增大PRESCALE进行滤波例如EC_DIV22分频第二步运行控制与中断配置我们希望连续测量所以配置为连续模式。我们选择在第四个捕获事件CEVT4时触发中断这样一次中断可以读取四个时间戳计算出一个完整的周期和两个占空比信息。// 配置ECCTL2模式、运行控制、同步 ECap1Regs.ECCTL2.bit.CAP_APWM EC_CAP_MODE; // 设置为捕获模式 ECap1Regs.ECCTL2.bit.CONT_ONESHT EC_CONTINUOUS; // 连续捕获模式 ECap1Regs.ECCTL2.bit.SYNCO_SEL EC_SYNCO_DIS; // 禁用同步输出本例单模块 ECap1Regs.ECCTL2.bit.SYNCI_EN EC_DISABLE; // 禁用同步输入 ECap1Regs.ECCTL2.bit.TSCTRSTOP EC_RUN; // 启动TSCTR计数器 // 配置中断使能CEVT4中断 ECap1Regs.ECEINT.bit.CEVT4 1; // 使能捕获事件4中断 // 注意也需要在PIE控制器中使能对应的eCAP中断线第三步中断服务程序ISR数据处理在CEVT4中断中我们读取四个捕获寄存器。由于工作在差值模式CAP1和CAP3存储的是上升沿到下降沿的时间高电平时间CAP2和CAP4存储的是下降沿到上升沿的时间低电平时间。__interrupt void ecap1_isr(void) { uint32_t high_time1, low_time1, high_time2, low_time2; uint32_t period1, period2; float duty_cycle1, duty_cycle2; // 读取捕获值。注意在差值模式下这些值直接就是时间间隔单位时钟周期数 high_time1 ECap1Regs.CAP1; // 第一个高电平时间 low_time1 ECap1Regs.CAP2; // 第一个低电平时间 high_time2 ECap1Regs.CAP3; // 第二个高电平时间 low_time2 ECap1Regs.CAP4; // 第二个低电平时间 // 计算周期和占空比 period1 high_time1 low_time1; // 第一个完整周期 period2 high_time2 low_time2; // 第二个完整周期 duty_cycle1 (float)high_time1 / (float)period1 * 100.0f; // 第一个周期占空比 duty_cycle2 (float)high_time2 / (float)period2 * 100.0f; // 第二个周期占空比 // 可以根据period1/2计算频率Freq SYSCLK / period // 关键清除中断标志否则会持续进入中断 ECap1Regs.ECCLR.bit.CEVT4 1; // 清除CEVT4标志 ECap1Regs.ECCLR.bit.INT 1; // 清除全局中断标志 // 同时需要确认PIE中断应答寄存器 PieCtrlRegs.PIEACK.all PIEACK_GROUP4; }实操心得在差值模式下CAP1到CAP4的读数顺序与事件顺序严格对应。但在中断处理中必须考虑“数据就绪”的时机。手册图示表明在第四个事件CEVT4发生时四个寄存器的值才全部更新为最新一轮的数据。因此像上面这样在CEVT4中断中读取所有四个值是最稳妥的。如果试图在CEVT1中断里读取CAP1此时CAP2/3/4可能还是上一轮的老数据会导致计算错误。3.2 APWM模式实战生成带死区的互补PWM在电机驱动和全桥电源中我们经常需要生成一对互补的、带有死区Deadband的PWM信号以防止上下桥臂直通。虽然ePWM模块是死区生成的专家但用eCAP的APWM模式配合软件逻辑或外部逻辑芯片也能实现。这里我们演示如何用两个eCAP模块生成一对相位相反的PWM假设死区由外部硬件或软件插入。目标使用eCAP1和eCAP2生成两个频率为20kHz周期50us占空比为30%且互为反相的PWM。eCAP1为主模块eCAP2为从模块相位偏移180度。第一步主模块eCAP1配置主模块配置为标准APWM模式并使其在周期匹配时产生同步输出。// 停止计数器 ECap1Regs.ECCTL2.bit.TSCTRSTOP EC_FREEZE; // 配置为APWM模式主动高电平输出 ECap1Regs.ECCTL2.bit.CAP_APWM EC_APWM_MODE; ECap1Regs.ECCTL2.bit.APWMPOL EC_ACTV_HI; // 比较值代表高电平时间 // 设置周期值。系统时钟100MHz20kHz对应计数值 100MHz / 20kHz 5000 ECap1Regs.CAP1 5000; // 写入活动周期寄存器APRD // 注意在APWM模式下写入CAP1也会同时写入其影子寄存器CAP3APRD影子 // 设置初始比较值占空比30%。高电平时间 5000 * 0.3 1500 ECap1Regs.CAP2 1500; // 写入活动比较寄存器ACMP // 同样写入CAP2也会同时写入其影子寄存器CAP4ACMP影子 // 配置同步禁止同步输入同步输出选择CTRPRD事件 ECap1Regs.ECCTL2.bit.SYNCI_EN EC_DISABLE; ECap1Regs.ECCTL2.bit.SYNCO_SEL EC_CTR_PRD; // 关键主模块在周期点发出同步脉冲 // 启动计数器 ECap1Regs.ECCTL2.bit.TSCTRSTOP EC_RUN;第二步从模块eCAP2配置从模块需要与主模块同步并设置180度相位偏移。180度偏移意味着从模块的计数器起始点比主模块晚半个周期。半个周期对应的计数值是 5000 / 2 2500。// 停止计数器 ECap2Regs.ECCTL2.bit.TSCTRSTOP EC_FREEZE; // 配置为APWM模式主动高电平输出 ECap2Regs.ECCTL2.bit.CAP_APWM EC_APWM_MODE; ECap2Regs.ECCTL2.bit.APWMPOL EC_ACTV_HI; // 设置相同的周期值 ECap2Regs.CAP1 5000; // 设置相同的比较值占空比一致 ECap2Regs.CAP2 1500; // 配置相位偏移这是实现反相的关键 // 当同步事件发生时TSCTR会被加载为CTRPHS的值。 // 要延迟180度CTRPHS应设置为半个周期的值。 ECap2Regs.CTRPHS 2500; // 相位偏移寄存器 // 配置同步使能同步输入同步源选择SYNCI即来自主模块的SYNCO ECap2Regs.ECCTL2.bit.SYNCI_EN EC_ENABLE; // 使能同步加载CTRPHS ECap2Regs.ECCTL2.bit.SYNCO_SEL EC_SYNCO_DIS; // 从模块可以禁用同步输出或级联 // 启动计数器注意此时计数器可能不会立刻运行等待同步信号 ECap2Regs.ECCTL2.bit.TSCTRSTOP EC_RUN;第三步运行时更新占空比为了安全无毛刺地更新占空比我们应该通过影子寄存器CAP4ACMP影子来更新。// 假设需要在运行时将eCAP1的占空比从30%改为40% uint32_t new_cmp 5000 * 0.4; // 新的比较值 2000 ECap1Regs.CAP4 new_cmp; // 写入影子寄存器 // 硬件会在下一个CTRPRD周期结束时自动将CAP4的值加载到CAP2完成平滑更新。 // 如果需要立即更新不推荐在精密控制中使用可能产生窄脉冲可以直接写活动寄存器 // ECap1Regs.CAP2 new_cmp; // 这会同时更新CAP2和CAP4立即模式重要提示相位控制寄存器CTRPHS的值是在同步事件发生时加载到TSCTR中的。因此从模块的计数器起始点 CTRPHS。要实现反相180度偏移CTRPHS应设为Period/2。若CTRPHS设为0则主从模块完全同步启动。这个机制非常灵活可以实现任意精确的相位差对于多相交错并联电源减少输入输出纹波至关重要。4. 高级应用与同步链构建多相电机驱动实例让我们看一个更复杂的、贴近真实应用的例子控制一个三相永磁同步电机PMSM。这通常需要三个相位互差120度的PWM信号通常由ePWM模块产生但eCAP同样可以胜任。此外可能还需要一个独立的PWM用于刹车控制或风扇调速。我们使用四个eCAP模块来实现。系统设计eCAP1 作为主时钟源产生基础频率的同步信号。假设开关频率为10kHz。eCAP2, eCAP3, eCAP4 作为三个相位桥臂的PWM发生器分别偏移0°, 120°, 240°。目标 所有PWM频率严格同步相位关系精确固定。配置步骤详解1. 主模块eCAP1配置 它的主要任务是产生一个稳定的周期信号并在每个周期开始时发出同步脉冲。它自身也可以输出一个PWM例如用于刹车控制但这里我们更关注其同步功能。// eCAP1 主模块配置 ECap1Regs.ECCTL2.bit.TSCTRSTOP EC_FREEZE; ECap1Regs.ECCTL2.bit.CAP_APWM EC_APWM_MODE; ECap1Regs.ECCTL2.bit.APWMPOL EC_ACTV_HI; ECap1Regs.CAP1 10000; // 周期值对应10kHz 100MHz SysClk ECap1Regs.CAP2 5000; // 初始占空比50% ECap1Regs.CTRPHS 0; // 主模块自身相位为0 ECap1Regs.ECCTL2.bit.SYNCI_EN EC_DISABLE; // 主模块不需要外部同步 ECap1Regs.ECCTL2.bit.SYNCO_SEL EC_CTR_PRD; // 关键在周期匹配点输出同步脉冲 ECap1Regs.ECCTL2.bit.TSCTRSTOP EC_RUN;2. 从模块eCAP2, eCAP3, eCAP4配置 这三个模块需要接收来自eCAP1的同步信号并设置各自的相位偏移。一个完整的电角度周期360°对应一个PWM周期10000个计数。那么120° 相位偏移对应的计数值 10000 * (120 / 360) 3333.33 ≈ 3333取整240° 相位偏移对应的计数值 10000 * (240 / 360) 6666.66 ≈ 6667取整// eCAP2 配置 (U相 偏移 0°) ECap2Regs.ECCTL2.bit.TSCTRSTOP EC_FREEZE; ECap2Regs.ECCTL2.bit.CAP_APWM EC_APWM_MODE; ECap2Regs.ECCTL2.bit.APWMPOL EC_ACTV_HI; ECap2Regs.CAP1 10000; // 周期与主模块相同 ECap2Regs.CAP2 5000; // 初始占空比 ECap2Regs.CTRPHS 0; // 相位偏移0° ECap2Regs.ECCTL2.bit.SYNCI_EN EC_ENABLE; // 使能同步输入 ECap2Regs.ECCTL2.bit.SYNCO_SEL EC_SYNCI; // 同步输出选择为直通输入便于级联可选 ECap2Regs.ECCTL2.bit.TSCTRSTOP EC_RUN; // eCAP3 配置 (V相 偏移 120°) ECap3Regs.ECCTL2.bit.TSCTRSTOP EC_FREEZE; ECap3Regs.ECCTL2.bit.CAP_APWM EC_APWM_MODE; ECap3Regs.ECCTL2.bit.APWMPOL EC_ACTV_HI; ECap3Regs.CAP1 10000; ECap3Regs.CAP2 5000; ECap3Regs.CTRPHS 3333; // 相位偏移120° (10000 * 120/360) ECap3Regs.ECCTL2.bit.SYNCI_EN EC_ENABLE; ECap3Regs.ECCTL2.bit.SYNCO_SEL EC_SYNCO_DIS; // 本例中不需要eCAP3再输出同步 ECap3Regs.ECCTL2.bit.TSCTRSTOP EC_RUN; // eCAP4 配置 (W相 偏移 240°) ECap4Regs.ECCTL2.bit.TSCTRSTOP EC_FREEZE; ECap4Regs.ECCTL2.bit.CAP_APWM EC_APWM_MODE; ECap4Regs.ECCTL2.bit.APWMPOL EC_ACTV_HI; ECap4Regs.CAP1 10000; ECap4Regs.CAP2 5000; ECap4Regs.CTRPHS 6667; // 相位偏移240° (10000 * 240/360) ECap4Regs.ECCTL2.bit.SYNCI_EN EC_ENABLE; ECap4Regs.ECCTL2.bit.SYNCO_SEL EC_SYNCO_DIS; ECap4Regs.ECCTL2.bit.TSCTRSTOP EC_RUN;硬件连接 需要确保eCAP1模块的SYNCO输出信号通常映射到某个特定引脚或内部信号连接到eCAP2、eCAP3、eCAP4的SYNCI输入源。这通常在芯片的输入多路复用器Input XBAR或直接内部连接中配置具体需参考芯片数据手册的“信号连接”章节。运行时控制 在电机控制算法中如FOC我们需要实时更新三个相位的占空比。为了保证三个PWM通道同时更新避免相位错乱应利用影子寄存器并在主模块的同步点进行批量更新。// 在控制算法计算完新的三相占空比后U, V, W uint32_t new_cmp_u, new_cmp_v, new_cmp_w; // ... 计算 new_cmp_u, new_cmp_v, new_cmp_w ... // 更新影子寄存器。注意eCAP2/3/4的ACMP影子寄存器是CAP4。 ECap2Regs.CAP4 new_cmp_u; ECap3Regs.CAP4 new_cmp_v; ECap4Regs.CAP4 new_cmp_w; // 由于所有从模块的SYNCI都连接到主模块的SYNCO // 当下一个主模块周期结束时CTRPRD主模块发出同步脉冲。 // 这个脉冲会同时触发两件事 // 1. 所有从模块的TSCTR被加载为各自的CTRPHS值实现相位偏移。 // 2. 所有从模块的影子寄存器(CAP3/CAP4)值被加载到活动寄存器(CAP1/CAP2)。 // 因此三个相位的PWM将在同一个同步脉冲下同时更新占空比并保持精确相位关系。这种基于硬件同步链和影子寄存器的设计确保了多通道PWM更新的绝对同步性和无毛刺特性是构建高可靠性电机驱动和数字电源系统的基石。5. 调试陷阱与性能优化指南即使理解了原理和配置在实际调试中依然会遇到各种问题。下面是我在多个项目中总结的常见“坑点”和优化建议。5.1 常见问题排查速查表现象可能原因排查步骤与解决方案捕获模式无中断产生1. 输入引脚未正确映射。2. 事件极性CAPxPOL设置错误。3. 中断未使能ECEINT或PIE配置错误。4. 输入信号频率过高或过低超出滤波器范围或导致计数器溢出。1. 检查GPIO复用配置确保ECAPx引脚功能已启用。2. 用示波器确认信号边沿并核对CAPxPOL位。3. 检查ECEINT寄存器、PIEIER和PIEACK寄存器。确保ISR已正确声明和挂接。4. 估算信号周期和计数器溢出时间。对于慢信号考虑使用预分频PRESCALE或检查是否因噪声产生误触发。捕获值始终为0或不变1. 计数器未启动TSCTRSTOP0。2. 捕获寄存器加载被禁止CAPLDEN0。3. 在APWM模式下误读了CAP寄存器APWM模式下CAP1/2功能已变。1. 确认ECCTL2.bit.TSCTRSTOP已设置为EC_RUN。2. 确认ECCTL1.bit.CAPLDEN已设置为1。3. 检查ECCTL2.bit.CAP_APWM模式位确认处于捕获模式。APWM模式无输出1. 引脚未配置为输出功能。2. 模块仍处于捕获模式CAP/APWM0。3. 比较值CAP2大于或等于周期值CAP1。4. 输出极性APWMPOL理解有误。1. 检查GPIO配置确保APWMx引脚已设置为外设输出功能。2. 确认ECCTL2.bit.CAP_APWM已设置为EC_APWM_MODE。3. 确保CAP2CAP1才能产生有效脉冲。若CAP20则输出常低主动高或常高主动低。4. 用示波器观察结合APWMPOL设置判断逻辑是否正确。多模块间不同步1. 同步信号SYNCI/SYNCO未正确连接或使能。2. 主从模块的周期值CAP1设置不一致。3. 从模块的SYNCI_EN未使能。4. 主模块的SYNCO_SEL未正确设置为EC_CTR_PRD。1. 查阅芯片手册确认同步信号的内部路由XBAR配置正确。2. 确保所有需要同步的模块CAP1值相同。3. 检查从模块ECCTL2.bit.SYNCI_EN是否为1。4. 检查主模块ECCTL2.bit.SYNCO_SEL是否设置为EC_CTR_PRD或EC_SYNCIN若它也是从模块。相位偏移不准1.CTRPHS值计算错误。2. 同步事件发生在非预期时刻。3. 在运行中修改了CTRPHS但未触发新的同步事件。1. 重新计算CTRPHS (期望相位角 / 360°) * 周期值( CAP1 )并取整。2. 确认主模块的同步输出条件SYNCO_SEL符合设计。3.CTRPHS是影子寄存器修改后需要一次同步事件软件强制SWSYNC或硬件SYNCI才能生效。更新PWM参数产生毛刺直接写入了活动寄存器CAP1或CAP2而非影子寄存器CAP3或CAP4。严格遵守规则初始化时写CAP1/CAP2会同时初始化影子寄存器。运行时只通过CAP3更新周期或CAP4更新比较值来修改参数让硬件在CTRPRD时自动加载。5.2 性能优化与高级技巧事件滤波器的妙用ECCTL1[PRESCALE]不仅是一个简单的时钟分频器。它实际上是一个事件滤波器。当输入信号有噪声或振铃时可能会产生多个错误的边沿检测。通过设置预分频例如EC_DIV2eCAP模块要求输入信号边沿稳定保持至少2个系统时钟周期才会被确认为有效事件这能极大增强抗干扰能力。但要注意这会轻微降低时间戳的分辨率。单次模式One-Shot的应用场景ECCTL2[CONT/ONESHT]设置为单次模式时模块在捕获完指定数量的事件由STOP_WRAP位决定例如4个事件后会自动停止并禁止后续捕获。这在需要精确捕获特定数量脉冲如编码器索引信号或触发特定序列后等待软件处理的场景非常有用可以避免数据被新事件覆盖。软件强制同步SWSYNC的调试价值ECCTL2[SWSYNC]位写1可以产生一个软件同步脉冲。这在调试多模块系统时极其有用。你可以在代码中手动触发同步然后用调试器观察各个模块的TSCTR是否被同时加载为各自的CTRPHS值从而验证同步链路是否畅通。利用中断状态寄存器快速定位问题ECFLG寄存器记录了所有中断事件的状态。在调试时不要只关注全局中断标志INT。定期检查CEVT1-4、CTROVF、CTRPRD、CTRCMP这些具体标志位可以帮你快速定位是哪个环节出了问题。例如如果CTROVF被置位说明在差值模式下计数器溢出了需要检查信号周期是否过长。时钟与精度权衡 eCAP的计数器由系统时钟SYSCLK驱动。更高的系统时钟意味着更高的时间戳分辨率例如100MHz下为10ns但也意味着计数器溢出更快约42.9秒。在差值模式下必须确保待测信号的最大周期小于溢出时间。对于超低频信号测量可以考虑使用绝对时间戳模式或者对输入信号进行预分频。APWM模式下的“即时更新”陷阱 手册提到在APWM模式下直接写CAP1或CAP2会同时更新活动寄存器和影子寄存器模拟“即时更新”模式。除非在初始化阶段否则应避免这种操作。因为在PWM周期中间更新比较值可能导致当前周期产生一个极窄的脉冲或毛刺这在功率应用中可能是灾难性的。养成只通过CAP3/CAP4更新的习惯。