TM4C123 QEI模块详解:正交编码器硬件接口配置与调试指南

1. 项目概述与QEI模块核心价值

在机器人关节伺服、高精度数控平台或者自动化流水线的闭环控制系统中,实时、准确地获取电机转轴的位置和速度信息是确保系统稳定与精度的基石。我们通常依赖正交编码器这类传感器来提供这些信息,它输出两路相位差90度的方波信号(Phase A和Phase B)。然而,直接处理这两路高频脉冲并从中解算出方向、累计位置和瞬时速度,对主控MCU的软件来说是个不小的负担,尤其在高速或高精度场合,软件解码极易成为性能瓶颈并引入误差。

这时,像TI Tiva™ C系列(基于ARM Cortex-M4F内核)这类微控制器内置的Quadrature Encoder Interface (QEI) 模块就显现出其硬件级的优势。它本质上是一个专用的协处理器,替你完成了所有繁琐的脉冲计数、方向判断、位置累加乃至速度计算的工作。你只需要配置好几个寄存器,它就能在后台默默且精准地完成所有任务,并通过中断或DMA等方式通知CPU,极大地解放了CPU资源,也保证了反馈的实时性。

今天,我们就以TM4C123BH6ZRB这颗芯片为例,深入它的QEI模块内部,把那些看似枯燥的寄存器位域一个个掰开揉碎,讲清楚它们到底在干什么,以及如何通过引脚复用(Pin Mux)将这些功能映射到实际的物理引脚上。无论你是正在调试第一个伺服电机的新手,还是需要优化现有运动控制算法的老手,理解这些底层硬件的运作机制,都能让你在解决问题时更加得心应手。

2. QEI模块寄存器详解:从状态监控到速度计算

TM4C123BH6ZRB的QEI模块拥有一组功能清晰的寄存器,它们共同构成了模块的“控制中枢”和“数据窗口”。理解每个寄存器的职责,是进行正确配置和高效编程的前提。

2.1 核心状态与数据寄存器

这部分寄存器主要负责反馈信息的实时捕获与呈现,是软件读取位置、速度、方向等核心数据的直接接口。

2.1.1 QEI状态寄存器 (QEISTAT) - 地址偏移 0x004

这个只读寄存器是模块的“健康仪表盘”和“方向指示灯”,让你一眼看清编码器当前的工作状态。

  • 位0 - ERROR (相位错误标志): 这是编码器信号质量的“哨兵”。当模块配置为**正交相位模式(SIGMODE=0)**时,它会严密监控Phase A和Phase B两路输入信号。在理想的正交编码中,两路信号的变化应该总是错开的。如果硬件检测到两路信号在同一时刻发生跳变(即违反了格雷码序列),这位就会被硬件自动置1。这通常意味着编码器信号受到严重噪声干扰、线路接触不良或编码器本身故障。注意:在信号模式(SIGMODE=1,即计数/方向模式)下,此位无意义,应被屏蔽。
  • 位1 - DIRECTION (旋转方向指示): 这是一个非常直观的状态位。0表示编码器正在**正向(Forward)旋转,1则表示反向(Reverse)**旋转。方向判定的依据是Phase A和Phase B信号的相位关系(A领先B为正,B领先A为反)。这个位是实时更新的,你可以随时读取它来了解电机的瞬时转向。
  • 位31:2 - 保留位: 这些位是TI为未来产品预留的。一个非常重要的编程习惯:在对包含保留位的寄存器进行“读-修改-写”操作时(例如先读取QEICTL,修改某几位后再写回),必须确保保留位的值原封不动地写回去。这保证了代码在未来芯片型号上的兼容性。

实操心得:在系统初始化后或发生异常时,首先读取QEISTAT寄存器检查ERROR位是一个好习惯。如果发现错误,除了在软件中记录,还应检查硬件连接,如编码器供电、信号线屏蔽、是否使用了合适的差分线缆或添加了滤波电路。

2.1.2 QEI位置寄存器 (QEIPOS) - 地址偏移 0x008

这是整个QEI模块最核心的寄存器之一,一个32位可读可写(RW)的计数器,它忠实地记录着编码器的累积位置

  • 位31:0 - POSITION (位置积分器值): 这个32位有符号整数,记录了自上次复位或设定以来,编码器脉冲的净数量。其计数行为取决于QEICTL寄存器中的配置:
    • 捕获模式:每个完整的正交周期(即A、B各变化一次)计数值变化1。
    • 计数模式:对Phase A信号的每个边沿进行计数,分辨率提高一倍。
    • 计数方向由硬件根据Phase A/B相位自动判断,正向加,反向减。
    • 该寄存器具有回绕功能。当正向计数超过QEIMAXPOS寄存器设定的最大值时,它会自动归零;当反向计数从0向下溢出时,它会自动加载为QEIMAXPOS的值。这非常适用于旋转角度在0~360度之间循环的应用。
    • 关键特性:你可以直接向这个寄存器写入任意值来预设位置。这在系统上电寻找机械原点(Homming)后,将当前位置设为零点或某个已知参考点时极其有用。
2.1.3 QEI最大位置寄存器 (QEIMAXPOS) - 地址偏移 0x00C

这个寄存器定义了位置计数器(QEIPOS)的“计数天花板”,用于实现位置回绕,模拟一个旋转编码器的周期行为。

  • 位31:0 - MAXPOS (最大位置值): 设置位置积分器的最大值。当QEIPOS在正向旋转时递增超过此值,或反向旋转时从0递减,都会触发回绕。例如,对于一个每转产生1000个正交周期的编码器,如果你希望位置值在0~999之间循环,就应该将QEIMAXPOS设置为999。复位后默认值为0,如果不设置此寄存器,位置计数器将作为一个普通的32位向上/向下计数器工作,直到溢出。
2.1.4 速度测量相关寄存器组

速度测量是QEI模块的另一大亮点,它通过一个独立的硬件定时器和计数器来实现,不占用CPU时间。

  1. QEI定时器加载寄存器 (QEILOAD) - 地址偏移 0x010: 这个寄存器设定速度测量的“采样窗口”长度。它装载的是定时器的重载值。这里有个关键细节:定时器在减计数到0后,会在下一个时钟周期加载QEILOAD的值。因此,如果你希望定时器周期包含N个系统时钟,那么QEILOAD应该设置为N-1。例如,系统时钟为80MHz,你想每1ms计算一次速度,那么定时器周期需要80000个时钟滴答,QEILOAD应设置为79999。
  2. QEI定时器寄存器 (QEITIME) - 地址偏移 0x014: 只读寄存器,显示当前速度定时器的实时计数值。只有当QEICTL寄存器中的VELEN(速度使能)位被置1时,这个定时器才会开始运行。
  3. QEI速度计数器寄存器 (QEICOUNT) - 地址偏移 0x018: 这是一个“流水线”计数器。在当前的定时器周期内,它对编码器脉冲进行累加。注意:由于读取QEITIME和QEICOUNT存在微小的时间差,且它们都在实时变化,所以直接读取QEICOUNT并不能精确对应某个特定时刻的速度。官方文档明确指出,此寄存器仅用于信息参考
  4. QEI速度寄存器 (QEISPEED) - 地址偏移 0x01C: 这才是你真正需要读取的速度值。它记录的是上一个完整的定时器周期内所捕获的编码器脉冲数。这个值在每次定时器周期结束时(定时器归零)被更新并锁存。因此,读取QEISPEED得到的是一个稳定的、代表上一个采样周期内平均速度的值。速度单位是“脉冲数/定时器周期”,你需要根据定时器周期时间和编码器分辨率将其转换为实际的转速(如RPM或m/s)。

提示:速度测量的精度和响应速度是一对矛盾。较长的定时器周期(QEILOAD值大)能平滑噪声,提高低速下的测量精度,但速度更新率低,动态响��慢。较短的周期更新快,但低速时可能因为脉冲数太少而量化误差大。需要根据应用场景折中。

2.2 中断管理与控制寄存器

QEI模块提供了丰富的中断源,允许CPU以事件驱动的方式响应编码器的关键状态变化,而不是持续轮询,这对低功耗和实时性至关重要。

2.2.1 QEI中断使能寄存器 (QEIINTEN) - 地址偏移 0x020

这个寄存器是中断的“总开关面板”,你可以独立启用或禁用特定事件的中断请求。

  • 位0 - INTINDEX (索引脉冲中断使能): 使能后,当编码器的索引脉冲(Index,每转一圈产生一个)信号被检测到时,会触发中断。常用于寻找绝对机械零点。
  • 位1 - INTTIMER (定时器溢出中断使能): 使能后,当速度测量定时器溢出(即一个速度采样周期完成)时触发中断。你可以在中断服务程序(ISR)中安全地读取QEISPEED寄存器获取最新速度值。
  • 位2 - INTDIR (方向改变中断使能): 使能后,当编码器的旋转方向发生变化时触发中断。
  • 位3 - INTERROR (相位错误中断使能): 使能后,当发生相位错误(QEISTAT.ERROR=1)时触发中断。再次强调:仅在正交相位模式(SIGMODE=0)下有效。
2.2.2 QEI原始中断状态寄存器 (QEIRIS) - 地址偏移 0x024

这是一个只读的“事件记录本”。无论QEIINTEN是否使能,只要相应的事件发生,对应的位就会被硬件置1。它反映了中断源的原始状态。例如,即使你没有使能方向改变中断,当电机反转时,QEIRIS寄存器的INTDIR位仍然会变成1。你可以通过轮询这个寄存器来了解发生了哪些事件,而不一定非要用中断。

2.2.3 QEI中断状态与清除寄存器 (QEIISC) - 地址偏移 0x028

这是你与中断系统交互的主要接口。它的位域与QEIRIS和QEIINTEN对应。

  • 状态功能:某一位为1,表示同时满足两个条件:(a) QEIRIS中对应事件标志为1(事件发生了),(b) QEIINTEN中对应中断使能为1(你允许它中断)。只有这时,中断信号才会真正发送到NVIC(嵌套向量中断控制器)。
  • 清除功能:这是一个“写1清除”(RW1C)寄存器。在中断服务程序(ISR)中,为了通知硬件该中断已被处理,并防止同一中断源持续触发,你必须向QEIISC中对应的位写入1。这个操作会同时清除QEIISC中的该位以及QEIRIS中的对应原始状态位。这是清除中断标志的标准流程。

中断处理流程示例(以速度定时器中断为例):

  1. 配置QEILOAD设定速度采样周期,并使能VELEN和INTTIMER。
  2. 定时器溢出,硬件自动置位QEIRIS.INTTIMER。
  3. 由于QEIINTEN.INTTIMER也已使能,QEIISC.INTTIMER也被置位,并向NVIC发出中断请求。
  4. CPU跳转到QEI中断服务程序。
  5. 在ISR中,读取QEISPEED获取速度值。
  6. 关键步骤:向QEIISC寄存器的INTTIMER位写1,清除中断标志。
  7. 退出ISR。

3. 引脚复用配置:将功能映射到物理引脚

寄存器配置决定了QEI模块的“行为逻辑”,而引脚复用(Pin Mux)配置则决定了这些逻辑功能通过哪个物理引脚与外部编码器连接。TM4C123BH6ZRB的引脚功能非常灵活,绝大多数引脚都是GPIO,并通过复杂的复用开关连接到不同的外设。

3.1 引脚复用机制解析

芯片的每个GPIO引脚都像一个多功能插座,默认是普通的数字输入/输出(GPIO)。要让它成为QEI模块的输入引脚,需要操作两个关键寄存器:

  1. GPIO交替功能选择寄存器 (GPIOAFSEL):这是第一级开关。将对应引脚在GPIOAFSEL寄存器中的位设为1,表示该引脚不再作为简单GPIO,而是启用其“交替硬件功能”。
  2. GPIO端口控制寄存器 (GPIOPCTL):这是第二级、也是更精细的开关。因为一个引脚可能复用了多个外设功能(例如,一个引脚可能同时可以作为UART的RX、Timer的CCP和QEI的PhA)。GPIOPCTL寄存器中的PMCx(端口复用控制)位域(通常每引脚占4个bit)用于从众多交替功能中选择一个。你需要查阅数据手册中的“信号描述表”(如提供的Table 22-2),找到QEI功能对应的编码值,并写入PMCx。

以配置PA6引脚为QEI0 PhA为例

  • 首先,使能PORTA时钟(SYSCTL->RCGCGPIO |= 0x01;)。
  • 配置PA6为数字功能(GPIOA->DEN |= 0x40;)。
  • 设置PA6为交替功能(GPIOA->AFSEL |= 0x40;)。
  • 查表可知,PA6的QEI0 PhA功能对应的PMCx编码为0x4(具体值需查芯片数据手册的PinMux表,此处为示例)。因此,需要设置GPIOPCTL寄存器中控制PA6的4个bit(位27:24)为0x4:GPIOA->PCTL = (GPIOA->PCTL & 0xF0FFFFFF) | (0x4 << 24);

3.2 TM4C123BH6ZRB QEI相关引脚速查

根据提供的信号表(Table 22-2),我们可以快速定位QEI模块0和1的相关引脚。这对于硬件原理图设计和软件初始化至关重要。

QEI模块0引脚

  • PhA0 (相位A): 这是一个复用度很高的信号。它可以在多个引脚上实现,例如:
    • PD6(A3引脚): 同时复用为AIN5, M0FAULT0, U2Rx, WT5CCP0。
    • PH4(J3引脚): 同时复用为M0PWM4, SSI2Clk, WT3CCP0。
    • PF0(M9引脚):这是一个需要特别注意的引脚。它被标记为“特殊考虑”引脚(见Table 22-1),默认功能是GPIO但被锁定。要重新配置它,必须先解锁(向GPIOLOCK寄存器写入特定密钥0x4C4F434B),然后设置GPIOCR寄存器对应位,才能修改其AFSEL和PCTL。它复用了C0o, CAN0Rx, M1PWM4, NMI, SSI1Rx, T0CCP0, TRD2, U1RTS等多种功能。
  • PhB0 (相位B): 同样有多引脚可选:
    • PD7(B3引脚): 复用为AIN4, M0FAULT1, NMI, U2Tx, WT5CCP1。
    • PH5(H4引脚): 复用为M0PWM5, SSI2Fss, WT3CCP1。
  • IDX0 (索引信号): 可选引脚包括:
    • PJ2(A9引脚): 复用为AIN23, CAN0Rx。
    • PD3(C1引脚): 复用为AIN12, SSI1Tx, SSI3Tx, WT3CCP1。
    • PH1(K4引脚): 复用为M0FAULT1, M0PWM1, SSI3Fss, WT2CCP1。
    • PF4(L9引脚): 复用为M0FAULT2, M1FAULT0, T2CCP0, TRD3, U1DTR。

QEI模块1引脚

  • PhA1: 例如PC5(L1引脚),复用为C1+, M0PWM7, U1CTS, U1Tx, U4Tx, WT0CCP1。
  • PhB1: 例如PC6(K1引脚),复用为C0+, U3Rx, WT1CCP0。
  • IDX1: 例如PC4(L2引脚),复用为C1-, U1RTS, U1Rx, U4Rx, WT0CCP0。

配置决策建议

  1. 避免冲突:首先检查你项目中其他必须使用的外设(如UART、PWM、ADC),确保为QEI选择的引脚不与这些关键功能冲突。
  2. 优先非锁定引脚:除非必要,尽量避免使用像PF0这样的“特殊考虑”锁定引脚,以减少配置的复杂性。
  3. 信号完整性:对于高速编码器信号,尽量选择相邻的引脚对(如PhA和PhB选同一端口相邻的引脚),并确保原理图布线时保持等长、紧密耦合,以减少噪声和相位差。
  4. 预留测试点:在PCB设计时,为QEI信号线预留测试点,方便用示波器抓取实际波形,诊断硬件问题。

4. 完整驱动配置流程与代码实现

理解了寄存器和引脚,我们就可以动手编写一个完整的QEI模块初始化函数。下面以QEI0为例,展示一个典型的配置流程。

4.1 初始化步骤分解

  1. 使能外设时钟:这是所有外设配置的第一步,没有���钟,寄存器无法访问。
  2. 配置GPIO引脚:将选定的PhA, PhB, IDX引脚配置为正确的交替功能。
  3. 配置QEI控制寄存器 (QEICTL):这是最核心的配置,决定模块的基本工作模式。虽然输入资料未详细列出此寄存器,但根据TI标准库,它���常包含以下关键位(需要查阅具体数据手册):
    • VELDIV: 速度预分频因子。
    • VELEN: 使能速度捕获。
    • RESMODE: 位置计数器复位模式(索引信号复位或最大位置复位)。
    • CAPMODE: 捕获模式(正交相位模式或计数/方向模式)。
    • SIGMODE: 信号模式(使用编码器信号或直接方向/计数信号)。
    • SWAP: 交换Phase A和Phase B信号。
    • ENABLE: QEI模块总使能。
  4. 配置最大位置值 (QEIMAXPOS):如果需要位置回绕功能。
  5. 配置速度定时器 (QEILOAD):根据系统时钟和期望的速度更新率计算并设置。
  6. 配置中断 (可选):如果需要,配置QEIINTEN使能中断,并在NVIC中启用QEI中断。
  7. 使能QEI模块:最后一步,将QEICTL寄存器的ENABLE位置1。

4.2 示例代码:QEI0初始化与中断服务

假设我们使用PD6(PhA0), PD7(PhB0),并使能速度测量和定时器中断。

#include <stdint.h> #include "tm4c123gh6pm.h" // 包含寄存器定义的头文件 // 假设系统时钟为80MHz,我们希望速度采样率为1kHz (1ms) #define SYSTEM_CLOCK_HZ 80000000UL #define SPEED_SAMPLE_RATE_HZ 1000UL #define QEI_LOAD_VALUE (SYSTEM_CLOCK_HZ / SPEED_SAMPLE_RATE_HZ - 1) void QEI0_Init(void) { // 1. 使能外设时钟 SYSCTL->RCGCGPIO |= 0x08; // 使能GPIOD时钟 SYSCTL->RCGCQEI |= 0x01; // 使能QEI0模块时钟 __asm__ volatile("NOP"); // 等待时钟稳定 __asm__ volatile("NOP"); // 2. 配置GPIO引脚 PD6, PD7 为 QEI0 功能 // 解锁PD7(如果需要,PD6通常不需要) // GPIO_PORTD_LOCK_R = 0x4C4F434B; // 如果使用PF0等锁定引脚需要此步骤 // GPIO_PORTD_CR_R |= 0x80; // 允许更改PD7配置 GPIOD->DEN |= 0xC0; // 使能PD6, PD7数字功能 GPIOD->AFSEL |= 0xC0; // 使能PD6, PD7交替功能 // 查表确定PD6(PhA0)和PD7(PhB0)在PCTL中的编码,假设为0x1 GPIOD->PCTL = (GPIOD->PCTL & 0x00FFFFFF) | (0x11 << 24); // PD7和PD6都配置为QEI0 // 3. 配置QEI控制寄存器 (参考数据手册具体位域) QEI0->CTL = 0; QEI0->CTL |= (0 << 0); // 假设VELDIV=0,速度计数器不分频 QEI0->CTL |= (1 << 3); // VELEN: 使能速度捕获 QEI0->CTL |= (0 << 4); // RESMODE: 0=索引脉冲复位位置计数器(若需回绕用MAXPOS) QEI0->CTL |= (0 << 5); // CAPMODE: 0=正交相位模式(X4分辨率) QEI0->CTL |= (0 << 6); // SIGMODE: 0=使用正交编码器信号 QEI0->CTL |= (0 << 7); // SWAP: 0=不交换A/B相位 // 注意:先不使能模块,等配置完再使能 // 4. 配置最大位置值(例如,编码器每转1000个脉冲,设置回绕为999) QEI0->MAXPOS = 999; // 如果需要位置回绕 // 5. 配置速度定时器 QEI0->LOAD = QEI_LOAD_VALUE; // 设置1ms的定时周期 // 6. 配置中断(使能定时器溢出中断) QEI0->INTEN |= 0x02; // 使能INTTIMER中断 NVIC_EnableIRQ(QEI0_IRQn); // 在NVIC中使能QEI0中断 NVIC_SetPriority(QEI0_IRQn, 2); // 设置中断优先级 // 7. 使能QEI模块 QEI0->CTL |= 0x01; // 设置ENABLE位 } // QEI0中断服务程序 void QEI0_Handler(void) { if (QEI0->RIS & 0x02) { // 检查是否是定时器溢出中断 uint32_t speed = QEI0->SPEED; // 读取上一个周期的速度值 // 在这里进行速度处理,例如转换为RPM: // 假设编码器每转1000脉冲,速度单位是 脉冲数/1ms // RPM = (speed * 60 * 1000) / (1000) = speed * 60 // float rpm = (float)speed * 60.0f; QEI0->ISC = 0x02; // 写1清除中断标志(INTTIMER) } // 可以检查其他中断源,如方向改变、索引脉冲等 }

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

在实际项目中,QEI模块的调试可能会遇到各种问题。以下是一些常见问题的排查思路和实战技巧。

5.1 位置计数器不变化或变化异常

  • 症状:电机在转,但QEIPOS寄存器值不变、跳动或只向一个方向变化。
  • 排查步骤
    1. 信号检查:使用示波器或逻辑分析仪直接测量连接到PhA和PhB的引脚波形。确保信号幅度、频率正常,且两路信号存在清晰的90度相位差。检查是否有过冲、振铃或毛刺。
    2. 引脚配置确认:双重检查GPIOAFSEL和GPIOPCTL寄存器的配置值。一个常见的错误是只设置了AFSEL但忘了设置PCTL,导致引脚功能未正确映射。
    3. 模式确认:检查QEICTL寄存器的CAPMODE和SIGMODE位。如果你接的是标准正交编码器,CAPMODE应为0(正交模式),SIGMODE也应为0。如果配置为计数/方向模式,而接的是正交编码器,则只有一路信号会计数。
    4. 输入滤波:TI的QEI模块内部通常有输入滤波器(通过QEICTL寄存器的FILTEN等位控制)。如果编码器信号有噪声,可以启用并适当调整滤波采样周期。但滤波过重可能会丢失高频脉冲。
    5. 软件干扰:确保没有其他地方的程序意外地写入了QEIPOS寄存器,或者频繁地清除、重置QEI模块。

5.2 速度测量值不准或为零

  • 症状:QEISPEED寄存器读出的值总是0,或者与预期转速严重不符。
  • 排查步骤
    1. VELEN位:最基础的检查,确认QEICTL寄存器的VELEN位是否已置1。只有此位置1,速度定时器和计数器才会工作。
    2. QEILOAD计算:重新计算QEILOAD值。公式必须是(系统时钟频率 / 期望采样率) - 1。常见的错误是直接写入系统时钟频率 / 期望采样率
    3. 采样率与转速匹配:如果电机转速极低,而你的速度采样周期(例如1ms)又很短,可能导致在一个采样周期内捕获到的脉冲数为0,从而速度始终为0。此时需要增大QEILOAD值,降低采样率以获取更多脉冲。或者,可以考虑使用“捕获模式”下的定时器直接测量脉冲周期来计算超低速。
    4. 读取时机:确保你是在速度定时器中断(INTTIMER)发生后读取QEISPEED。如果在定时器周期中间读取,得到的是尚未完成更新的旧值或中间值。最佳实践就是在INTTIMER中断服务程序中读取

5.3 中断无法触发

  • 症状:配置了中断,但程序从未进入中断服务函数。
  • 排查步骤
    1. 中断使能链:这是一个经典的嵌入式问题链。检查是否每一步都做到了:
      • 外设级:QEIINTEN寄存器中特定中断位是否置1?
      • NVIC级:是否使用NVIC_EnableIRQ()正确使能了QEI0_IRQn或QEI1_IRQn?
      • 全局级:是否在启动代码中开启了总中断(对于Cortex-M,通常通过__enable_irq()或设置PRIMASK寄存器)?
    2. 中断标志清除:在第一次进入中断服务程序后,是否正确地通过向QEIISC寄存器对应位写1清除了中断标志?如果未清除,中断只会触发一次。
    3. 中断优先级:检查是否被更高优先级的中断长时间抢占,或者你的中断优先级设置过低。
    4. 向量表:确认中断向量表是否正确指向了你编写的QEI0_Handler函数。

5.4 引脚复用冲突导致功能异常

  • 症状:QEI功能似乎时好时坏,或者同时影响了其他外设(如某个UART不工作了)。
  • 排查:仔细核对芯片数据手册的“Signal Tables”和“Pin Mux Table”。使用一个引脚复用表工具或自己制作一个Excel表格,列出所有使用到的外设和引脚,确保没有一个物理引脚被两个同时使能的外设功能所占用。特别注意PF0、PD7等具有特殊功能或默认非GPIO的引脚。

调试利器:寄存器查看与信号抓取

  • 在线调试器:利用Keil、IAR或基于OpenOCD的调试环境,实时查看和修改QEI相关的所有���存器值,这是最直接的软件调试手段。
  • 逻辑分析仪:连接PhA、PhB和IDX信号,可以直观地看到编码器输出的波形、相位关系以及索引脉冲的位置,并与QEIPOS的计数值变化进行比对,是验证硬件连接和信号质量的终极工具。