深入解析TI eCAP模块:高精度时间捕获与同步PWM生成实战
2026/7/26 23:47:09 网站建设 项目流程

1. eCAP模块:嵌入式实时控制的精密“时间尺”与“波形画笔”

在电机驱动、开关电源或者任何需要精确控制时序的嵌入式项目里,你肯定遇到过这样的需求:想知道一个脉冲信号到底有多宽?两个脉冲之间的间隔是多少?或者,你需要生成一组频率、相位都严格对齐的PWM波去驱动多个功率开关。这时候,一个功能强大的定时器/捕获模块就是你的“瑞士军刀”。今天,我们就来深入聊聊德州仪器(TI)AM261x这类处理器中集成的增强型捕获(eCAP)模块,它远不止一个简单的计数器,而是一把能同时进行高精度时间测量和复杂波形生成的利器。

简单来说,eCAP模块的核心价值在于其双模式能力:捕获模式(CAP)增强型PWM模式(APWM)。在捕获模式下,它像一把高精度的“时间尺”,能记录外部信号边沿发生的精确时刻(时间戳),从而让你计算出周期、频率、占空比。而在APWM模式下,它又变成了一支灵活的“波形画笔”,可以生成单路或多路同步、甚至带有精确相位差的PWM波形。无论是测量电机编码器的转速,还是生成三相逆变器的驱动信号,eCAP都能胜任。理解它的配置和应用,是解锁高性能实时控制系统的关键一步。接下来,我将结合手册中的几个经典用例,拆解其工作原理、配置细节,并分享一些从实际项目中总结出来的配置心得和避坑指南。

2. 核心原理与设计思路:绝对时间与差值时间的哲学

在深入代码之前,我们必须先吃透eCAP模块两种核心工作模式的底层逻辑:绝对时间戳(Absolute Time-Stamp)差值时间(Delta Time)。这不仅仅是两个配置选项的区别,更是两种不同的测量哲学,直接决定了你如何设计中断服务程序(ISR)和处理数据。

2.1 绝对时间戳模式:记录“纪元时间”

想象一下,你有一个永不停止的秒表(32位时间计数器TSCTR),它从0开始一直向上累加,直到最大值0xFFFFFFFF后再从0开始循环(溢出)。eCAP模块的绝对时间戳模式,就是在外部信号(CAPx引脚)的特定边沿(上升沿或下降沿)到来时,“咔嚓”一下拍下这个秒表的当前读数,并将这个瞬间值存入对应的捕获寄存器(CAP1-CAP4)。

它的工作流程是这样的:

  1. TSCTR计数器自由运行,永不复位(除非软件强制或溢出归零)。
  2. 当检测到第一个预设边沿事件(如上升沿)时,将此刻TSCTR的值存入CAP1,然后内部的一个4状态计数器(MOD4 CTR)加1,指向下一个捕获寄存器CAP2。
  3. 当第二个同类事件到来时,将此刻TSCTR的值存入CAP2,MOD4 CTR再加1。
  4. 如此循环,在4个事件后,MOD4 CTR从3翻回0,并产生CEVT4(捕获事件4)中断标志。

关键计算与核心价值:在这种模式下,CAPn寄存器里存储的是事件发生的“绝对时刻”。要得到我们关心的时间间隔,比如脉冲周期,就需要在CPU中进行减法运算。例如,Period1 = CAP2 - CAP1。这种模式的优点是保留了事件的绝对时间信息,你可以追溯每个事件在时间轴上的具体位置。但缺点是需要CPU进行后处理计算,并且要特别注意32位计数器的溢出问题——如果CAP2的值小于CAP1,说明在两次捕获之间TSCTR发生了溢出,实际的周期应该是(0xFFFFFFFF - CAP1) + CAP2 + 1

实操心得:处理溢出是必修课在绝对时间戳模式下编写周期计算代码时,绝不能简单地做无符号减法。必须增加溢出判断逻辑。一个稳健的写法是使用32位无符号整数的减法特性,并考虑进位:

uint32_t TSt1, TSt2, Period; TSt1 = ECAPxRegs.CAP1; TSt2 = ECAPxRegs.CAP2; // 直接相减,C语言中的无符号整数运算会自动处理溢出(模2^32) // 但为了逻辑清晰,可以显式判断 if (TSt2 >= TSt1) { Period = TSt2 - TSt1; } else { // 发生了一次溢出 Period = (0xFFFFFFFFUL - TSt1) + TSt2 + 1; }

对于高频率信号,溢出可能频繁发生,上述判断逻辑应置于ISR中。更高效的做法是利用硬件中断:使能CNTOVF(计数器溢出)中断,在溢出中断中维护一个软件扩展的高32位计数器,与TSCTR的32位共同组成一个64位虚拟计数器,从而彻底避免软件判断的复杂性。

2.2 差值时间模式:直接读取“间隔”

差值时间模式则采用了另一种思路。它把TSCTR计数器变成了一个“每次事件后都归零的秒表”。每次有效的捕获事件发生时,模块会先记录下TSCTR的当前值(这就是从上一次事件到现在的时间间隔),然后立即将TSCTR复位为0,重新开始计时。

它的工作流程是这样的:

  1. 第一个事件到来,TSCTR的值T1(即从开始或上次复位到现在的时长)被存入CAP1,然后TSCTR被清零。
  2. TSCTR从0开始重新计数。
  3. 第二个事件到来,TSCTR的新值T2被存入CAP2,TSCTR再次被清零。
  4. 如此循环。

关键计算与核心价值:在这种模式下,CAPn寄存器里存储的直接就是相邻事件之间的时间间隔。例如,在仅捕获上升沿时,CAP1里就是第一个周期(Period1),CAP2里就是第二个周期(Period2),无需任何减法运算。这极大地简化了CPU的负担,特别适合需要快速响应和计算的实时系统。它的缺点是你丢失了事件的“绝对时间”信息,无法直接知道事件在全局时间轴上的位置。

模式选择决策指南:

  • 选择绝对时间戳模式,如果:你的应用需要知道事件发生的绝对时间点序列;或者你需要测量非连续事件之间的时间间隔;亦或是你需要将多个eCAP模块的时间戳进行全局对齐。
  • 选择差值时间模式,如果:你只关心信号周期或占空比本身,且需要最简化的ISR处理逻辑和最快的计算速度;或者你测量的信号周期相对稳定,不太需要处理复杂的溢出逻辑。

3. 捕获模式实战:从寄存器配置到代码实现

理解了核心原理,我们来看手册中给出的四个具体捕获用例。我会逐一拆解其配置表背后的意图,并补充完整的、可运行的初始化代码框架和ISR处理模板。

3.1 用例一:绝对时间戳,仅上升沿触发

这是最基础的用例,用于测量一个数字信号的周期(或频率)。假设我们有一个方波信号接入CAPx引脚。

配置解析(对应手册表7-76):

  • CAPxPOL = EC_RISING:所有4个捕获事件都配置为上升沿触发。这意味着模块只对信号的上升沿敏感。
  • CTRRSTx = EC_ABS_MODE:所有4个事件都设置为绝对时间戳模式。TSCTR在事件发生后复位。
  • CAPLDEN = EC_ENABLE:使能捕获加载,即允许事件发生时将TSCTR值载入CAPn寄存器。
  • CONT_ONESHT = EC_CONTINUOUS:设置为连续捕获模式。在4个事件(CAP1到CAP4)完成后,MOD4计数器会回绕,继续用CAP1覆盖旧值,循环不断。与之相对的是单次模式(ONESHOT),捕获4个事件后停止。
  • SYNCI_EN = EC_DISABLESYNCO_SEL = EC_SYNCO_DIS:禁用同步输入和输出功能。本例是独立工作模式。

完整的初始化函数示例:

void ECAP_AbsoluteTime_RisingEdge_Init(volatile struct ECAP_REGS *ECAPx) { // 步骤1:确保模块处于复位状态以便配置 ECAPx->ECCTL2.bit.TSCTRSTOP = EC_FREEZE; // 停止计数器 ECAPx->ECCTL2.bit.CAP_APWM = EC_CAP_MODE; // 设置为捕获模式 ECAPx->ECCTL2.bit.RE_ARM = EC_ARM; // 一次必要的重装操作,确保配置生效 // 步骤2:配置ECCTL1 - 捕获事件控制 ECAPx->ECCTL1.all = 0; // 先清零 ECAPx->ECCTL1.bit.CAP1POL = EC_RISING; // 事件1:上升沿 ECAPx->ECCTL1.bit.CAP2POL = EC_RISING; // 事件2:上升沿 ECAPx->ECCTL1.bit.CAP3POL = EC_RISING; // 事件3:上升沿 ECAPx->ECCTL1.bit.CAP4POL = EC_RISING; // 事件4:上升沿 ECAPx->ECCTL1.bit.CTRRST1 = EC_ABS_MODE; // 事件1后不复位TSCTR ECAPx->ECCTL1.bit.CTRRST2 = EC_ABS_MODE; // 事件2后不复位TSCTR ECAPx->ECCTL1.bit.CTRRST3 = EC_ABS_MODE; // 事件3后不复位TSCTR ECAPx->ECCTL1.bit.CTRRST4 = EC_ABS_MODE; // 事件4后不复位TSCTR ECAPx->ECCTL1.bit.CAPLDEN = EC_ENABLE; // 使能捕获寄存器加载 ECAPx->ECCTL1.bit.PRESCALE = EC_DIV1; // 预分频设为1,TSCTR每个系统时钟加1 // 步骤3:配置ECCTL2 - 工作模式控制 ECAPx->ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS; // 连续模式 ECAPx->ECCTL2.bit.STOP_WRAP = EC_EVENT4; // 在事件4后回绕(对于连续模式,此配置决定中断触发点) ECAPx->ECCTL2.bit.SYNCI_EN = EC_DISABLE; // 禁用同步输入 ECAPx->ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS; // 禁用同步输出 // 步骤4:清除可能存在的旧中断标志,并启用所需中断 ECAPx->ECEINT.all = 0; // 先禁用所有中断 ECAPx->ECCLR.all = 0xFFFF; // 清除所有中断标志位 ECAPx->ECEINT.bit.CEVT4 = 1; // 使能捕获事件4中断(4个事件完成一轮) // 步骤5:启动计数器 ECAPx->ECCTL2.bit.TSCTRSTOP = EC_RUN; }

中断服务程序(ISR)与数据处理:通常,我们会在第4个事件(CEVT4)触发中断时,一次性读取4个时间戳进行计算,这样效率最高。

__interrupt void ECAP_ISR(void) { uint32_t TSt1, TSt2, TSt3, TSt4; uint32_t Period1, Period2, Period3; // 检查是否是CEVT4中断 if (ECAPxRegs.ECFLG.bit.CEVT4 == 1) { // 读取四个时间戳 TSt1 = ECAPxRegs.CAP1; TSt2 = ECAPxRegs.CAP2; TSt3 = ECAPxRegs.CAP3; TSt4 = ECAPxRegs.CAP4; // 计算三个周期(需考虑溢出,此处为简化示例) Period1 = TSt2 - TSt1; Period2 = TSt3 - TSt2; Period3 = TSt4 - TSt3; // 这里可以添加你的处理逻辑,例如更新全局变量、触发其他操作等 // g_measured_period = Period1; // 示例 // 清除中断标志 ECAPxRegs.ECCLR.bit.CEVT4 = 1; // 可选:重新使能捕获(如果是单次模式则需要) // ECAPxRegs.ECCTL2.bit.RE_ARM = EC_ARM; } // ... 处理其他中断标志,如CNTOVF(计数器溢出) PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; // 假设eCAP中断在PIE第4组 }

3.2 用例二:绝对时间戳,上升沿与下降沿交替触发

这个用例用于测量PWM信号的周期和占空比。通过交替配置上升沿和下降沿触发,我们可以捕获到一个周期内高电平开始、结束,以及下一个周期开始的时间点。

配置解析(对应手册表7-77):关键变化在于CAPxPOL的配置:

  • CAP1POL = EC_RISING:事件1在上升沿触发(一个周期开始)。
  • CAP2POL = EC_FALLING:事件2在下降沿触发(同一个周期内高电平结束)。
  • CAP3POL = EC_RISING:事件3在下一个上升沿触发(下一个周期开始)。
  • CAP4POL = EC_FALLING:事件4在下一个下降沿触发。 这样,CAP1和CAP3捕获的是连续两个上升沿(周期边界),CAP1和CAP2捕获的是一个周期内的高电平时间。

ISR中的计算逻辑:

// 在CEVT4中断中 TSt1 = ECAPxRegs.CAP1; // 第一个上升沿 TSt2 = ECAPxRegs.CAP2; // 第一个下降沿 TSt3 = ECAPxRegs.CAP3; // 第二个上升沿 TSt4 = ECAPxRegs.CAP4; // 第二个下降沿 Period1 = TSt3 - TSt1; // 第一个完整周期 DutyOnTime1 = TSt2 - TSt1; // 第一个周期的高电平时间 DutyOffTime1 = TSt3 - TSt2; // 第一个周期的低电平时间 // 占空比 = (DutyOnTime1 / Period1) * 100%

注意事项:信号稳定性这种交替触发模式对输入信号的稳定性要求较高。如果信号有抖动,可能会导致边沿顺序错乱,例如本该是“上升-下降-上升”的序列,因为噪声变成“上升-上升”。在实际应用中,通常需要在信号进入eCAP引脚前进行适当的硬件滤波(RC电路)或软件去抖。

3.3 用例三与四:差值时间模式

差值时间模式的配置与绝对时间戳模式类似,核心区别在于将所有CTRRSTx位设置为EC_DELTA_MODE。这样,每次捕获事件后,TSCTR都会清零。

配置要点:

  • CTRRST1/2/3/4 = EC_DELTA_MODE:这是启用差值时间模式的关键。
  • 中断触发点的选择:在差值模式下,由于每个CAPn寄存器在捕获后立即就包含了有效的周期值,因此可以在任何事件(如CEVT1)触发中断时进行读取。手册示例在CEVT1时读取,此时CAP1-CAP4分别包含了T4, T1, T2, T3时刻的间隔值(注意顺序因MOD4计数器循环而偏移)。理解这个偏移是正确读取数据的关键。

差值模式下的数据读取策略:根据MOD4计数器的循环特性,当CEVT1发生时,意味着刚刚完成了一次对CAP1的写入。此时:

  • CAP1存储的是上一次事件4到事件1的间隔(T4)。
  • CAP2存储的是上上次事件1到事件2的间隔(T1)。
  • CAP3存储的是上上次事件2到事件3的间隔(T2)。
  • CAP4存储的是上上次事件3到事件4的间隔(T3)。 因此,在CEVT1中断中,如果你想获取最新的、完整的四个间隔,需要按照CAP2, CAP3, CAP4, CAP1的顺序来映射为Period1, Period2, Period3, Period4。手册示例代码正是这样处理的。

避坑指南:理解MOD4计数器与寄存器映射这是eCAP模块最易混淆的点之一。CAP1-CAP4是四个物理寄存器,但MOD4计数器(0,1,2,3循环)决定了下一个捕获事件将写入哪个寄存器。当中断标志CEVTx置位时,表示对CAPx寄存器的写入刚刚完成。因此,中断发生时,CAPx里是最新值,而其他寄存器里是更早的值。在连续模式下,必须根据当前触发的是哪个CEVTx来正确解读CAP1-CAP4数组中的数据顺序。画一个状态迁移图来理解这个过程会非常有帮助。

4. APWM模式实战:从单通道到多通道同步

当eCAP模块被配置为APWM模式时,它从一个“测量者”转变为“生成者”。CAP1和CAP2寄存器的功能发生了根本变化:

  • CAP1变为周期寄存器APRD(Active Period)。
  • CAP2变为比较寄存器ACMP(Active Compare)。 TSCTR计数器在0到APRD之间循环计数,并根据ACMP的值翻转APWMx输出引脚的电平,从而生成PWM波。

4.1 单通道PWM生成

这是最简单的应用。配置流程如下:

  1. 基础配置(对应手册表7-80):

    • CAP_APWM = EC_APWM_MODE:切换到APWM模式。
    • APWMPOL = EC_ACTV_HI:设置PWM极性为高电平有效。即当TSCTR小于ACMP时,输出高电平;大于等于ACMP时,输出低电平。如果设置为EC_ACTV_LO,则逻辑相反。
    • 写入CAP1寄存器以设置周期值(例如0x1000)。
    • 写入CAP2寄存器以设置初始占空比(比较值)。
    • CTRPHS(相位寄存器)通常设为0。
    • 禁用同步(SYNCI_EN = EC_DISABLE,SYNCO_SEL = EC_SYNCO_DIS)。
  2. 动态调整占空比:在APWM模式下,CAP2 (ACMP)寄存器是双缓冲的。这意味着你可以随时在软件中写入一个新的比较值,但这个值不会立即生效影响输出。它会被存入一个影子寄存器。只有当TSCTR计数器计数到0(一个PWM周期开始)时,影子寄存器的值才会被加载到活动寄存器中,从而真正改变下一个周期的占空比。这种机制保证了PWM波形切换的平滑,不会在周期中间产生毛刺。

    // 在运行中安全地改变占空比 ECAPxRegs.CAP2 = new_compare_value; // 写入的是影子寄存器 // 占空比将在下一个PWM周期开始时更新

4.2 多通道PWM同步

在电机控制、多相电源等应用中,经常需要多个PWM通道,并且它们之间必须保持严格的频率和相位关系。eCAP的同步功能正是为此而生。

同步原理:一个eCAP模块被配置为主设备(Master),在其TSCTR等于周期值(TSCTR == APRD)时,会产生一个同步输出脉冲(SYNCO)。其他eCAP模块配置为从设备(Slave),使能同步输入(SYNCI_EN = EC_ENABLE),并将SYNCO_SEL设置为EC_SYNCI。当从设备检测到主设备的同步脉冲时,会将自己的TSCTR计数器复位到CTRPHS寄存器所设定的相位值。这样,所有从设备的PWM周期都与主设备严格对齐,并且具有可编程的相位差。

配置步骤(以手册中4通道同步为例,图7-65):

  1. 主设备(ECAP1)配置:

    • 设置CAP1为最大周期(20000)。
    • SYNCO_SEL = EC_CTR_PRD:选择当TSCTR == APRD时产生同步脉冲。
    • SYNCI_EN = EC_DISABLE:主设备不需要同步输入。
  2. 从设备(ECAP2, ECAP3, ECAP4)配置:

    • 设置各自的CAP1为所需的周期值(10000, 5000, 4000)。这些周期值必须是主设备周期的整数分之一,以避免“拍频”现象。
    • SYNCI_EN = EC_ENABLE:使能同步输入。
    • SYNCO_SEL = EC_SYNCI:同步源选择为外部同步输入。
    • CTRPHS = 0:相位偏移设为0(对于简单频率同步,相位通常为0)。
  3. 运行时代码:

    // 初始化后,分别设置各通道的占空比 ECAP1Regs.CAP2 = 7000; // 主通道占空比 ECAP2Regs.CAP2 = 2000; // 从通道2占空比 ECAP3Regs.CAP2 = 550; // 从通道3占空比 ECAP4Regs.CAP2 = 6500; // 从通道4占空比

    这样,ECAP2/3/4的PWM频率分别是主设备ECAP1的2倍、4倍和5倍,且所有通道的周期起点严格对齐。

4.3 多通道PWM带相位控制

这是更高级的应用,例如驱动三相交错并联DC/DC变换器,各相之间需要相差120度。eCAP的相位控制寄存器CTRPHS在此大显身手。

配置步骤(以手册中三相120度相位差为例,图7-66):

  1. 主设备(ECAP1)配置:与上述同步配置类似,SYNCO_SEL = EC_CTR_PRD,产生同步脉冲。周期APRD设为1200。

  2. 从设备(ECAP2, ECAP3)配置:

    • 周期CAP1必须与主设备相同(1200),以保证频率一致。
    • 关键点在于CTRPHS(相位寄存器)的设置。TSCTR在收到同步脉冲时,会复位到CTRPHS值,而非0。
    • 相位计算:相位值 = (期望相位差 / 360°) × 周期值(APRD)。
      • 对于ECAP2(滞后120°):CTRPHS = (120/360) * 1200 = 400
      • 对于ECAP3(滞后240°):CTRPHS = (240/360) * 1200 = 800
    • 注意:CTRPHS的值必须小于APRD
  3. 运行时代码:设置相同的占空比(例如700),即可得到三路频率相同、相位互差120度的PWM波。

核心技巧:影子寄存器与同步点的时序在同步系统中,更新从设备的周期(CAP1)或比较值(CAP2)需要格外小心。务必在同步脉冲之间的窗口期进行修改。如果恰好在同步脉冲到来时写入,可能会导致不可预测的行为,例如输出毛刺或短暂的不稳定。一个稳健的做法是,在主设备的计数器达到某个安全值(例如APRD/2)时,统一更新所有从设备的影子寄存器。这样可以确保所有更新都在下一个同步点之前完成加载。

5. 高级话题与实战避坑指南

掌握了基本配置后,一些高级特性和实战中的“坑”决定了项目的稳定性和精度。

5.1 预分频器(PRESCALE)与测量范围/精度权衡

ECCTL1.PRESCALE位决定了TSCTR计数器的时钟源。EC_DIV1表示TSCTR每个系统时钟(SYSCLKOUT)计数一次。你可以通过分频来降低计数频率。

  • 为何要分频?为了扩展测量范围。一个32位的计数器,在150MHz的系统时钟下,EC_DIV1时最大能计数的时长约为2^32 / 150e6 ≈ 28.6秒。但如果你要测量一个100Hz的信号(周期10ms),其时间戳差值可能高达10ms * 150e6 = 1.5e6个计数,远小于计数器上限。此时,你可以使用EC_DIV8或更高分频,让TSCTR每8个时钟加1,这样在测量相同时长信号时,计数器差值变小,降低了在绝对时间戳模式下溢出的风险,同时也减少了中断频率(在差值模式下,中断频率不变)。
  • 代价是什么?精度损失。分频后,时间戳的分辨率降低了。在EC_DIV8下,你的时间戳最小单位是8个系统时钟周期。对于需要高精度时间测量的应用(如超声波测距),应尽量使用EC_DIV1,并妥善处理溢出。
  • 决策建议:根据待测信号的最大周期和所需精度来选择分频。公式为:所需计数 = 最大待测时间 / 系统时钟周期。确保所需计数 < 2^32 / 分频系数,并留有一定余量。同时,系统时钟周期 * 分频系数应小于你要求的时间分辨率。

5.2 中断策略与性能优化

eCAP模块提供了丰富的中断源:CEVT1-CEVT4, CNTOVF(计数器溢出),CTR=PRD(PWM模式下周期匹配),CTR=CMP(PWM模式下比较匹配)等。

  • 精简ISR,减少耗时:在捕获模式下,如果只需要周期值,使用差值时间模式并在CEVT1中断中读取所有CAP寄存器是最高效的,因为CAP寄存器里已经是周期值,无需计算。避免在ISR中进行浮点运算或复杂函数调用。
  • 使用DMA:对于需要连续高速采集时间戳的应用(如数字示波器),频繁的CPU中断会成为瓶颈。一些高级的TI处理器支持将eCAP的捕获寄存器通过DMA自动搬运到内存中。这样可以极大减轻CPU负担,实现超高频率的连续采集。
  • 中断标志清除顺序:在ISR中,应先读取关键数据,再清除中断标志。清除标志的代码应放在ISR末尾附近,避免清除标志后立刻又发生中断导致嵌套(如果未使能中断嵌套)。

5.3 常见问题排查实录

  1. 问题:捕获不到任何信号,CAP寄存器始终为0。

    • 检查1:引脚复用配置。这是最常见的原因。确保MCU的GPIO复用控制器已将对应引脚配置为eCAP功能,而非普通的GPIO。
    • 检查2:输入信号电平。确认输入信号的电压幅值符合MCU的IO电平标准(如3.3V CMOS)。对于非标准电平,需要电平转换电路。
    • 检查3:eCAP模块时钟使能。在处理器系统控制模块中,确保eCAP所在外设的时钟门控已被使能。
    • 检查4:滤波器与边沿选择。检查ECCTL1.CAPxPOL是否设置为正确的边沿。某些芯片的eCAP模块还带有数字滤波器(ECCTL1中的CAPxPOL位域可能包含滤波器设置),如果滤波器宽度设置过大,可能会滤除正常的脉冲。
  2. 问题:测量的周期值跳动很大,不稳定。

    • 检查1:信号噪声。使用示波器观察输入信号,看边沿是否有振铃或毛刺。增加硬件RC滤波或启用eCAP内部的输入滤波器(如果支持)。
    • 检查2:中断响应延迟。如果使用绝对时间戳模式并在CEVT4中断中计算,从第4个事件发生到CPU进入ISR读取CAP4,之间存在延迟。在这段延迟内,如果信号频率很高,MOD4计数器可能已经循环并覆盖了CAP1的值,导致读取到错误的数据组合。解决方案:改用差值模式;或使用DMA;或确保信号频率远低于(中断延迟时间 * 4)的倒数。
    • 检查3:TSCTR时钟源不稳定。确认系统时钟源(如PLL)已锁定且稳定。
  3. 问题:APWM模式输出波形频率或占空比不对。

    • 检查1:周期和比较值寄存器映射。在APWM模式下,CAP1APRD(周期),CAP2ACMP(比较值)。别写反了。
    • 检查2:影子寄存器机制。在APWM模式下更新CAP2(占空比)是立即更新影子寄存器,但活动寄存器要等到TSCTR=0(下个周期开始)才更新。如果你在周期中间连续多次修改CAP2,只有最后一次在TSCTR=0之前写入的值会生效。如果需要精确控制更新时刻,可以监控CTR=PRD标志或使用PWM周期中断。
    • 检查3:同步系统的相位计算。在多模块同步时,从设备的CTRPHS必须小于其自身的APRD。如果CTRPHS >= APRD,行为是未定义的,通常会导致输出异常。
  4. 问题:多模块同步时,从设备输出不同步。

    • 检查1:同步信号路径。确认主设备的SYNCO输出引脚和从设备的SYNCI输入引脚在硬件上已正确连接(有时是内部连接,需查数据手册)。
    • 检查2:从设备配置顺序。一个可靠的初始化顺序是:先配置所有从设备,但保持其TSCTRSTOP = EC_FREEZE(计数器停止)且SYNCI_EN = EC_DISABLE(同步禁用)。然后配置主设备并启动其计数器。最后,使能从设备的SYNCI_EN,再启动从设备的计数器。这可以避免在初始化过程中收到混乱的同步脉冲。
    • 检查3:同步脉冲极性/边沿。查阅技术参考手册,确认SYNCO脉冲是上升沿有效还是下降沿有效,以及脉冲宽度。确保从设备的同步检测逻辑与之匹配。

通过深入理解eCAP模块的两种时间哲学(绝对与差值)、熟练掌握CAP/APWM双模式配置、并警惕上述实战中的陷阱,你就能在AM261x乃至TI C2000系列的其他MCU上,游刃有余地驾驭时间测量与PWM生成这两项核心的实时控制技术,为你的电机控制、数字电源、精密测量等应用打下坚实的基础。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询