2. C2000 eQEP 模块详解:架构、位置计数器、速度计算与索引脉冲捕获

各位好,欢迎来到第二章。

上一章我们聊了编码器的基本原理,知道了 A、B、Z 三根线分别干什么用。但信号从编码器出来,总得有个“接收端”吧?在 C2000 里,这个接收端就是 eQEP 模块。

说实话,我第一次用 C2000 做电机控制时,觉得 eQEP 就是个简单的计数器。后来踩了坑才发现——它远比我想象的复杂,也远比我想象的强大。你把它用好了,位置和速度数据几乎不占 CPU 资源;用不好,换相时机全乱套。

今天我们就把它彻底拆开看看。

2.1 eQEP 模块的整体架构

eQEP 的全称是 Enhanced Quadrature Encoder Pulse,增强型正交编码脉冲模块。它本质上是一个专门处理编码器信号的硬件状态机。

我习惯把 eQEP 分成三个功能块来理解:

  • 输入处理单元:负责对 A、B、Z 信号进行滤波、极性反转、边沿检测。
  • 位置计数单元:核心计数器,根据 A/B 相位差决定加/减计数。
  • 速度与索引单元:计算转速,并处理 Z 信号的索引脉冲。

下面这张图是我自己画的架构简图,你看一眼就能明白数据是怎么流的。

eQEP 模块内部架构 输入处理单元 数字滤波 极性反转 边沿检测 位置计数单元 位置计数器 (QPOSCNT) 锁存寄存器 比较单元 速度与索引单元 速度计算 (QCAP/QPOS) 索引脉冲捕获 零位标记 外部编码器 A / B / Z 信号 输出到 CPU 位置 / 速度 / 索引 💡 数据流方向: 编码器 A/B/Z → 输入处理(滤波/极性)→ 位置计数(QPOSCNT)→ 速度计算 & 索引捕获 → CPU 读取 整个过程由硬件自动完成,不需要 CPU 干预,这是 C2000 实时性的关键。

你看,信号从左边进来,经过滤波和极性处理,然后进入位置计数器。位置计数器是核心,它每时每刻都在跟踪电机转子的绝对位置。速度单元和索引单元则从位置计数器的数据中“提取”出转速和零位信息。

我的习惯: 在初始化 eQEP 时,我会先把输入处理单元的滤波参数设得保守一点(比如 6 个采样点),等系统跑起来后再根据实际噪声情况调整。这样能避免一开始就被毛刺信号干扰。

2.2 位置计数器:QPOSCNT 与 QPOSLAT

位置计数器是 eQEP 的心脏。它叫 QPOSCNT,是一个 32 位的寄存器。

它的工作原理很简单:

  • A 相上升沿或下降沿到来时,计数器加 1 或减 1。
  • 具体是加还是减,取决于 B 相当时的电平。
  • 如果 A 领先 B 90°,电机正转,计数器递增。
  • 如果 B 领先 A 90°,电机反转,计数器递减。

这里有个关键点——计数模式。eQEP 支持两种模式:

模式 计数方式 适用场景
方向/计数模式 一个信号做方向,一个信号做计数 单端编码器、霍尔传感器
正交计数模式 A/B 相位差决定方向,双边沿计数 增量式正交编码器(最常见)

我个人几乎只用正交计数模式。为什么?因为它的分辨率最高。你想想看,一个 1000 线的编码器,在正交模式下每转能产生 4000 个计数脉冲(4 倍频)。位置精度直接提升了 4 倍。

除了 QPOSCNT,还有一个寄存器叫 QPOSLAT。它是位置锁存器。当索引脉冲(Z 信号)到来时,硬件会自动把 QPOSCNT 的当前值复制到 QPOSLAT 里。这个功能在换相校准中至关重要——我们后面会详细讲。

注意: QPOSCNT 是 32 位的,但编码器每转的脉冲数通常远小于 2^32。如果你不做软件清零,它可能会溢出。我曾经在一个项目中忘了处理溢出,结果电机转了几百圈后位置突然跳变,吓了我一跳。解决方案很简单:在索引脉冲中断里把 QPOSCNT 重置为 0。

2.3 速度计算:两种方法,各有千秋

速度计算是 eQEP 的另一个核心功能。C2000 提供了两种硬件速度计算方法:

  1. QCAP 方法(捕获法):测量两个相邻边沿之间的时间间隔。适合低速场景。
  2. QPOS 方法(位置差法):测量固定时间窗口内的位置变化量。适合中高速场景。

我画了个对比表,你一看就明白:

方法 原理 优点 缺点 推荐转速
QCAP 测脉冲周期 低速精度高 高速时更新慢 < 500 RPM
QPOS 测单位时间位移 高速响应快 低速时误差大 > 500 RPM

在实际项目中,我通常的做法是:低速用 QCAP,高速用 QPOS。切换点设在 500 RPM 左右。当然,这个阈值取决于你的编码器线数和控制周期,需要自己调。

这里有个小技巧:QCAP 方法需要配置一个“捕获定时器”,它的时钟源我建议用 CPU 时钟的 1/64 分频。这样既能保证低速时的测量精度,又不会在高速时溢出。

核心要点:

  • QCAP 适合低速,QPOS 适合高速。
  • 两种方法可以同时使能,软件里根据转速动态切换。
  • 速度计算的精度直接决定了速度环的性能,别马虎。

2.4 索引脉冲捕获:找到那个“绝对零点”

索引脉冲,就是编码器的 Z 信号。它每转只出现一次,用来标记一个绝对物理位置。

在 eQEP 里,索引脉冲捕获有几种模式:

  • 上升沿捕获:Z 信号上升沿触发。
  • 下降沿捕获:Z 信号下降沿触发。
  • 窗口捕获:只在 A/B 信号的特定相位窗口内捕获 Z。

我最常用的是窗口捕获模式。为什么?因为 Z 信号在实际中可能不是完美的单脉冲——它可能因为机械抖动而产生毛刺。窗口模式可以确保只在 A/B 信号的特定相位区间内响应 Z,大大提高了抗干扰能力。

索引脉冲捕获后,硬件会做三件事:

  1. 把 QPOSCNT 的当前值锁存到 QPOSLAT。
  2. 设置索引事件标志位(QEPFLG 寄存器中的 IEC 位)。
  3. 如果使能了中断,触发 CPU 中断。

这个机制在换相校准中怎么用?很简单:

  • 上电后,让电机转一圈。
  • 当索引脉冲到来时,QPOSLAT 里记录的就是“零位”对应的计数值。
  • 把这个值作为参考点,就能算出任意时刻的绝对电角度。
避坑指南: 我曾经在一个项目中,编码器的 Z 信号和电机磁极的零位没有对齐。结果每次索引脉冲捕获到的位置都不是真正的电角度零点。后来我加了一个软件偏移量,才把问题解决。所以,索引脉冲只是机械零点,电角度零点需要你根据电机极对数做换算。

2.5 小结:eQEP 模块的“三板斧”

好了,这一章的内容就这些。我们来捋一捋:

  • 架构:输入处理 → 位置计数 → 速度/索引,硬件流水线作业。
  • 位置计数器:QPOSCNT 是核心,正交模式能 4 倍频提高分辨率。
  • 速度计算:QCAP 测周期(低速),QPOS 测位移(高速),动态切换最合理。
  • 索引脉冲:窗口捕获最可靠,锁存值 QPOSLAT 是换相校准的基石。