深入解析C2000 eCAP模块:从信号捕获到PWM生成的双重应用

发布时间:2026/7/22 18:14:57
深入解析C2000 eCAP模块:从信号捕获到PWM生成的双重应用 1. 从“计时”到“控制”eCAP模块的双重使命在嵌入式实时控制的世界里时间就是一切。无论是测量电机编码器脉冲的间隔还是生成驱动开关管的精确PWM信号其核心都离不开对时间的精准感知与操控。很多工程师初次接触德州仪器TIC2000系列微控制器时可能会被其丰富的外设搞得眼花缭乱其中eCAPEnhanced Capture模块就是一个典型代表——它名字叫“捕获”却又能干“PWM”的活这种设计背后其实藏着TI对系统集成和资源复用极致的考量。简单来说你可以把eCAP模块理解为一个高度智能化的“秒表”兼“信号发生器”。在捕获模式下它是个专注的“记录员”外部引脚ECAPx上一有风吹草动上升沿或下降沿它就立刻看一眼自己内部的32位计数器TSCTR把这个“时刻”记录下来存进CAP1-CAP4这四个“笔记本”里。这非常适合测量脉冲宽度、信号周期或频率。而在APWM模式下它摇身一变成为精准的“指挥家”内部的计数器循环往复地计数并与你预设的“周期值”APRD和“比较值”ACMP进行比较从而在引脚上输出占空比可调的PWM波形用于控制电机转速、LED亮度或开关电源的功率。我最初用这个模块是做无刷直流电机的霍尔传感器测速。三个霍尔传感器输出方波需要精确捕获其边沿来计算转速和换相点。eCAP的四个独立捕获寄存器正好可以应对多路信号其连续/单次模式、事件预分频等功能让代码写起来非常清爽。后来做数字电源又用它的APWM模式来生成互补PWM其影子寄存器Shadow Register机制保证了PWM参数更新的同步与无毛刺这是稳定运行的关键。下面我就结合手册和实际踩过的坑把这个模块里里外外讲透让你不仅能看懂手册框图更能写出稳健可靠的驱动代码。2. 模块架构总览一图胜千言要驾驭eCAP首先得在脑子里建立起它的整体架构模型。手册里的框图信息量很大我们把它拆解成几个核心功能区来理解。2.1 核心引擎32位时间戳计数器TSCTR与相位控制这是eCAP模块的“心脏”是一个由系统时钟SYSCLK驱动的32位向上计数器。它所有的“时间”概念都源于此。无论是捕获模式下的时间戳还是APWM模式下的周期基准都是这个计数器当前的值CTR[31:0]。相位寄存器CTRPHS是它的“调谐器”。你可以给CTRPHS写入一个值然后通过软件同步SWSYNC或外部同步输入SYNCI事件将这个值加载到TSCTR中。这有什么用呢想象一下多个eCAP或ePWM模块需要协同工作比如做三相电机控制时三个PWM通道需要互差120度。通过设置不同的CTRPHS值并同步加载就能轻松实现这种相位偏移让各个模块的计数器不是同时从0开始而是有一个初始的相位差。注意在APWM模式下当计数器达到周期值CTRPRD时TSCTR会自动复位为0开始下一个周期。但在捕获模式下TSCTR是自由运行的除非你配置了事件复位它会一直累加直到溢出0xFFFFFFFF - 0x00000000并可以触发溢出中断CTROVF。设计长周期测量时必须考虑溢出处理。2.2 捕获模式的信号处理流水线当模块配置为捕获模式ECCTL2[CAP/APWM] 0时外部信号从ECAPx引脚进入需要经过一系列处理才会最终成为寄存器里的一个时间戳值。这个过程像一条流水线事件预分频器Event Prescaler由ECCTL1[13:9]的PRESCALE位控制。输入信号可能频率很高直接让计数器捕获每一个边沿会导致中断过于频繁消耗大量CPU资源。预分频器可以按2~62步进为2进行分频或者直接旁路Bypass。例如设置PRESCALE2除以4那么每4个输入边沿才会产生1个“有效边沿”进入下一级。这相当于一个简单的抗干扰滤波和降频。边沿极性选择Edge Polarity Select经过预分频后的信号会送到4个独立的极性选择多路复用器对应CEVT1到CEVT4四个捕获事件。每个事件都可以通过ECCTL1中的CAP1POL~CAP4POL位独立配置为在上升沿0或下降沿1触发。这是实现脉宽测量的关键通常CEVT1设为上升沿触发CEVT2设为下降沿触发那么两次捕获值之差就是高电平脉宽。模4序列器Modulo 4 Sequencer与连续/单次控制这是eCAP最精妙的设计之一。它是一个2位的状态机0-1-2-3-0循环决定了当前到来的有效边沿应该加载到哪个捕获寄存器CAP1~CAP4。连续模式CONT/ONESHT0序列器循环运行捕获事件按顺序循环覆盖CAP1到CAP4像一个环形缓冲区。适用于连续监控信号。单次模式CONT/ONESHT1序列器在捕获了指定次数由STOP_WRAP值决定1~4次后自动停止并禁止后续的捕获加载直到你通过软件“重新武装”RE-ARM。这适用于精确捕获一个特定序列比如捕获一个完整方波周期的上升沿和下降沿。捕获寄存器加载当序列器指向某个序号比如1且对应的加载使能CAPLDEN有效时当前TSCTR计数器的值就会被锁存到对应的CAPx寄存器中。你还可以通过CTRRSTx位配置在某个事件捕获后是否复位TSCTR计数器。如果复位那么CAPx中存储的就是相对于上一次复位的时间间隔差分模式如果不复位存储的就是自计数器启动以来的绝对时间戳。2.3 APWM模式下的双缓冲比较逻辑切换到APWM模式ECCTL2[CAP/APWM] 1后模块的关注点从“外部输入”转向“内部比较输出”。此时CAP1和CAP2寄存器被赋予了新的角色CAP1变为活动周期寄存器Active Period, APRD其值决定了PWM波的周期。CAP2变为活动比较寄存器Active Compare, ACMP其值与计数器比较决定输出电平翻转的时机从而控制占空比。而CAP3和CAP4则成为对应的影子寄存器Shadow Register分别映射为APRD shadow和ACMP shadow。这是实现PWM参数无毛刺更新的核心机制。你可以在任何时刻安全地向影子寄存器CAP3/CAP4写入新的周期或比较值而这个值不会立即生效影响正在输出的PWM波。只有当特定的“影子加载事件”发生时通常是当计数器等于周期值CTRPRD即一个PWM周期结束时影子寄存器的内容才会一次性同步地加载到活动寄存器中。这样PWM的周期和占空比可以在下一个周期无缝切换避免了中间状态可能产生的窄脉冲或毛刺。2.4 中断系统的协同eCAP提供了丰富的中断源在两种模式下各有侧重捕获模式主要关注CEVT1~CEVT4四个捕获事件中断以及计数器溢出中断CTROVF。APWM模式主要关注周期匹配中断CTRPRD和比较匹配中断CTRCMP。所有中断的使能由ECEINT寄存器控制状态标志在ECFLG寄存器中清除标志用ECCLR寄存器甚至可以用ECFRC寄存器软件强制触发中断进行测试。一个至关重要的细节是全局中断标志INTECFLG[0]。当任何一个使能的中断事件发生时INT位会被置1并且模块会向PIE外设中断扩展器发出一个中断脉冲。在中断服务程序ISR中你必须先清除具体的事件标志如CEVT1最后再清除INT标志。如果只清除了事件标志而忘了清INT模块将不会再产生新的中断脉冲。这个顺序是很多初学者容易出错的地方。3. 关键寄存器详解与配置策略手册里寄存器列表很长我们挑出最核心、配置时最容易混淆的几个结合应用场景来解读。3.1 控制寄存器ECCTL2模式与同步的指挥所这个寄存器是模块的“模式开关”和“同步中枢”。位域名称功能详解与配置心得9CAP/APWM模式选择核心。0捕获模式1APWM模式。切换此位会重置模块部分逻辑建议在模块初始化停止计数器后进行。10APWMPOLAPWM输出极性。0高有效CMP值定义高电平时间1低有效。根据你的驱动电路如上桥臂用高有效下桥臂用低有效来设定。8SWSYNC软件同步触发。写1会强制产生一次同步事件将CTRPHS的值加载到TSCTR。用于手动同步多个模块的时基。7-6SYNCO_SEL同步输出选择。决定本模块同步输出信号SYNCO的来源。00直接转发SYNCI输入直通01使用本模块的CTRPRD事件作为SYNCO10/11禁止同步输出。用于构建模块间的同步链。5SYNCI_EN同步输入使能。1使能当SYNCI引脚有事件或SWSYNC时用CTRPHS值加载TSCTR。0CONT/ONESHT捕获模式运行方式。0连续模式1单次模式。单次模式配合STOP_WRAP和REARM非常适合捕获固定长度的脉冲串。配置心得做多模块同步时我通常的链路设计是指定一个模块为“主”Master将其SYNCO_SEL设为CTRPRD并将其SYNCO输出连接到其他“从”Slave模块的SYNCI输入。从模块使能SYNCI_EN并设置各自的CTRPHS以获得相位差。这样主模块每个PWM周期结束都会触发同步所有从模块的计数器同时加载相位值实现精确同步。3.2 控制寄存器ECCTL1捕获行为的精细调校这个寄存器专注于捕获模式下的细节控制。位域名称功能详解与配置心得13-9PRESCALE事件预分频。手册中定义的值0-31对应分频系数1,2,4,6,8,10,...,60,62。计算实际分频数N的公式是N 2 * (PRESCALE 1)。例如PRESCALE0N2PRESCALE4N10。设为0则旁路分频器。8CAPLDEN捕获加载使能。必须置1捕获事件发生时才会将时间戳加载到CAPx寄存器。单次模式下当序列器停止时硬件会自动清零此位。7,5,3,1CTRRST4/3/2/1事件捕获后复位计数器。这是实现“差分测量”和“绝对测量”的关键。如果测量单个脉冲宽度可以设置CTRRST10首次上升沿不复位CTRRST21下降沿捕获后复位这样CAP2里存的就是脉宽值。如果测量周期可以设置CTRRST11这样每次上升沿捕获后计数器归零CAP1里存的就是周期值。6,4,2,0CAP4/3/2/1POL捕获事件边沿极性。灵活配置这四个位可以捕获任意边沿组合。例如测量一个高电平脉冲CAP1POL0上升沿CAP2POL1下降沿CAP3POL0下一个上升沿这样就可以同时得到脉宽和周期。配置心得PRESCALE的配置需要根据输入信号频率和系统时钟综合考量。假设系统时钟为100MHz输入信号为1MHz如果你希望每捕获一个边沿就中断一次那么中断频率是1MHzCPU负担会极重。此时可以设置PRESCALE让每10个边沿才产生一次捕获PRESCALE4分频10中断频率降为100kHz合理很多。另外在单次模式下修改STOP_WRAP值后必须重新ARM写ECCTL2[REARM]1才能使新配置生效这是一个容易忽略的步骤。3.3 中断相关寄存器组可靠事件响应的保障中断处理是实时系统的核心eCAP的中断逻辑需要清晰理解。ECFLG标志寄存器只读。任何中断事件如CEVT1, CTRPRD发生时对应的位会被硬件置1。INT位是总开关任何使能的中断事件置位后INT也会置1并产生到CPU的中断脉冲。ECEINT使能寄存器你需要在这里使能你关心的具体中断源。例如在捕获模式使能CEVT1和CEVT2在APWM模式使能CTRPRD。ECCLR清除寄存器写1清除对应的标志位。清除顺序很重要在ISR里先清除具体事件标志如CEVT1最后清除INT标志。如果先清INT而事件标志还在可能会立即再次触发INT置位导致中断异常。ECFRC强制寄存器调试利器。可以软件写1来模拟某个事件发生强制置位对应的标志位并可能触发中断用于测试你的中断服务程序是否正确。一个典型的中断服务程序框架如下__interrupt void ecap1Isr(void) { // 1. 判断是哪个事件触发的中断通常通过ECFLG判断 if (ECap1Regs.ECFLG.bit.CEVT1 1) { // 处理捕获事件1 g_capture1_value ECap1Regs.CAP1; // 读取捕获值 // ... ECap1Regs.ECCLR.bit.CEVT1 1; // 清除事件1标志 } if (ECap1Regs.ECFLG.bit.CEVT2 1) { // 处理捕获事件2 ECap1Regs.ECCLR.bit.CEVT2 1; } // ... 处理其他事件 // 2. 最后必须清除全局中断标志位以允许新的中断产生 ECap1Regs.ECCLR.bit.INT 1; // 3. 如果需要清除PIE组应答位 PieCtrlRegs.PIEACK.all PIEACK_GROUP4; // 假设eCAP1在GROUP4 }4. 捕获模式实战从信号测量到代码实现理论讲完了我们来看具体怎么用。假设一个经典场景测量一个未知频率的方波信号同时得到其占空比。4.1 需求分析与配置规划目标测量方波的周期和正脉宽。 方法利用eCAP的单次模式顺序捕获第一个上升沿CEVT1、第一个下降沿CEVT2和第二个上升沿CEVT3。那么周期 CAP3 - CAP1正脉宽 CAP2 - CAP1 假设计数器没有在中间复位即使用绝对时间戳模式。配置规划工作模式捕获模式CAP/APWM0单次模式CONT/ONESHT1捕获3个事件后停止STOP_WRAP2。边沿极性CEVT1上升沿CEVT2下降沿CEVT3上升沿。计数器行为采用绝对时间戳不自动复位CTRRSTx均0。这样CAPx里存的就是事件发生时TSCTR的绝对值。中断使能CEVT3中断因为第三个事件发生时我们需要的三个时间戳都已就绪。预分频根据输入信号最大预期频率和系统时钟设置假设信号频率不高直接旁路PRESCALE0。4.2 初始化代码步骤与详解以下是基于TI C2000芯片如TMS320F28379D的典型初始化代码。代码中使用了TI提供的驱动程序库DriverLib风格的宏便于理解。// 假设使用ECAP1模块系统时钟SYSCLK 200MHz void ECAP1_Capture_Init(void) { // 步骤1禁用模块并置于已知状态可选但推荐 ECap1Regs.ECCTL2.bit.TSCTRSTOP EC_FREEZE; // 停止计数器 ECap1Regs.ECCTL2.bit.CAP_APWM EC_CAP_MODE; // 确保为捕获模式 ECap1Regs.ECCTL2.bit.CONT_ONESHT EC_ONESHOT; // 单次模式 ECap1Regs.ECCTL2.bit.STOP_WRAP EC_EVENT3; // 3个事件后停 // 步骤2配置捕获事件的具体行为 ECap1Regs.ECCTL1.bit.CAPLDEN EC_ENABLE; // 使能捕获加载 ECap1Regs.ECCTL1.bit.CTRRST1 EC_ABS_MODE; // 事件1后不复位计数器 ECap1Regs.ECCTL1.bit.CTRRST2 EC_ABS_MODE; // 事件2后不复位 ECap1Regs.ECCTL1.bit.CTRRST3 EC_ABS_MODE; // 事件3后不复位 ECap1Regs.ECCTL1.bit.CAP1POL EC_RISING; // 事件1上升沿 ECap1Regs.ECCTL1.bit.CAP2POL EC_FALLING; // 事件2下降沿 ECap1Regs.ECCTL1.bit.CAP3POL EC_RISING; // 事件3上升沿 ECap1Regs.ECCTL1.bit.PRESCALE EC_DIV1; // 预分频旁路 (除以1) // 步骤3配置中断 ECap1Regs.ECEINT.bit.CEVT3 EC_ENABLE; // 使能事件3中断 // 注意ECEINT.bit.CEVT1/2 未使能因为我们只在序列完成时处理 ECap1Regs.ECCLR.all 0xFFFF; // 清除所有可能悬而未决的中断标志 ECap1Regs.ECFRC.all 0; // 确保强制寄存器为0 // 步骤4启动捕获序列 ECap1Regs.ECCTL2.bit.REARM EC_ARM; // 武装单次序列清零Mod4计数器使能加载 ECap1Regs.ECCTL2.bit.TSCTRSTOP EC_RUN; // 启动32位计数器 // 步骤5配置PIE和CPU中断此处略与具体芯片相关 // 例如将ECAP1_INTPIE组4中断1指向我们的ISR并使能中断。 }关键点解析REARM操作是单次模式的“启动扳机”。它不仅清零了内部的模4序列器还重新允许了捕获加载如果之前因为停止而禁止了。每次想要开始一次新的单次捕获序列都必须执行一次REARM。我们只使能了CEVT3中断因为前两个事件CEVT1, CEVT2只是过程数据在CEVT3发生时才完整。这减少了不必要的中断开销。计数器在初始化最后才启动TSCTRSTOP EC_RUN确保配置完成后再开始计数避免捕获到混乱的初始值。4.3 中断服务程序与数据处理当第三个事件第二个上升沿发生时触发中断。在ISR中我们读取数据并重新武装模块以进行下一次测量。volatile uint32_t g_period_ticks 0; volatile uint32_t g_pulse_width_ticks 0; __interrupt void ECAP1_ISR(void) { // 读取三个捕获寄存器的值 uint32_t cap1 ECap1Regs.CAP1; uint32_t cap2 ECap1Regs.CAP2; uint32_t cap3 ECap1Regs.CAP3; // 计算周期和脉宽注意32位溢出处理 if (cap3 cap1) { g_period_ticks cap3 - cap1; } else { // 处理计数器溢出情况cap3 cap1 意味着 cap3 是下一次溢出后的值 g_period_ticks (0xFFFFFFFF - cap1) cap3 1; } if (cap2 cap1) { g_pulse_width_ticks cap2 - cap1; } else { g_pulse_width_ticks (0xFFFFFFFF - cap1) cap2 1; } // 将tick值转换为时间单位秒 // 假设系统时钟 SYSCLK 200MHz则每个tick为5ns float period_sec (float)g_period_ticks * 5e-9; float pulse_width_sec (float)g_pulse_width_ticks * 5e-9; float duty_cycle (float)g_pulse_width_ticks / g_period_ticks * 100.0f; // 清除中断标志必须按顺序 ECap1Regs.ECCLR.bit.CEVT3 1; // 清除具体事件标志 ECap1Regs.ECCLR.bit.INT 1; // 最后清除全局中断标志 // 重新武装模块准备下一次捕获 ECap1Regs.ECCTL2.bit.REARM EC_ARM; // 确认PIE中断应答具体寄存器名因芯片而异 PieCtrlRegs.PIEACK.all PIEACK_GROUP4; }重要提示32位溢出处理。TSCTR是32位自由运行计数器约每21.47秒200MHz时钟下溢出一次。在计算时间差时必须考虑溢出情况。上面的if-else判断是一种简单的处理方法。更稳健的方法是使用uint64_t中间变量进行计算uint64_t diff (uint64_t)cap3 - (uint64_t)cap1;因为C语言中无符号数的减法在溢出时会自动得到正确模差值但转换为64位可以安全地处理所有情况。5. APWM模式实战生成精密的PWM波形现在我们把eCAP变成PWM发生器。假设我们需要生成一个频率为100kHz占空比为30%的PWM波。5.1 参数计算与配置规划系统时钟SYSCLK200 MHz期望PWM频率Fpwm100 kHz期望占空比D30%计算步骤PWM周期对应的计数器tick数APRD周期 T 1 / Fpwm 1 / 100,000 Hz 10 µs每个tick的时间 T_tick 1 / SYSCLK 1 / 200e6 Hz 5 nsAPRD T / T_tick 10e-6 / 5e-9 2000(0x7D0)注意APRD是周期值计数器从0计数到APRD包含所以实际计数值是APRD1个tick。但通常我们说的周期值APRD就是指这个寄存器值。比较值ACMP高电平时间假设高有效 T_high D * T 0.3 * 10 µs 3 µsACMP T_high / T_tick 3e-6 / 5e-9 600(0x258)对于高有效模式APWMPOL0当计数器小于ACMP时输出高大于等于ACMP时输出低。配置规划工作模式APWM模式CAP/APWM1。影子加载模式为了无毛刺更新我们使用影子寄存器。在CTRPRD时加载这是默认且最安全的方式。输出极性高有效APWMPOL0。中断使能CTRPRD中断用于在周期结束时执行一些控制算法如更新下一个周期的ACMP值。5.2 初始化代码与动态更新#define PWM_PERIOD_TICKS 2000 // APRD #define PWM_DUTY_TICKS 600 // 初始ACMP void ECAP1_APWM_Init(void) { // 步骤1停止计数器配置为APWM模式 ECap1Regs.ECCTL2.bit.TSCTRSTOP EC_FREEZE; ECap1Regs.ECCTL2.bit.CAP_APWM EC_APWM_MODE; // 步骤2配置APWM参数 ECap1Regs.ECCTL2.bit.APWMPOL EC_ACTV_HI; // 高有效输出 // SYNCO_SEL, SYNCI_EN等根据同步需求配置此处假设独立运行 // 步骤3初始化活动寄存器和影子寄存器 // **关键在APWM模式下写入活动寄存器(CAP1/CAP2)会同时写入影子寄存器(CAP3/CAP4)** ECap1Regs.CAP1 PWM_PERIOD_TICKS; // 写入APRD活动寄存器同时更新APRD影子 ECap1Regs.CAP2 PWM_DUTY_TICKS; // 写入ACMP活动寄存器同时更新ACMP影子 // 此时CAP1CAP3PWM_PERIOD_TICKS, CAP2CAP4PWM_DUTY_TICKS // 步骤4配置中断可选用于周期更新 ECap1Regs.ECEINT.bit.CTR_PRD EC_ENABLE; // 使能周期匹配中断 ECap1Regs.ECCLR.all 0xFFFF; // 步骤5启动计数器 ECap1Regs.ECCTL2.bit.TSCTRSTOP EC_RUN; // 步骤6配置GPIO复用将ECAP1引脚设置为PWM输出功能此处略参考芯片数据手册 } // 中断服务程序中动态更新占空比 __interrupt void ECAP1_APWM_ISR(void) { // 假设根据某些算法计算出了新的比较值 new_compare uint32_t new_compare ...; // 你的控制算法计算结果 // **安全更新写入影子寄存器CAP4 (ACMP shadow)** ECap1Regs.CAP4 new_compare; // 新值将在下一个PWM周期开始时生效 // 清除中断标志 ECap1Regs.ECCLR.bit.CTR_PRD 1; ECap1Regs.ECCLR.bit.INT 1; PieCtrlRegs.PIEACK.all PIEACK_GROUP4; }影子寄存器机制详解这是APWM模式稳定性的基石。在初始化时我们直接写CAP1和CAP2此时影子寄存器CAP3和CAP4也被同步写入可以理解为“立即模式”。而在运行中更新时我们只写影子寄存器CAP4对于比较值或CAP3对于周期值。硬件会在下一个CTRPRD事件即当前PWM周期结束时自动将影子寄存器的值加载到活动寄存器从而在周期边界同步切换完全避免了在PWM周期中间更新比较值可能产生的短脉冲毛刺。警告不要直接在运行中写活动寄存器CAP2。如果你在计数器值介于旧ACMP和新ACMP之间时写CAP2输出可能会立即翻转产生一个宽度异常的脉冲。务必使用影子寄存器更新机制。5.3 高级应用带死区插入的互补PWM虽然eCAP本身不象ePWM模块那样集成死区发生器Dead-Band Generator但我们可以利用两个eCAP模块或一个eCAP和一个ePWM来生成带死区的互补PWM。基本思路是主模块eCAP1生成基础PWM从模块eCAP2生成互补PWM并通过设置不同的CTRPHS值相位偏移来引入死区时间。主模块eCAP1配置为APWM模式输出主PWM例如高有效。从模块eCAP2配置为APWM模式输出互补PWM低有效。同步与相位设置使能eCAP1的同步输出SYNCO_SEL CTR_PRD连接到eCAP2的SYNCI输入。使能eCAP2的同步输入SYNCI_EN 1。计算死区时间对应的tick数DeadTime_Ticks DeadTime / T_tick。设置eCAP2的相位寄存器CTRPHS DeadTime_Ticks。效果当eCAP1的计数器在周期结束时复位并发出同步信号时eCAP2的计数器会加载其CTRPHS值死区时间从而延迟启动。这样eCAP2的输出边沿就比eCAP1的对应边沿晚了一个死区时间实现了互补输出之间的死区。6. 调试技巧与常见问题排查即使理解了原理和配置实际调试中还是会遇到各种问题。下面分享一些我积累的排查经验和技巧。6.1 捕获模式常见问题现象可能原因排查步骤与解决方案捕获不到任何值CAPx寄存器始终为01. 输入引脚GPIO复用未配置为ECAP功能。2. 捕获加载未使能CAPLDEN0。3. 模块未武装单次模式下REARM未执行。4. 计数器未启动TSCTRSTOP0。5. 输入信号电平不满足GPIO要求。1. 检查GPIOxMUX/GPIOxGMUX寄存器确认引脚已配置到ECAP。2. 确认ECCTL1[CAPLDEN]1。3. 单次模式下检查是否执行了ECCTL2[REARM]1。4. 确认ECCTL2[TSCTRSTOP]1。5. 用示波器或逻辑分析仪检查引脚是否有信号电平是否在VIL/VIH范围内。只能捕获到第一个事件1. 单次模式下STOP_WRAP设置成了1EC_EVENT1。2. 连续模式下但读取CAPx寄存器后没有及时处理被后续事件覆盖。1. 检查ECCTL2[STOP_WRAP]值确保它大于你期望的事件数。2. 在连续模式下确保中断服务程序或主循环读取CAPx的速度快于信号频率或使用DMA传输捕获值。捕获值间隔异常非常大或为01. 预分频器PRESCALE设置过大导致有效事件间隔拉长。2. 计数器复位模式CTRRSTx配置错误。例如想测脉宽却配置了事件后复位。3. 32位计数器溢出未处理。1. 核对PRESCALE值根据信号频率调整。2. 仔细检查CTRRST1~4的配置是否符合你的测量意图绝对时间戳还是差分。3. 在中断中检查CTROVF标志并在计算时间差时加入溢出补偿逻辑如前文代码所示。中断不触发1. 具体事件中断未使能ECEINT。2. 全局中断INT标志未清除阻塞了新中断。3. PIE或CPU级中断未使能。4. 中断标志在ISR外被意外清除。1. 检查ECEINT寄存器确认对应事件位已置1。2.确保ISR中先清具体事件标志最后清INT标志。3. 检查PIEIER组使能、PIEACK组应答和CPU的IER、INTM位。4. 避免在主循环或其他地方操作ECCLR寄存器。6.2 APWM模式常见问题现象可能原因排查步骤与解决方案无PWM输出1. 引脚未配置为APWM输出功能。2. 模块未工作在APWM模式CAP/APWM0。3. 计数器未启动。4. 周期值APRD设置过大远大于计数器最大值或为0。1. 双重检查GPIO复用配置。2. 确认ECCTL2[CAP/APWM]1。3. 确认ECCTL2[TSCTRSTOP]1。4. 检查CAP1APRD寄存器值是否合理非零且小于0xFFFFFFFF。PWM频率或占空比不对1. 周期值APRD或比较值ACMP计算错误。2. 影子寄存器机制理解有误错误地写了活动寄存器。3. 系统时钟SYSCLK配置与计算时假设的不符。1. 重新计算APRD和ACMP使用示波器测量验证。2.运行时更新占空比务必只写影子寄存器CAP4ACMP。更新周期则写CAP3APRD。3. 确认系统时钟配置寄存器如PLL、分频器设置正确。PWM更新时出现毛刺1. 在PWM周期中间直接写入了活动寄存器CAP2。2. 更新周期CAP3和比较值CAP4未在同一个CTRPRD事件同步导致两者在时间上错开一个周期。1.绝对禁止在运行时写CAP1/CAP2。所有更新必须通过CAP3/CAP4。2. 如果需要同时更新周期和占空比应在同一个控制周期内先后写入CAP3和CAP4它们会在下一个周期边界同时生效。多个eCAP模块PWM不同步1. 同步链未正确配置SYNCI_EN, SYNCO_SEL。2. 相位寄存器CTRPHS设置错误。3. 主模块的计数器未启动或已停止。1. 确认主模块SYNCO_SEL设为CTR_PRD从模块SYNCI_EN1且物理连接正确。2. 检查从模块CTRPHS值计算其对应的延迟时间是否符合预期。3. 确保所有模块的TSCTRSTOP1且主模块先启动。6.3 调试工具箱寄存器观察窗口在CCSCode Composer Studio的调试视图中添加eCAP相关寄存器的监视。重点关注ECFLG中断标志、TSCTR计数器实时值、CAP1-CAP4捕获/PWM值。GPIO翻转调试法在中断服务程序ISR的开始和结束位置添加一条GPIO引脚翻转的语句。用示波器观察这个引脚可以直观看到ISR的执行频率和耗时判断中断是否正常触发、是否过于频繁。软件强制中断ECFRC在初始化后、主循环中可以尝试写ECFRC寄存器来强制触发某个中断事件用于测试你的ISR逻辑是否正确而不需要依赖真实的硬件信号。逻辑分析仪/示波器这是最直接的硬件调试工具。连接ECAPx引脚可以直观看到输入捕获信号的波形或者输出的PWM波形验证频率、占空比、边沿是否与预期一致。eCAP模块的灵活性带来了复杂性但一旦掌握了其双模式切换、影子寄存器、同步链这些核心概念它就会成为你手中应对精密计时和波形生成任务的强大工具。从简单的脉冲测量到复杂的多相PWM生成其设计都体现了对实时控制应用需求的深刻理解。