1. 项目概述与核心价值
在伺服电机、机器人关节、数控机床这类对运动精度要求极高的场合,如何实时、准确地获取电机转子的位置和速度,是整个控制系统的基石。增量式编码器,作为一种经济、可靠且分辨率可观的传感器,成为了这个问题的标准答案。它输出的那两路相位差90度的正交脉冲信号(通常称为A相和B相),就像一套精密的“运动语言”,忠实地记录着每一次微小的转动。
然而,将这套“语言”翻译成控制器能直接理解和使用的数字信息——即精确的计数值和方向——并非易事。传统的方案是使用外部的专用解码芯片,或者依赖通用定时器的输入捕获功能配合软件算法来实现。前者增加了BOM成本和PCB面积,后者则大量消耗宝贵的CPU资源,在高动态响应或高分辨率编码器的场景下,软件解码的实时性和精度往往成为瓶颈。
这时,像德州仪器C2000系列这样的高性能实时微控制器的价值就凸显出来了。其内置的增强型正交编码器脉冲(eQEP)模块,是一个专为“翻译”编码器信号而生的硬件外设。它不仅仅是一个简单的计数器,更是一个集成了正交解码、位置管理、速度测量、事件捕获和同步输出于一体的完整子系统。把编码器信号直接接入eQEP模块,你就相当于为你的运动控制系统配备了一位不知疲倦、零延迟的“专职译码员”。它能在后台自动完成所有繁琐的脉冲计数、方向判断、索引对齐和速度计算工作,并将结果整齐地放在指定的寄存器里,等待CPU随时读取。这种硬件级的处理方式,将CPU从繁重的实时解码任务中彻底解放出来,使其能专注于更高级的控制算法(如PID调节、轨迹规划等),从而构建出响应更快、精度更高、更稳定的高性能运动控制系统。
2. eQEP模块核心架构与功能单元拆解
要玩转eQEP,不能只停留在调用API的层面,必须深入理解其内部各个功能单元是如何协同工作的。这就像驾驶一辆高性能跑车,了解它的引擎、变速箱和底盘特性,才能发挥其全部潜力。eQEP模块的架构可以清晰地划分为几个核心部分,它们共同构成了一个高效的位置速度信息处理流水线。
2.1 信号输入与预处理:GPIO配置与同步
一切始于引脚。eQEP模块的输入信号包括四路:QEPA(A相)、QEPB(B相)、QEPI(索引/Z脉冲)和QEPS(选通/Strobe)。在C2000上,这些功能复用在其GPIO引脚上。因此,第一步也是最关键的一步,就是正确配置GPIO复用寄存器(GPyMUX/GPyGMUX),将物理引脚连接到eQEP外设。
这里有一个至关重要的细节: eQEP的输入必须配置为同步输入模式 。C2000的GPIO模块支持同步和异步两种输入采样模式。异步模式采样更快,但容易因信号抖动或噪声产生毛刺,导致计数错误。对于编码器这种高速脉冲信号,必须使用同步模式,让信号经过系统时钟(SYSCLK)同步后再进入eQEP模块,确保信号的稳定性和时序的正确性。配置时,通常先设置GPyGMUX,再设置GPyMUX,以避免引脚状态切换瞬间的毛刺。
2.2 正交解码单元(QDU):从脉冲到计数与方向
QDU是eQEP的“翻译官”核心。它接收QEPA和QEPB两路原始信号,并输出给后续单元两个关键信息:计数时钟(QCLK)和方向(QDIR)。
其工作模式通过
QDECCTL[QSRC]
位选择,主要有四种:
- 正交计数模式(Quadrature-count) :这是最常用的模式,用于标准的增量式编码器。QDU内部有一个状态机(参考原文图16-6),通过检测A、B两相跳变沿的先后顺序来判断方向。例如,当A相上升沿领先于B相上升沿时,判定为正向旋转,QDIR输出高电平,并在每个A/B的跳变沿(上升和下降)都产生一个QCLK脉冲,使位置计数器递增。因此,对于一个每转N线的编码器,在此模式下可获得4N个计数/转的分辨率,即所谓的“4倍频”。
- 方向计数模式(Direction-count) :有些编码器或上位机直接输出“时钟”和“方向”两路信号。此时,QEPA引脚接时钟信号,QEPB引脚接方向信号(高电平正向,低电平反向)。QDU在此模式下 bypass 了正交解码逻辑,直接将QEPA作为QCLK,QEPB作为QDIR。
-
向上计数模式(Up-count)
与
向下计数模式(Down-count)
:这两种模式将方向信号硬编码为向上或向下,仅使用QEPA输入作为计数时钟。通过配置
QDECCTL[XCR]位,可以选择在QEPA的单个边沿(上升沿)或两个边沿计数,从而获得1倍或2倍的分辨率。这种模式通常用于频率测量或仅有关脉冲输出的场景。
一个重要的实践技巧
:编码器安装的相位或电机转向定义可能与控制系统期望的正方向相反。无需调换物理接线,只需在软件中设置
QDECCTL[SWAP]
位,即可交换QEPA和QEPB信号输入到QDU的顺序,从而软件反转计数方向。
2.3 位置计数器与控制单元(PCCU):位置信息的管理者
PCCU是eQEP的“内存与逻辑控制中心”。其核心是一个32位的位置计数器
QPOSCNT
,它根据QDU提供的QCLK和QDIR进行递增或递减计数。
2.3.1 位置计数器工作模式
QPOSCNT
的行为模式由
QEPCTL[PCRM]
位决定,这直接关系到位置信息的物理意义:
-
在索引事件复位(PCRM=00)
:每当检测到索引脉冲(QEPI)时,
QPOSCNT会在下一个QCLK沿被复位(正向复0,反向复为QPOSMAX值)。这适用于 每转绝对寻零 的应用,例如机械臂关节,每次上电或寻零后,位置计数器从0开始计数,代表相对于“零位”的位移。QPOSMAX在此模式下定义了单圈的最大计数值(例如,对于1000线4倍频的编码器,设为3999)。 -
在最大位置复位(PCRM=01)
:
QPOSCNT在达到QPOSMAX时溢出归0,在达到0时下溢归QPOSMAX。此模式下索引脉冲仅用于锁存(见下文),不触发复位。这适用于 多圈绝对位置 或 线性位移 测量,计数器可以连续累加,不受单圈限制。你需要用软件来处理溢出/下溢,以扩展位置范围。 -
在首次索引事件复位(PCRM=10)
:仅在第一次检测到索引脉冲时复位
QPOSCNT,之后行为同PCRM=01模式。这结合了前两种模式的优点:上电后先通过索引脉冲找到一个绝对零点,之后进行多圈计数,非常适合需要建立绝对参考点又需记录多圈位移的场景。 - 在单位时间超时复位(PCRM=11) :此模式用于速度测量,后文详述。
2.3.2 位置锁存与初始化
除了连续计数,PCCU还提供了强大的事件捕获功能:
-
索引/选通事件锁存
:可以在索引脉冲(QEPI)的上升沿、下降沿或“索引事件标记”(即紧随索引脉冲后的第一个正交边沿)发生时,将当前的
QPOSCNT值瞬间捕获到QPOSILAT寄存器。选通信号(QEPS)同样可以触发锁存至QPOSSLAT。这有什么用? 用于高精度位置同步或误差校验 。例如,你可以将一个光电开关信号接到QEPS,当物体经过时锁存位置,实现飞拍定位。或者,在索引复位模式下,检查每次锁存的QPOSILAT值是否接近0或QPOSMAX,可以诊断编码器计数是否丢失或存在干扰。 -
位置计数器初始化
:可以通过索引脉冲边沿、选通脉冲边沿或软件命令(写
QEPCTL[SWI]位),将QPOSCNT设置为QPOSINIT寄存器中的值。这为系统提供了灵活的归零或预设位置的手段。
2.4 边沿捕获单元(QCAP)与单位时间基准(UTIME):低速精确测速的法宝
速度测量是运动控制的核心需求。eQEP提供了两种互补的测速方法,分别针对高速和低速场景,这是其“增强型”特性的重要体现。
2.4.1 单位时间基准(UTIME)法(高速测速)
这种方法对应速度估算公式
v = ΔX / T
。你需要设置一个固定的单位定时器(由
QUTMR
和
QUPRD
控制),例如每1ms产生一次中断。在中断服务程序中,读取
QPOSCNT
的当前值
x(k)
,减去上一次的值
x(k-1)
,得到ΔX(单位时间内的位移脉冲数)。已知单位时间T(1ms),即可算出速度。
优点
:在高速时,ΔX较大,测量相对误差小,计算简单直接。
缺点
:在极低速时,ΔX可能为0或1,速度计算分辨率极低,量化误差巨大。例如,对于2000 CPR的编码器,在1ms采样周期下,速度分辨率约为
(1 count / 2000 counts/rev) / 0.001s * 60 ≈ 30 RPM
。这意味着低于30RPM的速度可能无法准确测量。
2.4.2 边沿捕获单元(QCAP)法(低速测速)
这种方法对应速度估算公式
v = X / ΔT
。它不关心固定时间内的计数,而是关心固定位移(例如1个脉冲)所花费的时间。eQEP的QCAP单元正是为此而生。你可以配置它捕获特定事件(如QCLK的上升沿)之间的时间间隔。它内部有一个专用的捕获定时器
QCTMR
,以系统时钟(SYSCLK)运行。当捕获事件发生时,
QCTMR
的当前值会被锁存到
QCTMRLAT
,同时
QCTMR
复位重新计数。你还可以设置一个捕获周期寄存器
QCPRD
,当
QCTMR
计满
QCPRD
时也会产生捕获事件,并将周期值锁存到
QCPRDLAT
。
工作流程
:假设我们想测量每1个QCLK脉冲(即编码器最小机械角位移)的时间。配置QCAP在QCLK上升沿捕获。第一个上升沿到来,
QCTMR
值被锁存(假设为T1),
QCTMR
清零重启。第二个上升沿到来,
QCTMR
值再次被锁存(T2)。那么,产生这两个脉冲之间的时间差就是
ΔT = T2 * Tsysclk
。已知位移
X = 1 count
,速度
v = X / ΔT
。
优点 :在低速时,ΔT较大,用高精度的系统时钟去测量它,可以获得极高的速度分辨率,非常适合伺服系统启动、低速爬行等工况。 缺点 :在高速时,ΔT非常小,受限于系统时钟频率和测量精度,误差会变大。同时,CPU需要频繁响应捕获中断。
实践中的策略 :因此,一个鲁棒的速度观测器通常会采用 混合策略 :在高速区间使用UTIME法,在低速区间切换到QCAP法。切换的阈值需要根据编码器分辨率、系统时钟和速度范围精心计算和调试。
2.5 看门狗定时器(QWDOG)与位置比较单元
-
看门狗定时器(QWDOG)
:这是一个简单的定时器,用于监测电机是否堵转或丢失反馈。如果超过
QWDPRD设定的时间没有收到任何QCLK脉冲,就会触发看门狗超时中断。这在安全保护中非常有用。 -
位置比较单元
:这是eQEP模块的一个输出功能。你可以设置一个目标位置值到
QPOSCMP寄存器。当QPOSCNT计数到与该值匹配时,模块会产生一个内部事件(PCEVENT),并可以配置在一个引脚(通常是QEPI或QEPS)上输出一个同步脉冲(PCSOUT)。这个脉冲的宽度可以通过QPOSCTL[PCSPW]配置。 这个功能极其强大 ,它可以用于在精确的机械位置触发外部事件,例如在数控机床上触发刀具动作,在包装机上触发喷码,无需CPU干预,实现了硬件级的精准同步。
3. eQEP模块的配置与编程实战指南
理解了原理,我们进入实战环节。配置eQEP不是简单地填寄存器,而是一个有逻辑顺序的过程。下面我将以一个典型的伺服电机控制场景为例,展示如何从零开始配置eQEP模块,并分享关键代码片段和避坑指南。
3.1 硬件连接与GPIO初始化
假设我们使用TI的TMS320F28379D芯片,将1000线增量式编码器(A, B, Z信号)接入。
- 引脚规划 :查阅数据手册,决定使用EQEP1模块,其引脚为:GPIO20 (EQEP1A), GPIO21 (EQEP1B), GPIO22 (EQEP1I), GPIO23 (EQEP1S)。
-
GPIO配置
:
// 首先,将引脚功能选择为eQEP,注意配置顺序避免毛刺 EALLOW; // 允许写入受保护的寄存器 // 1. 配置GPIO20, 21, 22, 23为异步模式(仅对eQEP输入,必须同步,但这里配置MUX) // 假设这些引脚默认是GPIO输入,我们先配置为eQEP功能 GpioCtrlRegs.GPAGMUX2.bit.GPIO20 = 1; // 将GPIO20配置到A组MUX2的bit0-1,具体值查手册,假设为1对应EQEP1A GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1; // 具体值查手册 // ... 类似配置GPIO21, 22, 23为EQEP1B, I, S // 2. (关键!)配置输入限定。eQEP输入必须为同步输入。 GpioCtrlRegs.GPAQSEL2.bit.GPIO20 = 0; // 0表示与SYSCLKOUT同步,无采样窗口。也可根据需要配置带滤波的模式。 // ... 类似配置GPIO21, 22, 23 EDIS; // 禁止写入受保护的寄存器注意 :GPIO配置的具体位域值 必须 根据你所使用的具体C2000型号的《Technical Reference Manual》来查找,以上代码仅为示例逻辑。错误配置是导致eQEP无法工作的最常见原因之一。
3.2 eQEP模块初始化流程
初始化应遵循“先功能,后中断”的顺序。
步骤一:配置正交解码单元(QDU)
EQep1Regs.QDECCTL.all = 0; // 先清零
// QSRC=00: 正交计数模式
// XCR=0: 在正交模式下,此位用于方向/上下计数模式,在正交模式下忽略,但通常设0。
// SWAP=0: 不交换A、B相输入(根据实际电机转向调整)
// IGATE=0: 索引门控功能禁用(根据编码器索引类型选择)
// 配置输入极性,假设信号正常,不反转
EQep1Regs.QDECCTL.bit.QAP = 0; // QEPA不反相
EQep1Regs.QDECCTL.bit.QBP = 0; // QEPB不反相
EQep1Regs.QDECCTL.bit.QIP = 0; // QEPI不反相
EQep1Regs.QDECCTL.bit.QSP = 0; // QEPS不反相
// 位置比较同步输出禁用,初始不启用
EQep1Regs.QDECCTL.bit.SOEN = 0;
步骤二:配置位置计数器与控制单元(PCCU)
// 1. 设置位置计数器模式
EQep1Regs.QEPCTL.all = 0;
// PCRM=00: 索引事件复位模式(每圈清零)
EQep1Regs.QEPCTL.bit.PCRM = 0;
// 2. 设置最大位置值。对于1000线编码器,4倍频后每转4000个脉冲。
// 计数器从0计数到QPOSMAX,所以QPOSMAX = 4000 - 1 = 3999。
EQep1Regs.QPOSMAX = 3999;
// 3. 配置索引事件锁存。我们希望每次索引信号(Z脉冲)上升沿时锁存位置,用于校验。
EQep1Regs.QEPCTL.bit.IEL = 1; // 01b: 在索引上升沿锁存
// 4. 配置索引事件初始化。我们希望上电后,第一个Z脉冲到来时将位置计数器初始化为0。
EQep1Regs.QEPCTL.bit.IEI = 2; // 10b: 在索引上升沿初始化QPOSCNT为QPOSINIT
EQep1Regs.QPOSINIT = 0; // 初始化值为0
// 5. 使能位置计数器
EQep1Regs.QEPCTL.bit.QPEN = 1;
步骤三:配置单位时间基准(UTIME)用于高速测速
// 假设系统时钟SYSCLKOUT = 200MHz,我们想要100us的速度计算周期。
// Unit Timer 时钟预分频器,在QEPCTL中设置。假设设为 /128 (具体值查手册)。
EQep1Regs.QEPCTL.bit.UTE = 1; // 使能Unit Timer
EQep1Regs.QEPCTL.bit.UTPS = ...; // 设置预分频值,例如对应/128
// 计算Unit Period值:100us / (1/(200MHz/128)) = 100e-6 / (128/200e6) = 156.25
// 由于QUPRD是整数,取整为156。实际周期约为 156 * (128/200e6) = 99.84us
EQep1Regs.QUPRD = 156;
// 使能Unit Timeout中断,用于定期读取位置计算速度
EQep1Regs.QEINT.bit.UTO = 1; // 使能Unit Timeout中断
步骤四:配置边沿捕获单元(QCAP)用于低速测速
EQep1Regs.QCAPCTL.all = 0;
// 使能捕获单元
EQep1Regs.QCAPCTL.bit.CEN = 1;
// 设置捕获定时器分频。假设系统时钟200MHz,分频后给QCTMR的时钟不宜过快。
// 例如,分频 /16,则QCTMR时钟 = 200MHz / 16 = 12.5MHz,周期80ns。
EQep1Regs.QCAPCTL.bit.CCPS = ...; // 设置分频因子
// 设置捕获事件源:这里选择QCLK的上升沿。也可以选择单位超时事件。
EQep1Regs.QCAPCTL.bit.CCPS = 0; // 假设0对应QCLK上升沿(需查手册确认)
// 设置捕获周期。例如,我们希望每32个QCLK脉冲捕获一次时间,用于计算速度。
// 这相当于测量32个最小位置脉冲的时间。对于低速,可以设为1;对于中速,可以设大一些以减少中断频率。
EQep1Regs.QCPRD = 32; // 每32个QCLK边沿产生一次捕获事件
// 使能捕获事件中断
EQep1Regs.QEINT.bit.QDC = 1; // 使能捕获事件中断(具体位名需查手册,可能是QDC或CAP)
步骤五:配置看门狗(可选)
// 设置看门狗周期,例如设定为10ms内无脉冲则报警
// QWDTMR时钟源和分频需查手册。假设时钟为SYSCLKOUT/64。
// 10ms对应的计数值 = 0.01 / (1/(200e6/64)) = 31250
EQep1Regs.QWDPRD = 31250;
EQep1Regs.QEPCTL.bit.WDE = 1; // 使能看门狗
// EQep1Regs.QEINT.bit.WDOG = 1; // 使能看门狗中断(如果需要)
步骤六:配置中断并启用模块
// 清除所有中断标志
EQep1Regs.QCLR.all = 0xFFFF;
// 将eQEP中断线连接到PIE(外设中断扩展)模块
// 假设EQEP1_INT使用PIE组1,中断8。这需要根据具体芯片和连接调整。
PieCtrlRegs.PIEIER1.bit.INTx = 1; // 使能PIE组1中的相应中断
// 在PIE向量表中注册中断服务函数
EALLOW;
PieVectTable.EQEP1_INT = &eqep1_isr; // eqep1_isr是你的中断服务函数名
EDIS;
// 最后,全局使能eQEP模块(如果存在全局使能位,需查手册)并开启CPU INTM
// 通常QEPCTL.QPEN已使能核心功能。确保相关时钟已使能。
3.3 中断服务程序(ISR)设计与速度计算
中断服务程序是获取数据的关键。它必须高效,只做最必要的操作。
interrupt void eqep1_isr(void) {
Uint32 status = EQep1Regs.QFLG.all; // 读取中断标志
// 处理单位时间超时中断(高速测速)
if (status & 0x0080) { // UTO位掩码,需根据寄存器定义确认
EQep1Regs.QCLR.bit.UTO = 1; // 清除中断标志
// 计算速度 v = delta_pos / delta_t
static int32_t last_pos = 0;
int32_t curr_pos = EQep1Regs.QPOSCNT; // 注意:32位读取可能需要分两次
int32_t delta_pos = curr_pos - last_pos;
// 处理计数器溢出/下溢。在索引复位模式下,delta_pos正常计算即可。
// 在连续计数模式下,需要处理从QPOSMAX到0或0到QPOSMAX的跳变。
// 例如:if(delta_pos > POS_MAX/2) delta_pos -= (POS_MAX+1);
// else if(delta_pos < -POS_MAX/2) delta_pos += (POS_MAX+1);
float speed_rps = (float)delta_pos / (ENCODER_COUNTS_PER_REV) / (UNIT_TIMER_PERIOD_S);
// UNIT_TIMER_PERIOD_S是单位定时器周期,例如100e-6秒
last_pos = curr_pos;
// 将speed_rps用于你的速度环PID控制器
}
// 处理捕获事件中断(低速测速)
if (status & 0x0004) { // 假设0x0004对应捕获事件标志,需查手册确认
EQep1Regs.QCLR.bit.?? = 1; // 清除对应的捕获中断标志
// 读取捕获的时间差
Uint32 cap_period = EQep1Regs.QCPRDLAT; // 捕获的周期值(单位:QCTMR时钟周期)
// 计算速度 v = (固定位移对应的脉冲数) / (时间差)
// 固定位移 = QCPRD 个QCLK脉冲。QCLK脉冲数/转 = 4 * 编码器线数。
// 时间 = cap_period * (QCTMR时钟周期)
float time_elapsed = (float)cap_period * (1.0 / (SYSCLK_FREQ / CAP_TIMER_DIV));
float speed_rps = (float)QCPRD_VALUE / (ENCODER_COUNTS_PER_REV) / time_elapsed;
// 将speed_rps用于低速下的速度环控制
}
// 处理索引事件中断(用于位置校验或同步)
if (status & 0x0001) { // IEL标志位
EQep1Regs.QCLR.bit.IEL = 1;
Uint32 latched_pos = EQep1Regs.QPOSILAT;
// 在索引复位模式下,latched_pos理论上应为0(正向)或QPOSMAX(反向)。
// 可以检查其值是否在预期的小范围内,以诊断计数错误。
if(abs(latched_pos) > POS_ERROR_THRESHOLD) {
// 触发错误处理,可能发生了丢脉冲或干扰
}
}
// 处理看门狗超时中断
if (status & 0x0400) { // WDOG标志位
EQep1Regs.QCLR.bit.WDOG = 1;
// 电机可能堵转或编码器信号丢失!执行安全操作,如关闭PWM输出。
EPwm1Regs.TBCTL.bit.CTRMODE = 0; // 停止PWM
}
// 必须应答PIE中断
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 根据实际中断组设置
}
4. 高级应用、调试技巧与常见问题排查
掌握了基础配置和编程,我们来看看如何利用eQEP的高级特性,以及在实际项目中会遇到哪些“坑”。
4.1 位置比较同步输出的精妙应用
位置比较功能是实现硬件级同步的利器。假设我们需要在电机转到特定角度时,精确触发一个外部事件(如打开激光器、发出喷墨信号)。
-
配置步骤 :
- 确定目标位置(例如,从索引零点起第12345个计数)。
-
将目标值写入位置比较影子寄存器
QPOSCMP(如果使能了影子模式)。 -
配置
QPOSCTL寄存器:选择加载模式(例如,在计数器为0时加载影子寄存器到工作寄存器QPOSCMP)、设置输出脉冲极性(PCPOL)和脉冲宽度(PCSPW)。 -
使能位置比较同步输出,并选择输出引脚(通过
QDECCTL[SOEN]和[SPSEL]位,通常输出到QEPI或QEPS引脚,需要额外配置该引脚为输出模式)。 -
使能位置比较匹配中断(
QEINT.PCM)。
-
工作流程 :电机转动,
QPOSCNT递增。当QPOSCNT与QPOSCMP匹配的瞬间,硬件自动在指定引脚上产生一个宽度可调的脉冲(PCSOUT),同时置位中断标志。这个脉冲的抖动是纳秒级的,远非软件中断可比。 -
应用场景 :
- 飞拍定位 :在高速传送带上,当产品到达拍照位置时触发相机。
- 多轴同步 :主轴eQEP产生同步脉冲,触发从轴开始运动,实现电子齿轮或电子凸轮。
- 精准触发 :在印刷机中,在滚筒的绝对位置触发喷墨。
4.2 混合速度测量策略的实现
如前所述,单一测速方法无法覆盖全速度范围。我们需要实现一个平滑切换的混合策略。
策略核心 :在高速区(例如,速度 > V_high)使用UTIME法;在低速区(速度 < V_low)使用QCAP法;在中间区域(V_low < 速度 < V_high)可以加权融合或保持当前方法。
实现要点 :
-
速度估算
:在UTIME中断中计算速度
v_ut,在QCAP中断中计算速度v_cap。 -
可靠性判断
:QCAP法在速度极低时,
ΔT可能超过定时器量程,导致溢出;在速度过高时,ΔT太小,测量误差大。因此,需要检查QCPRDLAT值是否在合理范围内(例如,介于MIN_CAP_TICKS和MAX_CAP_TICKS之间)。 -
平滑切换
:避免在切换点附近速度抖动。可以设置一个滞回区间。当
v_ut持续低于V_low + hysteresis一段时间后,才切换到QCAP法;当v_cap计算出的速度持续高于V_high - hysteresis,且v_cap本身可靠时,才切换回UTIME法。 - 软件滤波 :无论是UTIME还是QCAP得到的速度值,通常都需要经过低通滤波(如一阶滞后滤波)后才能用于控制环,以抑制噪声。
4.3 常见问题排查实录(踩坑记录)
-
问题:eQEP完全无计数,
QPOSCNT始终为0。- 检查1:GPIO配置 。这是头号杀手。确认GPIO已正确复用为eQEP功能,并且 输入限定(GPxQSEL)配置为同步模式(通常为0) ,而不是异步模式。用示波器或逻辑分析仪检查引脚上是否有编码器信号。
- 检查2:编码器电源与信号电平 。确认编码器供电正常(通常是5V或24V),其输出信号(A, B, Z)的电平(通常是推挽或集电极开路)与DSP的GPIO电压(通常是3.3V)兼容。可能需要上拉电阻或电平转换电路。
-
检查3:
QEPCTL.QPEN位 。确认位置计数器使能位已置1。 - 检查4:信号质量 。长线传输可能导致信号边沿畸变。尝试在靠近DSP输入端加入RC低通滤波(如100欧姆串联电阻+100pF对地电容),但注意不要过度滤波影响高速计数。
-
问题:计数方向反了,电机正转时
QPOSCNT递减。-
解决
:不要调换A、B相接线!只需在软件中设置
QDECCTL.SWAP = 1,交换两路信号输入即可。保持硬件接线的一致性有利于标准化。
-
解决
:不要调换A、B相接线!只需在软件中设置
-
问题:索引脉冲(Z信号)无法触发复位或锁存。
-
检查1:索引脉冲类型
。编码器的Z脉冲可能是“门控”的(与A/B信号边沿对齐)或“非门控”的。eQEP的索引逻辑默认期望一个干净的脉冲。如果信号不规整,尝试调整
QDECCTL.IGATE位或检查输入极性QDECCTL.QIP。 - 检查2:索引脉冲宽度 。确保Z脉冲宽度足够被eQEP模块检测到(通常需要几个SYSCLK周期)。如果脉冲太窄,可能需要硬件上对Z信号进行展宽。
-
检查3:配置模式
。确认
QEPCTL.PCRM和QEPCTL.IEL的配置符合你的预期。例如,想用Z脉冲复位,需设置PCRM=00;想用Z脉冲锁存位置,需设置IEL为非0值且PCRM不为00。
-
检查1:索引脉冲类型
。编码器的Z脉冲可能是“门控”的(与A/B信号边沿对齐)或“非门控”的。eQEP的索引逻辑默认期望一个干净的脉冲。如果信号不规整,尝试调整
-
问题:低速时速度测量波动大,高速时速度值不准。
-
低速波动
:这是QCAP法固有的量化误差在极低速下的表现。当速度低到每个QCLK脉冲的时间间隔接近甚至超过你的捕获定时器溢出周期时,测量会极不稳定。
对策
:a) 降低QCTMR的时钟频率(增大分频),扩展测量范围。b) 增加
QCPRD值,测量多个脉冲的平均时间。c) 在极低速段,可以考虑采用开环启动或直接使用UTIME法的结果(即使分辨率低)。 -
高速不准
:UTIME法在高速时,ΔX大,本身精度尚可。但不准可能源于:a)
单位定时器周期设置不当
。周期太长,动态响应差;周期太短,CPU中断负担重。需要折中。b)
软件计算延迟
。在UTIME中断中,从读取
QPOSCNT到完成速度计算并应用,存在延迟。对于高速环,这个延迟可能不可忽略。 对策 :使用更高优先级的中断,简化ISR,或者考虑在PWM周期中断(与功率级同步)中读取eQEP位置值进行计算。 - 通用策略 :务必对计算出的速度进行软件滤波。一阶低通滤波器是必须的。滤波时间常数需要根据速度环带宽和噪声水平调整。
-
低速波动
:这是QCAP法固有的量化误差在极低速下的表现。当速度低到每个QCLK脉冲的时间间隔接近甚至超过你的捕获定时器溢出周期时,测量会极不稳定。
对策
:a) 降低QCTMR的时钟频率(增大分频),扩展测量范围。b) 增加
-
问题:使用位置比较同步输出时,脉冲有时丢失或不精确。
-
检查1:影子模式与加载时机
。如果你使能了位置比较影子寄存器(
PSSHDW=1),那么写入QPOSCMP的值不会立即生效。必须等到你设置的加载事件(如计数器归零)发生时,影子寄存器的值才会加载到工作寄存器。在加载发生前,比较的是旧值。 确保你的软件在正确的时机更新影子寄存器 。 -
检查2:脉冲宽度
。
PCSPW设置的脉冲宽度是以SYSCLK为单位的。如果设置过小,脉冲可能窄到无法被外部设备检测到。如果设置过大,在高速时可能导致连续两个比较事件产生的脉冲连在一起。需要根据外部设备的识别要求和电机最高速度来计算。 - 检查3:输出引脚配置 。别忘了将用作同步输出的QEPI或QEPS引脚,通过GPIO MUX配置为 输出功能 ,而不仅仅是eQEP输入。
-
检查1:影子模式与加载时机
。如果你使能了位置比较影子寄存器(
调试eQEP,
示波器或逻辑分析仪是你的最佳伙伴
。同时观察编码器的A/B/Z原始信号、GPIO引脚上的信号以及关键寄存器(如
QPOSCNT
)的变化,是定位问题最直接的方法。TI的Code Composer Studio (CCS)中的实时寄存器查看和图形化显示功能,也能极大提升调试效率。
323



被折叠的 条评论
为什么被折叠?



