使用 NXP RT1170 的 QDC 外设与增量编码器获取电机转子位置

关键字 :NXPRT1170

1.概述

2.正交编码器信号介绍

3.RT1170 QDC 解码器介绍

4.初始化代码

5.实物连接图

6.测试结果

7.参考资料


  1. 概述

    在 FOC 电机控制中,为了能产生最大的转矩,定子电流产生的磁链需要与转子永磁体磁链成 90 度,定子磁链可以通过电压矢量来控制磁链的方向,但转子角度需要通过外部编码器获取,比如增量编码器、绝对值编码器、霍尔编码器,本文讲诉如何通过增量编码器获取电机转子位置,NXP  RT1170 的 QDC 外设可以解码增量编码器的正交信号,提供转子旋转方向和角度信息。

  1. 正交编码器信号介绍

      正交编码器输出 A、B、Z 信号,3 个信号都为方波信号,当电机正向旋转时,A 信号超前 B 信号 90 度,反转时 B 信号超前 A 信号 90度,Z 信号为归零信号,转子转一圈产生一瞬间的脉冲信号,主要用于圈数计数与 A、B 信号的脉冲数归零,下图为编码器 A、B 信号示意图,图片来自 RT1170 参考手册。

  1. RT1170 解码器介绍

       RT1170 的 QDC 外设检测  A、B 信号边沿,判断相位关系,对位置寄存器进行加或者减操作,当反向时,寄存器 CTRL2 的 DIR 位给出方向信息,RT1170 QDC 具有 32bit 的 POS 位置寄存器,可以通过模值寄存器 MOD、初始值寄存器 INT 设置其能计数的最大最小范围, QDC 在系统中的框图和其内部框图如下所示,AB 信号先通过 XBAR 桥接电路接至 QDC 外设,QDC 对AB 信号滤波后送至解码电路,同时可以用 AB 信号作为定时器捕获信号,用于测量转子速度。




  1. 初始化代码

       使用 RT1170 的 driver_examples,工程为 SDK 中的 SDK_2_11_1_MIMXRT1170-EVK\boards\evkmimxrt1170\driver_examples\enc\basic\cm7 目录下的工程,

在 BOARD_InitPins() 函数中对 GPIO 口进行初始化,编码器信号分别连接至 GPIO_DISP_B2_10、GPIO_DISP_B2_11、GPIO_DISP_B2_12。

void BOARD_InitPins(void) {
CLOCK_EnableClock(kCLOCK_Iomuxc); /* LPCG on: LPCG is ON. */

IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_24_LPUART1_TXD, /* GPIO_AD_24 is configured as LPUART1_TXD */
0U); /* Software Input On Field: Input Path is determined by functionality */
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_25_LPUART1_RXD, /* GPIO_AD_25 is configured as LPUART1_RXD */
0U); /* Software Input On Field: Input Path is determined by functionality */
IOMUXC_SetPinMux(
IOMUXC_GPIO_DISP_B2_10_XBAR1_INOUT38, /* GPIO_DISP_B2_10 is configured as XBAR1_INOUT38 */
1U); /* Software Input On Field: Force input path of pad GPIO_DISP_B2_10 */
IOMUXC_SetPinMux(
IOMUXC_GPIO_DISP_B2_11_XBAR1_INOUT39, /* GPIO_DISP_B2_11 is configured as XBAR1_INOUT39 */
1U); /* Software Input On Field: Force input path of pad GPIO_DISP_B2_11 */
IOMUXC_SetPinMux(
IOMUXC_GPIO_DISP_B2_12_XBAR1_INOUT40, /* GPIO_DISP_B2_12 is configured as XBAR1_INOUT40 */
1U); /* Software Input On Field: Force input path of pad GPIO_DISP_B2_12 */

IOMUXC_GPR->GPR21 = ((IOMUXC_GPR->GPR21 &
(~(IOMUXC_GPR_GPR21_IOMUXC_XBAR_DIR_SEL_38_MASK | IOMUXC_GPR_GPR21_IOMUXC_XBAR_DIR_SEL_39_MASK | IOMUXC_GPR_GPR21_IOMUXC_XBAR_DIR_SEL_40_MASK))) /* Mask bits to zero which are setting */
| IOMUXC_GPR_GPR21_IOMUXC_XBAR_DIR_SEL_38(0x00U) /* IOMUXC XBAR_INOUT38 function direction select: 0x00U */
| IOMUXC_GPR_GPR21_IOMUXC_XBAR_DIR_SEL_39(0x00U) /* IOMUXC XBAR_INOUT39 function direction select: 0x00U */
| IOMUXC_GPR_GPR21_IOMUXC_XBAR_DIR_SEL_40(0x00U) /* IOMUXC XBAR_INOUT40 function direction select: 0x00U */
);
}
//XBAR 配置:
XBARA_Init(XBARA1);
XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputIomuxXbarInout38, kXBARA1_OutputDec1Phasea);
XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputIomuxXbarInout39, kXBARA1_OutputDec1Phaseb);
XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputIomuxXbarInout40, kXBARA1_OutputDec1Index);


//ENC 配置:
/* Initialize the ENC module. */
ENC_GetDefaultConfig(&mEncConfigStruct);
ENC_Init(DEMO_ENC_BASEADDR, &mEncConfigStruct);
ENC_DoSoftwareLoadInitialPositionValue(DEMO_ENC_BASEADDR); /* Update the position counter with initial value. */


  1. 实物连接图
      A 信号接到 J25 3 引脚,B 信号接到 J25 1 引脚,Z 信号接到 J9 3 脚,编码器电源接入 5 V



      6. 测试结果
           IAR DEBUG 后,在 IAR live Watch 窗口中查看 mCurPosValue 变量,正向旋转时 mCurPosValue 增加,反向旋转时 mCurPosValue 减少。



   7. 参考资料

    参考手册 IMXRT1170RM.pdf

      i.MX RT1170 Processor Reference Manual

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论