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 关键控制逻辑:从事件输入到寄存器加载
无论是哪种模式,都离不开一套精巧的事件处理流水线。以捕获模式为例,一个外部信号要成功转化为寄存器中的一个时间戳,需要经历以下关卡:
- 事件预分频器:对于频率非常高的输入信号,可以先进行分频(N=2,4,6,...,62)。这就像给高速摄像机加了一个减光镜,防止它“过曝”。通过ECCTL1[EVTPS]配置。
- 边沿极性选择:每个捕获事件(CEVT1-CEVT4)都可以独立选择在上升沿还是下降沿触发。这是通过ECCTL1[CAPxPOL]位配置的。例如,你可以设置CEVT1为上升沿,CEVT2为下降沿,来测量一个脉冲的高电平时间。
- 模4计数器与序列器:这是一个2位计数器,决定下一个到来的合格边沿事件应该加载到哪个CAP寄存器(1,2,3,4依次循环)。它确保了事件的顺序性。你可以通过ECCTL2[STOP_WRAP]设置它在连续模式下循环(如1->2->3->4->1...),或在单次模式下在捕获指定次数后停止(如仅捕获前2次事件后冻结)。
- 加载使能与计数器复位:ECCTL1[CAPLDEN]位是总开关,打开后时间戳才能加载。而每个事件都可以独立配置是否在捕获后复位TSCTR(ECCTL1[CTRRSTx])。如果开启,则CAPx中存储的是从上次复位到本次事件的时间差(差分模式);如果关闭,存储的则是事件发生的绝对计数值。
这套流水线保证了硬件处理的自动化和高可靠性,软件只需要在适当的时候(如捕获完成产生中断后)去读取CAP寄存器中的值即可。
3. 捕获模式深度剖析与实战配置
捕获模式是eCAP的看家本领,其设计初衷就是为了实现高精度、低CPU开销的时间测量。我们通过一个完整的实战场景来理解它:测量一个方波信号的频率和占空比。
3.1 应用场景与配置策略
假设我们需要测量一个频率约1kHz,占空比可变的方波。我们计划用CEVT1捕获上升沿,CEVT2捕获下降沿,CEVT3捕获下一个上升沿。这样,CAP2-CAP1就是高电平时间,CAP3-CAP2就是低电平时间,CAP3-CAP1就是整个周期。我们采用差分模式,让计数器在每次捕获后复位,这样CAP寄存器里直接存储的就是时间间隔,省去了软件做减法的步骤。
配置步骤如下:
- 引脚与时钟初始化:将对应的GPIO引脚配置为eCAP功能输入。确保eCAP模块的时钟已使能。
- 停止并复位计数器:在配置前,先将ECCTL2[TSCTRSTOP]设为0(停��计数器),并可选择将TSCTR和CTRPHS寄存器写0。
- 配置捕获参数(ECCTL1):
CAP1POL = 0(CEVT1上升沿触发)CAP2POL = 1(CEVT2下降沿触发)CAP3POL = 0(CEVT3上升沿触发)CTRRST1 = 1(CEVT1捕获后复位计数器)CTRRST2 = 0(CEVT2捕获后不复位)CTRRST3 = 1(CEVT3捕获后复位计数器,为下一个周期做准备)CAPLDEN = 1(使能捕获加载)PRESCALE = 0(输入信号1kHz,频率不高,无需预分频)
- 配置操作模式(ECCTL2):
CAP/APWM = 0(设置为捕获模式)CONT/ONESHT = 0(连续模式,持续捕获)STOP_WRAP = 3(模4计数器在4个事件后归零,因为我们用了3个事件,设置到4确保循环)SYNCI_EN = 0(本例不需要外部同步)
- 配置中断:使能ECEINT寄存器中的CEVT1、CEVT2、CEVT3中断。通常我们更关心一个完整周期的结束,所以可以主要处理CEVT3中断。
- 启动计数器:将ECCTL2[TSCTRSTOP]设为1,计数器开始运行。
- 中断服务程序(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波形的完整性,更新发生在周期的边界,实现了“无缝切换”。
配置要点与避坑指南
- 初始化顺序:务必先配置模式和控制位,最后再使能计数器。一个推荐的顺序是:停止计数器(TSCTRSTOP=0) -> 设置CAP/APWM=1进入APWM模式 -> 配置极性等 ->写入CAP1和CAP2设置初始值(此时CAP3/CAP4会自动同步)-> 使能计数器(TSCTRSTOP=1)。
- 运行时更新:若要改变占空比,应只写入CAP4寄存器。例如:
ECap4Regs.CAP4 = new_compare_value;。若要改变周期,应只写入CAP3寄存器。绝对避免在运行时直接写CAP1或CAP2,除非你非常清楚后果。- 同步与相位控制:多个eCAP模块生成多路PWM时,可以利用CTRPHS和同步链(SYNCI/SYNCO)来精确控制它们之间的相位差。例如,主模块设置
SYNCO_SEL为CTR=PRD输出同步信号,从模块使能SYNCI_EN,并设置不同的CTRPHS值,就能实现交错并联。
4.3 实战:配置一个中心对称的PWM
假设我们需要在150MHz系统时钟下生成一个100kHz(周期10us),占空比50%的PWM,并采用影子模式更新。
- 计算寄存器值:
- 周期值
APRD = (T_pwm * SYSCLK) - 1 = (10e-6 * 150e6) - 1 = 1499 - 比较值
ACMP = Duty * (APRD + 1) = 0.5 * 1500 = 750
- 周期值
- 基础配置:
// 假设使用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 - 设置初始值(直接写活动寄存器):
ECap1Regs.CAP1 = 1499; // 写入活动周期寄存器APRD,CAP3会自动同步 ECap1Regs.CAP2 = 750; // 写入活动比较寄存器ACMP,CAP4会自动同步 - 启动计数器:
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // 启动TSCTR计数器 - 运行时更新占空比(例如改为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_PRD和CTR_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; }必须避开的坑:
- 清除标志的顺序:务必先清除具体事件标志(如CEVT1),再清除全局INT标志。顺序反了可能导致中断立即被重新触发。
- 读取寄存器与清除标志:对于捕获模式,通常需要在清除标志前读取CAP寄存器,以确保数据是本次中断对应的。但这不是绝对的,取决于你的应用逻辑。
- 中断使能时机:推荐的外设初始化顺序是:关闭全局中断 -> 停止eCAP计数器 -> 禁用所有eCAP中断(ECEINT=0) -> 配置所有寄存器 -> 清除所有可能悬置的中断标志(ECFLG) -> 使能需要的eCAP中断 -> 启动计数器 -> 开启全局中断。这可以避免在配置过程中产生不可预期的中断。
- 使用强制中断寄存器(ECFRC)进行测试:在调试阶段,你可以通过向
ECFRC寄存器的对应位写1,来模拟硬件中断事件,这对于验证你的ISR逻辑是否正确非常有用。
5.3 利用中断实现高级功能
理解了基础中断,我们可以设计更复杂的应用。例如,在单次捕获模式下,我们可以设置STOP_WRAP=EC_EVENT4,并使能CEVT4中断。当第四个边沿事件捕获完成后,模块自动停止,并产生中断。在ISR中,我们可以安全地读取全部四个CAP寄存器(值已被冻结),计算出三个时间间隔,然后重新REARM模块,开始下一次捕获序列。这非常适合测量一个固定格式的脉冲串。
在APWM模式下,使能CTR=CMP和CTR=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; }这段代码提供了一个稳健的初始化模板。在实际项目中,你需要根据具体的测量需求(差分/绝对、单次/连续、边沿选择)来调整ECCTL1和ECCTL2的配置。记住,好的初始化是稳定工作的基石,遵循“先停止,再配置,后启动”的原则,能避免绝大多数奇怪的硬件问题。