TI C2000 eCAP模块深度解析:从高精度捕获到无毛刺PWM生成

📅 2026/7/23 2:26:57 👁️ 阅读次数 📝 编程学习
TI C2000 eCAP模块深度解析:从高精度捕获到无毛刺PWM生成

1. 项目概述与eCAP模块核心价值

在嵌入式实时控制的世界里,时间就是一切。无论是精确测量电机编码器的脉冲间隔,还是生成驱动开关电源的PWM信号,其核心都依赖于一个能够精准“感知”和“创造”时间的硬件单元。很多工程师初接触这类需求时,可能会尝试用通用定时器配合中断和软件计算来实现,但很快就会发现,在高频信号或对实时性要求严苛的场景下,软件开销和中断延迟会成为性能瓶颈,甚至导致测量失真或控制失稳。

这时,像德州仪器(TI)C2000系列微控制器中集成的增强型捕获(eCAP)模块这样的专用外设,其价值就凸显出来了。它不是一个简单的计数器,而是一个高度集成、高度自动化的“时间处理器”。你可以把它想象成一个拥有独立大脑和精密秒表的哨兵。在捕获模式下,它能自动记录外部信号四个特定边沿(上升沿或下降沿)发生的精确时刻(时间戳),完全无需CPU干预,解放了CPU去处理更复杂的控制算法。而在APWM模式下,它又能摇身一变,成为一个高分辨率、带影子寄存器的PWM发生器,确保你在运行时更新占空比或周期时波形不会出现毛刺。

我最初接触eCAP是为了做一个无刷直流电机的转速测量。用普通GPIO中断测频,在高速时误差很大。改用eCAP后,不仅测量精度达到了纳秒级,CPU占用率也几乎降为零。这让我深刻体会到,用好这类硬件加速模块,是从“能实现功能”到“能稳定、高效、精确实现功能”的关键一步。本文将结合手册原理和实际项目经验,为你彻底拆解eCAP的捕获模式APWM模式,让你不仅知道怎么配置,更明白为什么要这样配置,以及在实际项目中如何避开那些手册上没写的“坑”。

2. eCAP模块整体架构与工作模式解析

要驾驭eCAP模块,绝不能把它当成一堆零散寄存器的集合。我们必须先建立起一个清晰的顶层视图,理解其内部数据流和控制逻辑。整个模块可以看作围绕一个核心——32位时间戳计数器(TSCTR)——构建的两套独立但又共享资源的系统:一套用于“捕捉”外部世界的时间(捕获模式),另一套用于“塑造”输出波形的时间(APWM模式)。

2.1 核心引擎:32位时间戳计数器(TSCTR)与相位控制

TSCTR是整个模块的心跳。它由一个32位的向上计数器构成,时钟源通常来自系统时钟(SYSCLK)或其分频。32位的宽度意味着在150MHz的系统时钟下,其计数周期超过28秒,足以满足绝大多数高精度定时需求。它的工作非常简单:不停地从0向上累加,到达最大值0xFFFFFFFF后溢出归零,并置位溢出标志。

但光有自由运行还不够,在多个eCAP或ePWM模块需要协同工作时(例如多相电机控制),同步至关重要。这就是CTRPHS(计数器相位偏移寄存器)和同步逻辑的作用。你可以将CTRPHS看作TSCTR的一个“预备值”。当发生同步事件(SYNCI,可以是外部引脚信号或软件强制同步)时,CTRPHS中的值会立刻加载到TSCTR中。这就允许你让一个eCAP模块的计数器从0开始,而另一个从1000开始,从而实现精确的相位差控制。这个特性在APWM模式下构建交错式电源拓扑时极其有用。

2.2 两副面孔:捕获模式与APWM模式的本质区别

模块通过ECCTL2[CAP/APWM]这个关键位来决定当前扮演哪个角色。这不仅仅是功能切换,更是内部资源的一次重大重新分配。

捕获模式(CAP/APWM = 0)下:

  • 引脚功能:配置的GPIO引脚作为输入,用于检测外部信号边沿。
  • 核心资源:四个32位的捕获寄存器(CAP1, CAP2, CAP3, CAP4)全部用作“快照存储器”。当指定的边沿事件发生时,当前TSCTR的值被自动锁存到对应的CAPx寄存器中。
  • 计数器行为:TSCTR可以配置为在特定捕获事件后复位(用于测量脉冲宽度),或一直自由运行(用于记录绝对时间戳)。
  • 目标:精确测量时间间隔、频率、占空比。

APWM模式(CAP/APWM = 1)下:

  • 引脚功能:配置的GPIO引脚作为输出,用于产生PWM波形。
  • 核心资源:寄存器角色发生转变。CAP1和CAP2变成了活动周期寄存器(APRD)活动比较寄存器(ACMP),直接参与和TSCTR的比较以生成PWM。CAP3和CAP4则成为它们的影子寄存器,用于安全地更新参数。
  • 计数器行为:TSCTR在计数值等于周期值(APRD)时自动复位,形成一个标准的递增计数PWM时基。
  • 目标:生成高精度、可实时无毛刺更新的PWM信号。

理解这种“角色扮演”是正确配置寄存器的前提。例如,在APWM模式下,你向CAP3写入值是想更新周期,但这个值不会立即生效,而是先放在影子寄存器里,等待一个安全的时机(如计数器归零时)才加载到活动的CAP1中,从而避免PWM波形中间出现断裂。

2.3 关键控制逻辑:从事件输入到寄存器加载

无论是哪种模式,都离不开一套精巧的事件处理流水线。以捕获模式为例,一个外部信号要成功转化为寄存器中的一个时间戳,需要经历以下关卡:

  1. 事件预分频器:对于频率非常高的输入信号,可以先进行分频(N=2,4,6,...,62)。这就像给高速摄像机加了一个减光镜,防止它“过曝”。通过ECCTL1[EVTPS]配置。
  2. 边沿极性选择:每个捕获事件(CEVT1-CEVT4)都可以独立选择在上升沿还是下降沿触发。这是通过ECCTL1[CAPxPOL]位配置的。例如,你可以设置CEVT1为上升沿,CEVT2为下降沿,来测量一个脉冲的高电平时间。
  3. 模4计数器与序列器:这是一个2位计数器,决定下一个到来的合格边沿事件应该加载到哪个CAP寄存器(1,2,3,4依次循环)。它确保了事件的顺序性。你可以通过ECCTL2[STOP_WRAP]设置它在连续模式下循环(如1->2->3->4->1...),或在单次模式下在捕获指定次数后停止(如仅捕获前2次事件后冻结)。
  4. 加载使能与计数器复位ECCTL1[CAPLDEN]位是总开关,打开后时间戳才能加载。而每个事件都可以独立配置是否在捕获后复位TSCTR(ECCTL1[CTRRSTx])。如果开启,则CAPx中存储的是从上次复位到本次事件的时间差(差分模式);如果关闭,存储的则是事件发生的绝对计数值。

这套流水线保证了硬件处理的自动化和高可靠性,软件只需要在适当的时候(如捕获完成产生中断后)去读取CAP寄存器中的值即可。

3. 捕获模式深度剖析与实战配置

捕获模式是eCAP的看家本领,其设计初衷就是为了实现高精度、低CPU开销的时间测量。我们通过一个完整的实战场景来理解它:测量一个方波信号的频率和占空比。

3.1 应用场景与配置策略

假设我们需要测量一个频率约1kHz,占空比可变的方波。我们计划用CEVT1捕获上升沿,CEVT2捕获下降沿,CEVT3捕获下一个上升沿。这样,CAP2-CAP1就是高电平时间,CAP3-CAP2就是低电平时间,CAP3-CAP1就是整个周期。我们采用差分模式,让计数器在每次捕获后复位,这样CAP寄存器里直接存储的就是时间间隔,省去了软件做减法的步骤。

配置步骤如下:

  1. 引脚与时钟初始化:将对应的GPIO引脚配置为eCAP功能输入。确保eCAP模块的时钟已使能。
  2. 停止并复位计数器:在配置前,先将ECCTL2[TSCTRSTOP]设为0(停��计数器),并可选择将TSCTR和CTRPHS寄存器写0。
  3. 配置捕获参数(ECCTL1)
    • CAP1POL = 0(CEVT1上升沿触发)
    • CAP2POL = 1(CEVT2下降沿触发)
    • CAP3POL = 0(CEVT3上升沿触发)
    • CTRRST1 = 1(CEVT1捕获后复位计数器)
    • CTRRST2 = 0(CEVT2捕获后不复位)
    • CTRRST3 = 1(CEVT3捕获后复位计数器,为下一个周期做准备)
    • CAPLDEN = 1(使能捕获加载)
    • PRESCALE = 0(输入信号1kHz,频率不高,无需预分频)
  4. 配置操作模式(ECCTL2)
    • CAP/APWM = 0(设置为捕获模式)
    • CONT/ONESHT = 0(连续模式,持续捕获)
    • STOP_WRAP = 3(模4计数器在4个事件后归零,因为我们用了3个事件,设置到4确保循环)
    • SYNCI_EN = 0(本例不需要外部同步)
  5. 配置中断:使能ECEINT寄存器中的CEVT1、CEVT2、CEVT3中断。通常我们更关心一个完整周期的结束,所以可以主要处理CEVT3中断。
  6. 启动计数器:将ECCTL2[TSCTRSTOP]设为1,计数器开始运行。
  7. 中断服务程序(ISR):在CEVT3中断中,读取CAP1, CAP2, CAP3的值。由于工作在差分模式且CTRRST1/3使能,我们有:
    • 高电平时间T_high = CAP2
    • 低电平时间T_low = CAP3 - CAP2(注意:CAP3是第二个上升沿的捕获值,此时计数器从0开始计到了这个值)
    • 周期T_period = CAP3
    • 频率Freq = SYSCLK / T_period
    • 占空比Duty = T_high / T_period读取后,必须清除对应的中断标志位(ECFLG中的CEVT3)和全局中断标志(ECFLG[INT]),通常通过向ECCLR寄存器的对应位写1来完成。

3.2 单次模式与连续模式的抉择

连续模式(CONT/ONESHT=0)就像一台自动运行的录像机,模4计数器循环往复(0,1,2,3,0,1...),捕获事件不断覆盖CAP寄存器(除非用DMA搬走)。这适用于需要持续监控信号的场合,比如实时转速反馈。

单次模式(CONT/ONESHT=1)则像拍一张照片。通过STOP_WRAP设置拍几张(1-4次)。例如,设为EC_EVENT2,则模块在捕获完CEVT1和CEVT2后,模4计数器会停止,CAP1和CAP2的值被冻结,不再被后续事件覆盖。这对于捕获一个特定的事件序列非常有用,比如测量一个已知的、非周期性的脉冲串宽度。要开始下一次捕获,必须通过软件向ECCTL2[REARM]位写1来重新“上膛”。

实操心得:中断处理与数据读取的时机在连续模式下,中断产生和寄存器被新值覆盖是异步的。一个常见的坑是:中断产生后,如果你在ISR中读取CAP寄存器的速度太慢,而输入信号频率很高,可能在你读完之前,下一个周期的事件已经发生并覆盖了寄存器值。对于高速信号,有两种策略:1) 使用DMA在每次捕获事件时自动将CAP寄存器的值搬运到安全的RAM缓冲区;2) 在ISR中第一时间将CAP寄存器的值拷贝到局部变量中,再进行计算。绝对避免在ISR中进行浮点运算等耗时操作。

3.3 差分模式与绝对模式的原理与计算

这是捕获模式中理解时间值含义的关键。

  • 绝对模式(CTRRSTx=0):TSCTR一直自由运行。CAPx中捕获的是事件发生时TSCTR的绝对计数值。要计算时间间隔,需要软件做减法。例如,间隔 = CAP2 - CAP1。前提是TSCTR在这期间没有溢出。如果间隔可能很长,就需要处理计数器溢出的情况,计算会变得复杂:间隔 = (CAP2 - CAP1) & 0xFFFFFFFF(如果CAP2 > CAP1,且无溢出);如果CAP2 < CAP1,则说明发生了溢出,需要加上2^32。
  • 差分模式(CTRRSTx=1):在特定捕获事件后,TSCTR自动复位为0。那么,下一个捕获事件发生时,CAPx中存储的就是从上一次复位到当前事件的时间间隔。这样,每个CAP寄存器里的值本身就是一个时间差,无需软件再做减法。这大大简化了计算,并天然避免了溢出问题。如上文的占空比测量例子。

选择哪种模式取决于应用。差分模式简单直观,适合测量连续的、周期性的时间间隔。绝对模式则提供了更大的灵活性,可以记录事件发生的绝对时间线,适合复杂的事件序列分析,但需要更复杂的软件逻辑来处理溢出和计算。

4. APWM模式原理与高可靠性PWM生成

当eCAP切换到APWM模式,它就从一个“记录员”变成了一个“指挥家”。其核心是利用一个递增计数器与两个比较器(周期比较和占空比比较)来生成PWM波形。TI的eCAP在APWM模式下的设计精髓在于其影子寄存器机制,这确保了PWM参数在运行中更新的平滑性与安全性。

4.1 APWM模式的工作原理与寄存器映射

在APWM模式下,内部逻辑发生了根本性变化:

  • TSCTR:行为变为递增计数,在TSCTR == CAP1(APRD)时复位归零。CTR=PRD事件成为周期匹配信号。
  • CAP1:角色变为活动周期寄存器(Active Period, APRD)。它的值决定了PWM的周期。
  • CAP2:角色变为活动比较寄存器(Active Compare, ACMP)。它的值与TSCTR比较,产生CTR=CMP事件,用于翻转PWM输出,决定占空比。
  • CAP3:成为APRD的影子寄存器(Shadow Register)
  • CAP4:成为ACMP的影子寄存器(Shadow Register)
  • 输出逻辑:根据ECCTL2[APWMPOL]位,决定输出极性。APWMPOL=0为高有效,即TSCTR小于ACMP时输出高电平;APWMPOL=1为低有效。

PWM的周期和占空比计算公式如下(假设系统时钟为SYSCLK):

  • PWM周期T_pwm = (APRD + 1) / SYSCLK
  • PWM高电平时间(APWMPOL=0时)T_high = (ACMP) / SYSCLK
  • PWM占空比Duty = ACMP / (APRD + 1)

特别注意:公式中是APRD + 1。因为当TSCTR从0计数到APRD时,总共经历了APRD+1个时钟周期。这是一个常见的理解误区,手册中的波形图也明确显示了这一点。

4.2 影子寄存器:实现无毛刺参数更新的关键

这是APWM模式最核心的机制。在电机控制或数字电源中,我们经常需要在PWM运行时动态调整占空比或频率。如果直接写入活动的CAP1或CAP2寄存器,而写入的时刻恰好发生在计数器正在与旧值比较的过程中,就可能导致产生一个极窄的“毛刺”脉冲,这在功率电路中可能是灾难性的。

影子寄存器解决了这个问题。它提供了一个缓冲区域。初始化时,你必须直接写入活动寄存器CAP1和CAP2来设置初始周期和比较值,同时这个值会自动拷贝到影子寄存器CAP3和CAP4。运行时需要更新参数,你则写入影子寄存器CAP3(更新周期)或CAP4(更新占空比)。

那么,影子寄存器的值何时加载到活动寄存器呢?这由加载模式决定,通过写入的目标寄存器隐含控制:

  • 立即加载模式:当你直接写入活动寄存器CAP1或CAP2时,硬件会同时更新活动寄存器及其对应的影子寄存器。这本质上绕过了影子缓冲机制,适用于初始化或对实时性要求极高且能接受潜在风险的场景。
  • 周期加载模式(影子模式):当你写入影子寄存器CAP3或CAP4时,新值不会立即生效。它会在下一个CTR=PRD事件(即当前PWM周期结束,计数器归零时)自动从影子寄存器加载到活动寄存器。这保证了PWM波形的完整性,更新发生在周期的边界,实现了“无缝切换”。

配置要点与避坑指南

  1. 初始化顺序:务必先配置模式和控制位,最后再使能计数器。一个推荐的顺序是:停止计数器(TSCTRSTOP=0) -> 设置CAP/APWM=1进入APWM模式 -> 配置极性等 ->写入CAP1和CAP2设置初始值(此时CAP3/CAP4会自动同步)-> 使能计数器(TSCTRSTOP=1)。
  2. 运行时更新:若要改变占空比,应只写入CAP4寄存器。例如:ECap4Regs.CAP4 = new_compare_value;。若要改变周期,应只写入CAP3寄存器。绝对避免在运行时直接写CAP1或CAP2,除非你非常清楚后果。
  3. 同步与相位控制:多个eCAP模块生成多路PWM时,可以利用CTRPHS和同步链(SYNCI/SYNCO)来精确控制它们之间的相位差。例如,主模块设置SYNCO_SELCTR=PRD输出同步信号,从模块使能SYNCI_EN,并设置不同的CTRPHS值,就能实现交错并联。

4.3 实战:配置一个中心对称的PWM

假设我们需要在150MHz系统时钟下生成一个100kHz(周期10us),占空比50%的PWM,并采用影子模式更新。

  1. 计算寄存器值
    • 周期值APRD = (T_pwm * SYSCLK) - 1 = (10e-6 * 150e6) - 1 = 1499
    • 比较值ACMP = Duty * (APRD + 1) = 0.5 * 1500 = 750
  2. 基础配置
    // 假设使用eCAP1 ECap1Regs.ECCTL2.bit.CAP_APWM = 1; // 1: APWM mode ECap1Regs.ECCTL2.bit.APWMPOL = 0; // 0: Active high ECap1Regs.ECCTL2.bit.SYNCO_SEL = 2; // 2: Disable sync-out (本例独立运行) ECap1Regs.ECCTL2.bit.SYNCI_EN = 0; // Disable sync-in
  3. 设置初始值(直接写活动寄存器)
    ECap1Regs.CAP1 = 1499; // 写入活动周期寄存器APRD,CAP3会自动同步 ECap1Regs.CAP2 = 750; // 写入活动比较寄存器ACMP,CAP4会自动同步
  4. 启动计数器
    ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // 启动TSCTR计数器
  5. 运行时更新占空比(例如改为30%)
    Uint16 new_cmp = (Uint16)(0.3 * 1500); // 计算新比较值 ECap1Regs.CAP4 = new_cmp; // 写入影子寄存器ACMP shadow,下个周期生效

通过这样的配置,我们就得到了一个稳定、可安全动态调整的PWM输出。eCAP的APWM模式虽然不如专有的ePWM模块功能丰富(如死区生成、错误联防等),但其简单、精准且带影子寄存器的特性,使其成为需要高分辨率PWM或作为补充PWM通道时的绝佳选择。

5. 中断系统详解与稳健编程实践

eCAP模块提供了丰富的中断事件源,让CPU可以及时知道关键事件的发生,而不必轮询。但中断配置和使用不当,也是导致系统不稳定、丢中断甚至死锁的常见原因。

5.1 中断源与标志位管理

eCAP的中断事件主要分为捕获模式相关和APWM模式相关两大类,由ECFLG(标志寄存器)ECEINT(使能寄存器)管理:

  • 捕获模式:CEVT1, CEVT2, CEVT3, CEVT4。当对应序号的捕获事件发生时置位。
  • APWM模式:CTR=PRD(周期匹配), CTR=CMP(比较匹配)。
  • 通用事件:CTROVF(计数器溢出),两种模式下均有效。

一个至关重要的细节ECFLG寄存器中的CEVTx标志位仅在捕获模式下有效,而CTR_PRDCTR_CMP标志位仅在APWM模式下有效CTROVF则在两种模式下都有效。如果你在错误模式下使能了不该使能的中断,将永远无法等到中断发生。

中断产生的逻辑是:当一个事件发生,其对应的ECFLG标志位会被硬件置1。如果ECEINT中对应的中断使能位也为1,并且全局中断标志ECFLG[INT]为0,则模块会向CPU的PIE控制器产生一个中断脉冲。一旦中断脉冲发出,ECFLG[INT]位会被自动置1,这将阻塞后续所有中断,直到该位被软件清零。

5.2 中断服务程序(ISR)的标准流程与陷阱规避

编写健壮的eCAP中断服务程序,必须遵循严格的清理流程。以下是一个处理CEVT1中断的示例框架:

__interrupt void ecap1_isr(void) { // 1. 读取捕获值(如果需要) Uint32 cap1_value = ECap1Regs.CAP1; Uint32 cap2_value = ECap1Regs.CAP2; // ... 进行必要的计算 // 2. 清除具体的事件标志位(必须做) ECap1Regs.ECCLR.bit.CEVT1 = 1; // 清除CEVT1标志 // 3. 清除全局中断标志INT(必须做,否则后续中断被阻塞) ECap1Regs.ECCLR.bit.INT = 1; // 4. 确认PIE组中断已被响应(针对C2000,其他MCU类似) PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; // 假设eCAP1在PIE组4 // 5. 使能全局中断(如果之前关闭了) EINT; }

必须避开的坑:

  1. 清除标志的顺序:务必先清除具体事件标志(如CEVT1),再清除全局INT标志。顺序反了可能导致中断立即被重新触发。
  2. 读取寄存器与清除标志:对于捕获模式,通常需要在清除标志读取CAP寄存器,以确保数据是本次中断对应的。但这不是绝对的,取决于你的应用逻辑。
  3. 中断使能时机:推荐的外设初始化顺序是:关闭全局中断 -> 停止eCAP计数器 -> 禁用所有eCAP中断(ECEINT=0) -> 配置所有寄存器 -> 清除所有可能悬置的中断标志(ECFLG) -> 使能需要的eCAP中断 -> 启动计数器 -> 开启全局中断。这可以避免在配置过程中产生不可预期的中断。
  4. 使用强制中断寄存器(ECFRC)进行测试:在调试阶段,你可以通过向ECFRC寄存器的对应位写1,来模拟硬件中断事件,这对于验证你的ISR逻辑是否正确非常有用。

5.3 利用中断实现高级功能

理解了基础中断,我们可以设计更复杂的应用。例如,在单次捕获模式下,我们可以设置STOP_WRAP=EC_EVENT4,并使能CEVT4中断。当第四个边沿事件捕获完成后,模块自动停止,并产生中断。在ISR中,我们可以安全地读取全部四个CAP寄存器(值已被冻结),计算出三个时间间隔,然后重新REARM模块,开始下一次捕获序列。这非常适合测量一个固定格式的脉冲串。

在APWM模式下,使能CTR=CMPCTR=PRD中断,可以分别在每个PWM周期的比较点(改变输出时)和周期点(计数器复位时)执行特定的代码,例如在周期点进行电流采样,在比较点后更新下一个周期的控制算法输出(写入CAP4影子寄存器),实现精准的数字控制环路时序。

6. 关键寄存器精讲与配置代码片段

手册提供了寄存器列表,但实际编程时,我们需要关注的是每个位域的具体含义和组合效果。这里对一些最关键的寄存器位进行“翻译”和实战化解读。

6.1 ECCTL2:模式与全局控制寄存器

这是eCAP的“大脑”,决定了模块的根本行为。

  • CAP/APWM (位9):模式选择开关。0为捕获,1为APWM。切换此位会显著改变内部逻辑和引脚方向,通常需要在计数器停止时进行
  • APWMPOL (位10):仅APWM模式有效。0=高有效(CMP定义高电平时间),1=低有效。选择取决于你的驱动电路是高端驱动还是低端驱动。
  • CONT/ONESHT (位0):捕获模式下的运行模式。连续模式像录像,单次模式像拍照。单次模式捕获完成后,必须软件REARM才能开始下一次
  • STOP_WRAP (位[2:1]):在单次模式下,它定义“拍几张照片后停止”(1-4)。在连续模式下,它定义“录像带循环覆盖的起点”(在哪个事件后CAP1重新开始装载)。例如,设为EC_EVENT2,在连续模式下意味着CAP1和CAP2被循环使用。
  • REARM (位3):单次模式的“快门按钮”。写1会使模4计数器归零,并重新允许捕获加载。在单次模式下,每次捕获序列结束后都必须执行此操作
  • TSCTRSTOP (位4):计数器的启停开关。1=运行,0=停止。在修改关键配置(如CAP/APWM模式、同步设置)前,应先停止计数器

6.2 ECCTL1:捕获事件精细控制寄存器

这是捕获模式的“感官系统”,负责定义如何感知外部信号。

  • CAPxPOL (位0,2,4,6):分别定义四个捕获事件的边沿极性。0=上升沿,1=下降沿。巧妙配置这四个位可以实现脉宽、周期、占空比的一次性测量。
  • CTRRSTx (位1,3,5,7):定义对应捕获事件发生后,是否复位TSCTR。这是实现差分模式的关键。例如,测量高电平时间:设置CEVT1上升沿触发且CTRRST1=1,CEVT2下降沿触发且CTRRST2=0。则CAP1为0(复位后立即捕获),CAP2即为高电平时间。
  • CAPLDEN (位8):总使能位。必须设为1,捕获事件才能加载到CAP寄存器。在单次模式下,当停止条件满足时,硬件会自动清零此位以冻结数据
  • PRESCALE (位[13:9]):事件预分频。输入信号频率超过系统时钟几分之一时,就需要考虑分频。例如,PRESCALE=2表示4分频,每4个输入边沿才产生1个捕获事件。

6.3 完整初始化代码示例(捕获模式)

下面是一个针对TI C2000 Piccolo系列MCU,使用CCS开发环境的eCAP1捕获模式初始化函数示例,配置为连续模式、测量上升沿时间戳、使用中断。

#include "F28x_Project.h" void InitECap1_CaptureMode(void) { // 步骤1: 关闭全局中断 DINT; // 步骤2: 停止eCAP计数器并禁用中断 ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; // 停止计数器 ECap1Regs.ECEINT.all = 0; // 禁用所有eCAP中断 // 步骤3: 配置GPIO引脚为eCAP功能 (以GPIO5为例,需查具体数据手册) GPIO_SetupPinMux(5, GPIO_MUX_CPU1, 1); // 复用功能1通常是eCAP // 步骤4: 配置捕获控制寄存器1 (ECCTL1) ECap1Regs.ECCTL1.bit.CAP1POL = 0; // CEVT1 上升沿 ECap1Regs.ECCTL1.bit.CAP2POL = 0; // CEVT2 上升沿 (可根据需要调整) ECap1Regs.ECCTL1.bit.CAP3POL = 0; // CEVT3 上升沿 ECap1Regs.ECCTL1.bit.CAP4POL = 0; // CEVT4 上升沿 ECap1Regs.ECCTL1.bit.CTRRST1 = 0; // 绝对模式,不复位 ECap1Regs.ECCTL1.bit.CTRRST2 = 0; ECap1Regs.ECCTL1.bit.CTRRST3 = 0; ECap1Regs.ECCTL1.bit.CTRRST4 = 0; ECap1Regs.ECCTL1.bit.PRESCALE = 0; // 不分频 ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // 使能捕获加载 // 步骤5: 配置捕获控制寄存器2 (ECCTL2) ECap1Regs.ECCTL2.bit.CAP_APWM = 0; // 捕获模式 ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0; // 连续模式 ECap1Regs.ECCTL2.bit.STOP_WRAP = 3; // 4个事件后循环 ECap1Regs.ECCTL2.bit.SYNCI_EN = 0; // 禁用同步输入 ECap1Regs.ECCTL2.bit.SYNCO_SEL = 2; // 禁用同步输出 // REARM位和SWSYNC位保持默认0 // 步骤6: 清除所有可能悬置的中断标志 ECap1Regs.ECCLR.all = 0xFFFF; // 清除所有标志位 // 步骤7: 使能所需的中断 (例如,使能CEVT1和计数器溢出中断) ECap1Regs.ECEINT.bit.CEVT1 = 1; ECap1Regs.ECEINT.bit.CTROVF = 1; // 可选,用于检测长时间无信号 // 步骤8: 初始化计数器值 (可选) ECap1Regs.TSCTR = 0; ECap1Regs.CTRPHS = 0; // 步骤9: 启动计数器 ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // 步骤10: 配置PIE中断向量表并开启PIE中断 (C2000特有步骤) // 假设eCAP1中断在INT4.1 EALLOW; PieVectTable.ECAP1_INT = &ecap1_isr; // 指向你的ISR函数 EDIS; PieCtrlRegs.PIEIER4.bit.INTx1 = 1; // 使能PIE组4的第1个中断 IER |= M_INT4; // 使能CPU级INT4中断 // 步骤11: 开启全局中断 EINT; }

这段代码提供了一个稳健的初始化模板。在实际项目中,你需要根据具体的测量需求(差分/绝对、单次/连续、边沿选择)来调整ECCTL1ECCTL2的配置。记住,好的初始化是稳定工作的基石,遵循“先停止,再配置,后启动”的原则,能避免绝大多数奇怪的硬件问题。