eCAP 全称 Enhanced Capture,干的活就是把输入信号边沿发生的"时刻"记下来——这个时刻就是模块内部计数器 TSCTR 当时的值。最常见的用途是测外部 PWM 的频率和占空比。这篇按 SysConfig 配置页一项一项过一遍,再把 TSCTR、Counter Reset、同步机制几个容易绕的点单独拎出来说清楚。
1. eCAP 是什么
测 PWM 时,eCAP 不会直接给你频率和占空比,而是把几个边沿的时间戳依次存进 CAP1~CAP4,剩下的差值计算交给软件。三个关键对象先认一下:
- TSCTR:内部时间戳计数器,按 eCAP 时钟一直递增,边沿一来就把它的当前值锁下来。
- CAP1~CAP4:四个捕获寄存器,依次保存第 1~4 个事件的 TSCTR 值;每个事件抓上升还是下降沿,由 Event Polarity 决定。
- Counter Reset:指定某个事件后把 TSCTR 清零,方便下一组测量从 0 重新开始。
2. SysConfig 选项逐项过
按界面从上到下,每项说清楚它控制什么、普通测 PWM 时怎么配。
Name / eCAP Instance:前者(myECAP0)是 SysConfig 里的软件实例名,生成代码的变量名、中断函数名会用到,不是寄存器名;后者选硬件实例,ECAP1 对应ECap1Regs,ECAP2 对应ECap2Regs。
Emulation Mode:仿真暂停(CCS 打断点)时 TSCTR 停不停。当前是暂停即停,学习调试用这个合适。
eCAP Mode = Capture:eCAP 有 Capture 和 APWM 两种用法,前者测输入边沿,后者把 eCAP 当简单 PWM 输出。这里是捕获模式。
Capture Mode = Continuous:CAP1~CAP4 循环使用,不用每次手动 arm;另一种 One-shot 抓到指定事件就停、要重新 arm。
Capture Stops at Event:One-shot 下表示抓到第几个事件后停,Continuous 下大致是第几个事件后回绕。截图里是 Event1,等于只反复用 CAP1,测不了完整占空比——测占空比要改成 Event4,凑齐一组 CAP1~CAP4 再回绕。
Event Prescaler = 0:输入事件分频,0 表示不分频、每个有效边沿都抓。普通测 PWM 用 0。
Event 1~4 Polarity:四个事件各抓什么边沿。截图里四个全是 Rising,只能测连续上升沿间隔。测占空比要配成 Rise / Fall / Rise / Fall:
Event1 = Rising -> CAP1 Event2 = Falling -> CAP2 Event3 = Rising -> CAP3 Event4 = Falling -> CAP4 高电平时间 = CAP2 - CAP1 周期 = CAP3 - CAP1 占空比 = (CAP2 - CAP1) / (CAP3 - CAP1)Use / Register / Enable Interrupt、Interrupt Source:四个一组。Use Interrupt 只是允许在 SysConfig 里配中断,不代表真会进;Register Interrupt Handler 决定要不要 SysConfig 帮你注册 ISR,不勾就得自己Interrupt_register(INT_ECAP1, &xxxISR);Enable Interrupt 才是真正开 CPU/PIE 通道;Interrupt Source 选哪个事件当中断源。截图里 Source 是 None,等于没中断。要稳定读一组 CAP1~CAP4,常见做法是开 Event4 中断(Event4 一到说明这组边沿基本抓全了)。
Enable Counter Reset = None:选哪些事件后清 TSCTR。None 表示不清,CAPx 存的是连续时间戳。
Phase Shift Count / Enable Load Counter / Load Counter / Reset Counters:都跟同步和软件复位有关,普通捕获基本用不到——Phase Shift Count 填 0,后面三个不勾。其中 Reset Counters 初始化可清一次,运行中别乱碰。
Sync Out Mode / Sync-In Pulse Source:同步相关,下面第 4 节单独说。普通测外部 PWM:Sync-In 选 Disable,Sync Out 保持默认或关掉都行。
eCAP Input:选 ECAP1 捕获哪一路输入(截图是 GPTRIP7)。务必确认外部 GPIO / Input XBAR / GPTRIP7 到 ECAP1 的输入路径接通了,这一步漏了就一直抓不到边沿。
Use DMA Source / DMA Source:要不要用 eCAP 事件触发 DMA。普通测 PWM 用 CPU 读就行,不用勾;真要用,触发源一般选 Event4。
Re-arm eCAP:重新 arm,主要对 One-shot 有意义,Continuous 下不用管。
3. TSCTR、CAP1~CAP4、Counter Reset 怎么联动
边沿来的时候,eCAP 不算占空比,只是把 TSCTR 当前值存进 CAP:
PWM: ___|‾‾‾‾|_____|‾‾‾‾|_____ ↑ ↓ ↑ ↓ E1 E2 E3 E4 TSCTR: 100 250 500 650 CAP1=100 CAP2=250 CAP3=500 CAP4=650 高电平时间 = CAP2 - CAP1 周期 = CAP3 - CAP1 低电平时间 = CAP3 - CAP2Enable Counter Reset 清的是 TSCTR,不是清 CAP1~CAP4,也不是清 CPU Timer。三种清法对应三种读数方式:不清时 CAPx 是绝对时间戳,靠差值算周期/脉宽,逻辑最清楚;每个事件都清时 CAPx 直接就是相邻边沿的间隔;只在 Event4 清时,一组 CAP1~CAP4 共用同一时间基准、下一组从头开始,连续测 PWM 占空比最方便。
贴一段对应的寄存器配置(Rise/Fall/Rise/Fall + Event4 清零):
ECap1Regs.TSCTR = 0; // 清时间戳计数器 ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // 允许捕获值加载到 CAP1~CAP4 ECap1Regs.ECCTL1.bit.CAP1POL = 0; // Event1 上升沿 ECap1Regs.ECCTL1.bit.CAP2POL = 1; // Event2 下降沿 ECap1Regs.ECCTL1.bit.CAP3POL = 0; // Event3 上升沿 ECap1Regs.ECCTL1.bit.CAP4POL = 1; // Event4 下降沿 ECap1Regs.ECCTL1.bit.CTRRST1 = 0; // Event1 后不清 TSCTR ECap1Regs.ECCTL1.bit.CTRRST2 = 0; // Event2 后不清 TSCTR ECap1Regs.ECCTL1.bit.CTRRST3 = 0; // Event3 后不清 TSCTR ECap1Regs.ECCTL1.bit.CTRRST4 = 1; // Event4 后清 TSCTR ECap1Regs.ECCTL2.bit.CAP_APWM = 0; // Capture 模式 ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // TSCTR 开始运行4. 同步机制
这块名字容易让人误会,先把对象说清楚:eCAP 的同步不是同步外部输入信号,也不是让被测 PWM 变整齐,它同步的是 eCAP 内部的 TSCTR 时间基准。
当 eCAP 收到 Sync-In、且装载功能打开时,硬件执行的是TSCTR = Phase Shift Count。所以 Phase Shift Count = 0 时,同步就等于把 TSCTR 清零;填 1000,同步后 TSCTR 就从 1000 起算。
要让它真正生效,三样要配齐:Sync-In Pulse Source 选好同步源(ePWM Sync-Out、其他模块、软件强制等),Enable Load Counter 打开(不开的话 Sync-In 来了也不改 TSCTR),Phase Shift Count 填同步后的起点值。
Sync-In 和 Sync-Out 是相反方向:Sync-In 是别人同步我,Sync-Out 是我同步别人(或把收到的同步继续往下传)。比如一条同步链 ePWM1 → ECAP1 → ECAP2:
ePWM1 │ Sync-Out ↓ ECAP1 (Sync-In 选 ePWM1;Sync Out Mode 决定要不要继续往外发) │ Sync-Out ↓ ECAP2 / 其他模块什么时候才需要同步?只测一个外部 PWM 的频率/占空比时不需要,因为周期和占空比都用 CAP 差值算,TSCTR 的绝对零点无所谓。只有当你想知道外部边沿相对 ePWM 周期的位置、或者要让多个 eCAP/ePWM 共用一个时间基准时,才需要让 TSCTR 和主时基对齐。普通捕获就 Sync-In Disable、Load Counter 不勾、Phase Shift Count = 0。
5. 常用配置建议
测频率 + 占空比:Capture 模式 + Continuous;Capture Stops at Event 选 Event4;Prescaler = 0;极性 Rise/Fall/Rise/Fall;Counter Reset 选 Event4;中断可不开,要开就选 Event4;Sync-In Disable。
只测频率/周期:Event1~4 全 Rising,连续上升沿差值就是周期;Stops at Event 至少到 Event2(要两个上升沿才能算一个周期);Counter Reset 清不清都行。
中断 vs 轮询:主循环或定时器里周期性读 CAP 的话,轮询就够,Interrupt Source 留 None;想一组抓完立刻处理就开 Event4 中断;高频、数据量大、不想频繁进中断,再上 DMA(触发源选 Event4)。
6. 配置检查清单
- 输入路径接通了没:外部 GPIO / Input XBAR / GPTRIP7 / ECAP1 输入要连起来,漏了就一直抓不到边沿。
- 测占空比时 Event1~4 别全是 Rising,要 Rise/Fall/Rise/Fall。
- Capture Stops at Event 还停在 Event1 的话,只能反复抓一个事件,测不了完整占空比。
- Counter Reset 清的是 TSCTR;测一组 PWM 一般选 Event4 后清。
- 普通测量先别开同步:Sync-In Disable,Load Counter 不勾。
- 要开中断,Register / Enable / Interrupt Source 三个得配齐。
- 不用 DMA 就别勾 Use DMA Source,下面的 DMA Source 下拉不用管。