1. eQEP模块:从编码器信号到精准运动控制的核心桥梁
在电机控制、机器人关节定位或者高精度数控机床的伺服驱动里,我们总得知道一件事:电机轴此刻到底转到了哪里,以及它转得有多快。这听起来简单,但却是整个闭环控制系统得以稳定、精准运行的基石。增量式编码器,作为一种经济高效的旋转或直线位移传感器,通过输出两路相位差90度的正交脉冲信号(通常称为A相和B相)来回答这个问题。然而,将这两路看似简单的方波信号,实时、无差错地转换为准确的位置和速度数字量,如果全靠软件在通用定时器中断里数边沿、判方向,不仅会大量消耗宝贵的CPU资源,在高速或高精度场景下更可能力不从心,引入难以接受的延迟和误差。
这时,像TI C2000系列微控制器中集成的增强型正交编码器脉冲(eQEP)模块,就扮演了“专用解码芯片”的角色。它不是一个简单的计数器,而是一套完整的硬件信号处理系统。我接触过不少从软件解码转向硬件eQEP的工程师,最大的感受就是“解放了CPU”。eQEP模块在硬件层面自动完成了正交解码、方向判断、位置累加、索引信号处理、速度计算甚至位置比较输出等所有繁重工作,CPU只需要在合适的时机(比如定时中断)去读取一个已经计算好的位置值或速度值即可。这种硬件的确定性是软件无法比拟的,尤其在要求高实时性和高精度的伺服与运动控制领域,eQEP几乎是标配。
简单来说,eQEP模块的核心价值在于,它将编码器输出的模拟物理运动(脉冲序列),无缝、实时地转换为了数字控制系统能够理解和处理的“语言”——精确的位置计数值和速度值。接下来,我们就深入其内部,看看这套精密的“翻译官”是如何工作的。
2. 正交编码器基础与eQEP模块架构解析
2.1 增量式编码器的工作原理:不只是两路脉冲
要理解eQEP,必须先吃透它的输入信号从何而来。一个典型的增量式旋转编码器,其核心是一个刻有明暗相间栅格的码盘。当电机轴带动码盘旋转时,固定在码盘一侧的光电或磁电传感器会检测到光或磁场的变化,从而产生电脉冲。为了获取方向信息,通常会并排放置两套传感器,它们在机械上错开1/4个栅格间距(即90度电角度)。这就产生了我们熟悉的QEPA和QEPB两路信号。
关键点在于相位关系:当电机正向(通常定义为顺时针)旋转时,QEPA的上升沿会领先于QEPB的上升沿出现;反向旋转时,QEPB的上升沿则领先于QEPA。eQEP模块的正交解码单元(QDU)正是通过实时捕捉和比较这两路信号的边沿跳变顺序,来判定当前的旋转方向。
除了A、B两相,许多编码器还提供一个索引信号(QEPI或Z信号)。这个信号每转一圈产生一个脉冲,用于提供一个绝对的机械零点参考。这对于需要“归零”或进行多圈绝对位置计算的系统至关重要。eQEP模块可以配置为在检测到索引信号时,将位置计数器复位或锁存,从而建立绝对坐标。
注意:编码器的“线数”是一个关键参数。例如,一个“1000线”的编码器,意味着码盘上有1000对明暗栅格。由于eQEP可以对A、B两相的上升沿和下降沿都进行计数(即4倍频),因此其最终的位置分辨率是
4 * 线数。对于1000线编码器,电机转一圈,位置计数器QPOSCNT会变化4000次。
2.2 eQEP模块的功能单元全景图
eQEP不是一个单一的黑盒子,它由多个协同工作的子单元构成,理解这个架构有助于我们后续的配置和调试。其核心功能单元包括:
输入信号调理与选择:在信号进入核心逻辑之前,首先经过可编程的输入限定器(通常与GPIO复用功能相关),用于滤除可能因抖动产生的毛刺。更重要的是,eQEP的输入源是可配置的。除了直接从设备引脚(EQEPx_A, EQEPx_B)获取信号外,还可以来自内部交叉开关(PWMXBAR)或比较器子系统(CMPSS)的输出。这在一些高级应用,如使用旋转变压器(Resolver)或正余弦(Sin/Cos)编码器时非常有用,因为这些模拟信号经CMPSS处理后可以生成数字正交信号供eQEP解码。
正交解码单元:这是eQEP的“大脑”。它持续监控QEPA和QEPB的边沿变化,根据预设的“正交计数模式”,内部生成一个方向信号(QDIR)和一个计数时钟(QCLK)。这个QCLK的频率最高可达输入信号频率的4倍(4倍频模式),从而将编码器的原始分辨率提高了4倍。
位置计数器与控制单元:这是eQEP的“心脏”。一个32位的位置计数器(QPOSCNT)根据QDU输出的方向和时钟进行递增或递减。PCCU提供了丰富的控制逻辑,例如:当计数器达到用户设定的最大值(QPOSMAX)时是溢出还是归零?当检测到索引脉冲时,是锁存当前计数值还是复位计数器?这些行为都由相应的控制寄存器(QEPCTL, QPOSCTL)配置。
边沿捕获单元:这个单元专门用于低速下的高精度速度测量。它不依赖固定的采样时间,而是测量编码器产生一个固定数量脉冲(例如,1个脉冲)所花费的时间。在电机极低速运行时,单位时间内的脉冲数可能少于1,传统测速法会失效,而边沿捕获法通过测量脉冲周期来反推速度,在低速下依然能保持高精度。
单位时间基准与看门狗:单位时间基准(UTIME)用于中高速下的速度测量,它提供一个固定的计时周期(例如1ms),CPU在每个周期结束时读取位置计数器的差值来计算速度。看门狗定时器(QWDOG)则用于监测电机是否堵转或失步——如果超过预设时间没有收到任何编码器脉冲,就会触发中断告警。
2.3 关键寄存器内存映射速览
与eQEP模块交互,本质上是读写其对应的控制与状态寄存器。对于AM263P这类器件,eQEP的寄存器基址是固定的。作为开发者,我们不需要记住每个地址,但需要熟悉几个最核心的寄存器及其作用:
| 寄存器名称 | 偏移地址 | 主要功能描述 |
|---|---|---|
| QPOSCNT | 0x00 | 位置计数器。这是最常读的寄存器,实时反映当前位置。32位,可计数范围巨大。 |
| QPOSMAX | 0x08 | 最大位置值。设置位置计数器的计数上限,用于周期位置模式或溢出判断。 |
| QPOSCMP | 0x0C | 位置比较寄存器。当QPOSCNT等于此值时,可触发同步信号或中断,用于生成特定位置的触发事件。 |
| QEPCTL | 0x2A | eQEP主控制寄存器。配置工作模式(如位置计数器复位模式)、索引/选通信号触发方式等。 |
| QDECCTL | 0x28 | 正交解码控制寄存器。选择计数模式(正交/方向/向上/向下)、输入信号极性、是否使能同步输出等。 |
| QCAPCTL | 0x2C | 边沿捕获控制寄存器。配置捕获单位、分频、使能等,用于低速测速。 |
| QFLG | 0x32 | 中断标志寄存器。查看发生了什么事件(如索引事件、捕获完成、看门狗超时、上溢/下溢)。 |
| QCLR | 0x34 | 中断标志清除寄存器。写1到对应位可清除QFLG中的标志位。 |
| QEINT | 0x30 | 中断使能寄存器。决定哪些事件可以触发CPU中断。 |
在实际编程中,TI通常会提供完善的驱动库,将这些寄存器操作封装成清晰的API函数。但理解其底层含义,对于排查复杂问题和进行高性能优化至关重要。例如,当你发现位置读数在某个点附近跳动时,可能需要检查QDECCTL中的输入滤波设置;当速度计算在低速时不准确时,可能需要启用并配置QCAPCTL。
3. eQEP核心工作模式深度剖析与配置实战
理解了架构,我们就可以深入eQEP最核心的几个工作模式。不同的应用场景需要不同的配置,选对模式是成功的第一步。
3.1 位置计数器的四种灵魂模式
位置计数器(QPOSCNT)的行为模式由QEPCTL[PCRM]位域控制。这四种模式决定了计数器如何响应“一圈”或“一个周期”的概念。
3.1.1 模式0:在索引事件复位这是最直观的模式。每当编码器的索引脉冲(QEPI)到来时,位置计数器QPOSCNT会被复位。复位值取决于方向:正向旋转时复位到0,反向旋转时复位到QPOSMAX。
- 应用场景:每圈绝对位置测量。例如,一个旋转工作台,每一圈都需要从一个固定的“零点”开始计算位置。索引脉冲就是这个零点。计数器会从0开始累加,直到下一个索引脉冲到来时再次归零。QPOSMAX在此模式下通常设置为
4 * 编码器线数 - 1(例如1000线编码器设为3999),但复位逻辑不依赖它,它仅用于下溢判断。 - 配置要点:需要确保编码器的索引信号是“门控”的,即其边沿与A/B相的某个边沿对齐,否则可能在索引信号到来时,A/B相恰好变化,导致相位错误标志置位。
- 实操心得:在这种模式下,
QEPSTS[PCEF](位置计数器错误标志)非常有用。如果索引事件发生时,QPOSCNT的值既不是0也不是QPOSMAX,该标志位会置1。这通常意味着编码器存在丢脉冲、多计数或信号干扰问题,是诊断硬件连接或信号质量的好工具。
3.1.2 模式1:在最大位置复位在此模式下,索引信号不再复位计数器。计数器在达到用户设定的最大值QPOSMAX后,下一个正向时钟会使其归零(上溢);在达到0后,下一个反向时钟会使其跳变到QPOSMAX(下溢)。
- 应用场景:多圈绝对位置测量或线性位移测量。例如,一个丝杠驱动的直线模组,编码器直接安装在电机上。我们关心的是从启动开始的总位移,而不是每圈的相对位置。通过设置一个足够大的QPOSMAX(如0xFFFFFFFF),计数器可以连续累加数十亿个脉冲,实现超长行程测量。当需要“圈数”信息时,可以用总脉冲数除以每圈脉冲数来计算。
- 配置要点:QPOSMAX的值需要根据实际物理行程和编码器分辨率精心计算。要预留足够的余量,防止在高速下短时间内发生多次溢出/下溢,导致位置跟踪丢失。
3.1.3 模式2:在第一个索引事件复位这是模式0和模式1的混合。仅第一个索引脉冲会复位计数器(行为同模式0),之后的索引脉冲不再复位计数器,计数器将按照模式1(在QPOSMAX处循环)的方式运行。
- 应用场景:需要上电后寻找一次机械零点,之后进行多圈绝对位置测量的系统。例如,伺服驱动器上电后,驱动电机缓慢旋转直到找到索引脉冲,将当前位置设为绝对零点。之后在运行过程中,无论电机正反转多少圈,位置计数器都连续计数,提供相对于那个上电零点的绝对位置。
- 避坑指南:务必在软件中记录“上电寻零”这个状态。在找到第一个索引脉冲并完成复位后,要将系统状态切换为“已归零”,否则可能会错误地期待后续索引脉冲也有复位功能。
3.1.4 模式3:在单位时间超时事件复位此模式专为频率(速度)测量设计。位置计数器不再用于累加位置,而是被单位时间基准(UTIME)周期性复位。在每个UTIME周期内,计数器记录收到的编码器脉冲数。周期结束时,脉冲数被锁存,计数器复位,CPU读取该值即可计算出该周期内的平均速度。
- 应用场景:中高速速度测量。这是最经典的速度测量方法,计算简单直接:
速度 = (本次位置 - 上次位置) / 单位时间。 - 关键计算:单位时间QUPRD的设置决定了速度更新的频率和分辨率。周期太短,在低速时可能一个脉冲都采不到,速度读数为0;周期太长,速度反馈延迟大,影响动态性能。通常需要根据最低速要求来设计:
QUPRD > (1 / 最低转速对应的脉冲频率)。
3.2 正交解码单元的工作模式选择
QDU的工作模式由QDECCTL[QSRC]位选择,决定了QEPA和QEPB信号如何被解读。
3.2.1 正交计数模式这是最常用的模式,用于标准的增量式编码器。eQEP内部对A、B两相的四个边沿(A上升、A下降、B上升、B下降)都进行解码,产生4倍频的计数时钟(QCLK)。方向由两相信号的相位关系决定。
- 方向判断逻辑:硬件内部有一个状态机(参考技术手册中的状态图)。简单记法:当QEPA的边沿变化领先于QEPB时(例如A上升时B为低,A下降时B为高),通常判定为正向,QPOSCNT递增。
- 相位错误:如果A、B两相同时发生跳变(这在正常正交信号中不应发生),
QFLG[PHE]标志位会被置起。这通常意味着编码器信号受到严重干扰、电源不稳或接线错误。
3.2.2 方向计数模式有些传感器或早期编码器直接输出“方向”和“时钟”两路信号。此时,应将时钟信号接QEPA,方向信号接QEPB。当方向信号为高时,QEPA的每个上升沿使计数器递增;方向为低时则递减。
- 应用场景:接驳非标准正交输出的传感器,或某些数字输出的直线位移传感器。
3.2.3 向上/向下计数模式这两种模式将QEPA作为唯一的时钟源,方向被硬连线为向上或向下。通过配置QDECCTL[XCR]位,可以选择在QEPA的单个边沿或两个边沿计数,从而实现2倍频。
- 应用场景:频率测量或脉冲计数。例如,测量一个单通道转速传感器的频率。此时,QEPB引脚可以悬空或用作其他GPIO功能。
重要提示:在正交计数模式下,eQEP对输入信号的抖动非常敏感。务必启用GPIO模块的输入限定器,并设置合适的采样窗口周期,以滤除可能因电气噪声引起的毛刺,否则会导致额外的计数错误。
4. 双管齐下:基于eQEP的高精度速度测量策略
速度测量是运动控制的另一个核心。eQEP提供了两种互补的方法,分别针对高速和低速场景进行优化,从而实现全速度范围内的精确测速。
4.1 方法一:基于单位时间的位置差法(M法测速)
这是最直观的方法,适用于中高速。
- 原理:利用eQEP的单位时间(UTIME)基准,产生一个固定周期T的中断。在每次中断服务程序中,读取当前的位置计数器值
x(k),并与上一次的值x(k-1)相减,得到在时间T内走过的脉冲数ΔX。 - 计算公式:
速度 v = ΔX / T - eQEP实现:配置位置计数器为“单位时间超时复位”模式(PCRM=11)。设置QUPRD寄存器定义单位时间T。使能单位时间超时中断(UTEINT)。在中断中,锁存的位置差值可以直接反映速度。或者,在PCRM=01模式下,软件自己维护一个
last_position变量,在定时中断里做减法。 - 优点:计算简单,CPU开销小,在高速时精度高。
- ��点:在低速时误差大。例如,编码器分辨率是4000脉冲/转,速度计算频率是1kHz(T=1ms)。当电机转速为15 RPM时,每毫秒产生的脉冲数为
(15转/60秒) * 4000脉冲/转 * 0.001秒 = 1脉冲。此时速度分辨率就是1个脉冲对应的速度,即15 RPM。如果转速低于15 RPM,ΔX经常为0,测出的速度就是0,或者在有/无1个脉冲之间剧烈跳动,完全无法使用。
4.2 方法二:基于固定位置间隔的时间差法(T法测速)
这种方法适用于低速。
- 原理:不固定时间,而是固定一个位置变化量ΔX(例如,1个脉冲)。测量编码器产生这ΔX个脉冲所花费的时间ΔT。
- 计算公式:
速度 v = ΔX / ΔT - eQEP实现:这正是边沿捕获单元(QCAP)的用武之地。配置QCAPCTL寄存器,设置捕获定时器(QCTMR)的时钟分频,并选择捕获单位(例如,每1个QCLK边沿捕获一次)。当编码器产生指定数量的边沿后,QCTMR中的值就会被锁存到QCTMRLAT寄存器,并产生中断。这个值就代表了产生ΔX个脉冲所花费的“机器周期”数,结合系统时钟频率即可算出ΔT。
- 优点:在低速时精度极高。因为无论速度多慢,我都是测量固定数量脉冲的时间,这个时间可以测得很准。
- 缺点:在高速时,ΔT变得非常小,受限于定时器的时钟分辨率和中断响应延迟,相对误差会变大。同时,高速时中断频率会非常高,增加CPU负担。
4.3 混合测速策略与eQEP的自动化支持
在实际系统中,电机需要从极低速(甚至零速)运行到高速。单一的M法或T法都无法满足全范围要求。因此,混合测速策略成为必然选择:
- 低速区:使用T法(边沿捕获)。
- 高速区:切换到M法(单位时间中断)。
- 切换点:需要根据编码器分辨率、系统时钟和精度要求计算一个阈值速度。例如,当T法测出的周期ΔT小于某个值时(意味着速度已足够高),软件自动切换到M法。
eQEP的便利性:eQEP的硬件同时支持这两种机制。你可以同时使能单位时间中断和边沿捕获中断。在软件中,可以根据当前锁存的QCTMRLAT值(代表周期)来判断当前处于哪个速度区间,并决定使用哪个中断源的数据来计算速度,甚至可以动态关闭不用的中断源以节省资源。这种硬件支持使得实现全范围无盲区速度测量变得非常高效。
实操心得:速度计算中的“量化误差”:无论是M法还是T法,都存在固有的量化误差。M法的误差来源于“脉冲个数的整数化”,T法的误差来源于“计时周期的整数化”。理解这一点对评估系统精度至关重要。例如,在M法中,最低可分辨速度就是
1个脉冲 / T。在设计时,应根据系统最低速度要求,反推最大的可接受单位时间T。
5. 高级功能与实战配置指南
掌握了核心的位置和速度测量,eQEP还有一些高级功能可以大幅提升系统性能和集成度。
5.1 位置比较与同步输出
这是一个非常实用的功能,用于在电机到达特定位置时触发一个同步事件。
- 原理:用户预先在QPOSCMP寄存器中设置一个目标位置值。硬件持续将当前位置QPOSCNT与QPOSCMP进行比较。当两者匹配时,eQEP模块可以内部产生一个同步脉冲信号。
- 应用:
- 触发ADC采样:在电机控制中,为了获得最佳的电流环控制效果,需要在特定的转子位置(例如,每60度电角度)进行相电流采样。可以将电角度对应的编码器位置值写入QPOSCMP,利用产生的同步信号去触发ADC开始转换,实现硬件级同步,精度远高于软件定时。
- 生成精准的PWM事件:该同步信号可以连接到PWM模块,用于在特定位置更新PWM占空比或相位,实现与位置严格同步的功率输出。
- 配置步骤:
- 在QPOSCTL寄存器中使能位置比较功能。
- 将目标位置值写入QPOSCMP寄存器(注意,有时需要写入影子寄存器以避免运行时毛刺)。
- 配置QDECCTL[SOEN]和[SPSEL],选择将同步信号输出到哪个引脚(通常是索引或选通引脚复用)。
- 使能位置比较中断(如果需要在匹配时通知CPU)。
5.2 索引与选通事件的应用
索引和选通输入(QEPI和QEPS)除了用于复位和锁存位置计数器,还有更多用途。
- 索引信号:
- 归零与绝对定位:如上文所述,是建立机械零点的关键。
- 多圈计数参考:在模式1(最大位置复位)下,虽然索引不复位计数器,但可以配置为在索引边沿锁存当前计数值到QPOSILAT。软件可以读取这个值,结合溢出次数,计算出精确的、相对于某个索引点的多圈绝对位置。
- 选通信号:
- 外部事件触发:可以连接一个限位开关、光电传感器或外部按钮。当物体移动到传感器位置时,选通信号触发,eQEP立即锁存当前的位置到QPOSSLAT寄存器。这对于记录特定事件发生时的位置非常有用,例如记录机械臂抓取物品的瞬间位置。
- 多轴同步:在多轴协同系统中,一个主轴的选通信号可以连接到其他从轴的选通输入,实现多个编码器在同一个物理事件发生时同时锁存位置,保证位置采样的严格同步。
5.3 典型配置流程与代码片段思路
以下是一个针对标准增量式编码器,实现位置测量和单位时间法测速的初始化流程概述:
GPIO与时钟配置:
- 将对应的GPIO引脚复用为eQEP功能(QA, QB, QI)。
- 配置输入限定器参数(采样周期、阈值),滤除信号抖动。
- 使能eQEP模块的时钟。
正交解码单元配置:
- 设置QDECCTL[QSRC] = 0,选择正交计数模式。
- 根据编码器接线和机械方向,决定是否设置SWAP位来交换A、B相。
- 配置输入信号极性(QAP, QBP, QIP),确保上升沿对应有效的信号跳变。
位置计数器配置:
- 根据应用选择位置计数器模式(QEPCTL[PCRM])。例如,对于多圈绝对位置,选择模式1。
- 设置QPOSMAX值(对于模式1,可设为0xFFFFFFFF)。
- 配置索引事件行为(QEPCTL[IEL]),例如选择在索引上升沿锁存位置。
速度测量配置:
- M法:设置QEPCTL[PCRM]=11,启用单位时间复位模式。根据所需速度更新率计算并设置QUPRD值。使能单位时间超时中断(UTEINT)。
- T法:配置QCAPCTL寄存器,设置边沿捕获的单位(如每1个事件)和捕获定时器预分频。使能捕获事件中断(CEIINT)。
中断配置:
- 在中断控制器中使能eQEP对应的中断线。
- 编写中断服务程序。在M法的单位时间中断里,读取QPOSCNT计算速度差;在T法的捕获中断里,读取QCTMRLAT计算脉冲周期。
启动eQEP:
- 最后,设置QEPCTL[PHEN] = 1,使能位置计数器,开始计数。
// 伪代码示例:初始化eQEP1,正交模式,单位时间法测速 void Init_eQEP1(void) { // 1. 引脚复用和输入限定配置 (调用GPIO驱动API) GPIO_setPinConfig(GPIO_0_EQEP1A); GPIO_setQualificationPeriod(GPIO_0_EQEP1A, SYSTEM_CLOCK_FREQ / 1000000); // 例:1us滤波 // 2. 配置解码器 EQEP_setDecoderConfig(EQEP1_BASE, EQEP_CONFIG_QUADRATURE, EQEP_CONFIG_NO_SWAP); // 正交模式,不交换AB相 EQEP_setInputPolarity(EQEP1_BASE, false, false, false); // 假设信号均为高电平有效 // 3. 配置位置计数器(连续累加模式) EQEP_setPositionCounterConfig(EQEP1_BASE, EQEP_POSITION_RESET_MAX_POS, 0xFFFFFFFF); EQEP_setIndexLatchConfig(EQEP1_BASE, EQEP_LATCH_ON_RISING_EDGE); // 索引上升沿锁存 // 4. 配置单位时间基准用于M法测速(假设速度计算频率为1kHz) uint32_t unitPeriod = SYSTEM_CLOCK_FREQ / 1000; // 计算1ms对应的周期数 EQEP_setUnitPeriod(EQEP1_BASE, unitPeriod); EQEP_enableUnitTimerInterrupt(EQEP1_BASE); // 使能单位时间中断 // 5. 配置并启用中断 Interrupt_register(INT_EQEP1, &eQEP1_ISR); Interrupt_enable(INT_EQEP1); EQEP_enableInterrupt(EQEP1_BASE, EQEP_INT_UTIME); // 在eQEP模块内使能单位时间中断源 // 6. 启动eQEP模块 EQEP_enableModule(EQEP1_BASE); } // 中断服务程序示例:计算速度 volatile int32_t lastPos = 0; volatile float speed_rpm = 0.0; void eQEP1_ISR(void) { uint32_t status = EQEP_getInterruptStatus(EQEP1_BASE); EQEP_clearInterruptStatus(EQEP1_BASE, status); if (status & EQEP_INT_UTIME) { int32_t currentPos = EQEP_getPosition(EQEP1_BASE); int32_t deltaPos = currentPos - lastPos; // 计算脉冲差 // 处理计数器溢出/下溢(此处简化,实际需考虑32位溢出) // 计算速度:deltaPos (脉冲) / unitPeriod (周期数) * (系统时钟频率) / (编码器每转脉冲数) * 60 speed_rpm = (float)deltaPos / (float)unitPeriod * SYSTEM_CLOCK_FREQ / PULSES_PER_REV * 60.0; lastPos = currentPos; } }6. 常见问题排查与调试技巧实录
即使按照手册配置,在实际硬件调试中仍会遇到各种问题。以下是我在多年项目中总结的一些典型问题及排查思路。
6.1 位置计数器不计数或计数方向错误
这是最常见的问题。
- 症状:电机转动,但QPOSCNT寄存器值不变。
- 排查步骤:
- 信号层面:使用示波器直接测量连接到MCU引脚的QEPA和QEPB信号。确保有正确的、幅值足够的方波,且两者存在90度相位差。检查电源和地线是否良好,编码器供电是否稳定。
- GPIO配置:确认GPIO已正确复用为eQEP功能,而非普通的输入。检查输入限定器是否设置得过于“苛刻”,例如采样窗口过宽,可能滤除了所有有效信号。一个快速验证方法是暂时禁用输入限定。
- 极性配置:检查QDECCTL中的QAP和QBP位。如果编码器输出是低电平有效的开路集电极信号,可能需要设置极性反转。方向错误通常也可以通过交换A、B相线序或设置SWAP位来解决。
- 模式配置:确认QDECCTL[QSRC]设置正确。如果编码器是标准正交输出,却配置成了方向计数模式,自然不会计数。
6.2 位置读数存在偶尔的“跳变”或“回滚”
- 症状:位置值大体正确,但偶尔会突然增加或减少一个固定值(如1, 2, 3),或者向反方向跳变一下。
- 原因与解决:
- 相位错误:这是最可能的原因。检查
QFLG[PHE]标志位是否被置位。相位错误意味着A、B两相在同一时刻发生了跳变,导致解码状态机混乱。根本原因通常是信号噪声。解决方案包括:- 加强硬件滤波:在编码器信号线上靠近MCU端增加RC低通滤波。
- 优化软件滤波:适当增加GPIO输入限定器的采样周期。
- 检查布线:编码器信号线应使用双绞线,并远离电机动力线、PWM线等噪声源。
- 计数器溢出/下溢处理不当:在连续计数模式下,如果软件没有正确处理32位计数器的溢出(从0xFFFFFFFF到0x0)或下溢(从0x0到0xFFFFFFFF),在计算位置差时会出现巨大跳变。软件中必须使用有符号的、足够位宽(如64位)的变量来维护“扩展位置”,或者及时进行溢出补偿计算。
- 相位错误:这是最可能的原因。检查
6.3 低速时速度测量为零或不准确
- 症状:电机在低速旋转,但用M法计算出的速度时常为0,或者数值极不稳定。
- 分析:这是M法测速的固有缺陷。在低速下,单位时间内的脉冲数可能小于1,导致量化误差极大。
- 解决:启用边沿捕获单元进行T法测速。
- 配置QCAPCTL,设置一个合适的捕获单位(例如CCNT=1,即每个QCLK边沿捕获一次)。
- 在捕获中断中,读取QCTMRLAT寄存器值,该值代表了两个编码器边沿之间的系统时钟周期数。
- 计算速度:
速度 = (系统时钟频率 / QCTMRLAT) / (每转脉冲数) * 60。 - 注意,在极低速时,两次捕获间隔可能很长,中断频率低,需确保看门狗不会误触发。
6.4 索引信号不起作用
- 症状:配置了索引复位或锁存,但电机转过索引点时,QPOSCNT没有复位,QPOSILAT也没有更新。
- 排查:
- 信号确认:用示波器确认索引脉冲信号是否正常到达MCU引脚,其脉宽和边沿是否符合要求。
- 极性配置:检查QDECCTL[QIP]位,索引信号的极性是否设反。
- 事件配置:检查QEPCTL[IEL]寄存器。如果想在上升沿复位,需设置为00;想在上升沿锁存,需设置为01。两者功能不同,别混淆。
- 模式兼容性:在“位置计数器在索引事件复位”模式(PCRM=00)下,IEL配置是被忽略的,因为硬件强制在索引事件标记点复位。只有在其他模式下,IEL配置才用于控制锁存行为。
6.5 看门狗频繁超时
- 症状:QFLG[WTO]标志位经常置位,即使电机在正常转动。
- 原因:看门狗定时器(QWDTMR)在每次有效的编码器事件(QCLK)时会被重置。如果超过QWDPRD设定的时间没有编码器事件,就会超时。
- 解决:
- 检查电机是否真的停转或堵转。
- 调整看门狗周期:根据系统最低运行速度来设置QWDPRD。如果电机最低运行速度为
v_minRPM,编码器每转脉冲数为P,则最小脉冲间隔时间为T_min = 60 / (v_min * P)秒。看门狗周期应略大于此值。设置得过小会导致正常低速运行时误报警。 - 检查信号完整性:如果信号有断续,也会导致看门狗复位。