TM4C1299NCZAD正交编码器接口(QEI)配置与实战指南
2026/7/22 16:53:53 网站建设 项目流程

1. 项目概述与核心价值

在电机控制、机器人关节定位、数控机床进给这些需要精确知道“转了多少圈、转得多快”的场景里,正交编码器(Quadrature Encoder)是工程师最信赖的“眼睛”。它输出的两路相位差90度的方波信号(PhA和PhB),不仅包含了位置信息,还隐含了方向。如果让主控芯片的CPU去实时捕获和计算这些高频脉冲,无异于让一个数学家去数心跳,既浪费算力,又难以保证实时性和精度。这正是Tiva™ C系列微控制器(如TM4C1299NCZAD)内置正交编码器接口(QEI)模块的价值所在——它把这份繁重且要求精确的“计数”工作,从软件层面剥离,交给了硬件专用电路。

我接触过不少项目,从简单的直流有刷电机转速反馈,到复杂的多轴协作机器人闭环控制,QEI模块都是实现稳定、可靠位置反馈的基石。TM4C1299NCZAD作为TI Tiva系列中的高性能型号,其QEI模块功能相当完善,支持绝对位置跟踪、速度测量、多种复位模式以及丰富的中断事件。但官方数据手册动辄数百页,寄存器描述分散,初次上手容易抓不住重点。本文将结合我多年的调试经验,为你拆解TM4C1299NCZAD的QEI模块,从工作原理、寄存器功能映射、初始化配置步骤,到实际应用中的参数计算和避坑指南,提供一个清晰、可直接落地的实践手册。无论你是正在评估该芯片用于新的运动控制项目,还是正在调试编码器读数不准的问题,相信都能在这里找到答案。

2. QEI模块核心工作原理与设计思路

要玩转QEI的寄存器,必须先理解它硬件层面是怎么“思考”的。这能帮你明白每个配置位的意义,而不是死记硬背。

2.1 正交解码与位置计数

编码器输出的PhA和PhB信号,在理想情况下有四种状态组合(00, 01, 11, 10),形成一个格雷码循环。QEI模块的核心解码逻辑就是识别这两个信号边沿的变化顺序。

  • 方向判定:QEI内部有一个方向状态机。简单来说,如果PhA的边沿变化领先于PhB(例如状态从00->10->11->01),则判定为正向旋转;反之,若PhB领先(例如00->01->11->10),则判定为反向旋转。这个判断是硬件实时完成的,速度极快。
  • 位置计数:根据配置,计数器对边沿的敏感度不同,这直接决定了位置分辨率。
    • 单边沿计数模式(CAPMODE=0):仅对PhA的上升沿或下降沿(取决于相位配置)进行计数。这是最基础的模式,每个机械周期(编码器线数)产生的脉冲数等于编码器的线数(PPR)。例如,一个1000线的编码器,转一圈产生1000个计数。
    • 双边沿计数模式(CAPMODE=1):对PhA和PhB两个信号的所有边沿(上升沿和下降沿)都进行计数。由于每个方波周期有4个边沿,因此分辨率提高了4倍。同样是1000线的编码器,转一圈会产生4000个计数。这是最常用的高精度模式,但需要注意,此时位置计数器的范围(MAXPOS)也需要相应扩大4倍。

2.2 速度测量的实现机制

速度测量是QEI另一个核心功能。它并非简单地在固定时间间隔内读取位置差值,而是采用了一个更巧妙的“速度定时器+脉冲计数器”双缓冲结构,以实现连续、无间隔的速度采样。

  1. 速度定时器(QEILOAD & QEITIME):这是一个向下计数的定时器。你预先设置一个装载值(LOAD),定时器从该值开始递减,减到0时,触发“定时器溢出”事件,并自动重载LOAD值重新开始计数。这个定时器的周期就是你的速度采样周期。例如,系统时钟为80MHz,若设置LOAD = 79999,则定时器周期为 (79999+1)/80MHz = 1ms。
  2. 速度脉冲计数器(QEICOUNT):这是一个独立的计数器,在速度测量使能后,它对经过预分频(VELDIV)后的编码器脉冲进行累加。
  3. 速度值锁存(QEISPEED):关键在这里!当速度定时器溢出归零的瞬间,硬件会自动做两件事:第一,将当前QEICOUNT计数器的值锁存到QEISPEED寄存器中;第二,将QEICOUNT计数器清零,开始下一个采样周期的计数。因此,你任何时候去读取QEISPEED寄存器,得到的都是上一个完整采样周期内捕获的脉冲数。这个值除以采样周期时间,就得到了瞬时速度(单位:脉冲数/秒)。

这种设计保证了速度值的连贯性和实时性,软件无需在精确的时间点去同步读取两个值,也避免了在计算期间计数器仍在变化的问题。

2.3 复位模式与索引信号

许多增量式编码器除了PhA/PhB,还有一个索引信号(Index),每旋转一圈产生一个脉冲。QEI模块可以利用这个信号来校正绝对位置,防止因噪声或累计误差导致的“丢步”或“多步”。

  • 最大位置复位模式(RESMODE=0):位置计数器(QEIPOS)在达到设定的最大值(QEIMAXPOS)后自动归零,循环计数。适用于无索引信号的场合,或作为多圈计数的一部分。
  • 索引脉冲复位模式(RESMODE=1):每当检测到索引脉冲的上升沿(或下降沿,可通过INVI位反转)时,位置计数器(QEIPOS)被硬件自动复位为0。这确保了每一圈的起始位置都是绝对准确的,非常适合需要“回零”或绝对位置校准的应用,比如机械臂的关节零点。

3. 寄存器详解与配置实战

理解了原理,我们再来逐一攻克那些寄存器。TM4C1299NCZAD的QEI模块寄存器基地址为0x4002.C000(QEI0)。所有寄存器均为32位,但很多字段只用了低几位。

3.1 控制寄存器(QEICTL, Offset 0x000)—— 模块的大脑

这是最重要的寄存器,所有核心功能开关和模式选择都在这里。

// 假设我们使用QEI0模块 #define QEI0_BASE 0x4002C000 #define QEI_CTL_OFFSET 0x000 volatile uint32_t *QEICTL = (uint32_t *)(QEI0_BASE + QEI_CTL_OFFSET);

关键位域解析与配置示例:

  1. ENABLE (Bit 0):模块总开关。一个至关重要的注意事项:一旦将此位置1,在不进行模块软件复位(通过系统控制模块的SRQEI寄存器)的情况下,无法通过写0来禁用模块。这意味着你的初始化顺序必须是:配置好所有其他寄存器 -> 最后置位ENABLE。如果配置中途需要修改,必须先复位整个QEI模块。

    // 错误示范:先使能,再配置其他 *QEICTL |= 0x1; // 先使能 // ... 配置其他寄存器 (可能无效或导致不可预期行为) // 正确示范:最后使能 // ... 先配置QEIMAXPOS, QEILOAD, QEIINTEN等所有寄存器 *QEICTL |= 0x1; // 最后打开总开关
  2. SIGMODE (Bit 2):信号模式选择。

    • 0正交相位模式。PhA和PhB作为正交信号,硬件进行方向解码和边沿计数。这是连接标准增量编码器的模式。
    • 1时钟/方向模式。PhA作为时钟信号(CLK),PhB作为方向信号(DIR)。每个PhA的上升沿计数,DIR电平决定加减(通常高电平加,低电平减)。这种模式可用于连接某些输出为“脉冲+方向”形式的驱动器或简易传感器。
  3. CAPMODE (Bit 3) & RESMODE (Bit 4):捕获模式与复位模式。这两个位需要根据你的编码器和应用需求配合设置。

    • 对于1000线、带索引信号的编码器,希望获得最高分辨率并在每圈索引处复位:
      // 双边沿计数(4倍频),索引复位 uint32_t ctrl_value = 0; ctrl_value |= (0 << 2); // SIGMODE=0, 正交模式 ctrl_value |= (1 << 3); // CAPMODE=1, 计数PhA和PhB的所有边沿 ctrl_value |= (1 << 4); // RESMODE=1, 索引脉冲复位 // ... 设置其他位 *QEICTL = ctrl_value; // 一次性写入配置,但先不使能
    • 对于无索引信号,仅需相对位置和速度:
      // 单边沿计数,最大位置复位 ctrl_value |= (0 << 3); // CAPMODE=0, 仅计数PhA边沿 ctrl_value |= (0 << 4); // RESMODE=0, 达到MAXPOS后复位
  4. VELEN (Bit 5) & VELDIV (Bits 8:6):速度测量使能与预分频。

    • VELEN:置1使能速度捕获功能。
    • VELDIV:速度预分频器。这是一个关键但易被忽略的配置。编码器高速旋转时,脉冲频率可能超过系统时钟或导致计数器溢出。VELDIV可以对输入脉冲进行2^N分频(N=0~7),然后再送给速度脉冲计数器(QEICOUNT)。例如,电机最高转速对应脉冲频率为1MHz,而你的系统时钟为80MHz,直接计数没问题。但如果脉冲频率达到10MHz,可能就需要设置分频了。计算原则:确保分频后的脉冲频率在速度采样周期内不会使16位或32位的QEICOUNT计数器溢出(取决于具体型号,TM4C1299是32位)。
  5. FILTEN (Bit 13) & FILTCNT (Bits 19:16):输入数字滤波器。这是抗干扰的利器。编码器信号在长线传输或恶劣工业环境中容易引入毛刺。使能滤波器(FILTEN=1)后,输入信号需要稳定连续FILTCNT+2个系统时钟周期,其变化才会被QEI模块确认。例如,系统时钟80MHz(周期12.5ns),设置FILTCNT=0xF(十进制15),则信号需稳定(15+2)*12.5ns=212.5ns才被确认,能有效滤除窄脉冲噪声。调试心得:如果发现位置计数偶尔有跳变或方向错误,优先检查并启用滤波器,逐步增加FILTCNT值直到稳定。

3.2 位置与最大值寄存器(QEIPOS & QEIMAXPOS)

  • QEIPOS (Offset 0x008):32位可读写寄存器,反映当前位置计数值。软件可以写入一个初始值(例如在找到机械零点后)。重要提示:手册明确指出,如果需要设置特定的初始位置,必须在使能QEI模块(设置QEICTL的ENABLE位)之后,再写入QEIPOS。在这之前写入可能无效。
  • QEIMAXPOS (Offset 0x00C):32位寄存器,定义位置计数器的最大值。其设置与CAPMODE紧密相关。
    • 对于CAPMODE=1(4倍频):MAXPOS = 4 * PPR - 1。例如1000线编码器,MAXPOS = 4000 - 1 = 3999 (0xF9F)
    • 对于CAPMODE=0(1倍频):MAXPOS = PPR - 1
    • RESMODE=0时,计数器到达MAXPOS后归零;当RESMODE=1时,此寄存器在索引复位模式下意义不大,但最好也正确设置。

3.3 速度相关寄存器(QEILOAD, QEITIME, QEICOUNT, QEISPEED)

这是速度测量功能的核心寄存器组。

  1. QEILOAD (Offset 0x010):速度定时器的重载值。如前所述,若想要定时器周期为T,系统时钟频率为SysClk,则:LOAD = T * SysClk - 1例如,需要1ms的速度更新周期,系统时钟80MHz:LOAD = 0.001 * 80,000,000 - 1 = 79999务必注意:定时器在减到0后的下一个时钟周期装载LOAD值,所以装载值比实际计数值少1。

  2. QEITIME (Offset 0x014):只读,当前速度定时器的值。可用于调试,观察定时器是否正常运行。

  3. QEICOUNT (Offset 0x018):只读,当前速度采样周期内累计的(经过预分频后的)脉冲数。手册特别警告:由于读取QEICOUNTQEITIME存在微小的时间差,这两个值在读取瞬间可能并不严格对应,因此不要用它们来计算实时速度。这个寄存器主要用于监控。

  4. QEISPEED (Offset 0x01C):只读,这才是你应该读取的速度值。它锁存了上一个完整定时器周期内的脉冲数。速度计算公式为:速度 (脉冲数/秒) = (QEISPEED * (2^VELDIV)) / ( (QEILOAD + 1) / SysClk )化简后:速度 = (QEISPEED * (2^VELDIV) * SysClk) / (QEILOAD + 1)如果需要转换为转速RPM,且编码器每转脉冲数为PulsesPerRevolution(考虑倍频):转速 (RPM) = (速度 * 60) / PulsesPerRevolution

3.4 中断控制寄存器(QEIINTEN, QEIRIS, QEIISC)

QEI模块可以产生四种中断,通过这三个寄存器管理。

  • QEIINTEN (Offset 0x020):中断使能寄存器。位[3:0]分别对应相位错误(INTERROR)、方向改变(INTDIR)、定时器溢出(INTTIMER)、索引脉冲(INTINDEX)。需要哪种中断,就将对应位置1。
  • QEIRIS (Offset 0x024):原始中断状态寄存器。只要事件发生,对应位就被硬件置1,无论该中断是否在QEIINTEN中被使能。这个寄存器用于查询所有潜在的中断源。
  • QEIISC (Offset 0x028):中断状态及清除寄存器。这是最常用的。只有当事件发生在QEIINTEN中被使能时,对应位才置1。向该寄存器的某一位写1,可以清除该中断标志(同时也会清除QEIRIS中的对应位)。这是一种典型的“写1清除”(W1C)机制。

中断服务程序(ISR)标准流程:

void QEI0_IRQHandler(void) { uint32_t status = HWREG(QEI0_BASE + QEI_ISC_OFFSET); // 读取中断状态 if (status & QEI_INTINDEX) { // 处理索引脉冲中断:例如,标记零点位置、校正位置等 // ... 你的代码 ... HWREG(QEI0_BASE + QEI_ISC_OFFSET) = QEI_INTINDEX; // 写1清除索引中断标志 } if (status & QEI_INTTIMER) { // 处理速度定时器中断:读取QEISPEED,计算速度,进行速度环PID控制 // ... 你的代码 ... HWREG(QEI0_BASE + QEI_ISC_OFFSET) = QEI_INTTIMER; // 清除定时器中断标志 } if (status & QEI_INTDIR) { // 处理方向改变中断:可能用于记录转向历史或触发特定动作 // ... 你的代码 ... HWREG(QEI0_BASE + QEI_ISC_OFFSET) = QEI_INTDIR; } if (status & QEI_INTERROR) { // 处理相位错误中断:通常意味着编码器信号受到严重干扰,需要错误处理 // ... 你的错误恢复或报警代码 ... HWREG(QEI0_BASE + QEI_ISC_OFFSET) = QEI_INTERROR; } }

4. 完整初始化流程与代码实现

结合第25.4节的示例和寄存器理解,一个稳健的QEI初始化流程如下。我们以连接一个1000线带索引的增量编码器,并在索引处复位、启用速度测量为例。

4.1 硬件连接与引脚复用

首先,根据芯片数据手册的“Signal Tables”(如你提供的表27-2),找到QEI0模块对应的PhA0, PhB0, IDX0引脚。例如,TM4C1299NCZAD上:

  • PhA0 可能复用在PL1(Pin H19) 或PS4(Pin V9)
  • PhB0 可能复用在PL2(Pin G18) 或PS5(Pin T13)
  • IDX0 可能复用在PL3(Pin J18) 或PS6(Pin U10)

你需要根据PCB布局选择一组,并通过GPIO的交替功能选择(AFSEL)和端口控制(PCTL)寄存器将其配置为QEI功能。

4.2 软件初始化步骤

#include <stdint.h> #include "tm4c1299nczad.h" // 包含你的设备头文件 void QEI0_Init(void) { // 步骤1: 使能外设时钟 SYSCTL->RCGCQEI |= 0x01; // 使能 QEI0 模块时钟 SYSCTL->RCGCGPIO |= (1 << 10); // 使能 Port L 时钟 (假设使用PL1, PL2, PL3) // 步骤2: 等待外设时钟稳定(通常需要几个周期) __asm(" NOP"); __asm(" NOP"); __asm(" NOP"); // 步骤3: 配置GPIO引脚为QEI功能 // 假设使用 PL1(PhA), PL2(PhB), PL3(IDX) GPIO_L->AFSEL |= (1 << 1) | (1 << 2) | (1 << 3); // 使能PL1,2,3的交替功能 // 清除 PCTL 中对应位的旧配置,然后设置为QEI功能 (需查表确定编码,例如0x4) GPIO_L->PCTL &= ~((0xF << (1*4)) | (0xF << (2*4)) | (0xF << (3*4))); GPIO_L->PCTL |= (0x4 << (1*4)) | (0x4 << (2*4)) | (0x4 << (3*4)); // 假设编码为4 GPIO_L->DEN |= (1 << 1) | (1 << 2) | (1 << 3); // 使能数字功能 // 步骤4: 配置QEI模块核心参数(在使能前完成!) // 4.1 设置最大位置值 (1000线,4倍频) QEI0->MAXPOS = 4000 - 1; // 0xF9F // 4.2 配置速度定时器 (假设系统时钟80MHz,期望1ms速度更新) QEI0->LOAD = 80000 - 1; // 1ms @ 80MHz // 4.3 配置控制寄存器 (不包含ENABLE位) uint32_t ctl_config = 0; ctl_config |= (0 << 2); // SIGMODE=0: 正交模式 ctl_config |= (1 << 3); // CAPMODE=1: 双边沿计数 (4倍频) ctl_config |= (1 << 4); // RESMODE=1: 索引脉冲复位 ctl_config |= (1 << 5); // VELEN=1: 使能速度捕获 ctl_config |= (0 << 6); // VELDIV=0: 预分频 ÷1 (根据实际脉冲频率调整) ctl_config |= (1 << 13); // FILTEN=1: 使能输入滤波器 ctl_config |= (0x3 << 16);// FILTCNT=3: 滤波计数=3,即稳定5个周期后确认 // INVA, INVB, INVI 根据编码器信号实际相位和电路连接决定是否取反 // STALLEN 调试时可根据需要设置,通常为0 QEI0->CTL = ctl_config; // 步骤5: (可选) 配置中断 QEI0->INTEN |= QEI_INTEN_INTINDEX | QEI_INTEN_INTTIMER; // 使能索引和定时器中断 // 在NVIC中使能QEI0中断 NVIC_EnableIRQ(QEI0_IRQn); NVIC_SetPriority(QEI0_IRQn, 2); // 设置合适优先级 // 步骤6: 最后,使能QEI模块 QEI0->CTL |= QEI_CTL_ENABLE; // 步骤7: (可选) 如果需要,在使能后设置初始位置 // QEI0->POS = 0; // 例如,在索引复位模式下,通常会在索引中断里处理,这里可以不设 }

4.3 主循环中的位置与速度读取

初始化完成后,在应用代码中即可轻松读取位置和速度。

int32_t GetCurrentPosition(void) { return (int32_t)(QEI0->POS); // 注意,QEIPOS是32位无符号数,但可转为有符号解释 } float GetCurrentSpeedRPM(uint32_t pulsesPerRev) { // pulsesPerRev 是考虑倍频后每转的脉冲数,例如 4000 (1000线*4) uint32_t raw_speed = QEI0->SPEED; // 读取锁存的速度值 uint32_t veldiv_factor = 1 << ((QEI0->CTL & QEI_CTL_VELDIV_M) >> QEI_CTL_VELDIV_S); uint32_t timer_load = QEI0->LOAD + 1; float sysclk_hz = 80000000.0f; // 系统时钟频率 // 计算速度 (脉冲数/秒) float speed_pps = (float)(raw_speed * veldiv_factor) * sysclk_hz / (float)timer_load; // 转换为转速 (RPM) float speed_rpm = (speed_pps * 60.0f) / (float)pulsesPerRev; return speed_rpm; } void main(void) { // 系统初始化... QEI0_Init(); while(1) { int32_t pos = GetCurrentPosition(); float rpm = GetCurrentSpeedRPM(4000); // 1000线,4倍频 // 使用pos和rpm进行控制逻辑... // 例如,显示、PID计算等 SysCtlDelay(1000000); // 简单延时 } }

5. 常见问题排查与实战经验

即使按照手册配置,在实际项目中仍会遇到各种问题。以下是我总结的几个典型问题及排查思路。

5.1 位置计数不准确或跳变

  • 现象:电机匀速旋转,但读取的位置值增长不均匀,偶尔有回跳或突增。
  • 排查
    1. 信号质量:首要怀疑对象。用示波器观察PhA、PhB和IDX信号,检查是否有过冲、振铃、毛刺或幅值不足。编码器供电是否稳定?信号线是否过长且未采用双绞或屏蔽?
    2. 滤波器配置:如果信号有轻微噪声,启用并调整FILTCNT。从一个较小值(如3或4)开始增加,直到计数稳定。但注意,过大的滤波值会降低最高响应频率。
    3. 电源与地:确保微控制器和编码器共地良好,模拟地(GNDA)和数字地(GND)的隔离或单点连接是否正确。
    4. 相位与方向:如果方向判断错误(正转时数值减小),检查INVAINVB位,尝试反转其中一个信号的极性。也可以尝试交换PhA和PhB的物理接线(同时可能需要调整SWAP位)。

5.2 速度测量值为零或异常

  • 现象:电机在转,但QEISPEED读出来总是0,或者数值明显不对。
  • 排查
    1. 速度测量是否使能:确认QEICTL寄存器的VELEN位已设置为1。
    2. 定时器装载值QEILOAD是否合理:如果LOAD值设置得过大(例如0xFFFFFFFF),定时器溢出周期极长,你可能在等待期间读到的速度一直是0。如果LOAD值设置得过小,定时器频繁溢出,速度值更新太快,可能捕获不到足够脉冲,导致精度下降或为0。根据预期转速和编码器分辨率计算一个合适的值。
    3. 预分频VELDIV是否过大:如果电机转速很低,脉冲频率本身就不高,又设置了很大的分频(如÷128),可能导致每个采样周期内计数值小于1,速度寄存器长期为0。此时应减小VELDIV或延长采样周期(增大LOAD)。
    4. 读取的寄存器是否正确:确保你读取的是QEISPEED,而不是QEICOUNTQEICOUNT是实时变化的中间值,不适合直接用于速度计算。

5.3 索引中断不触发

  • 现象:编码器转了很多圈,但索引中断始终未进入。
  • 排查
    1. 索引信号连接与极性:确认IDX引脚已正确连接并配置为QEI功能。用示波器检查索引脉冲是否产生,其电压幅值和宽度是否符合要求。尝试配置INVI位反转索引信号极性。
    2. 中断使能与全局开关:确认QEIINTEN寄存器中的INTINDEX位已置1。确认NVIC中已使能QEI0中断。确认全局中断已开启(例如调用了__enable_irq())。
    3. 复位模式冲突:如果你设置了RESMODE=0(最大位置复位),索引脉冲不会复位计数器,但中断仍应产生。如果RESMODE=1MAXPOS设置得非常小,可能在索引脉冲到来前,计数器已达到MAXPOS并复位,这可能影响你对索引事件的观察。

5.4 初始化后模块无反应

  • 现象:代码执行后,无论怎么转动编码器,QEIPOS寄存器始终为0。
  • 排查
    1. 时钟是否使能:最基础的错误。检查SYSCTL->RCGCQEI和对应GPIO端口的RCGCGPIO是否已正确置位。务必在使能时钟后插入少量空操作(NOP)或延时,等待时钟稳定再访问外设寄存器。
    2. 引脚复用配置:这是最容易出错的一步。除了设置AFSEL必须正确配置PCTL寄存器,将引脚映射到QEI功能。具体编码值需要查阅数据手册的“Pin Mux Table”(如表27-5),不同引脚、不同功能编码不同。
    3. ENABLE位的顺序:牢记**“先配置,后使能”** 的铁律。所有关键配置(MAXPOS, LOAD, CTL的大部分位)都必须在设置CTL寄存器的ENABLE之前完成。一旦使能,部分配置可能被锁定。
    4. 软件复位:如果怀疑模块处于异常状态,可以尝试通过系统控制模块的SRQEI寄存器对QEI模块进行软件复位,然后重新执行完整的初始化流程。

5.5 性能优化与高级技巧

  • 高速应用:当编码器转速极高时,需注意:
    • 检查FILTCNT不能设置得太大,以免滤除有效边沿。
    • 确保VELDIV设置合理,防止QEICOUNT计数器溢出(32位宽,在80MHz系统时钟和1ms采样下,理论最大脉冲频率很高,通常够用)。
    • 中断服务程序(ISR)要尽可能短小精悍。如果只在速度环中使用速度值,可以考虑使用DMA将QEISPEED定期传输到内存,或者使用定时器溢出中断而非QEI速度中断来触发速度读取和控制计算,以降低中断频率。
  • 多圈绝对位置:在索引复位模式(RESMODE=1)下,QEIPOS记录的是单圈内的绝对位置。如果需要记录多圈,可以在索引中断中,用一个软件计数器(如int32_t multi_turn_count)进行加减(根据方向状态QEISTAT.DIRECTION)。同时,在索引中断中,可以将QEIPOS清零或设为一个已知的偏移值,实现高精度的多圈绝对位置跟踪。
  • 低功耗考虑:在电池供电设备中,如果不需要QEI功能,确保其时钟已禁用(RCGCQEI = 0),并且相关GPIO引脚配置为低功耗状态,以减少静态功耗。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询