1. eCAP模块:嵌入式时序控制的瑞士军刀
在电机控制、数字电源或者任何需要精确时序的嵌入式项目里,你肯定遇到过这样的问题:需要测量一个脉冲信号的频率和占空比,或者需要生成一组严格同步且相位可调的PWM波形。用软件轮询GPIO?精度太差,CPU占用率高得吓人。用通用定时器模拟?逻辑复杂,资源占用多,同步更是噩梦。这时候,如果你用的是TI的C2000或者部分ARM Cortex-M系列微控制器,那么你手边就藏着一件被严重低估的利器——增强型捕获模块,也就是eCAP。
我第一次在无刷电机驱动项目里深挖eCAP,是因为需要同时捕获电机霍尔传感器的换相信号并生成互补PWM。当时觉得,一个外设既能抓信号又能发信号,是不是两边都做不精?实际用下来才发现,它把这两件事都做到了硬件级的高效和精准。简单来说,你可以把eCAP理解为一个带4级深度FIFO和精密计时器的硬件“快照”相机,或者一个可灵活配置的PWM信号发生器。它最核心的价值,是把时间测量和波形生成这种对实时性要求极高的任务,从软件中彻底解放出来,交给专用硬件去完成,从而为CPU减负,让系统响应更 deterministic。
这篇文章,我就结合自己踩过的坑和项目经验,带你彻底搞懂TI eCAP模块。我们不只停留在手册的寄存器描述,而是深入它从捕获到PWM生成两种模式的工作原理、配置要点,并通过几个典型的实战场景——比如测量脉冲宽度、生成多路同步PWM、实现三相交错电源的相位控制——来展示如何把它用活。无论你是正在调试电机驱动,还是设计需要精密时序的测量设备,这篇文章都能给你提供可直接“抄作业”的配置思路和避坑指南。
2. 核心架构与工作模式解析
要玩转eCAP,不能只知其然,必须知其所以然。它的设计非常巧妙,通过一套硬件资源,以不同的配置服务于两种截然不同的需求:输入捕获和输出比较。我们先来拆解它的核心家当。
2.1 硬件资源全景图
eCAP模块的核心硬件可以概括为“一个核心,两套逻辑,四个仓库”。
时间基准:32位时间戳计数器这是eCAP的心脏,一个32位向上计数器。在捕获模式下,它自由运行,记录当前的时间值;在APWM模式下,它工作在增减计数或向上计数模式,作为PWM的时基。它的时钟源通常来自系统时钟分频,精度直接决定了整个模块的测量或输出分辨率。
事件识别与处理逻辑这是模块的“感官系统”。它连接到一个专用的输入/输出引脚。在捕获模式下,该引脚是输入,硬件可以检测上升沿、下降沿事件。在APWM模式下,该引脚变为输出,直接输出PWM波形。边缘检测极性是可编程的,这是实现差分模式测量的关键。
4级深度捕获寄存器这是模块的“记忆仓库”,即CAP1、CAP2、CAP3、CAP4这四个32位寄存器。这是eCAP设计最精妙的地方,它的角色在不同模式下完全不同:
- 捕获模式:它们是只读的“快照”存储单元。当指定的事件(如边沿)发生时,硬件会自动将此刻TSCTR计数器的值“抓拍”下来,存入其中一个寄存器。四个寄存器可以构成一个环形缓冲区,连续记录最多4个事件的时间戳。
- APWM模式:它们变身为一组“影子寄存器”系统。CAP1和CAP2作为活动寄存器,直接与比较器联动,决定PWM的周期和比较值。CAP3和CAP4则作为它们的影子寄存器。你可以在任何时候安全地向影子寄存器写入新的周期或占空比值,硬件会在下一个PWM周期开始时自动将其加载到活动寄存器,从而实现PWM参数的无毛刺、平滑更新。
灵活的工作模式切换这一切的魔法,都源于一个关键的配置位:ECCTL2.CAP_APWM。把它设为0,整个硬件逻辑切换到捕获模式,引脚变输入,寄存器准备存时间戳。把它设为1,硬件逻辑切换到APWM模式,引脚变输出,寄存器变成PWM发生器。这种硬件级的模式切换,使得同一个物理模块可以根据系统需求被动态重定义,极大地提高了资源利用率。
2.2 捕获模式:把时间“拍”下来
捕获模式的本质是高精度的时间戳记录仪。想象一下,你要测量一个方波的周期。最原始的方法是用CPU中断,在上升沿中断里读取系统时间,存下来,下次上升沿再读一次,两者相减。这个方法的问题在于中断响应有延迟,而且频繁中断会拖垮CPU。
eCAP的捕获模式把这一切都硬件化了。它的工作流程,特别是差分模式,是理解其价值的关键。
绝对时间戳 vs. 差分时间戳
- 绝对模式:每次捕获事件发生时,直接把TSCTR的当前值存入CAPx寄存器。你需要用软件做减法(CAP2 - CAP1)才能得到时间间隔。TSCTR会一直累加直到溢出归零。
- 差分模式:这是eCAP的杀手锏。通过配置
ECCTL1.CTRRSTx位,你可以让硬件在每次捕获事件发生后,自动将TSCTR清零。这样,下一次捕获到的时间戳,直接就是两次事件之间的时间差!省去了软件减法的步骤,也避免了32位计数器溢出带来的计算复杂度。
差分模式测量脉宽实例假设我们要测量一个PWM信号的高电平和低电平时间。配置流程如下:
- 设置CAP1捕获上升沿,并设置
CTRRST1 = 1(第一次捕获后复位计数器)。 - 设置CAP2捕获下降沿,并设置
CTRRST2 = 1(第二次捕获后复位计数器)。 - 设置CAP3捕获下一个上升沿,
CTRRST3 = 1。 - 设置CAP4捕获下一个下降沿,
CTRRST4 = 1,并将工作模式设置为连续模式。
当信号输入后,硬件会自动化执行以下操作:
- 第一个上升沿到来:触发CEVT1,将此刻TSCTR值(假设为0)存入CAP1,然后TSCTR复位并开始从0计数。
- 随后的下降沿到来:触发CEVT2,将TSCTR的当前值(即高电平时间T1)存入CAP2,TSCTR再次复位。
- 下一个上升沿到来:触发CEVT3,将TSCTR值(即低电平时间T2)存入CAP3,TSCTR复位。
- 再下一个下降沿到来:触发CEVT4,将TSCTR值(下一个高电平时间T3)存入CAP4,TSCTR复位。此时,Mod4计数器回绕,下一个事件将覆盖CAP1,如此循环。
这样一来,你只需要在中断中读取CAP2和CAP3,就能直接得到高电平和低电平的计数值,进而算出占空比。整个过程完全由硬件完成,精度仅取决于时钟频率,与软件延迟无关。
注意:在差分模式下,CAP1中存储的值通常是上一个周期的低电平时间(或0,如果是第一个周期),而CAP2、CAP3、CAP4则循环存储着最新的高、低电平时间。理解这个存储顺序对正确读取数据至关重要。
2.3 APWM模式:精准的波形“雕刻师”
当CAP_APWM位被置1,eCAP摇身一变,成为一个功能齐全的PWM发生器。此时,它的核心逻辑从“记录时间”转变为“比较时间”。
PWM生成的基本原理在APWM模式下,TSCTR计数器在0和周期值之间循环计数。CAP1寄存器被重新定义为周期活动寄存器,CAP2被定义为比较活动寄存器。同时,CAP3和CAP4作为它们的影子寄存器。
- 当TSCTR从0开始计数,小于比较值时,输出有效电平(由
APWMPOL位定义高有效或低有效)。 - 当TSCTR等于或大于比较值,但小于周期值时,输出无效电平。
- 当TSCTR计数到等于周期值时,产生周期匹配事件,TSCTR复位为0(或从CTRPHS加载),同时硬件���动将CAP3和CAP4影子寄存器的值加载到CAP1和CAP2活动寄存器,开始一个新的周期。
影子寄存器的妙用这是实现PWM参数无毛刺更新的核心。假设电机控制算法计算出一个新的占空比。如果直接写入CAP2,而写入的瞬间TSCTR刚好跨过这个新值,就会导致当前PWM周期出现一个极窄或极宽的脉冲,即“毛刺”,这在电机驱动中是致命的。通过影子寄存器机制,你可以安全地在任何时间将新值写入CAP4。硬件保证只在下一个周期开始时才生效,从而确保了PWM输出的连续性和平滑性。
同步与相位控制单个PWM生成并不稀奇,eCAP的强大之处在于多模块协同。通过SYNCI和SYNCO信号,多个eCAP模块可以串联起来。
- 主模块:可以配置为在TSCTR等于周期值时,产生一个
SYNCO同步输出脉冲。 - 从模块:可以配置为在接收到
SYNCI同步输入脉冲时,将其自身的TSCTR计数器复位为CTRPHS寄存器中设定的相位值。
这就为实现多通道同步PWM和精确的相位控制提供了硬件基础。例如,在三相逆变器中,你可以让三个eCAP模块同步运行,并分别设置不同的CTRPHS值,从而让三路PWM波彼此相差120度电角度。
3. 从捕获到APWM的实战配置详解
理解了原理,我们进入实战。手册里的寄存器表格往往让人望而生畏,我们把它翻译成具体的、可操作的步骤和代码。
3.1 捕获模式实战:测量PWM信号频率与占空比
假设我们需要测量一个频率约1kHz,占空比可变的PWM信号。系统时钟SYSCLK为100MHz,我们希望测量分辨率达到100ns。
第一步:引脚与时钟配置首先,将对应的GPIO引脚复用为eCAP功能。例如,在TI的C2000系列中,可能需要配置GPxMUX寄存器。确保eCAP模块的时钟使能。
第二步:关键寄存器初始化以下是基于差分模式、连续捕获的配置代码及详解:
// 假设使用 eCAP1 模块 void ECAP1_CAP_Init(void) { // 1. 停止计数器,确保安全配置 ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_STOP; // 2. 配置事件捕获控制寄存器1 (ECCTL1) ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING; // CAP1 捕获上升沿 ECap1Regs.ECCTL1.bit.CAP2POL = EC_FALLING; // CAP2 捕获下降沿 ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING; // CAP3 捕获上升沿 ECap1Regs.ECCTL1.bit.CAP4POL = EC_FALLING; // CAP4 捕获下降沿 // 设置为差分模式:每次捕获后复位计数器,CAPx中直接存储时间间隔 ECap1Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE; ECap1Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE; ECap1Regs.ECCTL1.bit.CTRRST3 = EC_DELTA_MODE; ECap1Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE; ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE; // 使能捕获事件时自动加载CAPx寄存器 ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1; // 事件预分频设为1(不分频) // 3. 配置事件捕获控制寄存器2 (ECCTL2) ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE; // 设置为捕获模式 ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS; // 连续捕获模式 ECap1Regs.ECCTL2.bit.STOP_WRAP = EC_WRAP_4; // 4个事件后回绕(覆盖CAP1) ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE; // 禁用外部同步输入 ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS; // 禁用同步输出 ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN; // 启动TSCTR计数器 // 4. 配置中断(可选,如果需要实时处理) ECap1Regs.ECEINT.bit.CEVT4 = 1; // 使能第4次捕获事件中断(一个完整周期结束) // ... 其他中断使能配置,并连接至PIE和CPU }第三步:中断服务程序与数据处理配置捕获完成中断后,在中断服务程序中进行计算:
__interrupt void ECAP1_ISR(void) { volatile uint32_t high_time, low_time, period, duty_cycle_percent; // 读取捕获值。在差分模式下,CAP2和CAP3通常对应一个完整周期的高电平和低电平时间 // 注意:由于是环形缓冲,需要根据当前Mod4计数器的状态判断哪个寄存器是最新数据 // 这里假设一个简单情况:每次进入中断都是CEVT4触发,即完成了一个完整的上升-下降-上升-下降循环 high_time = ECap1Regs.CAP2; // 高电平时间(计数值) low_time = ECap1Regs.CAP3; // 低电平时间(计数值) period = high_time + low_time; // 计算占空比(百分比)。注意防止除零和溢出。 if (period != 0) { duty_cycle_percent = (high_time * 100) / period; } else { duty_cycle_percent = 0; } // 计算频率(Hz)。假设系统时钟为100MHz,分频为1,则每个计数周期为10ns。 float freq_hz = 1.0 / ((float)period * 10e-9); // ... 将计算结果用于你的控制算法或发送出去 // 清除中断标志 ECap1Regs.ECCLR.bit.CEVT4 = 1; ECap1Regs.ECCLR.bit.INT = 1; // 应答PIE中断 PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; }实操心得:在差分模式下,理解CAPx寄存器数据的“流水线”顺序是关键。一个稳健的做法是,在中断中读取所有四个CAP寄存器,并配合
ECFLG寄存器中的事件标志位,来重构完整的信号时序,而不是假设固定的映射关系。这对于非对称或占空比快速变化的信号尤其重要。
3.2 APWM模式实战:生成单路与多路同步PWM
现在,我们切换到信号生成角色。假设我们需要用eCAP1生成一路频率为20kHz,占空比为30%的PWM。
第一步:计算寄存器值系统时钟100MHz,不分频。
- 周期值 = 系统时钟 / PWM频率 = 100,000,000 / 20,000 = 5000
- 比较值 = 周期值 * 占空比 = 5000 * 0.3 = 1500
第二步:单路PWM初始化配置
void ECAP1_APWM_Single_Init(void) { // 1. 停止计数器 ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_STOP; // 2. 配置为APWM模式,并设置初始参数 ECap1Regs.CAP1 = 5000; // 设置周期活动寄存器 (APRD) ECap1Regs.CAP2 = 1500; // 设置比较活动寄存器 (ACMP) // 注意:在APWM模式下,写入CAP1/CAP2会同时写入其影子寄存器CAP3/CAP4,实现立即加载。 ECap1Regs.ECCTL2.bit.CAP_APWM = EC_APWM_MODE; // APWM模式 ECap1Regs.ECCTL2.bit.APWMPOL = EC_ACTV_HI; // 高电平有效(比较值对应高电平时间) ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE; // 禁用同步输入(主模式) ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS; // 禁用同步输出(单路不需要) ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN; // 启动计数器 // 3. 使能周期匹配和比较匹配中断(如果需要) ECap1Regs.ECEINT.bit.PRDEQ = 1; ECap1Regs.ECEINT.bit.CMPEQ = 1; }第三步:动态更新占空比要安全地更新占空比,必须写入影子寄存器CAP4:
void Update_ECAP1_DutyCycle(uint32_t new_compare_val) { // 安全更新:写入影子寄存器CAP4,将在下一个PWM周期开始时生效 ECap1Regs.CAP4 = new_compare_val; // 注意:不要直接写CAP2,否则可能导致当前周期出现毛刺脉冲。 }第四步:构建多路同步PWM系统这是eCAP的进阶应用。假设我们需要4路PWM,频率分别为5kHz、10kHz、20kHz、25kHz,且要求它们同步启动,相位对齐。
设计思路:
- 主模块:选择频率最低的(5kHz)作为主模块(eCAP1)。将其配置为在周期匹配时产生同步输出脉冲(
SYNCO_SEL = EC_CTR_PRD)。 - 从模块:其他三个模块(eCAP2, eCAP3, eCAP4)配置为从模式,使能同步输入(
SYNCI_EN = EC_ENABLE),并将同步源选择为SYNCI。 - ��位对齐:所有从模块的
CTRPHS寄存器设置为0,这样它们在收到主模块的同步脉冲时,TSCTR从0开始计数,实现完全同步。
主模块(eCAP1)配置:
// eCAP1 主模块, 5kHz ECap1Regs.CAP1 = 20000; // 周期值 = 100MHz / 5kHz ECap1Regs.CAP2 = 7000; // 初始占空比 ECap1Regs.ECCTL2.bit.CAP_APWM = EC_APWM_MODE; ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_CTR_PRD; // 关键:周期匹配时产生SYNCO ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;从模块(eCAP2)配置:
// eCAP2 从模块, 10kHz (2倍频于主模块) ECap2Regs.CAP1 = 10000; // 周期值 = 100MHz / 10kHz ECap2Regs.CAP2 = 2000; // 初始占空比 ECap2Regs.ECCTL2.bit.CAP_APWM = EC_APWM_MODE; ECap2Regs.ECCTL2.bit.SYNCI_EN = EC_ENABLE; // 关键:使能同步输入 ECap2Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCI; // 同步输出选择为输入直通(可选) ECap2Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;eCAP3和eCAP4的配置类似,只需设置各自的CAP1(周期)和CAP2(比较)值。
注意事项:在多模块同步时,启动顺序很重要。应先启动所有从模块的计数器(
TSCTRSTOP = EC_RUN),最后再启动主模块。因为从模块在等待同步信号时,计数器是停止的。如果先启动主模块,从模块可能错过第一个同步脉冲。
4. 高级应用:三相交错DC-DC的相位控制
在诸如三相交错并联Buck/Boost变换器这样的拓扑中,各相PWM需要彼此间隔固定的相位差(例如120°),以减小输入输出电流纹波,优化磁件尺寸。eCAP的相位控制功能为此而生。
场景:控制一个三相交错DC-DC变换器,开关频率100kHz,各相之间相位差120°。
设计步骤:
- 确定主模块:选择eCAP1作为主模块,产生基准频率和同步信号。周期值 = 100MHz / 100kHz = 1000。
- 计算从模块相位偏移值:相位差转换为时间偏移。一个周期360°对应1000个计数。
- eCAP2 需要滞后 120°:
CTRPHS2 = (120/360) * 1000 ≈ 333 - eCAP3 需要滞后 240°:
CTRPHS3 = (240/360) * 1000 ≈ 667注意:实际计算需取整,并考虑计数器是向上计数,CTRPHS是计数器被同步时的加载值。
- eCAP2 需要滞后 120°:
- 配置主模块:使能周期同步输出。
- 配置从模块:使能同步输入,并设置各自的
CTRPHS值。
配置代码关键片段:
// eCAP1 主模块配置 ECap1Regs.CAP1 = 1000; // 100kHz 周期 ECap1Regs.CTRPHS = 0; // 主模块相位为0 ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_CTR_PRD; // 周期匹配时发出同步脉冲 // eCAP2 从模块配置 (滞后120°) ECap2Regs.CAP1 = 1000; // 相同频率 ECap2Regs.CTRPHS = 333; // 关键:设置相位偏移 ECap2Regs.ECCTL2.bit.SYNCI_EN = EC_ENABLE; ECap2Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCI; // 可继续传递同步信号 // eCAP3 从模块配置 (滞后240°) ECap3Regs.CAP1 = 1000; ECap3Regs.CTRPHS = 667; ECap3Regs.ECCTL2.bit.SYNCI_EN = EC_ENABLE; ECap3Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS; // 最后一个模块可禁用同步输出工作原理: 主模块eCAP1的TSCTR从0计数到999,然后归零,同时产生一个SYNCO脉冲。eCAP2和eCAP3在收到这个脉冲的瞬间,会立即将自己的TSCTR计数器加载为CTRPHS寄存器中的值(分别是333和667),然后开始向上计数。这样,三路PWM波就自然形成了120°的相位差。
避坑指南:相位值
CTRPHS必须小于周期值CAP1。如果设置CTRPHS等于或大于CAP1,在同步加载时,计数器会立刻触发周期匹配或比较匹配,导致输出异常。务必在软件中增加边界检查。
5. 寄存器精讲与配置陷阱
手册里的寄存器描述是权威,但也是“天书”。我结合调试经验,把几个最容易出错的寄存器配置要点提炼出来。
5.1 ECCTL1:捕获事件的“规则制定者”
这个寄存器定义了硬件如何响应输入引脚的变化。
- CAPxPOL:这是边沿极性选择。最常见的错误是设反了。记住:
0是上升沿,1是下降沿。在差分测量脉宽时,必须交替设置(如上升、下降、上升、下降)。 - CTRRSTx:差分模式开关。设为
1,该事件捕获后TSCTR自动清零。绝对模式下,所有CTRRSTx都应设为0;差分模式下,通常全部设为1,以实现每次捕获后重新计时。 - CAPLDEN:必须设为
1(使能),否则事件发生时不会将时间戳存入CAPx寄存器,你会永远读不到数据。 - PRESCALE:事件预分频。用于滤除高频毛刺。如果输入信号有噪声,可以设置一个分频值(如2或4),让硬件在连续检测到N个边沿后才认为是一个有效事件。但注意,这会降低时间分辨率。
5.2 ECCTL2:模式与同步的“总开关”
这是eCAP的“大脑”。
- CAP_APWM:最关键的位。0=捕获模式,1=APWM模式。模式切换后,引脚功能、寄存器含义、计数器行为全部改变。务必在计数器停止时切换此模式。
- CONT_ONESHT:连续/单次模式。捕获模式下,
0为连续模式(环形缓冲),1为单次模式(捕获指定次数后停止)。APWM模式下此位无效。 - STOP_WRAP:在连续捕获模式下,它定义环形缓冲区的“绕回点”。通常设为
3(即EC_WRAP_4),表示在第4个事件后绕回CAP1。如果设为2,则只使用CAP1-CAP3循环。 - SYNCI_EN / SYNCO_SEL:同步控制的核心。
SYNCI_EN=1:使能同步输入。当SYNCI引脚有事件时,TSCTR会加载CTRPHS的值。在APWM模式下,这是实现从模块相位控制的关键。SYNCO_SEL:选择同步输出源。00直通输入,01选择PRDEQ(周期匹配)事件,10和11为禁用。在多模块同步中,主模块应选01,从模块可选00或禁用。
- APWMPOL:仅APWM模式有效。决定了输出有效电平。
0=高有效(比较值对应高电平时间),1=低有效。务必根据后续驱动电路(如上桥臂驱动芯片是低有效还是高有效)来正确设置。
5.3 影子寄存器机制与更新策略
这是APWM模式稳定性的基石,也是最容易混淆的地方。
- 活动寄存器:CAP1(APRD)、CAP2(ACMP)。它们直接参与当前PWM周期的比较。
- 影子寄存器:CAP3(APRD影子)、CAP4(ACMP影子)。它们是后台寄存器。
- 加载时机:影子寄存器的值,只在TSCTR等于周期值(PRDEQ事件)时,才会被一次性加载到活动寄存器。
- 更新策略:
- 立即加载:直接写CAP1或CAP2。这会同时更新活动寄存器和对应的影子寄存器。风险是可能产生毛刺。
- 影子加载:写CAP3或CAP4。只更新影子寄存器,在下一个周期开始时生效。这是运行时更新PWM参数的标准安全做法。
手册中提到的“初始化时写活动寄存器”就是这个原因:上电初始化时,没有PWM输出,不存在毛刺风险,直接写CAP1/CAP2最方便。但在运行中动态调整,必须使用CAP3/CAP4。
6. 调试技巧与常见问题排查
即使配置看起来完美,实际调试中还是会遇到各种问题。下面是我总结的eCAP模块的“症状-诊断-解决”清单。
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 捕获模式下读不到数据 | 1. 引脚复用未配置。 2. CAPLDEN位未使能。3. 计数器未启动( TSCTRSTOP)。4. 中断标志未清除,导致后续事件不触发。 | 1. 检查GPIO的MUX配置,确保引脚功能选对。 2. 确认 ECCTL1.CAPLDEN = 1。3. 确认 ECCTL2.TSCTRSTOP = 1。4. 在中断服务程序中,读取数据后立即清除对应的 CEVTx和全局INT标志。 |
| 捕获的时间值异常大或为0 | 1. 差分/绝对模式配置错误。 2. 计数器溢出处理不当。 3. 事件预分频( PRESCALE)设置过大。 | 1. 检查CTRRSTx位。想测间隔用差分模式(=1),想测绝对时间用绝对模式(=0)。2. 在绝对模式下,TSCTR是32位,会溢出。计算时间差时需做溢出处理: delta = (current > previous) ? (current - previous) : (0xFFFFFFFF - previous + current + 1)。3. 检查 PRESCALE,如果信号频率不高但设了高分频,可能导致长时间无“有效”事件。 |
| APWM模式无输出或波形不对 | 1. 模式未切换(CAP_APWM=0)。2. 引脚配置为输入。 3. 周期或比较值为0。 4. 同步信号导致计数器不运行。 | 1. 确认ECCTL2.CAP_APWM = 1。2. 即使配置为APWM模式,部分芯片仍需将GPIO方向设置为输出。检查 GPxDIR寄存器。3. 确保 CAP1(周期)和CAP2(比较)已写入非零值,且CAP2 < CAP1。4. 对于从模块,检查是否使能了 SYNCI_EN但在等待永远不来的同步信号。可先禁用同步,测试单模块输出。 |
| 多路PWM不同步 | 1. 主从模块启动顺序错误。 2. 同步信号路径未连通。 3. 从模块 CTRPHS设置错误。 | 1.先启动所有从模块计数器,再启动主模块。确保从模块先进入“等待同步”状态。 2. 使用示波器或芯片的GPIO复用功能,将主模块的 SYNCO信号引出,检查是否有脉冲产生。3. 确认从模块 CTRPHS值小于其自身的CAP1周期值。 |
| 动态更新PWM参数时出现毛刺 | 运行时直接写入了活动寄存器CAP1或CAP2。 | 严格禁止在PWM运行时直接写CAP1/CAP2。所有运行时更新必须通过写入影子寄存器CAP3/CAP4来完成。 |
| 中断无法进入 | 1. PIE或CPU级中断未使能。 2. eCAP模块中断未使能( ECEINT)。3. 中断标志位在初始化时未清除。 | 1. 按层级检查:eCAP模块中断使能位 -> PIE组使能 -> CPU全局中断使能。 2. 确认 ECEINT寄存器中对应的CEVTx、PRDEQ或CMPEQ位已置1。3. 在初始化eCAP后、使能中断前,先写 ECCLR寄存器清除所有可能残留的标志位。 |
调试必备工具:
- 示波器:直接观察eCAP引脚波形,是判断有无输出、同步信号是否产生、相位关系是否正确的最直观手段。
- CCS的寄存器查看和内存查看:实时监控
TSCTR、CAPx、ECFLG等关键寄存器的值,看它们是否按预期变化。 - CPU定时器:在调试捕获功能时,可以用一个已知频率和占空比的PWM信号(可由另一个eCAP或GPIO模拟)作为eCAP的输入,方便验证测量结果。
最后,分享一个我自己的习惯:在编写任何eCAP初始化函数时,都会在开头加上ECCTL2.bit.TSCTRSTOP = EC_STOP;,在配置完成后再启动。这是一个防止在配置过程中计数器乱跑的好习惯。eCAP是一个强大的模块,初看复杂,但一旦理顺了其“捕获”和“比较”两条主线,理解了影子寄存器与同步机制,它就会成为你项目中解决时序难题的得力助手。