This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMDSIDK437X:eQEP 正交编码器问题

Guru**** 2595805 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/586693/tmdsidk437x-eqep-quadrature-encoder-issue

器件型号:TMDSIDK437X

您好!

我尝试使用 AM437x IDK 的 PRU1_0从 eQEP 读取正交编码器脉冲。

通过 CCS 将固件加载到 PRU1_0后、我可以从 PWMSS0.eQEP_QPOSLAT 中读取任何内容。

我尝试在 uboot 模式下停止 CortexA9、以防止内核和器件树的发生变化、并使用 GEL 文件配置 PWMSS0_eQEP 的寄存器、但仍然看不到 eQEP_QPOSLAT 有任何变化。 (但我可以看到单位计时器计数)

请帮助我了解我错过了哪些内容。 谢谢!


以下是我使用的代码和 GEL 文件:

我以335x 的 PID 控制演示(http://www.ti.com/tool/tidep0073)为参考、并将 CM_PER_PWMSS0_CLKCTRL 的地址更改为0x44DF8C38。
由于我尚未在 AM437x-idk-evm.dts 和 McASP0中看到 LCDC 和 HDMI 已禁用、因此我只需将 eQEP0A_IN、eQEP0B_IN、eQEP0_INDEX 和 eQEP0_STROBE 的引脚多路复用器设置为(PIN_INPUT_PULLUP | MUX_MODE1)。


下面是用于配置 PWMSS0_eQEP 的 GEL 文件:

菜单项"PWMSS0_eQEP"

热菜单 PWMSS0_eQEP_Init()

PWMSS0_eQEP_PINMUX();
PWMSS0_eQEP_Enable();
PWMSS0_eQEP_config();

热菜单 PWMSS0_eQEP_PINMUX()

*((unsigned int*) 0x44E109A0)= 0x60001;// input_pullup | MODE1
*((unsigned int*) 0x44E109A4)= 0x60001;// input_pullup | MODE1
*((unsigned int*) 0x44E109A8)= 0x60001;// input_pullup | MODE1
*((unsigned int*) 0x44E109AC)= 0x60001;// input_pullup | MODE1

热菜单 PWMSS0_eQEP_Enable()

GEL_TextOut ("\t\t**** PWMSS0 eQEP 启用步骤1正在进行****\n"、"输出"、1、1);
*((unsigned int*) 0x44DF0810)|= 0x2;//rm_per_RSTCTRL。 断言复位
*((unsigned int*) 0x44DF0810)&= 0xFFFFFFFD;//rm_per_RSTCTRL。 清除复位
GEL_TextOut ("\t\t**** PWMSS0 eQEP 使能步骤1完成****\n"、"输出"、1、1);

GEL_TextOut ("\t\t**** PWMSS0 eQEP 使能步骤2正在进行****\n"、"输出"、1、1);
*((unsigned int*) 0x44DF8C38)|= 0x2;//PRCM_CM_PER_PWMSS0_CLKCTRL

GEL_TextOut ("\t\t**** PWMSS0 eQEP 使能步骤2完成****\n"、"输出"、1、1);

热菜单 PWMSS0_eQEP_config()

/*在四线模式下设置为默认值:PWMSS0.eQEP_QDECCTL */
*((unsigned int*) 0x483001A8)= 0x00;

/*启用装置定时器[1]
*在设备超时时时启用捕捉锁存[2]
*启用正交位置计数器[3]
*启用位置计数器的软件加载[7]
*在最大位置上重置位置计数器[12]:
* PWMSS0.eQEP_QEPCTL
*
*((unsigned int*) 0x483001AA)= 0x308E;/* 0x108E */

/*禁用 eQEP 捕捉:PWMSS0.eQEP_QCAPCTL *
/*((unsigned int*) 0x483001AC)= 0x0;*/

/*设置 eQEP 捕捉定时器和 UPEVNT 的预分频器*/
/*注意:在更改预分频器之前必须禁用 eQEP 捕捉单元*/
*((unsigned int*) 0x483001AC)= 0x0073;

/*启用 eQEP 捕捉*/
*((unsigned int*) 0x483001AC)|= 0x8000;

/*启用单元超时中断:PWMSS0.eQEP_QEINT */
*((unsigned int*) 0x483001B0)|= 0x0800;

/*清除编码器计数:PWMSS0.eQEP_QPOSCNT_bit.QPOSCNT *
*((unsigned int*) 0x48300180)= 0x00000000;

//设置最大编码器计数:PWMSS0.eQEP_QPOSMAX_bit.QPOSMAX *
*((unsigned int*) 0x48300188)= 0xFFFFFFFF;

/*清除计时器:PWMSS0.eQEP_QUTMR_bit.QUTMR */
*((unsigned int*) 0x4830019C)= 0x00000000;

/*设置单元定时器周期计数:PWMSS0.eQEP_QUPRD_BIT.QUPRD *
/* QUPRD =周期* 100MHz */
*((unsigned int*) 0x483001A0)= 0x007FFFFF;//(0x007FFFFF~1/12s)(0x000186A0~1ms)@ 100MHz

/*清除所有中断位:PWMSS0.eQEP_QCLR */
*((unsigned int*) 0x483001B4)= 0xFFFF;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好

    我无法访问您的链接。 您正在使用什么 SDK、SDK 版本和 SDK 项目?
    有关 PRU 编程的一些信息、请访问 processors.wiki.ti.com/.../PRU-ICSS_Getting_Started_Guide

    David
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 David:

    感谢您的回复。

    我使用"ti-processor-sdk-linux-rt-AM437X-EVM-03.02.00.05"、我的 CCS 为 v7、我 没有使用 SDK 而是 CCS 来构建我的 PRU 程序。

    该链接是该项目的关键文档: http://www.ti.com/tool/tidep0073

    我以两个函数(init_eQEP ()和 get_enc_rpm ())为例,并对它们进行修改以适应 AM437x,此外,我还配置了 eqep0A、eqep0B、eqep0_index 和 eqep0_strobe 的 pinmux。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Leif、

    运行 GEL 脚本并验证时钟是否已启用后、您能否读回 CLKCTRL 寄存器的内容(使用 CCS 存储器浏览器)? 原始 PRU C 程序轮询等待时钟启用的值、然后再继续。 如果时钟尚未打开、那么写入寄存器的任何内容都将被忽略。

    在设置其余配置的同时、您的时钟仍在转换(尚未完全启用)。 请添加一种检查时钟启用转换是否已完成的方法、然后再继续执行 GEL 脚本。

    Jason Reeder