TI C2000 eQEP模块全解析:从正交编码器原理到伺服驱动实战配置
2026/7/21 6:58:33 网站建设 项目流程

1. 项目概述:为什么我们需要eQEP模块?

在工业伺服驱动、机器人关节控制或者高精度数控机床里,想让电机乖乖听话,精确地走到你指定的位置并以恒定的速度运行,核心前提是你得先“知道”它现在在哪儿、跑得多快。这就好比开车,速度和里程表是让你安全驾驶的基础。在电机控制的世界里,这个“速度和里程表”通常就是增量式编码器

你可能会在电机屁股后面看到一个带着电缆的小圆盘,那就是它。它通过光电或磁电原理,随着电机轴旋转,输出两路被称为QEPAQEPB的方波信号。这两路信号的神奇之处在于,它们的相位差是精确的90度(电角度)。当电机正转时,A相领先B相90度;反转时,则B相领先A相。控制器通过识别谁领先谁来判断方向,通过数脉冲的个数来计算转过的角度(位置),通过测量脉冲的频率来推算转速。

听起来很简单,不就是数数嘛?但实际做起来坑不少。比如,电机转速范围可能从每分钟几转到几千转,跨度极大。低速时,脉冲间隔很长,用固定时间采样位置来计算速度(M法测速),分辨率会惨不忍睹,可能电机在蠕动,你的读数却是零。高速时,脉冲像暴雨一样打来,用测量固定脉冲数所需时间的方法(T法测速),对计时器的分辨率要求又极高,误差很大。此外,还有信号抖动(需要滤波)、计数溢出处理、寻找机械零点(索引信号)等一系列问题。如果这些全靠主控芯片的通用IO和定时器去软件模拟,不仅会消耗大量宝贵的CPU时间,实时性和可靠性也难以保证。

因此,像TI C2000这类专为实时控制而生的微控制器,就集成了一个硬件外设来专门干这个脏活累活——增强型正交编码器脉冲(eQEP)模块。它把解码、计数、捕获、比较、看门狗等功能都做进了硬件里,你只需要进行正确的配置,它就能自动、准确、高效地完成位置和速度的测量,把CPU解放出来去执行更高级的控制算法(如FOC)。今天,我就结合手册和实际调伺服驱动器的经验,把这个模块从原理到配置,掰开揉碎了讲清楚。

2. eQEP模块核心架构与工作模式解析

拿到一个外设,别急着翻寄存器。先看懂它的整体架构和能干什么,配置起来才能心中有数。eQEP模块可以看作一个专为编码器信号设计的“流水线工厂”。

2.1 模块功能单元拆解

根据手册里的框图,eQEP模块主要由以下几个核心车间组成:

  1. 正交解码单元(QDU):这是第一道工序。它接收来自GPIO引脚的两路原始正交信号(QEPA, QEPB)。它的核心工作就是“解码”:根据A、B两相信号的边沿变化顺序,判断当前是正转还是反转,并生成一个统一的方向信号(QDIR)和计数时钟(QCLK)。在4倍频模式下,A、B的每个上升沿和下降沿都会触发一次计数,因此最终位置分辨率是编码器物理线数的4倍。一个1000线的编码器,经过QDU后,每转会产生4000个计数脉冲。

  2. 位置计数器与控制单元(PCCU):这是核心车间。它包含一个32位的位置计数器(QPOSCNT),随着QDU输出的每一个QCLK脉冲进行递增或递减。PCCU的“控制”部分非常强大,它决定了这个计数器如何工作:

    • 计数模式:除了标准的正交计数,还支持方向计数(外部直接给时钟和方向信号)、递增计数、递减计数模式。
    • 复位/归零策略:计数器不能无限累加,否则会溢出。PCCU提供了多种“归零”机制:可以在收到编码器的索引(Index)信号时复位,可以在计数器达到用户设定的最大值(QPOSMAX)时复位,也可以由内部单元定时器超时触发复位。这对应了不同的应用场景,比如每圈清零找绝对零点,或者进行频率测量。
  3. 边沿捕获单元(QCAP):这是解决低速测量精度问题的“神器”。它不关心位置,而是专注于“时间”。当QDU产生的QCLK脉冲到来时,QCAP会捕获此时内部一个自由运行计时器(QCTMR)的值。通过测量固定数量脉冲(通常是1个)之间的时间间隔,就能非常精确地计算出低速时的速度。这个模式在电机启动、极低速运行时至关重要。

  4. 单元定时器(UTIME)与看门狗(QWDOG)

    • 单元定时器:提供一个固定的时基,用于高速速度测量(M法)。你设定一个周期(如1ms),定时器每到这个周期就产生中断,在中断里读取位置计数器的差值,除以时间,就得到了速度。
    • 看门狗定时器:用于监测电机是否堵转或丢失。如果超过设定的时间(QWDPRD)没有收到任何编码器脉冲,看门狗就会超时并产生中断,告诉你“电机可能卡住了”。

2.2 关键输入信号与工作模式选择

eQEP模块有4个关键输入引脚,理解它们才能正确接线和配置:

  • EQEPxA / EQEPxB:核心正交信号输入。在**正交计数模式(Quadrature-count)下,就是标准的A、B两相。在方向计数模式(Direction-count)**下,A脚作为时钟输入(Clock),B脚作为方向输入(Direction),此时模块退化成一个简单的“有符号”计数器。
  • EQEPxI:索引信号输入。编码器每旋转一圈,会输出一个窄脉冲,代表机械零点。这个信号对于确定绝对位置起点(“回家”)至关重要。eQEP可以利用它来复位位置计数器。
  • EQEPxS:选通信号输入。这是一个通用的数字输入,你可以把它接到一个限位开关或光电传感器上。当电机运动到某个物理位置触发此开关时,eQEP可以锁存当前的位置计数值到QPOSSLAT寄存器,方便你记录特定位置。

模式选择的心得:绝大多数增量编码器应用都使用正交计数模式,这是eQEP的主场。方向计数模式通常用于接收其他控制器或特定传感器输出的“时钟+方向”信号。递增/递减模式则用于频率测量等特殊场合。

3. 正交解码单元(QDU)的深入配置与避坑指南

QDU是将物理信号转化为逻辑计数的第一步,这里配置错了,后面全完蛋。

3.1 解码原理与方向判断

手册里那张状态机图和真值表是理解核心。简单来说,QDU内部有一个状态机,跟踪A、B信号上一个边沿的状态(00, 01, 11, 10)。当新的边沿到来,状态发生跳转。如果跳转顺序是顺时针(例如00->01->11->10->00),则判定为正转(QDIR=1),计数器加;如果是逆时针跳转,则判定为反转(QDIR=0),计数器减。

一个极其重要的坑:相位错误(Phase Error)。理想情况下,A、B信号相位差严格90度,状态跳转总是沿着状态图的四个状态循环。但如果信号受到严重干扰,或编码器安装松动导致A、B信号抖动,可能会出现“毛刺”,导致状态机发生非法跳转(例如从00直接跳到11,跳过了01和10)。这种跳转在状态图中是用虚线表示的。一旦发生,QDU会置位相位错误标志(PHE),并且位置计数器可能会产生±1或±3的计数错误

实操注意:在电机高速运行或强干扰环境(如变频器附近)中,一定要在初始化时使能输入信号滤波(通过GPIO的Qualifier功能),并定期在中断中检查QFLG寄存器的PHE位。如果频繁出现相位错误,必须检查编码器接线(是否使用双绞屏蔽线)、电源质量以及编码器本身的安装是否牢固。我曾遇到过因编码器联轴器松动导���信号不同步,从而引发频繁相位错误,导致位置环震荡的情况。

3.2 输入极性交换与信号取反

  • 交换(SWAP):QDECCTL寄存器中的SWAP位。这个功能非常实用。有时候因为机械安装方向或者电机相序的原因,你发现电机实际正转时,计数器却在递减。懒得多想,直接把SWAP位置1,交换A、B两路信号输入到解码器的顺序,计数方向就反过来了。这比在软件里对计数结果取反更底层、更高效。
  • 取反(QAP, QBP, QIP, QSP):同样是QDECCTL寄存器中的控制位,可以分别将A、B、I、S信号的极性反转。如果你的编码器输出是低电平有效,或者信号经过反相器驱动,就需要用到这个功能。配置前最好用示波器确认一下信号的实际极性。

3.3 位置计数器的四种输入模式详解

通过QDECCTL[QSRC]位选择,这决定了QDU输出给位置计数器(QPOSCNT)的“时钟”和“方向”信号来源。

  1. 00: 正交计数模式:最常用模式。QDU根据A、B信号生成4倍频的QCLK和方向信号QDIR。
  2. 01: 方向计数模式:EQEPxA作为时钟输入,EQEPxB作为方向输入(高电平递增,低电平递减)。此时,QDU基本旁路,模块变成一个简单的边沿计数器。
  3. 10: 递增计数模式:EQEPxA作为时钟输入,方向固定为递增。可用于测量脉冲频率。注意,在此模式下,EQEPxB引脚必须悬空或配置为其他功能,否则其上的电平跳变可能会干扰计数。
  4. 11: 递减计数模式:与递增模式相反,方向固定为递减。同样需要注意EQEPxB引脚的处理。

配置陷阱:在非正交计数模式下(即方向、递增、递减模式),手册明确警告,必须确保不用的那个输入引脚(通常是B相)不要被配置为eQEP功能,或者确保其上没有信号跳变。否则,内部逻辑可能会被意外触发,导致计数异常。最安全的做法是在GPIO MUX寄存器中,将不用的引脚配置为其他功能(如普通GPIO输入)。

4. 位置计数器与控制单元(PCCU)的高级应用

PCCU是eQEP的“大脑”,它决定了位置数据如何被管理和利用。

4.1 四种位置计数器运行模式(PCRM)的场景选择

通过QEPCTL[PCRM]位配置,这是整个eQEP应用的顶层设计决策。

  • 模式00:索引事件复位。每次收到编码器索引信号(Index),位置计数器就复位到0(正转)或QPOSMAX(反转)。这是多圈绝对位置测量的经典模式。你需要一个电池备份的寄存器来记录“圈数”。每圈开始时,位置计数器从0开始线性计数到QPOSMAX(例如3999),收到Index信号后清零并开始新的一圈,同时你的软件将“圈数”加1。这样,结合“圈数”和“圈内位置”,就能得到真正的多圈绝对位置。注意:此模式下,索引信号必须与某个正交边沿对齐(即门控索引),否则复位点会漂移。

  • 模式01:达到最大位置复位。计数器自由累加,向上溢出时(超过QPOSMAX)自动回到0,向下溢出时(低于0)自动回到QPOSMAX。这形成了一个循环的、模数为(QPOSMAX+1)的计数环。适用于无限位移动的应用,比如控制一个无限长的传送带(理论上),或者你不关心绝对圈数,只关心相对位移。此时,索引信号可以用来锁存位置(见下文IEL配置),用于校验或同步。

  • 模式10:首次索引事件复位。只在第一次收到索引信号时复位计数器,之后的行为同模式01(自由循环)。这种模式比较少见,适用于那种只需要在启动时寻找一次零点,之后便进行相对运动的场景。

  • 模式11:单位超时事件复位。计数器被单元定时器(UTIME)的超时事件复位。这纯粹用于频率/速度测量模式。在此模式下,位置计数器实际上被用作一个在固定时间窗口内的脉冲计数器。每次UTIME超时,读取QPOSCNT的值(即该时间窗口内的脉冲数),然后清零,准备下一次计数。这个值直接正比于速度。

选择建议:对于需要知道“第几圈第几个脉冲”的伺服系统,选模式00。对于旋转平台、雷达天线等连续旋转且无需区分第几圈的应用,选模式01。对于纯粹的速度测量,选模式11

4.2 位置锁存(Latch)功能:精准的时刻抓拍

这是eQEP非常实用的功能。想象一下,你想知道电机恰好经过某个物理开关(接在STROBE引脚)时的精确位置,或者想校验每圈编码器计数是否准确(通过Index信号)。锁存功能就是干这个的。

  • 索引事件锁存(IEL):当Index信号事件发生时,将瞬间的位置计数器值“抓拍”下来,保存到QPOSILAT寄存器。你可以配置在Index的上升沿、下降沿或“索引事件标记”时锁存。这个“索引事件标记”是个智能设计,它指的是Index脉冲后紧跟的第一个正交边沿,这确保了锁存时刻与编码器光栅刻线严格对齐,避免了因Index脉冲宽度不标准带来的误差。
  • 选通事件锁存:当STROBE引脚信号事件发生时,将位置值锁存到QPOSSLAT寄存器。可以配置为仅上升沿锁存,或根据方向选择边沿(正转上升沿,反转下降沿锁存)。

应用示例:原点复归与位置校验。在伺服启动时,我们常执行“原点复归”操作:让电机慢速向一个方向运动,直到触发限位开关(接STROBE)。在触发瞬间,eQEP自动锁存当前位置到QPOSSLAT。软件读取这个值,将其设定为系统的“零位”坐标。同时,每转一圈,通过Index信号锁存的位置(QPOSILAT)应该是一个固定值(如0或QPOSMAX),如果不是,说明存在计数错误或丢脉冲,可以触发报警。

4.3 位置比较单元:硬件同步输出的利器

这是eQEP模块的输出功能。你可以设定一个目标位置值(QPOSCMP),当位置计数器(QPOSCNT)运行到这个值时,硬件会自动在一个引脚(可配置为Index或Strobe引脚复用为输出)上产生一个同步脉冲(PCSOUT)。

有什么用?实现硬件同步,精度是纳秒级的,不占用CPU。例如:

  1. 电子齿轮/电子凸轮:主轴(虚拟或实际)每转一定角度,通过eQEP输出一个脉冲给从轴,作为其位置环的同步触发信号。
  2. 精准触发ADC采样:在磁场定向控制(FOC)中,希望在某特定转子角度时采样相电流。可以将这个角度对应的位置值写入QPOSCMP,当电机转到该位置时,eQEP输出脉冲触发ADC开始采样序列。
  3. 生成PWM同步信号:在多个电机协同或与外部设备同步时,提供硬件同步点。

影子寄存器与加载模式:QPOSCMP有影子寄存器。你可以安全地在任何时候写入新的比较值到影子寄存器,并配置在“比较匹配”或“计数器归零”的瞬间,将影子寄存器的值加载到工作寄存器。这避免了在比较过程中修改寄存器导致误触发。

脉冲展宽(PCSPW):可以设置输出脉冲的宽度(基于SYSCLK周期)。如果两次比较匹配事件间隔太近,前一个脉冲还没结束,后一个事件又来了,脉冲展宽逻辑会保证输出一个完整的、宽度为PCSPW的新脉冲,而不会产生窄毛刺。

5. 速度测量:高低速结合的实战策略

��是eQEP的核心价值之一。如前所述,单一测速方法无法兼顾宽速度范围。eQEP硬件同时支持两种方法,我们需要在软件上实现“高低速切换”。

5.1 高速测量法(M法):基于单位定时器

原理:在固定的、较短的时间间隔T(例��1ms)内,读取位置计数器的增量ΔX。速度 v = ΔX / T。单位定时器(UTIME)就是用来产生这个固定间隔T的。

配置与计算

  1. 配置单元定时器周期寄存器QUPRD。若系统时钟SYSCLKOUT为100MHz,想要1ms中断,则QUPRD = 100MHz * 0.001s = 100,000。
  2. 使能单元定时器超时中断(QEINT中的UTO中断)。
  3. 在中断服务程序中:
    • 读取当前QPOSCNT值pos_now
    • 计算增量delta_pos = pos_now - pos_last。注意处理计数器溢出/下溢(模式01下,差值可能超过QPOSMAX/2,需做修正)。
    • 记录pos_last = pos_now供下次使用。
    • 速度speed_rps = delta_pos / (T * N),其中N是每转的总计数(线数*4)。再乘以60即得到RPM。

优点:高速时精度高,计算简单。缺点:低速时,ΔX可能为0或1,速度分辨率极低,量化误差大。

5.2 低速测量法(T法):基于边沿捕获单元

原理:测量固定位置增量ΔX(通常就是1个QCLK脉冲)所花费的时间ΔT。速度 v = ΔX / ΔT。边沿捕获单元(QCAP)就是用来测量这个ΔT的。

配置与计算

  1. 配置捕获控制寄存器QCAPCTL。设置捕获分频,例如每1个QCLK脉冲捕获一次(CCPS=0)。
  2. 使能捕获定时器溢出中断和捕获事件中断。
  3. 在捕获事件中断中:
    • 读取捕获的周期值QCPRD(这个寄存器记录了连续两个捕获事件间,自由运行定时器QCTMR的计数值差)。
    • delta_time = QCPRD / f_sysclk
    • 速度speed_rps = (1 / N) / delta_time,其中(1/N)是每个QCLK脉冲对应的机械弧度或转数。

优点:低速时测量精度极高。缺点:高速时,ΔT非常小,对定时器分辨率敏感,且频繁中断会增加CPU负荷。

5.3 软件实现高低速自动切换

这是体现工程师功力的地方。一个鲁棒的测速算法不能只依赖一种方法。

策略

  1. 始终同时运行两种测量机制。M法依赖UTIME定时中断,T法依赖QCAP捕获中断。
  2. 在软件中维护一个“可信速度”值。同时计算M法速度v_m和T法速度v_t
  3. 设计一个切换逻辑。例如:
    • v_t有效(捕获周期在合理范围内)且v_t小于某个阈值(如额定转速的5%)时,采用v_t作为输出速度。
    • v_t无效(捕获超时,说明速度太慢)或v_t大于阈值时,采用v_m作为输出速度。
    • 可以在切换区设置一个滞环,防止在临界速度附近频繁切换。

一个关键技巧:T法测量时,QCPRD寄存器是16位的,注意处理定时器溢出。通常使能捕获定时器溢出中断,在溢出中断中用一个软件变量记录溢出次数,与QCPRD结合计算长周期。

6. 从零开始:eQEP模块的配置步骤与代码示例

理论说了这么多,我们来点实际的。以下以TI C2000 F2807x系列,连接一个1000线增量编码器(4倍频后4000计数/转),工作在正交计数模式、索引复位模式为例,展示初始化流程。

6.1 GPIO引脚复用与配置

这是第一步,信号进不来,后面全白搭。

// 假设使用 eQEP1, 引脚为 GPIO20 (EQEP1A), GPIO21 (EQEP1B), GPIO22 (EQEP1I), GPIO23 (EQEP1S) // 1. 禁用引脚上拉(根据编码器输出类型决定,推挽输出可禁用) GpioCtrlRegs.GPAPUD.bit.GPIO20 = 1; // 禁用上拉 GpioCtrlRegs.GPAPUD.bit.GPIO21 = 1; GpioCtrlRegs.GPAPUD.bit.GPIO22 = 1; GpioCtrlRegs.GPAPUD.bit.GPIO23 = 1; // 2. 配置GPIO Qualifier(输入同步/滤波)。编码器信号建议使用带滤波的同步模式,以抗干扰。 // 选择采样窗口周期和次数。例如,6个周期采样5次,可有效滤除窄毛刺。 GpioCtrlRegs.GPAQSEL2.bit.GPIO20 = 2; // 6个周期采样,异步路径被禁止 GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 2; GpioCtrlRegs.GPAQSEL2.bit.GPIO22 = 2; GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 2; // 3. 配置引脚复用功能为 eQEP GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1; // 配置为 EQEP1A GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1; // 配置为 EQEP1B GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 1; // 配置为 EQEP1I GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 1; // 配置为 EQEP1S

6.2 eQEP模块初始化配置

// 停止 eQEP 模块 EQep1Regs.QEPCTL.bit.FREE_SOFT = 2; // 仿真挂起时停止 EQep1Regs.QEPCTL.bit.PCRM = 0; // 选择 PCRM=00: 索引事件复位模式 EQep1Regs.QEPCTL.bit.UTE = 0; // 先禁用单元定时器 EQep1Regs.QEPCTL.bit.QCLM = 0; // 索引事件发生时锁存位置计数器(可选) EQep1Regs.QEPCTL.bit.IEL = 1; // 在索引上升沿锁存位置(根据编码器Index极性调整) EQep1Regs.QEPCTL.bit.SEL = 0; // Strobe 上升沿锁存 EQep1Regs.QEPCTL.bit.SWI = 0; // 清除软件初始化标志 EQep1Regs.QEPCTL.bit.IEI = 0; // 禁用索引事件初始化 EQep1Regs.QEPCTL.bit.SEI = 0; // 禁用选通事件初始化 // 配置解码控制单元 EQep1Regs.QDECCTL.bit.QSRC = 0; // 00: 正交计数模式 EQep1Regs.QDECCTL.bit.XCR = 1; // 1: 使用2倍计数模式?不,对于正交模式,此位应保留默认或设为0。手册建议在UP/DOWN模式时清零以2倍频。 // 正交模式下,4倍频由硬件自动完成,此位无效。 EQep1Regs.QDECCTL.bit.SWAP = 0; // 不交换A、B输入 EQep1Regs.QDECCTL.bit.IGATE = 0; // 禁用索引门控(根据编码器Index类型设置) EQep1Regs.QDECCTL.bit.QAP = 0; // A输入不反相 EQep1Regs.QDECCTL.bit.QBP = 0; // B输入不反相 EQep1Regs.QDECCTL.bit.QIP = 0; // I输入不反相 EQep1Regs.QDECCTL.bit.QSP = 0; // S输入不反相 // 配置位置计数器 EQep1Regs.QPOSMAX = 3999; // 1000线编码器,4倍频后每转4000个脉冲,计数值0-3999 EQep1Regs.QPOSINIT = 0; // 初始化位置为0 EQep1Regs.QPOSCNT = 0; // 当前位置计数器清零 // 配置位置比较单元(如果需要) EQep1Regs.QPOSCTL.bit.PCSPW = 0xFF; // 位置比较同步脉冲宽度(根据需要设置) EQep1Regs.QPOSCTL.bit.PCE = 0; // 先禁用位置比较 EQep1Regs.QPOSCMP = 0; // 比较值暂设0 // 配置看门狗(可选) EQep1Regs.QWDPRD = 0xFFFF; // 看门狗周期,根据最大允许无脉冲时间设置 EQep1Regs.QEPCTL.bit.WDE = 0; // 先禁能看门狗 // 配置边沿捕获单元(用于低速测速) EQep1Regs.QCAPCTL.bit.UPPS = 5; // 分频:1/32, 即每32个QCLK脉冲捕获一次。可设为1-5。 EQep1Regs.QCAPCTL.bit.CCPS = 7; // 捕获定时器时钟分频:SYSCLKOUT/128,降低捕获定时器频率以测量更长时间 EQep1Regs.QCAPCTL.bit.CEN = 1; // 使能捕获单元 // 配置单元定时器(用于高速测速) // 假设系统时钟100MHz,我们想要1ms的测速周期 EQep1Regs.QUPRD = 100000; // 100MHz * 0.001s = 100,000 EQep1Regs.QEPCTL.bit.UTE = 1; // 使能单元定时器 // 配置中断 // 使能所需中断,例如:单元定时器超时(UTO), 位置比较(PCM), 捕获事件(CEI), 看门狗超时(WTO)等。 EQep1Regs.QEINT.bit.UTO = 1; // 使能单元定时器超时中断 // EQep1Regs.QEINT.bit.PCM = 1; // 使能位置比较匹配中断 // EQep1Regs.QEINT.bit.WTO = 1; // 使能看门狗超时中断 // 最后,使能 eQEP 位置计数器 EQep1Regs.QEPCTL.bit.QPEN = 1; // 使能位置计数器

6.3 中断服务程序示例(速度计算)

// 全局变量 volatile int32_t pos_last = 0; volatile float speed_rpm = 0.0; volatile uint16_t cap_timer_overflow_count = 0; // eQEP1 中断服务例程 __interrupt void eQEP1_ISR(void) { if (EQep1Regs.QFLG.bit.UTO == 1) { // 单元定时器超时中断(M法测速) int32_t pos_now = EQep1Regs.QPOSCNT; int32_t delta_pos = pos_now - pos_last; // 处理计数器循环溢出(在PCRM=00���式下,Index会复位,此处可能不需要复杂处理。 // 若在PCRM=01自由循环模式下,需处理跨最大值/0点的差值计算) // 简单示例,假设速度不至于在1ms内超过半圈(2000计数) if (delta_pos > 2000) { delta_pos -= 4000; // 假设正向溢出 } else if (delta_pos < -2000) { delta_pos += 4000; // 假设负向溢出 } // 计算速度 (RPM) // delta_pos: 1ms内的位置增量(计数) // 每转4000计数, 1ms = 1/1000 秒 // speed_rps = delta_pos / 4000 / (0.001) = delta_pos / 4.0 // speed_rpm = speed_rps * 60 = delta_pos / 4.0 * 60 = delta_pos * 15.0 speed_rpm = (float)delta_pos * 15.0; pos_last = pos_now; EQep1Regs.QCLR.bit.UTO = 1; // 清除中断标志 } if (EQep1Regs.QFLG.bit.CEQ == 1) { // 捕获事件中断(T法测速,可选) uint32_t cap_period = EQep1Regs.QCPRDLAT; // 读取锁存的捕获周期值 // 结合 cap_timer_overflow_count 计算总时间 // 计算低速速度... EQep1Regs.QCLR.bit.CEQ = 1; } if (EQep1Regs.QFLG.bit.PCE == 1) { // 位置计数器错误(例如索引事件位置非零) // 处理错误,例如记录日志或报警 EQep1Regs.QCLR.bit.PCE = 1; } // ... 处理其他中断标志 PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; // 确认PIE组4中断 }

7. 常见问题排查与调试技巧

调过eQEP的人,多少都踩过一些坑。下面是我总结的几个典型问题和排查思路。

7.1 位置计数器不计数或计数方向错误

  • 现象:电机转动,但QPOSCNT寄存器值不变。

  • 排查

    1. GPIO配置:首先用示波器或逻辑分析仪检查EQEPxA、B引脚是否有信号。如果没有,检查GPIO复用配置(GPAMUX)是否正确,引脚是否被其他外设占用。
    2. 输入滤波:如果信号有但计数器不动作,可能是输入滤波(Qualifier)设置过于严格,把正常脉冲滤掉了。尝试将GPAQSEL配置为0(仅同步,无滤波),看是否恢复计数。
    3. 信号极性:检查QDECCTL中的QAP、QBP位是否设置正确。如果编码器输出低电平有效,需要置位这些取反位。
    4. 工作模式:确认QDECCTL.QSRC是否设置为00(正交计数模式)。
  • 现象:电机正转,计数器却递减。

  • 排查

    1. 机械方向:这是最常见原因。电机定义的“正转”方向与编码器A、B相序不匹配。
    2. 软件修正:最简单的办法是置位QDECCTL.SWAP位,交换A、B输入。或者,在软件读取速度/位置后乘以-1。

7.2 索引(Index)信号相关故障

  • 现象:无法在索引点正确复位位置计数器。
  • 排查
    1. 索引信号类型:确认你的编码器输出是门控索引还是非门控索引。门控索引的脉冲边沿与A/B相的某个边沿对齐,eQEP的“索引事件标记”机制依赖于这种对齐。如果是非门控索引,建议使用“上升沿/下降沿锁存(IEL=01/10)”模式,而不是“索引事件标记复位(PCRM=00)”模式。
    2. 索引信号滤波:Index信号可能含有毛刺。适当启用GPIO Qualifier滤波。
    3. 复位模式:检查QEPCTL.PCRM是否配置为00。检查QEPCTL.IEL在PCRM=00时是否被忽略(应配置为00或11)。
    4. 信号连接:确保Index信号线已正确连接,并且编码器确实每圈输出一个脉冲。

7.3 速度测量不准或不稳定

  • 现象:低速时速度显示为0或跳变巨大。

  • 排查

    1. 测速方法:低速时必须使用或结合T法(边沿捕获)。检查QCAPCTL配置是否正确,捕获中断是否使能,是否处理了捕获定时器溢出。
    2. 捕获分频:QCAPCTL.UPPS(单位位置事件分频)设置过大,会导致在极低速下很久才有一个捕获事件,更新率低。对于追求低速响应性的场合,可以设置为1(每个QCLK捕获一次),但要注意此时高速下中断频率会很高。
    3. 定时器时钟:QCAPCTL.CCPS(捕获定时器时钟预分频)设置会影响ΔT的测量分辨率。时钟太快,容易在高速时溢出;时钟太慢,低速分辨率低。需要根据速度范围折中。
  • 现象:高速时速度值波动大。

  • 排查

    1. M法量化误差:在高速区,M法是准确的。波动大可能是由于UTIME中断周期内脉冲数不是整数带来的固有量化误差。可以通过滑动平均滤波锁相环(PLL)等软件算法对速度进行平滑。
    2. 中断延迟:确保UTIME中断优先级足够高,不会被其他长时间中断阻塞。检查中断服务函数是否过于冗长。
    3. 机械振动:电机或负载的机械振动可能导致编码器输出脉冲不均匀。这需要从机械上解决。

7.4 看门狗频繁超时

  • 现象:电机明明在转,但看门狗超时中断频繁触发。
  • 排查
    1. 看门狗周期:QWDPRD设置得太短。计算一下电机最低运行速度下,两个脉冲之间的最大时间间隔,并以此为依据设置看门狗周期,留有一定余量。
    2. 信号丢失:编码器接线松动、断线或受到严重干扰,导致脉冲丢失。检查线路和屏蔽。
    3. 电机真的停了:驱动器使能断开或负载过大导致堵转。

调试时,养成定期读取QEPSTS和QFLG寄存器的习惯。里面的方向标志位、错误标志位、索引状态位能提供最直接的硬件状态信息。另外,TI的C2000ware库中提供了完善的eQEP驱动例程,从最基础的配置到复杂的电子齿轮应用都有,那是非常好的学习和参考起点。但切记,理解寄存器背后的原理,才能在你自己的项目中灵活运用并快速排错。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询