公司动态
深入解析TI C2000 eCAP模块:高精度时间戳捕获与APWM生成实战
1. 项目概述与eCAP模块的核心价值在嵌入式系统开发尤其是工业控制、电机驱动和电源管理这类对时序精度有“变态”级要求的领域里我们常常需要回答一些看似简单却至关重要的问题这个电机转一圈到底花了多少微秒这个传感器发出的脉冲它的高电平持续了多久两个外部事件之间的间隔精确到纳秒级是多少这些问题背后是对外部事件发生时刻进行精准时间戳捕获的需求。传统上我们可能会依赖通用定时器GPT配合输入捕获功能或者用处理器核频繁轮询GPIO状态再结合高精度计时器来估算。但这些方法要么灵活性不足难以处理复杂的、多边沿的事件序列要么会大量占用CPU资源在系统负载高时引入不可接受的抖动。这时候像TI C2000系列微控制器内置的增强型捕获eCAP模块这样的专用外设其价值就凸显出来了。它就像一个硬件级的“高速摄影机”和“精密秒表”的结合体能独立于CPU运行在输入信号的特定边沿瞬间“咔嚓”一下记录下当前32位计数器的值并将这个时间戳存入专属的FIFO缓冲区最后才通过中断礼貌地通知CPU“数据准备好了您来取吧。”更妙的是eCAP模块绝非一个单一功能的外设。当你的系统不需要捕获外部事件反而需要产生一个精准的PWM波形时它可以摇身一变成为一个独立的、功能完整的辅助PWMAPWM发生器。这种“捕获”与“生成”模式的无缝切换体现了其设计上的高度集成与灵活性。理解并驾驭eCAP模块意味着你掌握了在嵌入式系统中实现高精度、低CPU占用的时间测量与波形生成的一把利器。无论是测量旋转编码器的频率和占空比还是生成驱动步进电机的细分脉冲亦或是实现数字电源的闭环控制eCAP模块都是底层硬件支持的坚实基石。2. eCAP模块架构深度解析从引脚到中断的完整通路要玩转eCAP不能只停留在调用API的层面必须深入其内部架构理解数据流和控制流是如何运作的。这就像开车知道油门刹车是基础但了解发动机和变速箱如何协同才能应对复杂路况。2.1 核心资源与数据通路一个完整的eCAP通道其核心是一套高度协同的硬件单元我们可以将其数据通路抽象为以下几个关键环节信号输入与调理一切始于ECAPx输入引脚通常与GPIO复用。外部信号首先进入事件预分频器Event Prescaler。这个预分频器可不是给系统时钟用的它是专门为输入事件设计的。你可以将其配置为旁路EC_DIV1或者进行2到62偶数的分频。这有什么用想象一下你要测量一个频率高达几十MHz的方波直接捕获每个边沿可能会让后续的序列器和计数器应接不暇甚至导致溢出。通过预分频你可以每N个边沿才产生一个有效的“捕获事件”从而测量更高频率的信号或者对信号进行降频采样。边沿检测与序列调度经过预分频或旁路后的信号送入边沿极性选择与限定器。这是eCAP灵活性的核心之一。模块内部有4个独立的极性选择器对应CAP1POL到CAP4POL你可以为连续4个捕获事件分别指定是上升沿触发还是下降沿触发。例如你可以设置为“上升沿 - 下降沿 - 上升沿 - 下降沿”这样一个完整的脉冲周期高电平和低电平时间就能被自动测量出来。这些被极性选择器“盖章认证”的有效边沿事件称为CEVT1到CEVT4会交给一个**模4计数器Modulo-4 Counter**来调度。这个计数器就像一个旋转的指针0-1-2-3-0严格按顺序决定当前是哪个捕获事件CEVT1-CEVT4有效并进而控制将时间戳存入对应的捕获寄存器CAP1-CAP4。时间基准与捕获动作整个模块的时间心脏是一个32位时间戳计数器TSCTR它由系统时钟SYSCLK驱动不断向上计数。当某个CEVTx事件发生时硬件会立即执行两个动作顺序至关重要捕获将TSCTR的当前值锁存到对应的CAPx寄存器中例如CEVT1事件发生时TSCTR值存入CAP1。复位可选根据CTRRSTx位的配置决定是否在捕获后将TSCTR复位为0。这就是绝对时间戳模式与差值Delta模式的根本区别。绝对模式下TSCTR永不复位除非溢出CAPx中记录的是自计数器启动以来的绝对时间点差值模式下每次捕获后TSCTR清零CAPx中记录的就是相邻两个事件之间的时间间隔周期。工作模式控制连续/单次CONT/ONESHT控制逻辑决定了上述捕获流程是循环不止还是单次执行。在连续模式下模4计数器会不断循环0,1,2,3,0,1...CAP1-CAP4四个寄存器构成一个环形缓冲区新数据会覆盖旧数据。在单次模式下你可以设置一个停止值STOP_WRAP 1-4当模4计数器计数值等于这个停止值时整个捕获过程暂停模4计数器和CAP寄存器内容都被冻结直到软件通过RE-ARM位重新触发。这对于捕获特定数量的脉冲序列非常有用。中断与CPU交互最后当捕获事件发生、计数器溢出CTROVF或在APWM模式下发生周期/比较匹配时会置位相应的标志位ECFLG。如果该事件在中断使能寄存器ECEINT中被使能并且全局中断标志ECFLG.INT为0模块就会向系统中断控制器发出一个中断脉冲。CPU在中断服务程序ISR中可以安全地读取CAP1-CAP4寄存器中的时间戳数据并进行计算如周期、占空比最后通过写ECCLR寄存器来清除已处理的事件标志为下一次中断做好准备。2.2 APWM模式捕获器的华丽变身当ECCTL2[CAP/APWM]位设置为1时eCAP模块从“听诊器”变成了“起搏器”其内部资源被重新映射用于生成PWM波形寄存器角色转换CAP1和CAP2寄存器分别变为活动周期寄存器APRD active和活动比较寄存器ACMP active直接参与硬件比较。CAP3和CAP4则成为它们的影子寄存器Shadow Register分别对应APRD shadow和ACMP shadow。计数器与比较器32位的TSCTR计数器在APWM模式下工作在递增计数模式。它不断与CAP1周期值和CAP2比较值进行比较。PWM生成逻辑当TSCTR小于CAP2时输出有效电平高或低由APWMPOL决定。当TSCTR等于或大于CAP2但小于CAP1时输出无效电平。当TSCTR等于CAP1时发生周期匹配事件CTRPRDTSCTR在下个时钟周期复位为0并开始一个新的PWM周期。同时如果使能了影子加载CAP3/CAP4中的值会被同步加载到CAP1/CAP2中。影子加载机制这是实现PWM参数无毛刺更新的关键。你可以在任何时候安全地向影子寄存器CAP3/CAP4写入新的周期或比较值。硬件提供了两种加载时机立即加载向活动寄存器CAP1/CAP2写入时值会同时写入对应的影子寄存器。这通常用于初始化。周期加载配置为影子加载模式后向影子寄存器CAP3/CAP4写入新值该值只会在下一个PWM周期开始时CTRPRD时刻才被加载到活动寄存器。这确保了在一完整的PWM周期内比较值保持不变避免了在PWM周期中间改变比较值可能导致的脉冲宽度异常。关键理解在捕获模式下CAP1-CAP4是只读的由硬件在事件发生时写入。在APWM模式下CAP1-CAP4是可读写的由软件配置并由硬件比较逻辑读取。这种“一物二用”的设计极大地节省了芯片硬件资源。3. 寄存器配置详解从位域到功能实现理解了架构我们就要通过配置寄存器来指挥硬件。TI的文档提供了寄存器位域的详细描述但我们需要将其翻译成实际的操作逻辑。这里重点剖析几个最核心的控制寄存器。3.1 捕获控制寄存器1ECCTL1定义捕获行为ECCTL1寄存器负责配置捕获事件的具体规则。CAPxPOL (Bits 1:0, 3:2, 5:4, 7:6)这4组位分别控制CEVT1到CEVT4的边沿极性。0为上升沿1为下降沿。这是实现占空比测量的关键。例如配置为0b0101CAP1POL上升沿 CAP2POL下降沿 CAP3POL上升沿 CAP4POL下降沿模块就会自动按“上升-下降-上升-下降”的顺序捕获完美匹配一个完整方波的两个周期。CTRRSTx (Bits 9:8, 11:10, 13:12, 15:14)这4组位决定每个捕获事件发生后32位计数器TSCTR是否复位。0表示不复位绝对时间模式1表示复位差值模式。这是选择绝对时间戳还是差值时间戳的核心开关。在差值模式下CAP1存储的是第一次事件发生前TSCTR计数的时长即第一个周期CAP2存储的是第二次事件发生前TSCTR重新计数后的时长第二个周期以此类推。CAPLDEN (Bit 16)捕获加载使能。必须置1捕获事件发生时才会将TSCTR值加载到CAPx寄存器。在单次模式捕获完成后硬件会自动清除此位以锁定数据。PRESCALE (Bits 20:16)事件预分频因子。设置范围为0-31对应的分频系数N (PRESCALE值 1) * 2。例如PRESCALE0- N22分频PRESCALE4- N1010分频。设置为0且PRESCALE位域使能时为旁路模式1分频。3.2 捕获控制寄存器2ECCTL2模式与同步控制ECCTL2寄存器控制着模块的全局工作模式和一些高级功能。CAP/APWM (Bit 0)模式选择总开关。0为捕获模式1为APWM模式。这个位决定了整个模块的数据流和控制逻辑。CONT/ONESHT (Bit 1)0为连续捕获1为单次捕获。单次捕获需要配合STOP_WRAP使用。STOP_WRAP (Bits 3:2)单次捕获的停止点。可以设置为1、2、3、4。当模4计数器计数值等于此值时停止捕获。例如设为3则模块在捕获完CEVT1CEVT2CEVT3后停止CAP4不会被更新。RE-ARM (Bit 4)单次模式下的软件重载位。向此位写1会清除CAPLDEN的自动锁定复位模4计数器使模块准备下一次单次捕获序列。SYNCI_EN (Bit 5)是否使能外部同步输入。使能后TSCTR可以被外部同步信号复位或与外部信号同步。SYNCO_SEL (Bits 7:6)同步输出选择。决定SYNCO引脚输出什么信号。可以是SYNCI输入、CTRPRD事件PWM周期匹配或者禁止输出。这用于多个eCAP或ePWM模块之间的同步构建主从定时器系统。TSCTRSTOP (Bit 8)TSCTR计数器停止控制。0停止1运行。通常保持运行。APWMPOL (Bit 9)仅在APWM模式下有效。0为高电平有效CMP值代表高电平时间1为低电平有效CMP值代表低电平时间。3.3 中断相关寄存器组eCAP模块拥有精细的中断管理机制由一组寄存器协同工作中断使能寄存器ECEINT你可以独立使能或禁止7个中断源CEVT1-CEVT4CTROVF计数器溢出CTRPRDAPWM周期匹配CTRCMPAPWM比较匹配。中断标志寄存器ECFLG当某个中断事件发生时对应的标志位被硬件置1。INT位是所有已使能事件标志的逻辑或是最终通向CPU的中断请求信号。中断清除寄存器ECCLR软件通过向相应的位写1来清除ECFLG中的事件标志位。这是清除中断请求的标准方式。中断强制寄存器ECFRC软件可以通过向此寄存器的位写1来模拟一个硬件中断事件强制置位ECFLG中的对应标志。这在调试和测试时非常有用。操作心得配置中断的经典流程是1. 在ECEINT中使能所需事件。2. 等待中断发生。3. 在ISR中读取ECFLG判断具体事件源。4. 处理数据如读取CAPx。5.向ECCLR写入相应的值以清除标志位。6. 清除PIE或CPU级的中断应答位。忘记第5步是导致中断只触发一次的常见错误。4. 实战应用从信号捕获到PWM生成的代码实现理论说得再多不如一行代码。我们结合TI文档中的示例深入其实现细节并补充一些关键的操作技巧。4.1 应用一测量脉冲信号的周期与占空比绝对时间戳模式这是最经典的应用。假设我们需要测量一个未知频率和占空比的方波信号。场景分析我们使用连续捕获模式并配置为“上升沿 - 下降沿 - 上升沿 - 下降沿”的序列。这样CAP1和CAP3存储的是连续两个上升沿的绝对时间点CAP2和CAP4存储的是两个下降沿的绝对时间点。配置步骤与代码实现// 假设使用 eCAP1 模块基地址为 ECAP1_BASE // 首先将引脚复用为 ECAP1 功能具体寄存器取决于具体MCU型号此处为示意 GPIO_setPinConfig(GPIO_0_ECAP1); // 配置GPIO0为ECAP1功能 // 停止并初始化eCAP模块 ECAP_disableInterrupt(ECAP1_BASE, ECAP_INT_ALL); // 关闭所有中断 ECAP_stopCounter(ECAP1_BASE); // 停止计数器 ECAP_reArmCounter(ECAP1_BASE); // 复位模4计数器单次模式准备此处用于初始化 ECAP_initCounter(ECAP1_BASE, 0); // 初始化计数器值为0 // 配置 ECCTL1 ECAP_setCaptureMode(ECAP1_BASE, ECAP_CONTINUOUS_CAPTURE_MODE); // 连续模式 ECAP_setEventPolarity(ECAP1_BASE, 0, ECAP_EVENT_POLARITY_RISING); // CEVT1 上升沿 ECAP_setEventPolarity(ECAP1_BASE, 1, ECAP_EVENT_POLARITY_FALLING); // CEVT2 下降沿 ECAP_setEventPolarity(ECAP1_BASE, 2, ECAP_EVENT_POLARITY_RISING); // CEVT3 上升沿 ECAP_setEventPolarity(ECAP1_BASE, 3, ECAP_EVENT_POLARITY_FALLING); // CEVT4 下降沿 ECAP_enableCaptureLoad(ECAP1_BASE); // 使能捕获加载 ECAP_setEventPrescale(ECAP1_BASE, 0); // 预分频旁路 (1分频) // 注意TI的驱动库可能将CTRRST配置封装在setCaptureMode或其他函数中需查证。 // 对于绝对时间模式通常需要配置CTRRSTx为不复位。底层操作是写ECCTL1寄存器的CTRRSTx位域为0。 // 配置 ECCTL2 ECAP_setSyncOutMode(ECAP1_BASE, ECAP_SYNC_OUT_DISABLE); // 禁用同步输出 ECAP_setSyncInMode(ECAP1_BASE, ECAP_SYNC_IN_DISABLE); // 禁用同步输入 ECAP_setApwmMode(ECAP1_BASE, ECAP_CAPTURE_MODE); // 设置为捕获模式非APWM ECAP_setCounterResetMode(ECAP1_BASE, ECAP_COUNTER_RESET_ON_CEVT1); // 此处应为绝对模式不复位。驱动库函数名可能不同。 // 更底层的寄存器操作示例如果驱动库未提供 // HWREGH(ECAP1_BASE ECAP_O_ECCTL1) ~((uint16_t)ECAP_ECCTL1_CTRRST1_M | // ECAP_ECCTL1_CTRRST2_M | // ECAP_ECCTL1_CTRRST3_M | // ECAP_ECCTL1_CTRRST4_M); // 清除所有CTRRST位设为绝对模式 // 使能中断例如在捕获到第4个事件时中断 ECAP_enableInterrupt(ECAP1_BASE, ECAP_INT_CEVT4); ECAP_clearInterrupt(ECAP1_BASE, ECAP_INT_CEVT4); // 清除可能存在的旧标志 Interrupt_register(INT_ECAP1, ECAP1_ISR); // 注册中断服务函数假设 Interrupt_enable(INT_ECAP1); // 使能CPU级中断 // 启动计数器 ECAP_startCounter(ECAP1_BASE); // --- 在中断服务程序 ECAP1_ISR 中 --- void ECAP1_ISR(void) { uint32_t cap1, cap2, cap3, cap4; uint32_t period, highTime, lowTime; float dutyCycle; // 1. 读取捕获寄存器 cap1 ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_1); cap2 ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_2); cap3 ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_3); cap4 ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_4); // 2. 计算第一个完整周期的参数 // 周期 第二个上升沿时间 - 第一个上升沿时间 period cap3 - cap1; // 高电平时间 下降沿时间 - 上升沿时间 highTime cap2 - cap1; // 低电平时间 第二个上升沿时间 - 下降沿时间 (或 周期 - 高电平时间) lowTime cap3 - cap2; dutyCycle (float)highTime / (float)period * 100.0f; // 3. 可以将 period, dutyCycle 等值存入全局变量供主循环使用 g_measuredPeriod period; g_measuredDuty dutyCycle; // 4. 清除中断标志至关重要 ECAP_clearInterrupt(ECAP1_BASE, ECAP_INT_CEVT4); // 5. 确认PIE/CPU级中断取决于具体MCU架构 Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3); // 示例C2000通常需要清除PIE应答 }关键点解析计数器溢出处理TSCTR是32位无符号数在绝对时间模式下如果信号周期很长或测量时间极长可能溢出从0xFFFFFFFF回到0x00000000。计算时间差时必须考虑溢出。简单的处理方法是使用uint32_t类型做减法C语言的无符号整数回绕特性可以自动处理单次溢出0 - 0xFFFFFFFF 1。但对于跨越多次溢出的长时间测量需要软件维护一个溢出计数器。中断触发点选择这里我们选择CEVT4第4个事件触发中断因为此时一个完整的“上升-下降-上升-下降”序列完成CAP1-CAP4包含了计算一个完整周期所需的所有数据。你也可以选择在CEVT2得到第一个脉冲的高电平时间或CEVT1在差值模式下更有用触发中断但需要更复杂的数据缓存逻辑。4.2 应用二单次捕获特定数量的脉冲单次模式假设我们需要在收到一个外部触发信号后精确捕获紧接着的3个脉冲上升沿的时间戳。配置步骤将ECCTL2[CONT/ONESHT]设为1单次模式。将ECCTL2[STOP_WRAP]设为2因为我们要捕获3个事件模4计数器从0开始0-1-2当计数值等于2时停止。注意STOP_WRAP的值等于停止事件序号减1。将所有CAPxPOL设为上升沿。使能CEVT3中断因为第3个事件发生后停止。配置完成后通过软件向ECCTL2[RE-ARM]位写1来“武装”模块。当3个上升沿事件发生后模块停止触发CEVT3中断。在ISR中读取CAP1CAP2CAP3即可。如需再次捕获必须再次执行“RE-ARM”操作。4.3 应用三配置eCAP为APWM模式输出PWM波当我们需要一个额外的、独立的PWM通道时eCAP的APWM模式就派上用场了。场景生成一个频率为100kHz占空比为30%高电平有效的PWM波。假设系统时钟SYSCLK 100MHz。计算与配置计算周期值APRDPWM频率 SYSCLK / (APRD 1)。所以APRD SYSCLK / Freq - 1 100,000,000 / 100,000 - 1 999。计算比较值ACMP对于高电平有效APWMPOL0比较值代表高电平时间对应的计数器值。占空比 (ACMP 1) / (APRD 1)。所以ACMP Duty * (APRD 1) - 1 0.3 * 1000 - 1 299。注意PWM输出在CMP0时始终为低CMP APRD时始终为高。CMP的有效范围通常是0到APRD。代码实现// 配置引脚为 APWM 输出功能 GPIO_setPinConfig(GPIO_1_APWM1); // 假设GPIO1复用为APWM1输出 // 停止计数器 ECAP_stopCounter(ECAP1_BASE); // 配置为 APWM 模式 ECAP_setApwmMode(ECAP1_BASE, ECAP_APWM_MODE); // 设置 PWM 极性为高电平有效 ECAP_setApwmPolarity(ECAP1_BASE, ECAP_APWM_ACTIVE_HIGH); // 配置周期和比较值使用影子寄存器以实现无毛刺更新 // 先写入活动寄存器这会同时初始化影子寄存器立即加载模式初始化 ECAP_setApwmPeriod(ECAP1_BASE, 999); // 设置周期值写入CAP1和CAP3 ECAP_setApwmCompare(ECAP1_BASE, 299); // 设置比较值写入CAP2和CAP4 // 或者更精细的控制配置为周期加载影子模式 // 首先需要配置影子加载模式。TI的驱动库可能直接提供“影子加载”配置函数 // 或者需要通过配置动作限定器AQ相关设置来实现。在APWM模式下默认或典型配置是 // 对CAP1/CAP2活动寄存器的写操作会立即生效并复制到影子寄存器用于初始化。 // 对CAP3/CAP4影子寄存器的写操作会在CTRPRD时加载。 // 因此初始化后运行时更新占空比应该写CAP4ACMP影子寄存器。 // 示例ECAP_setShadowCompare(ECAP1_BASE, 299); // 更新比较值影子 // 启动计数器 ECAP_startCounter(ECAP1_BASE); // --- 运行时动态改变占空比至 60% --- // 计算新的比较值0.6 * 1000 - 1 599 uint16_t new_cmp 599; // 安全地更新影子寄存器CAP4新值将在下一个PWM周期开始时生效 ECAP_setShadowCompare(ECAP1_BASE, new_cmp); // 注意ECAP_setShadowCompare 是假想的库函数实际可能需要直接操作寄存器 // HWREGH(ECAP1_BASE ECAP_O_CAP4) new_cmp; // 直接写CAP4影子寄存器避坑指南在APWM模式下初始化顺序很重要。务必先停止计数器再配置模式和参数最后启动计数器。如果需要在计数器运行时改变频率周期需要同时更新周期寄存器和比较寄存器并确保新的比较值不超过新的周期值否则可能产生意外的100%占空比输出。使用影子寄存器CAP3/CAP4进行运行时更新是保证波形稳定的最佳实践。5. 高级技巧与常见问题排查掌握了基本操作后一些高级技巧和“踩坑”经验能让你用得更顺手。5.1 时间戳的精度与溢出管理精度eCAP的时间戳精度直接取决于TSCTR的时钟源通常是系统时钟SYSCLK。例如SYSCLK100MHz时每个计数代表10ns。测量误差主要来源于时钟抖动和信号边沿与时钟沿的对齐误差±1个时钟周期。32位溢出TSCTR的最大值为0xFFFFFFFF。在SYSCLK100MHz下溢出周期约为2^32 / 100e6 ≈ 42.9秒。在绝对时间模式下进行长时间测量必须考虑溢出。一个稳健的做法是在CTROVF中断中维护一个64位的软件扩展计数器。volatile uint32_t tsctr_overflow_count 0; // 使能 CTROVF 中断 ECAP_enableInterrupt(ECAP1_BASE, ECAP_INT_CTROVF); // 在 CTROVF 的 ISR 中 void ECAP1_OVF_ISR(void) { tsctr_overflow_count; ECAP_clearInterrupt(ECAP1_BASE, ECAP_INT_CTROVF); // ... 其他ACK操作 } // 读取完整64位时间戳 uint64_t get_full_timestamp() { uint32_t low, high; do { high tsctr_overflow_count; low ECAP_getCounterValue(ECAP1_BASE); // 读取TSCTR当前值 } while (high ! tsctr_overflow_count); // 防止在读取过程中发生溢出 return ((uint64_t)high 32) | low; }5.2 同步多个eCAP或ePWM模块在复杂的电机控制或数字电源系统中经常需要多个PWM通道完全同或具有精确的相位差。eCAP的同步输入SYNCI和输出SYNCO功能可以实现这一点。主从设置将一个eCAP模块配置为主模块将其SYNCO输出设置为在CTRPRD周期匹配时产生一个同步脉冲。将其他eCAP或ePWM模块的SYNCI使能并设置为在接收到同步信号时将其TSCTR复位为CTRPHS相位寄存器的值。相位控制通过设置从模块的CTRPHS寄存器可以精确控制其PWM输出相对于主模块的相位偏移。例如主模块周期为1000从模块CTRPHS设为250则从模块的PWM波将滞后主模块1/4个周期。操作要点同步操作通常需要在所有模块的计数器停止时进行配置配置完成后再同时启动以避免初始状态不同步。5.3 常见问题排查清单现象可能原因排查步骤与解决方案捕获不到任何数据1. 引脚复用未配置为eCAP功能。2.CAPLDEN位未使能。3. 输入信号电平不匹配如3.3V MCU接收5V信号。4. 预分频设置过大事件被过滤。1. 检查GPIO复用配置寄存器。2. 确认ECCTL1[CAPLDEN]1。3. 使用电平转换器或分压电阻。4. 检查ECCTL1[PRESCALE]尝试设置为旁路0。捕获的数据全为0或固定值1.TSCTR计数器未启动ECCTL2[TSCTRSTOP]0。2. 在单次模式下未执行RE-ARM操作。3. 中断标志未清除导致后续中断被屏蔽。1. 启动计数器ECCTL2[TSCTRSTOP]1。2. 在单次捕获前向ECCTL2[RE-ARM]写1。3. 在ISR中确保清除ECFLG和ECCLR相应位。APWM模式无输出1. 模式未切换到APWMECCTL2[CAP/APWM]0。2. 引脚复用配置错误。3. 周期值APRD设置过大或为0。4. 输出极性APWMPOL配置与预期相反。1. 设置ECCTL2[CAP/APWM]1。2. 确认GPIO配置为APWM输出。3. 检查CAP1寄存器值确保大于0且合理。4. 用示波器观察或尝试切换极性。测量值波动大抖动1. 输入信号本身有噪声或抖动。2. 系统时钟SYSCLK不稳定。3. 中断响应延迟导致读取CAPx寄存器时间过晚在连续模式下旧数据可能被覆盖。1. 对输入信号进行硬件滤波RC电路或软件滤波中值/均值。2. 检查MCU时钟源和PLL配置。3. 提高中断优先级或在中断中尽快读取数据。对于高速连续信号考虑使用DMA将CAPx寄存器数据直接搬移到内存。差值模式下计算结果错误CTRRSTx位配置错误未在需要的事件上设置复位。例如想测量每个脉冲的周期却只在CEVT1上设置了复位。仔细检查ECCTL1中CTRRST1-CTRRST4的配置。对于连续差值测量通常需要将所有4个事件的CTRRSTx都置1。5.4 性能优化与进阶思考使用DMA对于需要连续高速捕获大量时间戳的应用如高频脉冲序列分析频繁的中断会带来巨大的CPU开销。许多高端MCU支持将eCAP的捕获寄存器与DMA控制器连接。可以配置DMA在每次CEVTx事件发生时自动将CAPx寄存器的值传输到指定的内存缓冲区中。CPU只需在缓冲区半满或全满时处理一批数据极大降低了中断频率。结合ePWM模块eCAP和ePWM模块是天然的互补组合。可以用ePWM模块产生一个精确的、带死区的PWM信号来驱动功率开关如电机逆变器同时用eCAP模块来捕获电流采样ADC的同步信号或编码器反馈信号实现硬件的闭环控制同步。校准与补偿任何硬件定时都有微小的偏差。对于超高精度应用可以考虑在已知精确频率的参考源下测量eCAP的捕获值计算出一个校准系数在软件中进行补偿。此外注意信号从输入引脚到内部捕获逻辑的物理路径延迟虽然通常很小但在纳秒级应用中需考虑。