TI C2000 eCAP/eQEP模块实战:从原理到电机控制应用

📅 2026/7/22 14:10:55 👁️ 阅读次数 📝 编程学习
TI C2000 eCAP/eQEP模块实战:从原理到电机控制应用

1. 项目概述与核心价值

在嵌入式系统,尤其是电机控制、伺服驱动和精密运动控制领域,我们工程师经常需要和两种最基础的物理量打交道:时间位置。时间决定了我们何时采样、何时驱动,而位置则告诉我们“身在何处”。处理这两者,如果全靠软件轮询或中断,不仅会大量消耗宝贵的CPU资源,在高频信号面前更是力不从心,精度根本无法保证。

这就是为什么像TI C2000系列这样的高性能微控制器,会内置专门的硬件外设来应对这些挑战:eCAP(增强型捕获模块)eQEP(增强型正交编码器脉冲模块)。前者是你的“高精度秒表”,专门用来捕捉信号的边沿,记录下事件发生的精确时刻;后者则是你的“智能里程表”,能自动解读编码器的正交信号,实时告诉你电机的转速和转向。

我见过不少项目,初期为了图省事,用GPIO中断加定时器来模拟这些功能,结果在电机转速稍高或者PWM频率上去之后,系统就变得不稳定,采样丢数据、计算有延迟。后来换上eCAP和eQEP,整个系统的响应速度和控制精度立刻上了一个台阶,CPU负载也降下来了。所以,今天我就结合手册里的原理图和代码片段,把这两个模块从寄存器配置到实际应用中的坑,给大家掰开揉碎了讲清楚。无论你是正在调试无刷电机驱动器,还是需要精确测量传感器信号的频率,这篇文章都能给你一套可以直接“抄作业”的实战方案。

2. eCAP模块:你的高精度硬件秒表

eCAP模块的核心思想很简单:它内部有一个32位的自由运行计数器(TSCTR),就像一块永不停止的电子表。当外部引脚(CAPx)上发生你预设的事件(比如上升沿)时,硬件会自动把当前“电子表”的读数(时间戳)保存到一个专用的捕获寄存器(CAP1-CAP4)里。整个过程由硬件完成,无需CPU干预,保证了极高的时效性和精度。

2.1 核心工作模式解析

根据你的需求,eCAP主要可以配置为两种工作模式:捕获模式(CAP)APWM模式。捕获模式用于测量,APWM模式则用于生成信号。我们重点看捕获模式,它又细分为两种时间戳类型和两种边沿触发方式,排列组合出四种经典应用场景。

2.1.1 绝对时间戳模式 vs. 差值时间戳模式

这是理解eCAP的关键。手册中的几个波形图(Figure 20-21 至 20-24)完美诠释了这两种模式。

绝对时间戳模式下,那个32位的TSCTR计数器一直累加,永不停止,直到溢出归零。每次捕获事件发生时,硬件只是“咔嚓”一下,把计数器当前的值复制到CAPx寄存器。要计算两个事件之间的时间间隔(比如脉冲周期),就需要软件做减法:Period = TSt2 - TSt1

差值时间戳模式则更加“智能”。在此模式下,每次捕获事件发生后,硬件在保存时间戳后,会立刻将TSCTR计数器复位到0。这意味着,下一次捕获发生时,CAPx寄存器里存放的值,直接就是从上一次事件到这一次事件所经过的时间。软件无需再做减法,读取的值就是直接的间隔时间。

模式选择心得:绝对模式适合测量连续事件的绝对时间点,便于进行复杂的事件序列分析;而差值模式在单纯测量周期或占空比时更高效,软件负担小。但要注意,在差值模式下,如果两次事件间隔超过了TSCTR计数器的最大值(0xFFFFFFFF),计数器会溢出(CNTOVF),这个标志位一定要在中断服务程序中检查和处理,否则时间计算会出错。

2.1.2 单边沿触发 vs. 双边沿触发

边沿触发决定了eCAP模块对什么样的信号变化做出反应。

  • 仅上升沿触发:只在信号从低到高跳变时捕获。这样,连续捕获到的时间戳T1、T2、T3...的差值,直接就是信号的周期Period = Tn - T(n-1)
  • 上升沿与下降沿交替触发:这是测量PWM波形的利器。通常配置为CAP1上升沿、CAP2下降沿、CAP3上升沿、CAP4下降沿,如此循环。这样,CAP2和CAP1的差值就是第一个脉冲的高电平时间(正占空比),CAP3和CAP2的差值是低电平时间,而CAP3和CAP1的差值才是完整的周期

2.2 从原理图到代码:四种经典配置实战

手册给出了四个示例的代码片段,我们结合波形图来深入理解其配置意图和操作流程。

2.2.1 示例1:绝对时间戳,仅上升沿触发

这是最基础的配置,用于测量一个周期性信号的频率。

// 初始化配置 ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING; // CAP1捕获上升沿 ECap1Regs.ECCTL1.bit.CAP2POL = EC_RISING; // CAP2捕获上升沿 ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING; // CAP3捕获上升沿 ECap1Regs.ECCTL1.bit.CAP4POL = EC_RISING; // CAP4捕获上升沿 ECap1Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE; // CAP1事件后,TSCTR不复位(绝对模式) ECap1Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE; // CAP2同理 ECap1Regs.ECCTL1.bit.CTRRST3 = EC_ABS_MODE; // CAP3同理 ECap1Regs.ECCTL1.bit.CTRRST4 = EC_ABS_MODE; // CAP4同理 ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE; // 使能捕获寄存器加载 ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1; // 输入预分频为1(不分频) ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE; // 设置为捕获模式 ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS; // 连续捕获模式 ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS; // 同步输出禁用 ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE; // 同步输入禁用 ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN; // 启动TSCTR计数器 // 在中断服务程序中(例如CEVT4中断,表示4个寄存器已满) TSt1 = ECap1Regs.CAP1; // 读取第一个上升沿时间戳 TSt2 = ECap1Regs.CAP2; // 读取第二个上升沿时间戳 TSt3 = ECap1Regs.CAP3; // 读取第三个上升沿时间戳 TSt4 = ECap1Regs.CAP4; // 读取第四个上升沿时间戳 Period1 = TSt2 - TSt1; // 计算第一个周期 Period2 = TSt3 - TSt2; // 计算第二个周期 Period3 = TSt4 - TSt3; // 计算第三个周期

关键点:这里CTRRSTx都配置为EC_ABS_MODE,即绝对模式。CAPLDEN必须使能,否则时间戳不会加载到CAPx寄存器。CONT_ONESHT设置为连续模式,这样在捕获4个事件后,MOD4计数器会滚回0,覆盖旧的捕获值,实现循环缓冲。通常我们利用CEVT4(第4次捕获事件)中断来一次性读取4个时间戳进行计算,效率最高。

2.2.2 示例2:绝对时间戳,上升沿与下降沿触发

此配置用于测量PWM信号的周期和占空比。

// 初始化配置(仅列出与示例1不同的关键行) ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING; // 第1次:上升沿 ECap1Regs.ECCTL1.bit.CAP2POL = EC_FALLING; // 第2次:下降沿 ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING; // 第3次:上升沿 ECap1Regs.ECCTL1.bit.CAP4POL = EC_FALLING; // 第4次:下降沿 // ... 其他CTRRST等配置与示例1相同,均为EC_ABS_MODE // 在中断服务程序中(例如CEVT4中断) TSt1 = ECap1Regs.CAP1; // 第一个上升沿时间 TSt2 = ECap1Regs.CAP2; // 第一个下降沿时间 TSt3 = ECap1Regs.CAP3; // 第二个上升沿时间 TSt4 = ECap1Regs.CAP4; // 第二个下降沿时间 Period1 = TSt3 - TSt1; // 第一个完整周期 = 第二个上升沿 - 第一个上升沿 DutyOnTime1 = TSt2 - TSt1; // 第一个脉冲高电平时间 DutyOffTime1 = TSt3 - TSt2; // 第一个脉冲低电平时间

计算逻辑:这里巧妙地利用交替触发,使得CAP1CAP3总是捕获上升沿,CAP2CAP4总是捕获下降沿。因此,相邻两个上升沿的时间差(TSt3 - TSt1)就是一��周期。而一个上升沿和紧随其后的下降沿的时间差(TSt2 - TSt1)就是该周期内的高电平时间。

2.2.3 示例3与示例4:差值时间戳模式

这两个示例分别对应单边沿和双边沿触发,但核心是CTRRSTx配置为了EC_DELTA_MODE

// 关键配置差异 ECap1Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE; // CAP1事件后,TSCTR复位 ECap1Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE; // CAP2事件后,TSCTR复位 // ... CAP3, CAP4 同理

在差值模式下,读取到的CAPx寄存器值直接就是时间间隔。对于示例3(仅上升沿),CAP2的值就是第一个周期。对于示例4(双边沿),CAP2是第一个高电平时间,CAP3是第一个低电平时间,周期需要相加获得。

重要提示:在差值模式下,中断触发的选择有讲究。手册示例3和4建议在CEVT1(第一次捕获事件)中断中读取数据。这是因为在差值模式下,第n次捕获的值,实际上是在第n+1次事件发生时才被锁存并覆盖旧值。在CEVT1中断时,CAP1-CAP4中分别保存的是T4, T1, T2, T3时刻的间隔值(参见Figure 20-23)。需要根据你的触发顺序,仔细对应寄存器和物理时间的映射关系,否则会读错数据。我个人的习惯是,在差值模式下,统一在CEVT4中断中读取,并按照CAP1->T1, CAP2->T2...的逻辑去理解,然后在软件中根据边沿配置重新计算周期和占空比,这样思维负担更小。

2.3 APWM模式:eCAP的另一面

eCAP模块并非只能捕获,它还可以作为一个简单的、非对称的PWM发生器使用。这在某些需要额外PWM通道,但ePWM模块又不够用的场景下很实用。

在APWM模式下,CAP1寄存器被重新用作周期寄存器(APRD),CAP2寄存器被用作比较寄存器(ACMP)。TSCTR计数器工作在递增计数模式,与CAP1比较,相等时复位。同时,TSCTR也会与CAP2比较,根据APWMPOL位的设置,在比较匹配时翻转输出引脚的电平,从而产生PWM波。

// APWM模式配置示例 ECap1Regs.CAP1 = 0x1000; // 设置PWM周期值 ECap1Regs.CTRPHS = 0x0; // 相位寄存器清零 ECap1Regs.ECCTL2.bit.CAP_APWM = EC_APWM_MODE; // 切换到APWM模式 ECap1Regs.ECCTL2.bit.APWMPOL = EC_ACTV_HI; // 设置PWM输出极性为高有效 // ... 其他同步、运行控制配置 ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN; // 启动计数器 // 运行时动态修改占空比 ECap1Regs.CAP2 = 0x0300; // 设置比较值,即高电平时间

注意事项:eCAP的APWM模式功能比专用的ePWM模块简单得多,它通常没有死区生成、故障联防等高级功能。因此,它更适合用于驱动指示灯、蜂鸣器或对实时性要求不高的辅助控制,而不建议用于驱动电机桥臂等关键功率部分。

3. eQEP模块:电机位置与速度的智能解码器

如果说eCAP是秒表,那eQEP就是一个集成了里程表、方向感应和速度计算功能的智能传感器接口。它直接连接增量式光电编码器,自动处理两路正交(相位差90度)的方波信号(QEPA, QEPB)和一路索引信号(QEPI),为我们提供精准的位置方向速度信息。

3.1 正交编码器基础与eQEP工作原理

一个典型的增量式编码器盘如图21-1所示,上面有明暗相间的刻线。一个完整的明暗对称为一线(line)。两个光敏元件错开1/4个线对的间距安装,从而产生相位差90度的QEPA和QEPB信号。编码器每旋转一线,A、B相各输出一个脉冲,但相位不同。根据A相超前B相还是B相超前A相,可以判断旋转方向。

eQEP模块的核心功能单元包括:

  1. 正交解码单元(QDU):负责将A、B相信号解码为计数时钟(QCLK)方向信号(QDIR)。它支持4倍频解码,即A、B相的每个边沿(上升沿和下降沿)都会产生一个QCLK,将位置分辨率提高4倍。对于一个N线/圈的编码器,最终位置分辨率是4Ncounts/rev。
  2. 位置计数器与控制单元(PCCU):包含一个32位的位置计数器(QPOSCNT),根据QCLK和QDIR进行递增或递减计数。这是位置信息的核心。
  3. 边沿捕获单元(QCAP):用于低速或静止时的精确速度测量,其原理与eCAP模块类似,通过测量特定数量编码器脉冲之间的时间来计算速度。
  4. 单位时间基准(UTIME):用于高速速度测量,原理是在一个固定的时间片内,读取位置计数器的变化量。
  5. 看门狗定时器(QWDOG):用于监测电机是否堵转或丢失编码器信号。

3.2 位置计数器工作模式深度解析

位置计数器的工作模式由QEPCTL[PCRM]位控制,这是配置eQEP的重中之重,决定了位置计数器的计数和复位逻辑。

3.2.1 索引事件复位模式(PCRM=00)

这是最常用的模式之一,尤其适用于需要知道“绝对机械角度”的应用。在此模式下,每当编码器的索引脉冲(QEPI)到来时,位置计数器(QPOSCNT)会在下一个正交时钟边沿被复位。

  • 正转时:复位到0。
  • 反转时:复位到QPOSMAX(用户设定的最大值,通常为4N - 1,N为编码器线数)。

如图21-8所示,对于一个1000线的编码器(QPOSMAX = 4000 - 1 = 0xF9F),索引脉冲会将计数器对齐到一个已知的绝对机械零点。模块会记住第一次索引事件发生时的正交边沿和方向,后续所有复位都必须对齐到相同的边沿条件,否则会触发位置错误标志(PCEF)。

应用场景:机械臂关节、旋转平台等需要上电后寻找机械原点的场合。配合QPOSILAT(索引位置锁存寄存器),可以在索引事件发生时瞬间锁存当前位置值,用于校准或触发同步动作。

3.2.2 最大位置复位模式(PCRM=01)

在此模式下,位置计数器达到QPOSMAX值后,会在下一个时钟自动复位到0;反之,向下计数到0后,会跳变到QPOSMAX索引信号在此模式下不会复位计数器

应用场景:模拟一个“无限”旋转的编码器,或者用于需要模数运算的位置环。例如,在永磁同步电机的矢量控制中,电角度需要周期性地在0到2π之间变化,这种模式就非常合适。QPOSMAX可以设置为电角度的周期值(例如,对于4极对电机,机械旋转一圈,电角度变化720度,若每个count代表1度,则QPOSMAX=719)。

3.2.3 首索引事件复位模式(PCRM=10)

此模式与索引事件复位模式类似,但只会在第一个索引脉冲到来时复位一次位置计数器,之后的索引脉冲将不再触发复位。方向信息以第一次复位时的方向为准。

应用场景:系统上电或复位后,只需要一次绝对位置对齐,之后便进行相对位置累积计数。适用于那些启动时需要找零,但运行过程中不允许位置计数器被意外清零的场合。

3.2.4 单位时间超时复位模式(PCRM=11)

此模式专为速度测量设计。位置计数器在一个由QUPRD定义的单位时间周期内自由计数。当单位时间定时器(QUTMR)达到QUPRD时,会产生一个“单位时间超时”事件,此时位置计数器的值会被锁存QPOSLAT寄存器,然后位置计数器复位到0,开始下一个周期的计数。

应用场景:这是实现M法测速的硬件基础。速度计算公式为:速度 (counts/单位时间) = QPOSLAT / 1个单位时间。通过设置合适的QUPRD(例如对应1ms、10ms),可以定期、固定频率地获取速度反馈,非常适合数字速度环的控制。

3.3 速度测量:高低速结合的智慧

手册的引言部分(第889页)提到了速度估算的两个经典公式,这直接对应eQEP的两种测速方式,也是工程实践中必须理解的权衡。

  • 公式27(M法,高频测速)v(k) = [x(k) - x(k-1)] / T。其中T是固定的采样周期(即单位时间)。这对应上述的单位时间超时复位模式。在高速时,单位时间内捕获的脉冲数多,速度分辨率高,测量准确。
  • 公式28(T法,低频测速)v(k) = X / [t(k) - t(k-1)]。其中X是固定的位置增量(例如1个count)。这对应eQEP的边沿捕获单元(QCAP)模式。在低速时,脉冲间隔时间长,测量这个间隔时间反而能得到更精确的速度值。

eQEP的巧妙之处在于它同时支持这两种模式

  1. 高速测量(M法):使用PCCU的单位时间超时模式。配置好QUPRD,使能UTO中断,在中断中读取QPOSLAT即可得到速度。
  2. 低速测量(T法):使用QCAP单元。该单元内部有一个定时器(QCTMR)和周期寄存器(QCPRD)。可以配置为在捕获到一定数量的编码器脉冲(例如1个、2个、4个等)后,产生中断,并锁存定时器的值。速度计算公式为:速度 = (预设的脉冲数 * 系统时钟周期) / 锁存的定时器值

工程实践建议:在电机全速范围内实现高精度测速,通常需要混合策略。在高速区主要依赖M法,在低速区切换到T法。可以在软件中设置一个速度阈值,根据当前速度值动态判断使用哪个模块的数据,或者对两者的结果进行加权融合。eQEP的硬件直接提供了这两种数据源,大大减轻了CPU的负担。

3.4 关键配置步骤与代码框架

以下是一个典型的eQEP初始化配置流程,用于正交计数和索引复位:

// 1. 配置GPIO复用为eQEP功能 (此处以TI C2000为例,具体寄存器请参考数据手册) // 假设使用EQEP1, GPIO20/21/23 分别作为 QEPA, QEPB, QEPI GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1; // 配置GPIO20为EQEP1A GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1; // 配置GPIO21为EQEP1B GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 1; // 配置GPIO23为EQEP1I // 2. 初始化eQEP寄存器 EQep1Regs.QUPRD = 0xFFFFFFFF; // 单位周期寄存器,先设最大,若不用M法则无关紧要 EQep1Regs.QWDPRD = 0xFFFF; // 看门狗周期,防止信号丢失 EQep1Regs.QDECCTL.bit.QSRC = 0; // 00: 正交计数模式 EQep1Regs.QDECCTL.bit.XCR = 0; // 0: 使用4倍频计数(推荐) EQep1Regs.QDECCTL.bit.SWAP = 0; // 0: 不交换A/B相输入 EQep1Regs.QDECCTL.bit.IGATE = 0; // 0: 禁止索引门控 EQep1Regs.QDECCTL.bit.QAP = 0; // A相输入极性,0: 不反相 EQep1Regs.QDECCTL.bit.QBP = 0; // B相输入极性 EQep1Regs.QDECCTL.bit.QIP = 0; // 索引输入极性 // 3. 配置位置计数器控制 EQep1Regs.QEPCTL.bit.FREE_SOFT = 2; // 仿真挂起时,eQEP继续运行 EQep1Regs.QEPCTL.bit.PCRM = 0; // 00: 索引事件复位模式 EQep1Regs.QEPCTL.bit.UTE = 0; // 0: 禁用单位定时器(若不用M法则禁用) EQep1Regs.QEPCTL.bit.QCLM = 0; // 0: 索引事件发生时锁存位置计数器 EQep1Regs.QEPCTL.bit.IEL = 0; // 00: 在索引上升沿锁存(根据编码器实际信号调整) EQep1Regs.QEPCTL.bit.SWI = 0; // 0: 索引事件不产生位置计数器交换 EQep1Regs.QEPCTL.bit.SEL = 0; // 0: 选择索引作为复位源 EQep1Regs.QEPCTL.bit.IEL = 1; // 01: 在索引上升沿和下降沿都锁存(如果编码器索引信号是脉冲) // 4. 设置位置计数器最大值 (例如,对于2500线编码器,4倍频后为10000 counts/rev) // 如果希望计数器在0~9999之间循环,则QPOSMAX设为9999。 // 在索引复位模式下,反转时复位到此值。 EQep1Regs.QPOSMAX = 10000 - 1; // 0x270F // 5. 使能看门狗 EQep1Regs.QEPCTL.bit.WDE = 1; // 使能eQEP看门狗 // 6. 清零位置计数器并启动 EQep1Regs.QPOSCNT = 0; EQep1Regs.QEPCTL.bit.QPEN = 1; // 使能eQEP位置计数器 // 7. 配置中断(例如,索引事件中断、单位时间超时中断、看门狗超时中断) EQep1Regs.QEINT.bit.IEL = 1; // 使能索引事件中断 // EQep1Regs.QEINT.bit.UTO = 1; // 使能单位时间超时中断(如果使用M法) // EQep1Regs.QEINT.bit.WDOG = 1; // 使能看门狗中断

4. 实战经验与避坑指南

纸上得来终觉浅,绝知此事要躬行。手册上的原理很完美,但实际调试中会遇到各种问题。下面分享几个我踩过的坑和总结的技巧。

4.1 eCAP模块常见问题

  1. 信号毛刺与误触发:eCAP的输入引脚对边沿非常敏感。如果被测信号有噪声或振铃,会导致多次误触发,捕获到错误的时间戳。务必在硬件上做好滤波,例如在引脚附近添加RC低通滤波电路。同时,eCAP模块内部有输入限定器,可以通过配置ECCTL2.bit.CAPLDEN等相关位(具体位名可能因型号而异,需查手册)来设置需要多少个系统时钟周期的稳定电平才确认为一个有效边沿,软件上也要合理利用这个功能。

  2. 计数器溢出处理:无论是绝对模式还是差值模式,32位的TSCTR计数器都有溢出的可能。在绝对模式下,如果两次捕获事件间隔过长,TSt2 - TSt1的计算结果可能是负数(因为计数器从0xFFFFFFFF绕回0)。必须在软件中做溢出判断。一个简单的办法是,如果TSt2 < TSt1,则实际间隔 =(0xFFFFFFFF - TSt1) + TSt2 + 1。在差值模式下,要监控CTROVF标志位。

  3. 中断服务程序效率:eCAP的中断可能发生在高频信号下。中断服务程序(ISR)应尽可能短小精悍,只做读取寄存器、计算基本参数、存入缓冲区的操作。复杂的滤波、转换等算法应放到主循环或低优先级任务中处理。避免在ISR内进行浮点运算或调用耗时函数。

  4. APWM模式下的影子寄存器:在APWM模式下,CAP1(周期)和CAP2(比较值)寄存器有活动寄存器和影子寄存器之分。初始化时必须同时写入活动寄存器,运行时通常只更新影子寄存器,在下一个周期边界影子值才会加载到活动寄存器生效。直接写活动寄存器可能导致PWM输出出现毛刺

4.2 eQEP模块调试技巧

  1. 编码器信号质量问题:这是eQEP工作不正常的最常见原因。使用示波器同时观察QEPA和QEPB信号,确保它们是干净、相位差90度的方波,没有严重的过冲、振铃或毛刺。索引信号也要检查其宽度和与A/B相的相对位置(是门控型还是非门控型)。信号质量差会导致位置计数器偶尔跳变、方向误判(QDF位翻转)或相位错误(PHE标志置位)。

  2. “飞车”与位置计数器溢出/下溢:在高速或连续单向旋转时,32位的位置计数器也可能溢出(从最大值跳回0)或下溢(从0跳回最大值)。QFLG寄存器中的COEFCUEF标志位会指示这种情况。在读取位置值QPOSCNT进行长距离累积位置计算时,必须考虑溢出。通常需要用一个64位的软件变量来累积硬件计数器的变化。可以在每次读取QPOSCNT后,与上次值比较,将其差值(考虑溢出)累加到软件累积位置中。

  3. 索引脉冲对齐与机械安装:在“索引事件复位模式”下,编码器索引脉冲的机械安装位置必须与你的机械零点对齐。如果不对齐,每次上电复位后,电机的“零位”都是错的。调试时,可以让电机缓慢旋转,观察QPOSILAT寄存器在索引事件发生时的值。如果这个值不是0或QPOSMAX,并且PCEF错误标志被置位,说明索引脉冲没有在预期的正交边沿上出现,可能需要调整编码器安装或修改QEPCTL[IEL]��索引边沿锁存选择)的配置。

  4. 速度测量的平滑处理:无论是M法还是T法,直接计算出的瞬时速度都可能含有高频噪声。在用于速度环控制前,必须进行低通滤波。简单的移动平均滤波或一阶惯性滤波就能显著改善性能。对于T法测速,在极低速时,脉冲间隔时间会非常长,更新率很低,此时可以切换到开环控制或使用观测器估算速度。

  5. 看门狗定时器的使用QWDOG看门狗定时器是一个非常有用的诊断工具。它监控QCLK信号。如果电机停止或编码器线缆断开,QCLK停止,看门狗就会超时并触发中断。在中断服务程序中,可以将系统安全地置于故障状态(如PWM输出禁用),防止因速度反馈丢失而导致系统失控。

5. 系统集成与性能优化

将eCAP和eQEP集成到完整的电机控制或运动控制系统中,还需要考虑一些系统级的问题。

5.1 与CPU内核及外设的协作

eCAP和eQEP都是独立于CPU工作的外设,但它们产生的中断需要CPU及时响应。在复杂的系统中,可能需要为eCAP(用于电流采样同步)、eQEP(用于速度/位置反馈)以及PWM中断分配不同的优先级。通常,eCAP的中断(用于关键保护或采样)优先级最高,eQEP的速度环中断次之,位置环中断再次之。

利用DMA可以进一步解放CPU。例如,可以配置eCAP在捕获4个事件后,自动通过DMA将CAP1-CAP4寄存器的值搬运到指定的内存缓冲区,CPU只需定期处理缓冲区中的数据即可,避免了频繁的中断。

5.2 精度与分辨率考量

  • eCAP的时间精度:取决于系统时钟(SYSCLKOUT)和eCAP模块的预分频器(PRESCALE)。最终的时间戳分辨率 =1 / (SYSCLKOUT / PRESCALE)。例如,系统时钟150MHz,预分频为1,则时间戳分辨率约为6.67ns。测量误差主要来源于信号边沿与计数器时钟的异步性,最大为一个时钟周期。
  • eQEP的位置分辨率:由编码器线数和eQEP的解码模式决定。4倍频模式下,分辨率 =4 * Ncounts/rev。对于速度测量,M法的速度分辨率 =(1 count) / (单位时间 T)。T越小,速度更新率越高,但低速时分辨率越差。需要根据电机的最低运行速度来权衡选择T。

5.3 在实时操作系统中的使用

在RTOS(如TI的SYS/BIOS或FreeRTOS)中,eCAP/eQEP的中断服务程序应遵循“快进快出”原则。常见的做法是:

  1. 在ISR中读取数据、清除标志。
  2. 通过消息队列、信号量或任务通知等方式,唤醒一个专门的数据处理任务(Task)。
  3. 数据处理任务负责进行复杂的计算、滤波、以及更新控制算法中的状态变量(如位置、速度)。 这种架构保证了中断响应时间的确定性,并将耗时操作从ISR中剥离,提高了系统的实时性和可靠性。

调试时,可以利用RTOS的分析工具(如CPU负载图、任务执行时间统计)来监控eCAP/eQEP相关中断和任务的执行情况,确保它们不会占用过多的CPU时间,也不会因为优先级设置不当而导致其他关键任务被阻塞。