C2000 eQEP边沿捕获单元:实现伺服电机超低速高精度测速

📅 2026/7/21 4:17:54 👁️ 阅读次数 📝 编程学习
C2000 eQEP边沿捕获单元:实现伺服电机超低速高精度测速

1. 项目概述与核心价值

在伺服电机、机器人关节或者任何需要精确位置和速度反馈的运动控制系统中,正交编码器(Quadrature Encoder)是获取旋转或直线位移信息的“眼睛”。然而,当电机运行在极低转速时,传统的基于固定时间间隔采样位置差来计算速度的方法会面临一个尴尬的境地:两次采样间,电机可能只移动了极少的几个脉冲,甚至没有移动。这种“低分辨率”的速度信息会带来巨大的计算误差和系统抖动,严重影响低速平稳性和控制精度。

这时,硬件级的边沿捕获单元(Edge Capture Unit)就成了解决问题的关键。它不是去问“固定时间内你走了多远?”,而是去精确测量“你走完一个固定距离(比如,1024个编码器边沿)花了多少时间?”。这个思路的转变,使得在低速甚至超低速下,我们依然能获得高分辨率、高精度的瞬时速度信息。德州仪器(TI)在其C2000系列微控制器(如TMS320F2807x)中集成的增强型正交编码器脉冲(eQEP)模块,就内置了这样一个强大的边沿捕获单元。

我过去在开发高性能伺服驱动器时,就深受低速“爬行”阶段速度波动问题的困扰。直到深入理解了eQEP的边沿捕获机制并正确配置后,系统的低速平稳性才有了质的飞跃。这篇文章,我将结合手册原理和实际调试经验,为你彻底拆解eQEP边沿捕获单元,从核心公式到寄存器配置,再到代码实操和避坑指南,让你不仅能看懂手册,更能用得好这个功能。

2. 边沿捕获单元的核心原理与低速测量公式

要理解边沿捕获单元,我们必须回到最根本的速度定义上。在离散系统中,瞬时速度v(k)最基本的计算方法是位置差分除以时间差分:

v(k) = [x(k) - x(k-1)] / [t(k) - t(k-1)] = ΔX / ΔT

这里,x(k)x(k-1)是相邻时刻的位置计数值,t(k)t(k-1)是对应的时刻。在高速情况下,我们通常采用固定时间法(M法):设置一个固定的采样周期T(例如1ms),在每次定时器中断中读取位置计数器QPOSCNT的差值ΔX,然后除以T得到速度。这种方法在高速时很有效,因为ΔX较大,量化误差相对较小。

但在低速时,问题来了。如果电机转速很低,在固定的T内,ΔX可能只有1、2甚至0个计数。用这么小的ΔX除以T,计算结果对单个脉冲的误差极其敏感,速度值会呈现明显的阶梯状跳动,无法用于精细控制。

eQEP的边沿捕获单元采用了固定位移法(T法)的思想。它定义了一个“单位位置事件”(Unit Position Event)。这个事件不是指一个编码器脉冲(A相或B相的边沿),而是指编码器移动了X个“正交时钟周期”(Quadrature Clock Periods)。一个正交时钟周期对应着编码器A、B相信号各产生一个边沿(即4倍频后的一个计数周期)。X的大小由用户通过QCAPCTL[UPPS]位域来配置,可以是QCLK的 1, 2, 4, ..., 2048 分频。例如,对于一个1000线(每转4000个计数)的编码器,如果设置UPPS=4,那么一个“单位位置事件”就对应着X = 4 * 4 = 16个原始编码器计数(因为每个QCLK对应4个边沿?这里需要澄清:实际上,在正交解码模式下,一个QCLK对应一个位置计数器QPOSCNT的增减,它已经代表了A、B相的一个状态变化,通常对应1/4个物理线数周期。手册中的X = N x PP是正交周期,NUPPS选择的分频数。因此,X的单位是“位置计数”,而不是原始边沿数)。

核心测量流程如下:

  1. 使能捕获单元 (QCAPCTL[CEN]=1)。
  2. 内部有一个16位的捕获定时器QCTMR,由系统时钟SYSCLKOUT经过预分频 (CCPS) 后驱动,不断向上计数。
  3. 每当编码器移动了预设的X个位置计数(即发生“单位位置事件”),硬件会自动执行两个动作:
    • 将当前QCTMR的计数值锁存到捕获周期寄存器QCPRD中。
    • QCTMR复位清零,重新开始计数。
  4. 同时,状态寄存器QEPSTS[UPEVNT]中的单位位置事件标志位会被置位,告知软件有新的时间数据可用。
  5. 软件在读取QCPRDLAT(或QCPRD,取决于锁存模式)之前,应先检查UPEVNT标志。读取后,需要向UPEVNT位写1来清除该标志。
  6. 读取到的QCPRDLAT值就是ΔT,它代表了走过X个位置计数所花费的QCTMR时钟周期数。结合QCTMR的时钟频率 (CAPCLK = SYSCLKOUT / CCPS),就能计算出真实时间ΔT_real = ΔT * (1 / CAPCLK)
  7. 最终,瞬时速度v = X / ΔT_real。由于X是固定的、已知的整数,ΔT由硬件高精度测量,因此在低速下,只要ΔT足够大(即速度足够慢,走完X个计数的时间较长),我们就能获得很高分辨率的速度值。

关键理解X是你的“测量尺子”的长度,ΔT是走过这把尺子所花的时间。尺子长度固定,时间测得越准,速度就算得越准。在低速时,走过固定尺子的时间自然变长,ΔT的数值变大,其测量相对误差就变小了,这正是T法测速在低速下精度高的原因。

3. 关键寄存器详解与配置策略

理解了原理,我们就要通过配置寄存器来让硬件按照我们的意图工作。与边沿捕获单元相关的寄存器主要有以下几个,我会结合实际应用场景解释每个位的意义。

3.1 QCAPCTL(捕获控制寄存器)

这是捕获单元的总开关和核心配置寄存器。

  • CEN (Bit 15): 捕获单元使能位。必须置1,边沿捕获单元才开始工作。
  • CCPS (Bits 6-4): 捕获定时器时钟预分频器。这决定了QCTMR的计数时钟CAPCLK的频率。CAPCLK = SYSCLKOUT / (2^CCPS),其中CCPS取值0-7,对应分频系数1, 2, 4, ..., 128。
    • 配置考量CAPCLK的频率直接决定了ΔT的时间分辨率和量程。频率太高(分频系数小),QCTMR计数过快,在低速下容易溢出(超过65535)。频率太低,则时间分辨率下降。一个实用的计算方法是:预估系统最低速度v_min,计算走过X个计数所需的最大时间T_max = X / v_min。要保证T_max * CAPCLK < 65535,以避免溢出。同时,为了精度,希望CAPCLK尽量高。需要在溢出风险和精度之间权衡。
  • UPPS (Bits 3-0): 单位位置事件预分频器。这定义了什么是“单位位置事件”。UPEVNT = QCLK / (2^UPPS),其中UPPS取值0-11,对应分频系数1, 2, 4, ..., 2048。
    • 配置考量UPPS决定了X,即速度计算中的“固定位移”。X越大,一次测量涵盖的编码器计数越多,在相同速度下ΔT越大,抗单个计数抖动能力越强,但速度更新的频率会变低(因为需要更长时间才能累积够X个事件)。X越小,速度更新快,但低速下ΔT小,量化误差可能变大。通常需要根据编码器分辨率、最低速度要求和控制周期来综合选择。例如,对于高分辨率编码器,UPPS可以设大一些;对于要求快速速度更新的系统,UPPS要设小一些。

重要警告(来自手册CAUTION):UPPS预分频器不能动态修改(例如从QCLK/4切换到QCLK/8)。否则会导致未定义行为。如果需要更改,必须先禁用捕获单元 (CEN=0),修改UPPS,然后再重新使能。而CCPS可以在捕获单元禁用后动态修改。

3.2 QEPCTL(QEP控制寄存器)中的相关位

  • QCLM (Bit 2): QEP捕获锁存模式选择。这个位决定了QCTMRQCPRD的值何时被锁存到对应的锁存寄存器 (QCTMRLAT,QCPRDLAT) 供软件读取。
    • 0:在CPU读取位置计数器 (QPOSCNT) 时锁存。这种模式下,当你读取QPOSCNT时,硬件会顺便把当前的捕获定时器和周期值锁存。这给了软件更大的灵活性,可以在任何需要的时候触发锁存。但要注意,读取QPOSCNT本身可能发生在单位位置事件之外,锁存的值可能不是最新的ΔT
    • 1:在单位超时事件 (UTOUT) 时锁存。这是最常用、最自动化的模式。单位定时器 (QUTMR) 达到周期 (QUPRD) 时会产生UTOUT事件,此时硬件会自动锁存位置计数器 (QPOSLAT)、捕获定时器 (QCTMRLAT) 和捕获周期 (QCPRDLAT)。这非常适合与速度计算周期同步。
  • UTE (Bit 1): 单位定时器使能。如果使用QCLM=1模式,需要使能单位定时器来产生周期性的锁存事件。

3.3 QEPSTS(状态寄存器)中的关键标志位

  • UPEVNT (Bit 7): 单位位置事件标志。这是软件轮询的关键。当发生单位位置事件时,硬件置1。软件在读取QCPRDLAT前应检查此位,读取后通过写1清除
  • COEF (Bit 3): 捕获溢出错误标志。如果QCTMR在两个单位位置事件之间发生了溢出(计数值从65535回到0),此位置1,同时QCPRDLAT会被设置为0xFFFF。这表明ΔT的测量无效,因为真实时间超过了QCTMR的测量范围。解决方案是增大CCPS分频系数,降低CAPCLK频率,或者减小UPPS以缩短测量间隔
  • CDEF (Bit 2): 捕获方向错误标志。如果在两个单位位置事件之间,电机的旋转方向发生了改变,此位置1,同时QCPRDLAT被设置为0xFFFF。这表明该次测量区间内的运动不是单向的,计算出的速度意义不大。在伺服系统中,频繁的方向改变可能意味着系统在震荡或处于换向点,软件需要根据此标志进行异常处理。

3.4 相关数据寄存器

  • QCTMR (地址 1Dh): 16位捕获定时器。自由运行,由CAPCLK驱动。
  • QCPRD (地址 1Eh): 16位捕获周期寄存器。在单位位置事件发生时,硬件将QCTMR的值锁存于此,然后复位QCTMR
  • QCPRDLAT (地址 20h): 16位捕获周期锁存寄存器。根据QCLM的设置,在特定事件(读QPOSCNTUTOUT)发生时,将QCPRD的值锁存到这里。软件实际读取的是这个寄存器,以避免在读取过程中QCPRD被硬件更新的风险。
  • QCTMRLAT (地址 1Fh): 16位捕获定时器锁存寄存器。锁存原理同QCPRDLAT

4. 低速速度测量的完整软件实现流程

下面,我将以一个典型的伺服电机低速速度测量为例,展示从初始化到速度计算的完整代码流程和思路。假设系统SYSCLKOUT = 100MHz,编码器为2500线(每转10000个QPOSCNT计数),我们希望测量低至1 RPM的速度。

4.1 初始化配置步骤

  1. 配置GPIO引脚:将MCU的相应引脚配置为eQEP功能,连接编码器的A、B、I相信号。
  2. 配置eQEP解码器:设置QDECCTL寄存器,选择正交计数模式 (QSRC=0),根据编码器硬件连接决定是否交换A、B相 (SWAP),设置索引信号极性等。
  3. 配置位置计数器:初始化QPOSINIT(如果需要),设置QPOSMAX(用于循环计数或作为模数)。
  4. 配置单位定时器(如果使用QCLM=1模式)
    • 计算单位定时器周期QUPRD。这决定了速度计算的更新频率。例如,若希望每1ms计算一次速度,则QUPRD = 1ms * SYSCLKOUT = 100,000
    • 使能单位定时器:QEPCTL.UTE = 1
  5. 配置边沿捕获单元
    • 确定UPPS(单位事件预分频):首先确定“单位位置”X。为了在低速下有足够大的ΔT,我们设X大一些。例如,让一个单位事件对应1024个位置计数。对于10000计数/转的编码器,UPPS需要满足X = (编码器线数*4) / (2^UPPS)的整数关系?不,这里容易混淆。手册图16-16表明,X = N * P,其中P是一个正交周期对应的位置计数(通常为1),NUPPS对应的分频系数。因此,X直接等于UPPS的分频系数。如果我们希望X=1024,那么UPPS需要设置为10(因为2^10 = 1024)。但UPPS最大为11(2048)。我们选择UPPS = 10,即X = 1024个位置计数。
    • 确定CCPS(捕获时钟预分频):计算最低速度下的最大ΔT。1 RPM = 10000 计数/分钟 ≈ 166.67 计数/秒。走过X=1024个计数所需时间T_max = 1024 / 166.67 ≈ 6.144秒QCTMR为16位,最大计数值65535。为避免溢出,需要CAPCLK < 65535 / T_max ≈ 10666 HzSYSCLKOUT=100MHz,因此分频系数需大于100MHz / 10666Hz ≈ 93772^13 = 8192不够,2^14=16384可以。所以选择CCPS = 14(对应分频16384)。此时CAPCLK = 100MHz / 16384 ≈ 6103.5 HzT_max对应的QCTMR计数 =6.144s * 6103.5 Hz ≈ 37500,远小于65535,安全且留有余量。
    • 写入配置:QCAPCTL = 0x8000 | (14 << 4) | (10 << 0);// CEN=1, CCPS=14, UPPS=10
    • 设置锁存模式:QEPCTL.QCLM = 1;// 选择在单位超时事件锁存
  6. 使能eQEP模块QEPCTL.QPEN = 1;

4.2 速度计算中断服务例程(ISR)

如果配置了单位定时器中断 (QEPCTL.UTE=1并开启了QEINT.UTO中断),可以在单位定时器超时中断中计算速度。

// 假设在系统初始化中已配置好eQEP和中断 interrupt void eQEP1_ISR(void) // 单位超时中断 { Uint16 captured_period; float delta_t_seconds, speed_rps, speed_rpm; // 1. 检查并清除中断标志 if (EQep1Regs.QFLG.bit.UTO == 1) { EQep1Regs.QCLR.bit.UTO = 1; // 写1清除UTO中断标志 EQep1Regs.QCLR.bit.INT = 1; // 清除全局中断标志 // 2. 检查捕获单元状态(可选但推荐) // 如果使用QCLM=1,数据在UTOUT事件时已锁存,但检查错误标志是好的习惯 if (EQep1Regs.QEPSTS.bit.COEF == 1) { // 发生捕获溢出,本次速度数据无效 // 可以采取补救措施,如使用上一次的有效速度,或增大CCPS EQep1Regs.QEPSTS.bit.COEF = 1; // 写1清除错误标志 return; // 或进行错误处理 } if (EQep1Regs.QEPSTS.bit.CDEF == 1) { // 测量期间方向改变,数据无效 EQep1Regs.QEPSTS.bit.CDEF = 1; // 写1清除错误标志 // 可能需要特殊处理,例如在零速附近 return; } // 3. 读取锁存的捕获周期值 captured_period = EQep1Regs.QCPRDLAT; // 读取ΔT (QCTMR时钟周期数) // 4. 检查是否发生“零除”情况(captured_period为0) if (captured_period == 0) { // 这意味着在两个UTOUT事件之间,没有发生任何单位位置事件。 // 电机速度极低,低于当前配置能测量的下限。 // 可以将速度设置为0,或者标记为“超低速”。 speed_rpm = 0.0; } else { // 5. 计算真实时间差 ΔT_real (秒) // CAPCLK = SYSCLKOUT / (2^CCPS) = 100e6 / 16384 ≈ 6103.515625 Hz // 每个QCTMR计数的时间 = 1 / CAPCLK delta_t_seconds = (float)captured_period / 6103.515625f; // 6. 计算速度 // 已知单位位移 X = 1024 个位置计数 // 编码器分辨率:10000 计数/转 // 速度 (转/秒) = (X / 10000) / ΔT_real speed_rps = (1024.0f / 10000.0f) / delta_t_seconds; // 转换为转/分钟 (RPM) speed_rpm = speed_rps * 60.0f; } // 7. 将计算出的速度值用于你的控制算法(例如,速度环PID) // g_motor_speed_rpm = speed_rpm; // 8. (可选)读取锁存的位置值,用于其他用途 // Uint32 latched_position = EQep1Regs.QPOSLAT; } // 清除PIE中断组应答位 PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; }

4.3 轮询方式读取速度

如果不使用中断,也可以在主循环或低速任务中轮询UPEVNT标志来读取速度。但要注意,轮询的频率必须高于单位位置事件发生的频率,否则会丢失数据。

void PollSpeedFromeQEP(void) { Uint16 captured_period; float delta_t_seconds, speed_rpm; // 检查是否有新的单位位置事件发生 if (EQep1Regs.QEPSTS.bit.UPEVNT == 1) { // 清除标志(必须在读取数据前或后立即进行) EQep1Regs.QEPSTS.bit.UPEVNT = 1; // 检查错误标志 if (EQep1Regs.QEPSTS.bit.COEF || EQep1Regs.QEPSTS.bit.CDEF) { // 处理错误... if (EQep1Regs.QEPSTS.bit.COEF) EQep1Regs.QEPSTS.bit.COEF = 1; if (EQep1Regs.QEPSTS.bit.CDEF) EQep1Regs.QEPSTS.bit.CDEF = 1; return; } // 注意:在轮询模式下,如果QCLM=0,需要在读取QPOSCNT时数据才会锁存。 // 如果QCLM=1,则需要有UTOUT事件。轮询模式通常配合QCLM=0使用。 // 假设这里配置为QCLM=0 Uint32 dummy_read = EQep1Regs.QPOSCNT; // 触发锁存 captured_period = EQep1Regs.QCPRDLAT; // 读取ΔT if (captured_period != 0) { delta_t_seconds = (float)captured_period / 6103.515625f; speed_rpm = (1024.0f / 10000.0f) / delta_t_seconds * 60.0f; // 使用速度值... } } }

5. 实战经验、常见问题与深度优化

纸上得来终觉浅,绝知此事要躬行。下面分享几个我在实际项目中踩过的坑和总结的优化技巧。

5.1 参数配置的黄金法则

  1. 避免溢出是首要原则:配置CCPSUPPS时,第一要务是确保在最低预期速度下,QCTMR不会溢出。务必使用前面介绍的方法计算T_max和所需的CAPCLK上限。宁可将CAPCLK设低一点,也不要冒险溢出。
  2. 精度与更新率的权衡UPPS决定了X,也间接决定了速度更新率。速度更新频率 ≈(电机速度 * 编码器分辨率) / XX越大,单次测量的ΔT越大,低速精度越高,但速度更新越慢。对于动态响应要求高的系统,X不宜过大。一个经验是,让速度更新频率至少是控制系统带宽的10倍以上。
  3. CAPCLK频率的选择:在保证不溢出的前提下,尽量选择高的CAPCLK频率(即小的CCPS)。因为ΔT的测量分辨率是1 / CAPCLKCAPCLK越高,时间测量越精细,计算出的速度分辨率也越高。例如,CAPCLK=6.1kHz时,时间分辨率约164μs;CAPCLK=100MHz时,分辨率高达10ns。当然,后者对UPPS和最低速度的要求也极其苛刻。

5.2 典型问题排查清单

当你发现速度测量值跳变、为零或明显不准时,可以按以下顺序排查:

现象可能原因排查方法解决方案
速度值恒为0或极小1.UPEVNT标志从未置位。
2.QCPRDLAT读取值始终为0。
1. 检查编码器信号是否正常接入,QPOSCNT是否在变化。
2. 检查QCAPCTL.CEN是否已使能。
3. 检查UPPS设置是否过大,导致单位事件极难产生。
1. 用示波器检查QEPA、QEPB波形。
2. 确认寄存器配置已写入。
3. 适当减小UPPS,观察UPEVNT标志。
速度值异常大(溢出)QCPRDLAT读取值为0xFFFF检查QEPSTS.CDEFCOEF标志。1. 若COEF=1,说明CAPCLK太高或UPPS太大,导致QCTMR溢出。增大CCPS或减小UPPS
2. 若CDEF=1,说明测量期间电机改变了方向。这在零速附近或震荡时可能发生。可以考虑在方向改变时丢弃该次采样,或使用带符号的速度计算。
速度值周期性跳动或不准1. 计算参数有误。
2. 机械传动存在间隙或编码器安装问题。
3. 中断响应延迟导致数据读取不及时。
1. 核对SYSCLKOUTCCPSUPPS、编码器线数等所有计算参数。
2. 观察QPOSCNT在低速匀速时的变化是否平滑。
3. 检查中断优先级,确保eQEP中断能及时响应。
1. 使用已知转速(如用上位机给定)进行校准。
2. 优化机械结构,确保编码器同心度。
3. 提高eQEP中断优先级,或使用DMA传输数据。
中断无法进入单位定时器中断或捕获事件中断未触发。1. 检查QEPCTL.UTEQEINT.UTO是否使能。
2. 检查PIE和CPU中断是否全局使能并正确配置。
3. 检查QUPRD是否设置为一个合理的非零值。
1. 逐步检查所有中断使能位。
2. 可以先尝试轮询QFLG.UTO标志,确认硬件是否置位。

5.3 高级应用与优化技巧

  1. 高速/低速自动切换(M/T法混合):单纯的T法在高速时会有问题,因为ΔT会变得非常小,甚至小于一个CAPCLK周期,导致量化误差巨大。工业上常采用M/T法:在高速时,采用固定时间法(M法),使用单位定时器中断定期读取位置差;在低速时,切换到固定位移法(T法),使用边沿捕获单元。你可以通过判断QCPRDLAT的值(或ΔT与一个阈值的关系)来动态选择速度计算公式,实现全速域的高精度测量。
  2. 使用DMA减轻CPU负担:在高速或实时性要求极高的场合,频繁进入中断读取QCPRDLATQPOSLAT会增加CPU开销。C2000的eQEP模块支持将位置比较匹配等事件触发DMA传输。虽然边沿捕获的直接DMA支持可能有限,但你可以将单位定时器中断与DMA结合,在中断中仅设置标志,由DMA在后台搬运数据缓冲区中的数据。
  3. 滤波与平滑处理:硬件测量得到的ΔT仍然可能因机械振动、电气噪声产生抖动。在软件计算速度后,可以施加一个低通滤波器(如一阶滞后滤波)。但要注意,滤波会引入相位延迟,在闭环控制中需考虑其对稳定性的影响。
  4. QCLM模式的选择QCLM=1(单位超时锁存)是最省心、最同步的模式,特别适合与控制周期同步。QCLM=0(读位置锁存)则更灵活,允许你在任意时刻“快照”当前的速度信息,适用于非周期性的速度查询或调试。

6. 从理论到实践:一个完整的调试案例

最后,我想分享一个早期调试永磁同步电机(PMSM)FOC控制时,低速启动抖动的案例。当时电机在5RPM以下启动时,速度反馈波动很大,导致电流环输出振荡,电机发出“滋滋”声。

问题现象:速度波形在目标值上下大幅波动,频率约几十Hz。

排查过程

  1. 首先怀疑是观测器或速度计算算法问题。但检查了SMO和PLL,参数似乎合理。
  2. 直接打印eQEP原始数据:在单位定时器中断中,不仅打印计算出的RPM,还打印原始的captured_period(ΔT) 和锁存的QPOSLAT。发现captured_period在几个值之间剧烈跳变,例如在5000和15000之间来回跳,这显然是不正常的。
  3. 检查硬件连接和配置:编码器A、B相波形正常,QPOSCNT计数连续。检查QCAPCTL寄存器,确认CCPSUPPS配置正确。
  4. 关键发现:查看QEPSTS寄存器,发现COEFCDEF标志偶尔会被置位。这说明发生了溢出或方向改变。
  5. 根因分析:计算当时配置下的理论��T。电机目标速度3RPM,编码器分辨率10000计数/转,UPPS=8(X=256)。理论ΔT时间应为256 / (3 * 10000 / 60) = 0.512秒CAPCLK当时配置为100MHz/8192 ≈ 12.2kHz。理论QCTMR计数值应为0.512s * 12200Hz ≈ 6246,远小于65535,不应溢出。但方向改变标志CDEF置位,暗示了问题。
  6. 真相大白:由于机械安装存在微小偏心,加上极低速下电机转矩脉动的影响,电机转子在“蠕动”时存在微小的来回晃动(cogging效应)。这导致在长达0.5秒的测量窗口内,QPOSCNT并不是单调增加,而是有微小的往复,触发了方向改变错误CDEF,导致QCPRDLAT被置为0xFFFF。软件中未处理CDEF错误,直接将0xFFFF代入公式计算,得到了一个错误的小速度值(因为ΔT极大)。下一次测量可能又正常,从而造成了速度值的剧烈跳变。

解决方案

  1. 软件容错:在中断服务程序中,严格检查COEFCDEF标志。当它们置位时,不更新速度值,而是保持上一次的有效速度,或将其置零,并清除错误标志。
  2. 优化测量窗口:适当减小UPPS,将X从256降低到64。这样,测量窗口时间缩短到约0.128秒,降低了在单次测量内发生方向反转的概率。
  3. 机械优化:重新调整编码器安装的同心度,并优化电机电流环的启动参数,减小低速转矩脉动。

经过这些调整后,电机在1RPM下也能给出平稳的速度反馈,启动抖动问题得以解决。这个案例深刻地告诉我,再强大的硬件功能,也需要细致的软件保护和系统级的考量才能可靠工作。eQEP的边沿捕获单元是一个精密的测量工具,理解其原理、善用其状态标志、合理配置参数并处理好边界情况,是将其性能发挥到极致的关键。