1. 项目概述从“捕获”到“生成”的硬件瑞士军刀在嵌入式实时控制的世界里时间就是一切。无论是精确测量电机编码器的脉冲间隔还是生成驱动开关电源的PWM信号核心需求都是对时间维度的精准掌控。传统上我们可能会用通用定时器配合中断来测量脉冲宽度或者用专用的PWM模块来生成波形。但有没有一种硬件能像瑞士军刀一样同时胜任“高精度测量”和“灵活生成”这两项看似矛盾的任务德州仪器TIC2000系列微控制器中的增强型捕获模块就是为回答这个问题而生的。eCAP模块全称Enhanced Capture Module是TMS320F280015x这类高性能实时微控制器上的一个外设明珠。它绝不是一个简单的输入捕获接口而是一个集成了32位时间戳计数器、4级深度捕获寄存器、灵活边沿触发逻辑甚至能摇身一变成为PWM发生器的多功能硬件单元。它的设计哲学很明确将最耗时、最要求确定性的时序处理任务从CPU肩上卸下来交给专用硬件去完成从而让CPU腾出手来处理更复杂的控制算法和系统管理。想象一下你要测量一个频率高达1MHz的PWM信号的占空比。如果用软件在中断里读取定时器值光是中断响应和上下文切换的时间抖动就可能带来数百纳秒的误差这对于精密控制来说是不可接受的。而eCAP模块可以在硬件层面在信号边沿到来的那个精确时钟周期自动将当前计数器的值“冻结”并存入FIFO整个过程零CPU干预精度直接取决于系统时钟。更进一步当你需要生成一个互补、带死区、或者有特定相移的PWM信号时eCAP模块可以切换到APWM模式利用其内部的周期和比较寄存器像一个小型的专用PWM发生器一样工作。本文将深入TMS320F280015x的eCAP模块内部不仅解读技术手册中的时序图和工作模式更会结合我多年在电机控制和数字电源项目中的实际使用经验拆解其从绝对/差值时间戳捕获到辅助PWM生成的全流程。我会重点分享如何根据不同的应用场景如测频、测脉宽、生成同步波形来选择和配置模式并附上关键寄存器的配置心得与避坑指南。无论你是正在评估C2000芯片的架构师还是正在调试传感器接口的工程师相信这篇关于eCAP原理与实战的深度解析都能为你提供直接的参考。2. eCAP模块核心架构与工作模式解析要玩转eCAP首先得理解它的“五脏六腑”。这个模块的设计非常精巧其核心是一个自由运行的32位时间戳计数器TSCTR和一个4状态的模4计数器Mod4 Counter。它们俩的配合构成了eCAP所有神奇功能的基石。2.1 核心硬件引擎TSCTR与Mod4计数器时间戳计数器TSCTR是eCAP模块的心跳。它通常由系统时钟SYSCLK驱动不断向上计数。这是一个32位的计数器意味着在200MHz的系统时钟下它的溢出周期长达约21.5秒2^32 / 200e6为超长周期的测量提供了可能。TSCTR是eCAP所有时序测量的绝对时间基准。模4计数器Mod4 Counter则像是一个智能的“流水线调度员”。它是一个2位计数器循环计数0-1-2-3-0…。它的核心作用是管理四个捕获寄存器CAP1-CAP4的轮转。每当一个有效的捕获事件由输入引脚边沿触发发生时Mod4计数器就会步进一次并决定当前时间戳该存入CAP1、CAP2、CAP3还是CAP4。这种设计形成了一个硬件FIFO可以连续捕获最多4个事件的时间戳而无需CPU立即读取极大地提高了系统的实时性和抗干扰能力。2.2 两种根本模式捕获模式 vs. APWM模式eCAP模块有两种根本的工作模式由ECCTL2.CAP_APWM位决定。这是理解其所有功能的第一步。捕获模式CAP Mode这是eCAP的“本职工作”。在此模式下配置的GPIO引脚作为输入模块的核心任务是监测该引脚上的信号边沿并在边沿发生时将此刻TSCTR的值捕获到相应的CAPx寄存器中。CPU可以稍后读取这些寄存器计算出信号的周期、占空比等信息。根据TSCTR在捕获后的行为捕获模式又细分为两种子模式绝对时间戳模式TSCTR自由运行永不复位。捕获到的是事件发生的绝对时间点。要计算时间间隔需要软件做减法例如Period CAP3 - CAP1。差值时间戳模式TSCTR在每次捕获事件后自动复位。捕获寄存器中存储的直接是本次事件与上一次事件之间的时间差值即周期或脉宽CPU无需再做减法简化了计算。辅助PWM模式APWM Mode这是eCAP的“副业”但也极其强大。在此模式下该GPIO引脚变为输出eCAP模块利用CAP1/CAP2作为活动的周期/比较寄存器CAP3/CAP4作为其影子寄存器变身成一个完整的、可与其他PWM模块同步的PWM发生器。虽然它没有ePWM模块那样复杂的死区、故障保护和事件触发系统但对于生成简单的、可同步的PWM信号或者作为额外的PWM通道它非常轻量且高效。2.3 关键寄存器组概览在深入时序之前快速浏览一下控制eCAP的几组关键寄存器这对后续的配置理解至关重要数据寄存器TSCTR计数器值、CAP1-CAP4捕获值或PWM周期/比较值。控制寄存器ECCTL1控制每个捕获事件的边沿极性上升沿/下降沿、是否在事件后复位TSCTR决定绝对/差值模式、事件滤波预分频等。ECCTL2这是“模式切换开关”。它决定模块工作在捕获模式还是APWM模式CAP_APWM位控制连续/单次捕获CONT_ONESHT设置停止/回绕点STOP_WRAP以及配置同步功能。中断寄存器ECEINT中断使能、ECFLG中断标志、ECCLR标志清除、ECFRC软件强制中断。合理利用中断可以高效处理捕获数据或更新PWM参数。理解了这些基础架构我们就可以像看施工图一样去解读官方手册中那些经典的时序图了。接下来我们将进入最核心的部分拆解四种经典的捕获操作序列看看硬件是如何在无声中完成精密测量的。3. 深度拆解四种经典捕获时序与配置实战TI的技术手册用几张经典的时序图清晰地展示了eCAP的四种典型工作方式。我们不仅要看懂这些图更要理解其背后的配置逻辑和适用场景。这是将原理转化为代码的关键一步。3.1 案例一绝对时间戳与上升沿触发这是最基础的捕获模式。如图15-13注此处指代输入内容中描述的图下同左侧部分所示我们仅配置在输入信号的上升沿进行捕获。工作原理TSCTR自由运行永不复位。输入引脚CAPx上每出现一个上升沿就产生一个捕获事件CEVT1, CEVT2...。每个事件触发时硬件自动将当前的TSCTR值锁存到由Mod4计数器指向的CAP寄存器中顺序为CAP1, CAP2, CAP3, CAP4然后循环。Mod4计数器在每次捕获后递增。你能得到什么CAP1, CAP2, CAP3, CAP4中分别存储了t1, t2, t3, t4时刻的绝对计数值。如何计算信号周期需要通过软件做减法。例如第一个周期 Period1 CAP3 - CAP1即t3 - t1。由于只捕获了上升沿你无法直接得到占空比。配置要点ECCTL2.CAP_APWM 0设置为捕获模式。ECCTL2.CONT_ONESHT 0设置为连续模式或1为单次模式。ECCTL1.CAPxPOL 0将所有CAP1POL-CAP4POL设置为0即仅上升沿触发。ECCTL1.CTRRSTx 0将所有CTRRST1-CTRRST4设置为0表示TSCTR在捕获后不复位绝对时间戳。ECCTL2.STOP_WRAP 3在连续模式下设置Mod4计数器在4次捕获后回绕0-1-2-3-0。实操心得这种模式适用于频率测量特别是频率较低或变化缓慢的场景。你只需要捕获两个连续的上升沿做一次减法再根据系统时钟频率就能算出周期。它的优势是简单直观但要注意32位计数器的溢出问题。如果你的信号周期很长两次捕获间TSCTR可能溢出软件计算时需要处理溢出情况通常判断如果CAP[n] CAP[n-1]则周期 CAP[n] (0xFFFFFFFF - CAP[n-1])。3.2 案例二绝对时间戳与双沿触发此模式在案例一的基础上进行了关键升级同时捕获上升沿和下降沿。如图15-13整体所示它交替响应上升沿和下降沿事件。工作原理配置CAP1和CAP3为上升沿触发CAP1POL0, CAP3POL0CAP2和CAP4为下降沿触发CAP2POL1, CAP4POL1。输入信号变化时硬件按照预设的极性依次触发CEVT1上升沿、CEVT2下降沿、CEVT3上升沿、CEVT4下降沿...同样TSCTR自由运行捕获的是绝对时间戳。你能得到什么CAP1存第一个上升沿时间t1CAP2存第一个下降沿时间t2CAP3存第二个上升沿时间t3CAP4存第二个下降沿时间t4如此循环。如何计算现在你拥有了一个完整脉冲的所有时间信息 * 第一个脉冲的周期Period1 t3 - t1* 第一个脉冲的高电平时间脉宽PulseWidth1 t2 - t1* 第一个脉冲的占空比DutyCycle1 (t2 - t1) / (t3 - t1) * 100%配置要点关键在ECCTL1的极性设置CAP1POL0,CAP2POL1,CAP3POL0,CAP4POL1。其他配置模式、复位控制、停止回绕与案例一相同。注意事项这是测量占空比和脉冲宽度的黄金模式。在调试电机驱动器的PWM信号或读取某些传感器的脉宽调制输出时我几乎总是优先使用此模式。它一次性硬件捕获一个完整周期所需的全部数据效率极高。但务必注意输入信号的最大频率。因为eCAP需要在一个周期内响应两个边沿事件所以它能测量的最高信号频率理论上是在你处理完4个捕获数据两个完整脉冲的时间内信号不能超过4个边沿事件。你需要根据CPU读取和处理数据的速度来评估。3.3 案例三差值时间戳与上升沿触发从案例三开始我们进入“差值时间戳”模式。如图15-14所示最大的变化在于TSCTR的行为。工作原理配置ECCTL1.CTRRST1 1假设我们只用CEVT1。这意味着在CEVT1上升沿事件发生时硬件先执行捕获操作然后将TSCTR复位为0。TSCTR从0开始重新向上计数直到下一个上升沿事件到来再次捕获并复位。因此捕获寄存器CAP1中存储的不再是绝对时间而是上一个上升沿到当前上升沿的时间间隔即信号的周期T1。你能得到什么CAP1中直接就是周期值T1CAP2中是下一个周期T2以此类推。软件无需做减法。如何计算读取CAPx的值乘以系统时钟周期即得到真实的信号周期。Period CAPx * (1 / SYSCLK)。配置要点ECCTL1.CTRRSTx 1将需要复位计数器的捕获事件对应位设为1。通常如果我们只关心周期只需在第一个事件如CEVT1后复位。ECCTL2.CONT_ONESHT和STOP_WRAP根据需求设置。例如在连续模式下设置STOP_WRAP1可以让Mod4计数器在每次捕获后CEVT1就回绕始终使用CAP1寄存器这样你总是从CAP1读取最新的周期值。避坑指南差值模式的巨大优势是简化了软件计算尤其适合需要快速得到周期值的应用如转速测量。但它有一个潜在风险计数器溢出。手册中提到如果TSCTR在下一个事件到来前就计满了达到0xFFFFFFFFCTROVF标志会被置位。这意味着输入信号频率过低或丢失。你的中断服务程序必须检查这个标志否则可能会将溢出后的错误值当作周期读走。一个健壮的做法是使能CTROVF中断在中断里进行超时或信号丢失的错误处理。3.4 案例四差值时间戳与双沿触发这是功能最强大的捕获模式如图15-15所示。它结合了差值模式的便捷和双沿信息的完整。工作原理配置双沿触发例如CEVT1上升沿CEVT2下降沿CEVT3上升沿CEVT4下降沿。关键配置CTRRST11,CTRRST31。这意味着在奇数事件如CEVT1, CEVT3后复位TSCTR。时序分析第一个上升沿CEVT1到来TSCTR值T1实际是0到t1的差值但通常复位后第一个间隔无意义或需忽略被捕获到CAP1然后TSCTR复位。TSCTR从0开始计数直到第一个下降沿CEVT2到来将计数值T2捕获到CAP2但此时TSCTR不复位继续计数。直到第二个上升沿CEVT3到来将计数值T3捕获到CAP3然后TSCTR复位。你能得到什么CAP2中存储的是高电平时间T2CAP3中存储的是整个周期T2T3这里需要仔细理解。实际上在CEVT3时刻捕获的T3是从CEVT2下降沿到CEVT3上升沿的时间即低电平时间。因此 * 高电平时间脉宽 T2 CAP2 * 低电平时间 T3 CAP3 * 信号周期 T2 T3 * 占空比 T2 / (T2 T3) * 100%配置要点极性设置CAP1POL0,CAP2POL1,CAP3POL0,CAP4POL1。复位控制CTRRST11,CTRRST20,CTRRST31,CTRRST40。确保在周期的开始点如每个上升沿复位计数器。通常设置STOP_WRAP3让Mod4计数器在4个事件后回绕这样CAP1-CAP4循环存储连续脉冲的时序数据。经验之谈这是我最推荐用于精密脉宽测量的模式。硬件直接为你测量出了高电平和低电平的时间软件只需要做一次加法就能得到周期做一次除法就能得到占空比CPU开销极小。在调试一个伺服系统的编码器接口时我用这种模式稳定测量了从几Hz到几百KHz的脉冲信号精度完全取决于系统时钟没有任何软件引入的抖动。配置时务必理清CTRRSTx的设置逻辑它决定了哪个时间差被直接捕获。一个常见的错误是错误地复位TSCTR导致捕获的时间差不是你想要的那一段。4. 模式切换将捕获器变为PWM发生器APWM模式eCAP模块的妙处在于它的“双重人格”。通过配置ECCTL2.CAP_APWM 1它可以瞬间从一个高精度的信号分析仪转变为一个可靠的PWM信号发生器即APWM模式。4.1 APWM模式基本原理在APWM模式下模块的内部逻辑发生了根本性变化引脚功能CAPx/APWMx引脚从输入变为输出。寄存器角色重映射CAP1CAP2变为活动寄存器分别对应PWM的周期值APRD和比较值ACMP。CAP3CAP4变为影子寄存分别对应周期影子寄存器APRD shadow和比较影子寄存器ACMP shadow。你可以安全地在任何时候向影子寄存器写入新值硬件会在下一个PWM周期开始时自动将其加载到活动寄存器实现无毛刺的PWM参数更新。计数器行为TSCTR现在作为一个递增计数器工作从0开始计数当TSCTR CAP2(ACMP)时输出电平根据APWMPOL位翻转当TSCTR CAP1(APRD)时输出电平再次翻转并将TSCTR复位为0开始下一个周期。这与标准的递增计数PWM原理完全一致。图15-16清晰地展示了这个过程TSCTR从0计数到ACMP比较值输出高电平从ACMP计数到APRD周期值输出低电平在APRD点TSCTR复位输出回到高电平开始新周期。4.2 单通道PWM生成配置配置一个简单的单通道PWM输出是直观的将对应GPIO引脚复用为eCAP输出功能。设置ECCTL2.CAP_APWM 1切换到APWM模式。配置ECCTL2.APWMPOL位决定输出极性0为高有效比较值代表高电平时间。向CAP3周期影子寄存器写入所需的周期值。Period (APRD 1) * T_sysclk。向CAP4比较影子寄存器写入所需的比较值决定占空比。Duty Cycle (ACMP / APRD) * 100%。使能TSCTR计数ECCTL2.TSCTRSTOP 1。此时引脚上就会输出指定频率和占空比的PWM波。你可以通过修改CAP3和CAP4来动态调整频率和占空比修改会在下一个周期边界生效。4.3 高级应用多通道相位同步PWM单个APWM通道的能力有限但eCAP模块支持同步链这使得生成多个具有固定相位差的PWM波形成为可能对于多相电机驱动、交错式电源拓扑非常有用。同步机制同步输入SYNCI一个eCAP模块的TSCTR可以被外部同步信号来自另一个eCAP的SYNCO、ePWM模块或软件触发复位或加载相位值CTRPHS寄存器。这用于从模块。同步输出SYNCO每个eCAP模块可以产生自己的同步输出信号可以来源于软件强制SWSYNC位计数器等于周期事件CTRPRD仅在APWM模式下有效禁用通过ECCTL2.SYNCI_EN使能同步输入通过ECCTL2.SYNCO_SEL选择同步输出源。配置相移PWM的步骤以eCAP1为主eCAP2滞后30%相位为例配置主模块eCAP1设置为APWM模式配置好频率APRD和占空比ACMP。设置SYNCO_SEL选择CTRPRD作为同步输出源。这样eCAP1在每个PWM周期开始时都会产生一个同步脉冲。配置从模块eCAP2设置为APWM模式配置相同的APRD和ACMP值保证频率和占空比一致。使能同步输入SYNCI_EN 1并将同步源选择为eCAP1的SYNCO。计算所需的相位延迟对应的计数值PhaseCount APRD * (PhaseShift / 360)。例如30%相位偏移PhaseCount APRD * 0.3。将PhaseCount写入eCAP2的CTRPHS计数器相位偏移值寄存器。工作原理当eCAP1的TSCTR到达APRD并复位时会产生一个SYNCO脉冲。这个脉冲触发eCAP2的同步输入eCAP2的TSCTR不会复位为0而是加载CTRPHS寄存器的值。因此eCAP2的PWM周期将从PhaseCount开始其输出波形在时间上就滞后于eCAP1一个相位差。软件同步示例输入材料中提到的ecap_ex3_apwm_phase_shift.c示例程序正是实现了这一功能。它通过宏定义设置频率、占空比和相位差初始化两个eCAP模块并利用同步机制产生相位差固定的双路PWM。在实际项目中我常用这种方法为三相逆变器生成六路PWM其中三路由ePWM模块产生另外三路互补信号则由eCAP模块在APWM模式下生成并通过同步确保所有通道的严格对齐。5. 从寄存器到代码eCAP模块驱动开发实战理解了原理和模式最终要落地到代码。TI提供了DriverLib库和示例但理解寄存器级的操作能让你更灵活地应对复杂需求。下面我将以差值时间戳双沿捕获模式和APWM模式生成带相移的PWM为例拆解关键配置步骤和代码片段。5.1 差值时间戳双沿捕获配置详解假设我们需要用eCAP1测量一个外部PWM信号的频率和占空比采用功能最全的差值时间戳双沿模式。步骤1GPIO引脚初始化首先将对应的GPIO引脚例如GPIO16配置为eCAP输入功能。需要解除该引脚的GPIO功能并将其映射到eCAP模块。// 假设使用GPIO16作为eCAP1输入 GPIO_setPinConfig(GPIO_16_ECAP1); // 将引脚功能切换到ECAP1 GPIO_setDirectionMode(16, GPIO_DIR_MODE_IN); // 设置为输入虽然复用后自动管理但明确设置是好习惯步骤2eCAP模块初始化与关键寄存器配置这是核心部分需要仔细设置控制寄存器。// 停止eCAP计数器确保安全配置 ECAP_stopCounter(ECAP1_BASE); ECAP_disableInterrupt(ECAP1_BASE, ECAP_INT_ALL); // 关闭所有中断 // 1. 配置操作模式捕获模式连续运行4事件回绕 ECAP_setCaptureMode(ECAP1_BASE, ECAP_CONTINUOUS_CAPTURE_MODE); // CONT_ONESHT0 ECAP_setCaptureModeWrap(ECAP1_BASE, ECAP_EVENT4); // STOP_WRAP3 (4 events) // 2. 配置事件极性CAP1上升沿CAP2下降沿CAP3上升沿CAP4下降沿 ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT1, ECAP_EV_POL_RISING); // CAP1POL0 ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT2, ECAP_EV_POL_FALLING); // CAP2POL1 ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT3, ECAP_EV_POL_RISING); // CAP3POL0 ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT4, ECAP_EV_POL_FALLING); // CAP4POL1 // 3. 配置计数器复位模式在事件1和事件3上升沿后复位TSCTR // 这样CAP2存高电平时间CAP3存低电平时间 ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT1); // CTRRST11 ECAP_disableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT2);// CTRRST20 ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT3); // CTRRST31 ECAP_disableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT4);// CTRRST40 // 4. 使能捕获寄存器加载 ECAP_enableCaptureLoad(ECAP1_BASE); // CAPLDEN1 // 5. 配置事件滤波器可选用于抗噪声 // 假设系统时钟200MHz我们希望滤除宽度小于50ns的毛刺 // 预分频值 毛刺宽度 / 系统时钟周期 50ns / 5ns 10个周期 // 查找手册PRESCALE5对应除以10 ECAP_setEventPrescale(ECAP1_BASE, 5); // 6. 清除可能存在的旧中断标志 ECAP_clearInterrupt(ECAP1_BASE, ECAP_INT_ALL); // 7. 使能中断例如在4个事件都捕获完成后产生中断 ECAP_enableInterrupt(ECAP1_BASE, ECAP_INT_CEVT4); // 使能CEVT4中断 // 8. 启动计数器 ECAP_startCounter(ECAP1_BASE);步骤3中断服务程序ISR数据处理当4个事件一个完整周期上升、下降、上升、下降捕获完成后进入中断。__interrupt void ecap1ISR(void) { uint32_t high_time, low_time, period; float duty_cycle; // 读取捕获值。注意在差值模式下这些值直接就是时间差计数值 high_time ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT2); // CAP2: 高电平时间 low_time ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT3); // CAP3: 低电平时间 // 计算周期和占空比 period high_time low_time; // 周期 高电平时间 低电平时间 if(period ! 0) { duty_cycle ((float)high_time / (float)period) * 100.0f; // 占空比百分比 } else { duty_cycle 0.0f; // 避免除零错误 } // 将period和duty_cycle存入全局变量供主循环使用 g_measured_period period; g_measured_duty duty_cycle; // 检查计数器溢出标志重要 if(ECAP_getInterruptStatus(ECAP1_BASE) ECAP_INT_CTROVF) { // 处理信号丢失或频率过低的情况 handleSignalLoss(); ECAP_clearInterrupt(ECAP1_BASE, ECAP_INT_CTROVF); } // 清除已处理的中断标志 ECAP_clearInterrupt(ECAP1_BASE, ECAP_INT_CEVT4); // 中断应答 Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP7); }5.2 APWM模式与相移PWM生成代码实现接下来我们实现eCAP1和eCAP2输出同频同占空比但eCAP2滞后eCAP1 90度25%周期相移的PWM。步骤1系统时钟与PWM参数计算假设系统时钟SYSCLK 200MHz我们需要生成一个10kHz的PWM占空比50%。#define PWM_FREQ_HZ 10000.0f #define SYS_CLK_HZ 200000000.0f #define PWM_DUTY 0.5f #define PHASE_SHIFT 0.25f // 90度相位差即25%周期 uint32_t period_count (uint32_t)(SYS_CLK_HZ / PWM_FREQ_HZ); // APRD uint32_t compare_count (uint32_t)(period_count * PWM_DUTY); // ACMP uint32_t phase_count (uint32_t)(period_count * PHASE_SHIFT); // CTRPHS for eCAP2步骤2主模块eCAP1配置// 初始化GPIO为eCAP输出 (例如 GPIO5) GPIO_setPinConfig(GPIO_5_ECAP1); GPIO_setDirectionMode(5, GPIO_DIR_MODE_OUT); // 配置eCAP1为APWM模式 ECAP_stopCounter(ECAP1_BASE); ECAP_disableInterrupt(ECAP1_BASE, ECAP_INT_ALL); ECAP_setAPWMPolarity(ECAP1_BASE, ECAP_ACTIVE_HIGH); // APWMPOL0高有效 ECAP_setCounterCompareValue(ECAP1_BASE, compare_count); // 写入活动比较寄存器CAP2 ECAP_setCounterPeriodValue(ECAP1_BASE, period_count); // 写入活动周期寄存器CAP1 // 注意DriverLib的set函数通常直接写入活动寄存器影子寄存器会自动加载初始值。 // 配置同步输出选择CTRPRD作为同步源这样每个周期开始都发出同步脉冲 ECAP_setSyncOutSignal(ECAP1_BASE, ECAP_SYNC_OUT_SEL_CTR_PRD); // 启动计数器 ECAP_startCounter(ECAP1_BASE);步骤3从模块eCAP2配置// 初始化GPIO为eCAP输出 (例如 GPIO6) GPIO_setPinConfig(GPIO_6_ECAP2); GPIO_setDirectionMode(6, GPIO_DIR_MODE_OUT); // 配置eCAP2为APWM模式 ECAP_stopCounter(ECAP2_BASE); ECAP_disableInterrupt(ECAP2_BASE, ECAP_INT_ALL); ECAP_setAPWMPolarity(ECAP2_BASE, ECAP_ACTIVE_HIGH); ECAP_setCounterCompareValue(ECAP2_BASE, compare_count); ECAP_setCounterPeriodValue(ECAP2_BASE, period_count); // 关键配置同步输入和相位偏移 ECAP_enableCounterResetOnSyncIn(ECAP2_BASE); // SYNCI_EN1使能同步输入 // 设置同步源为eCAP1的同步输出。这通常通过输入选择寄存器或全局同步模块配置。 // 假设使用SYNCIN信号具体配置取决于芯片的同步网络。 // 例如可能需要配置ECAPSYNCINSEL寄存器或使用其他同步外设。 configureSyncNetwork(ECAP2_BASE, SYNC_SRC_ECAP1); // 伪代码需查阅具体手册 // 设置相位偏移值 ECAP_setCounterPhaseValue(ECAP2_BASE, phase_count); // 写入CTRPHS寄存器 // 启动计数器。注意eCAP2的计数器将等待eCAP1的同步信号才开始有效计数。 ECAP_startCounter(ECAP2_BASE);关键点提示在实际的TMS320F280015x芯片上同步信号的路径可能需要通过ECAPSYNCINSEL寄存器或芯片特定的同步模块如SYSCLK来配置。你需要仔细查阅数据手册中关于“Synchronization”的章节确定eCAP1的SYNCO输出具体连接到哪个同步总线以及eCAP2如何选择这个总线作为其SYNCI输入。这是实现硬件同步最易出错的一步。6. 常见问题、调试技巧与性能优化即使理解了原理和配置在实际项目中调试eCAP模块时依然会遇到各种问题。下面分享一些我踩过的坑和总结的调试技巧。6.1 典型问题排查清单现象可能原因排查步骤与解决方案捕获不到任何数据1. GPIO引脚复用错误。2. eCAP模块时钟未使能。3. 输入信号电平不匹配如3.3V CMOS输入接了5V信号需分压。4. 事件滤波器设置过于苛刻滤除了正常信号。1. 用示波器确认信号已到达芯片引脚。2. 检查系统控制寄存器中eCAP外设时钟是否使能PCLKCRx。3. 确认信号电压在芯片IO可接受范围。4. 暂时将事件滤波预分频PRESCALE设为0旁路滤波测试。捕获值全为0或固定值1. 捕获寄存器加载未使能CAPLDEN0。2. TSCTR计数器未启动TSCTRSTOP0。3. 在APWM模式下误读了CAP1/CAP2它们已是活动寄存器。1. 确认ECCTL1.CAPLDEN位已设置为1。2. 确认ECCTL2.TSCTRSTOP位已设置为1运行。3. 在捕获模式应读取CAP1-CAP4在APWM模式应读写CAP3/CAP4影子寄存器来更新参数。测量周期或占空比不准1. 系统时钟SYSCLK配置错误导致TSCTR计数频率不对。2. 在绝对时间戳模式下软件减法未处理计数器溢出。3. 中断响应延迟导致数据读取不及时后续捕获覆盖了前值。1. 校准系统时钟。用已知频率的信号源测试反推实际SYSCLK频率。2. 在计算时间差时加入溢出判断逻辑if (new_stamp old_stamp) delta new_stamp (0xFFFFFFFF - old_stamp);3. 使用连续模式并设置合适的STOP_WRAP确保在Mod4计数器回绕前如4次事件后CPU能读取所有CAP寄存器。或者使用DMA将捕获数据直接搬移到内存。APWM模式无输出或波形错误1. 引脚未正确配置为输出模式。2.CAP_APWM位未设置为1。3. 周期值APRD设置过小至少大于比较值ACMP。4. 同步配置错误从模块等待不存在的同步信号。1. 检查GPIO的GPxMUX和GPxDIR寄存器。2. 确认ECCTL2.CAP_APWM 1。3. 确保APRD ACMP且APRD 0。4. 主模块确保已配置同步输出从模块确保同步输入使能且源正确。可先用软件强制同步SWSYNC测试。中断无法进入1. 全局中断未开启INTM位。2. PIE控制器中对应eCAP的中断未使能。3. eCAP模块内部中断未使能ECEINT寄存器。4. 中断标志未清除导致后续中断被屏蔽。1. 使用EINT或IER6.2 性能优化与高级技巧减少CPU开销使用DMA配合eCAP在高速连续捕获场景如解码高频编码器频繁的中断会消耗大量CPU资源。此时可以将eCAP模块配置为在捕获事件时触发DMA。DMA控制器能够自动将CAP1-CAP4寄存器的值搬运到指定的内存缓冲区中完全不需要CPU介入。你只需要在缓冲区半满或全满时产生一个DMA中断来处理一批数据极大提升了系统效率。提高测量精度注意时钟同步域TMS320F280015x的eCAP模块可能运行在高速时钟域如HRPWM时钟。在读取TSCTR或CAPx寄存器时如果CPU时钟与eCAP时钟不同步可能需要插入等待周期或使用特殊的读取序列。手册中关于“HR mode”的备注提示了这一点。在非HR模式下通常没有问题但在高精度应用中建议查阅芯片勘误表和应用笔记确认是否存在读取同步问题。抗噪声设计合理使用事件滤波器输入信号可能带有毛刺。eCAP的事件滤波器是一个数字防抖电路它要求信号边沿稳定持续N个同步时钟周期N由PRESCALE决定才被认定为有效事件。根据你的信号特性和系统时钟计算一个合适的预分频值。例如要滤除宽度小于20ns的毛刺系统时钟5ns则至少需要20ns / 5ns 4个周期选择PRESCALE为2除以4或3除以6。但注意滤波器也会引入微小延迟并限制了可测量的最高信号频率。灵活的事件控制单次模式与重装CONT_ONESHT位设置为1时eCAP工作于单次模式。在捕获完STOP_WRAP指定数量的事件后Mod4计数器和捕获加载会停止。这对于捕获特定数量的脉冲如只捕获一个完整周期非常有用。之后可以通过软件设置REARM位来重新启动捕获序列实现受控的、确定性的数据采集。APWM模式下的动态更新在APWM模式下要动态改变PWM频率或占空比必须写入影子寄存器CAP3周期和CAP4比较。硬件会在下一个PWM周期开始时自动将影子寄存器的值加载到活动寄存器CAP1和CAP2从而实现无毛刺、平滑的PWM参数更新。直接写入活动寄存器可能导致当前周期波形异常。调试时善用CCS的寄存器查看器和实时变量观察窗口监控TSCTR、CAPx、ECFLG等关键寄存器的变化。结合示波器观察输入输出波形能快速定位是配置问题、信号问题还是软件处理逻辑问题。eCAP模块一旦正确配置其硬件工作的稳定性和精确性是软件无法比拟的它能成为你实时控制系统中一个可靠且强大的“时序管家”。