
1. 项目概述为什么我们需要eQEP模块在工业伺服驱动、机器人关节控制或者高精度数控机床里想让电机乖乖听话精确地走到你指定的位置并以恒定的速度运行核心前提是你得先“知道”它现在在哪儿、跑得多快。这就好比开车速度和里程表是让你安全驾驶的基础。在电机控制的世界里这个“速度和里程表”通常就是增量式编码器。你可能会在电机屁股后面看到一个带着电缆的小圆盘那就是它。它通过光电或磁电原理随着电机轴旋转输出两路被称为QEPA和QEPB的方波信号。这两路信号的神奇之处在于它们的相位差是精确的90度电角度。当电机正转时A相领先B相90度反转时则B相领先A相。控制器通过识别谁领先谁来判断方向通过数脉冲的个数来计算转过的角度位置通过测量脉冲的频率来推算转速。听起来很简单不就是数数嘛但实际做起来坑不少。比如电机转速范围可能从每分钟几转到几千转跨度极大。低速时脉冲间隔很长用固定时间采样位置来计算速度M法测速分辨率会惨不忍睹可能电机在蠕动你的读数却是零。高速时脉冲像暴雨一样打来用测量固定脉冲数所需时间的方法T法测速对计时器的分辨率要求又极高误差很大。此外还有信号抖动需要滤波、计数溢出处理、寻找机械零点索引信号等一系列问题。如果这些全靠主控芯片的通用IO和定时器去软件模拟不仅会消耗大量宝贵的CPU时间实时性和可靠性也难以保证。因此像TI C2000这类专为实时控制而生的微控制器就集成了一个硬件外设来专门干这个脏活累活——增强型正交编码器脉冲eQEP模块。它把解码、计数、捕获、比较、看门狗等功能都做进了硬件里你只需要进行正确的配置它就能自动、准确、高效地完成位置和速度的测量把CPU解放出来去执行更高级的控制算法如FOC。今天我就结合手册和实际调伺服驱动器的经验把这个模块从原理到配置掰开揉碎了讲清楚。2. eQEP模块核心架构与工作模式解析拿到一个外设别急着翻寄存器。先看懂它的整体架构和能干什么配置起来才能心中有数。eQEP模块可以看作一个专为编码器信号设计的“流水线工厂”。2.1 模块功能单元拆解根据手册里的框图eQEP模块主要由以下几个核心车间组成正交解码单元QDU这是第一道工序。它接收来自GPIO引脚的两路原始正交信号QEPA, QEPB。它的核心工作就是“解码”根据A、B两相信号的边沿变化顺序判断当前是正转还是反转并生成一个统一的方向信号QDIR和计数时钟QCLK。在4倍频模式下A、B的每个上升沿和下降沿都会触发一次计数因此最终位置分辨率是编码器物理线数的4倍。一个1000线的编码器经过QDU后每转会产生4000个计数脉冲。位置计数器与控制单元PCCU这是核心车间。它包含一个32位的位置计数器QPOSCNT随着QDU输出的每一个QCLK脉冲进行递增或递减。PCCU的“控制”部分非常强大它决定了这个计数器如何工作计数模式除了标准的正交计数还支持方向计数外部直接给时钟和方向信号、递增计数、递减计数模式。复位/归零策略计数器不能无限累加否则会溢出。PCCU提供了多种“归零”机制可以在收到编码器的索引Index信号时复位可以在计数器达到用户设定的最大值QPOSMAX时复位也可以由内部单元定时器超时触发复位。这对应了不同的应用场景比如每圈清零找绝对零点或者进行频率测量。边沿捕获单元QCAP这是解决低速测量精度问题的“神器”。它不关心位置而是专注于“时间”。当QDU产生的QCLK脉冲到来时QCAP会捕获此时内部一个自由运行计时器QCTMR的值。通过测量固定数量脉冲通常是1个之间的时间间隔就能非常精确地计算出低速时的速度。这个模式在电机启动、极低速运行时至关重要。单元定时器UTIME与看门狗QWDOG单元定时器提供一个固定的时基用于高速速度测量M法。你设定一个周期如1ms定时器每到这个周期就产生中断在中断里读取位置计数器的差值除以时间就得到了速度。看门狗定时器用于监测电机是否堵转或丢失。如果超过设定的时间QWDPRD没有收到任何编码器脉冲看门狗就会超时并产生中断告诉你“电机可能卡住了”。2.2 关键输入信号与工作模式选择eQEP模块有4个关键输入引脚理解它们才能正确接线和配置EQEPxA / EQEPxB核心正交信号输入。在**正交计数模式Quadrature-count下就是标准的A、B两相。在方向计数模式Direction-count**下A脚作为时钟输入ClockB脚作为方向输入Direction此时模块退化成一个简单的“有符号”计数器。EQEPxI索引信号输入。编码器每旋转一圈会输出一个窄脉冲代表机械零点。这个信号对于确定绝对位置起点“回家”至关重要。eQEP可以利用它来复位位置计数器。EQEPxS选通信号输入。这是一个通用的数字输入你可以把它接到一个限位开关或光电传感器上。当电机运动到某个物理位置触发此开关时eQEP可以锁存当前的位置计数值到QPOSSLAT寄存器方便你记录特定位置。模式选择的心得绝大多数增量编码器应用都使用正交计数模式这是eQEP的主场。方向计数模式通常用于接收其他控制器或特定传感器输出的“时钟方向”信号。递增/递减模式则用于频率测量等特殊场合。3. 正交解码单元QDU的深入配置与避坑指南QDU是将物理信号转化为逻辑计数的第一步这里配置错了后面全完蛋。3.1 解码原理与方向判断手册里那张状态机图和真值表是理解核心。简单来说QDU内部有一个状态机跟踪A、B信号上一个边沿的状态00 01 11 10。当新的边沿到来状态发生跳转。如果跳转顺序是顺时针例如00-01-11-10-00则判定为正转QDIR1计数器加如果是逆时针跳转则判定为反转QDIR0计数器减。一个极其重要的坑相位错误Phase Error。理想情况下A、B信号相位差严格90度状态跳转总是沿着状态图的四个状态循环。但如果信号受到严重干扰或编码器安装松动导致A、B信号抖动可能会出现“毛刺”导致状态机发生非法跳转例如从00直接跳到11跳过了01和10。这种跳转在状态图中是用虚线表示的。一旦发生QDU会置位相位错误标志PHE并且位置计数器可能会产生±1或±3的计数错误。实操注意在电机高速运行或强干扰环境如变频器附近中一定要在初始化时使能输入信号滤波通过GPIO的Qualifier功能并定期在中断中检查QFLG寄存器的PHE位。如果频繁出现相位错误必须检查编码器接线是否使用双绞屏蔽线、电源质量以及编码器本身的安装是否牢固。我曾遇到过因编码器联轴器松动导信号不同步从而引发频繁相位错误导致位置环震荡的情况。3.2 输入极性交换与信号取反交换SWAPQDECCTL寄存器中的SWAP位。这个功能非常实用。有时候因为机械安装方向或者电机相序的原因你发现电机实际正转时计数器却在递减。懒得多想直接把SWAP位置1交换A、B两路信号输入到解码器的顺序计数方向就反过来了。这比在软件里对计数结果取反更底层、更高效。取反QAP, QBP, QIP, QSP同样是QDECCTL寄存器中的控制位可以分别将A、B、I、S信号的极性反转。如果你的编码器输出是低电平有效或者信号经过反相器驱动就需要用到这个功能。配置前最好用示波器确认一下信号的实际极性。3.3 位置计数器的四种输入模式详解通过QDECCTL[QSRC]位选择这决定了QDU输出给位置计数器QPOSCNT的“时钟”和“方向”信号来源。00: 正交计数模式最常用模式。QDU根据A、B信号生成4倍频的QCLK和方向信号QDIR。01: 方向计数模式EQEPxA作为时钟输入EQEPxB作为方向输入高电平递增低电平递减。此时QDU基本旁路模块变成一个简单的边沿计数器。10: 递增计数模式EQEPxA作为时钟输入方向固定为递增。可用于测量脉冲频率。注意在此模式下EQEPxB引脚必须悬空或配置为其他功能否则其上的电平跳变可能会干扰计数。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。这形成了一个循环的、模数为QPOSMAX1的计数环。适用于无限位移动的应用比如控制一个无限长的传送带理论上或者你不关心绝对圈数只关心相对位移。此时索引信号可以用来锁存位置见下文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。例如电子齿轮/电子凸轮主轴虚拟或实际每转一定角度通过eQEP输出一个脉冲给从轴作为其位置环的同步触发信号。精准触发ADC采样在磁场定向控制FOC中希望在某特定转子角度时采样相电流。可以将这个角度对应的位置值写入QPOSCMP当电机转到该位置时eQEP输出脉冲触发ADC开始采样序列。生成PWM同步信号在多个电机协同或与外部设备同步时提供硬件同步点。影子寄存器与加载模式QPOSCMP有影子寄存器。你可以安全地在任何时候写入新的比较值到影子寄存器并配置在“比较匹配”或“计数器归零”的瞬间将影子寄存器的值加载到工作寄存器。这避免了在比较过程中修改寄存器导致误触发。脉冲展宽PCSPW可以设置输出脉冲的宽度基于SYSCLK周期。如果两次比较匹配事件间隔太近前一个脉冲还没结束后一个事件又来了脉冲展宽逻辑会保证输出一个完整的、宽度为PCSPW的新脉冲而不会产生窄毛刺。5. 速度测量高低速结合的实战策略是eQEP的核心价值之一。如前所述单一测速方法无法兼顾宽速度范围。eQEP硬件同时支持两种方法我们需要在软件上实现“高低速切换”。5.1 高速测量法M法基于单位定时器原理在固定的、较短的时间间隔T例1ms内读取位置计数器的增量ΔX。速度 v ΔX / T。单位定时器UTIME就是用来产生这个固定间隔T的。配置与计算配置单元定时器周期寄存器QUPRD。若系统时钟SYSCLKOUT为100MHz想要1ms中断则QUPRD 100MHz * 0.001s 100,000。使能单元定时器超时中断QEINT中的UTO中断。在中断服务程序中读取当前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的。配置与计算配置捕获控制寄存器QCAPCTL。设置捕获分频例如每1个QCLK脉冲捕获一次CCPS0。使能捕获定时器溢出中断和捕获事件中断。在捕获事件中断中读取捕获的周期值QCPRD这个寄存器记录了连续两个捕获事件间自由运行定时器QCTMR的计数值差。delta_time QCPRD / f_sysclk。速度speed_rps (1 / N) / delta_time其中(1/N)是每个QCLK脉冲对应的机械弧度或转数。优点低速时测量精度极高。缺点高速时ΔT非常小对定时器分辨率敏感且频繁中断会增加CPU负荷。5.3 软件实现高低速自动切换这是体现工程师功力的地方。一个鲁棒的测速算法不能只依赖一种方法。策略始终同时运行两种测量机制。M法依赖UTIME定时中断T法依赖QCAP捕获中断。在软件中维护一个“可信速度”值。同时计算M法速度v_m和T法速度v_t。设计一个切换逻辑。例如当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; // 配置为 EQEP1S6.2 eQEP模块初始化配置// 停止 eQEP 模块 EQep1Regs.QEPCTL.bit.FREE_SOFT 2; // 仿真挂起时停止 EQep1Regs.QEPCTL.bit.PCRM 0; // 选择 PCRM00: 索引事件复位模式 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; // 处理计数器循环溢出在PCRM00式下Index会复位此处可能不需要复杂处理。 // 若在PCRM01自由循环模式下需处理跨最大值/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寄存器值不变。排查GPIO配置首先用示波器或逻辑分析仪检查EQEPxA、B引脚是否有信号。如果没有检查GPIO复用配置GPAMUX是否正确引脚是否被其他外设占用。输入滤波如果信号有但计数器不动作可能是输入滤波Qualifier设置过于严格把正常脉冲滤掉了。尝试将GPAQSEL配置为0仅同步无滤波看是否恢复计数。信号极性检查QDECCTL中的QAP、QBP位是否设置正确。如果编码器输出低电平有效需要置位这些取反位。工作模式确认QDECCTL.QSRC是否设置为00正交计数模式。现象电机正转计数器却递减。排查机械方向这是最常见原因。电机定义的“正转”方向与编码器A、B相序不匹配。软件修正最简单的办法是置位QDECCTL.SWAP位交换A、B输入。或者在软件读取速度/位置后乘以-1。7.2 索引Index信号相关故障现象无法在索引点正确复位位置计数器。排查索引信号类型确认你的编码器输出是门控索引还是非门控索引。门控索引的脉冲边沿与A/B相的某个边沿对齐eQEP的“索引事件标记”机制依赖于这种对齐。如果是非门控索引建议使用“上升沿/下降沿锁存IEL01/10”模式而不是“索引事件标记复位PCRM00”模式。索引信号滤波Index信号可能含有毛刺。适当启用GPIO Qualifier滤波。复位模式检查QEPCTL.PCRM是否配置为00。检查QEPCTL.IEL在PCRM00时是否被忽略应配置为00或11。信号连接确保Index信号线已正确连接并且编码器确实每圈输出一个脉冲。7.3 速度测量不准或不稳定现象低速时速度显示为0或跳变巨大。排查测速方法低速时必须使用或结合T法边沿捕获。检查QCAPCTL配置是否正确捕获中断是否使能是否处理了捕获定时器溢出。捕获分频QCAPCTL.UPPS单位位置事件分频设置过大会导致在极低速下很久才有一个捕获事件更新率低。对于追求低速响应性的场合可以设置为1每个QCLK捕获一次但要注意此时高速下中断频率会很高。定时器时钟QCAPCTL.CCPS捕获定时器时钟预分频设置会影响ΔT的测量分辨率。时钟太快容易在高速时溢出时钟太慢低速分辨率低。需要根据速度范围折中。现象高速时速度值波动大。排查M法量化误差在高速区M法是准确的。波动大可能是由于UTIME中断周期内脉冲数不是整数带来的固有量化误差。可以通过滑动平均滤波或锁相环PLL等软件算法对速度进行平滑。中断延迟确保UTIME中断优先级足够高不会被其他长时间中断阻塞。检查中断服务函数是否过于冗长。机械振动电机或负载的机械振动可能导致编码器输出脉冲不均匀。这需要从机械上解决。7.4 看门狗频繁超时现象电机明明在转但看门狗超时中断频繁触发。排查看门狗周期QWDPRD设置得太短。计算一下电机最低运行速度下两个脉冲之间的最大时间间隔并以此为依据设置看门狗周期留有一定余量。信号丢失编码器接线松动、断线或受到严重干扰导致脉冲丢失。检查线路和屏蔽。电机真的停了驱动器使能断开或负载过大导致堵转。调试时养成定期读取QEPSTS和QFLG寄存器的习惯。里面的方向标志位、错误标志位、索引状态位能提供最直接的硬件状态信息。另外TI的C2000ware库中提供了完善的eQEP驱动例程从最基础的配置到复杂的电子齿轮应用都有那是非常好的学习和参考起点。但切记理解寄存器背后的原理才能在你自己的项目中灵活运用并快速排错。