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.

[参考译文] RTOS/TM4C129ENCPDT:正交编码器问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/605225/rtos-tm4c129encpdt-quadrature-encoder-issue

器件型号:TM4C129ENCPDT

工具/软件:TI-RTOS

您好!

我在 Qudrature Encode API 函数中遇到问题。

我在下面的主题中面临相同的问题、

如线程中所述、我使用的代码相同、代码方向和位置正常。速度是唯一的问题。

我将获得低于输出的值。

++++++++ QEI.c:qePosition ={100}++++++

++++++++ QEI.c:qeDirection ={1}++++++

++++++++ QEI.c:qeiVelocity ={0}++++++

此致、

Nimesh

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

    这是我的代码、

    void QEITaskFxn (UARg arg0、UARg arg1)
    {
    uint32_t qeVelocity = 0;
    uint32_t qePosition = 0;
    int32_t qeDirection = 0; 

     //正交编码器(QEI)
    SysCtlPeripheralEnable (SYSCTL_Periph_QEI0);
    GPIOPinConfigure (GPIO_PL1_PHA0);
    GPIOPinTypeQEI (GPIO_PORTL_BASE、GPIO_PIN_1);

    SysCtlPeripheralEnable (SYSCTL_Periph_QEI1);
    GPIOPinConfigure (GPIO_PL2_PHB0);
    GPIOPinTypeQEI (GPIO_PORTL_BASE、GPIO_PIN_2);//

    //禁用正交编码器。
    //
    QEIDisable (QEI0_BASE);
    
    
    QEIConfigure (QEI0_BASE、(QEI_CONFIG_CAPTURE_A_B | QEI_CONFIG_NO_RESET | QEI_CONFIG_QUIVATURE | QEI_CONFIG_NO_SWAP)、10000);
    
    QEIVelocityConfigure (QEI0_BASE、
    
    QEIV0;QEIV_1000 (QEIV0);QEIV_BASE、QEIV_1000 (QEIV_1000);QEIV_1000 (QEIV_1000)
    
    
    
    //
    //启用正交编码器。
    //
    QEIEnable (QEI0_BASE);
    
    //
    //延迟一段时间...
    //
    Task_sleep (1);
    
    //
    读取编码器位置。
    //
    //qeiVelocity = QEIVelocityGet (QEI0_BASE);
    //System_printf ("\r\n++++++++ QEI.c:qeiVelocity ={%d}++++++ \r\n"、qeiVelocity);
    
    while (1)
    {
    
    qePosition = QEIPositionGet (QEI0_BASE);
    System_printf ("\r\n++++++ QEI.c:qePosition ={%d}++++++ \r\n"、qePosition);
    System_flush ();
    
    qeDirection=QEIDirectionGet (QEI0_BASE);
    System_printf ("\r\n++++++ QEI.c:qeDirection ={%d}++++++ \r\n"、qeDirection);
    System_flush ();
    
    qeVelocity = QEIVelocityGet (QEI0_BASE);
    System_printf ("\r\n++++++ QEI.c:qeiVelocity ={%d}++++++ \r\n"、qeiVelocity);
    System_flush ();
    
    Task_sleep (1000);
    }
    
    
    

    此致、

    Nimesh

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

    感受您的痛苦-必须注意、"QEI 代码示例-随"SW-DRL-UG.xxxx"提供-已轻松地证明其简短并"完全避免"(更复杂) QEI-Velocity 函数!   为了公平起见-在这种情况下(非常简短)示例的支持-提供了详细信息:带有函数"QEIConfigure()"的"设置最大位置参数"。   尽管如此,即使是在“按曲线评分”时,“D”的奖励也是慷慨的!

    您和之前到达的海报都报告了"速度问题"-您(两者)是否(更深入)考虑了以下两个问题:"that maximum position"参数及其"related parameter" w/在"QEIVelocityConfigure()?"中    您的代码列出了两个不同的值-并且完全没有提示-如何选择(其中一个)!    这不可能是好的-可以吗?

    如果这些参数为:

    • 设置过高
    • 设置过低
    • 设置正确

    这证明了(您)持续分析的"良好起点"-它不是吗?    必须提供"一些"细节、尤其是"重要细节"、以最大限度地提高"帮助者"的有效性。

    您可以选择更改这些参数、并在"while loop"中"扩大"延迟时间、然后查看"速度函数"(然后)是否开始执行...

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

    您好 CB1、

    感谢您的回复。

    我正在应用你的建议,但我有以下疑问。 如有可能、请详细说明。

    在 QEIVelocityConfigure (uint32_t ui32Base、uint32_t ui32PreDiv、uint32_t ui32Period)中、最后参数"ui32Period"以毫秒或秒为单位。

    2.在 QEIConfigure (uint32_t ui32Base、uint32_t ui32Config、uint32_t ui32MaxPosition )中、参数 "ui32MaxPosion"在速度测量中受影响? 如果是, 它如何影响速度?

    此致、

    Nimesh

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

    我的朋友-您宣布"怀疑!"    您是否(几乎)在一个荒芜的南海岛上独自(被船毁)来到了一艘时尚的船只、并提供了"食物和水"。   你有疑问吗?

    在 QEIVelocityConfigure (uint32_t ui32Base、uint32_t ui32PreDiv、 uint32_t  ui32Period)中、最后参数"ui32Period"以毫秒或秒为单位。

    也不会!   (怀疑第1层)  最后一个参数是"系统时钟节拍"。   因此、您的 MS 和 S "断言"都失败。   

    在 QEIConfigure (uint32_t ui32Base、uint32_t ui32Config、 uint32_t ui32MaxPosition) 中、Last Paramete "ui32MaxPosion" 在速度测量中受影响? 如果是, 它如何影响速度?

    这次您正确地注意到(pesky)最后一个参数。    该参数应指定、"电机旋转一圈期间到达的编码器脉冲数"。   您必须理解(或至少接受)这一点。   (怀疑第2层)   因此、"要计算速度"-您可以注意到、"真实速度"是通过以下公式计算的:

    "QEIVelocityGet ()的返回值(即在由"QEIVelocityConfigure()"指定的时间范围内检测到的脉冲数)、后跟几个数学运算、这些运算会"标准化"速度计算。)    如果"不清楚"、请多次阅读。   

    对于"额外信用"-为什么 "您"(现在)不提供"少数"数学运算来将"QEIVelocityGet ()的返回值转换为(Rps 或 RPM)。   (因此我/他人可能会产生"怀疑"。)

    您授予的" 验证答案"可能会使我无法在芝加哥的一个主要街道上进行访问-寻求"捐赠"。    (需要一些资金才能"远离"被遗弃的岛屿...)

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

    您好 CB1、

    感谢您的回复。

    现在、我获得了正确的速度。 这是我的工作代码。

    /!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //
    //正交编码器(QEI)
    SysCtlPeripheralEnable (SYSCTL_Periph_QEI0);
    GPIOPinConfigure (GPIO_PL1_PHA0);
    GPIOPinTypeQEI (GPIO_PORTL_BASE、GPIO_PIN_1);
    
    SysCtlPeripheralEnable (SYSCTL_Periph_QEI1);
    GPIOPinConfigure (GPIO_PL2_PHB0);
    GPIOPinTypeQEI (GPIO_PORTL_BASE、GPIO_PIN_2);
    
    GPIOPinConfigure (GPIO_PL3_IDX0);
    GPIOPinTypeQEI (GPIO_PORTL_BASE、GPIO_PIN_3);
    /!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //
    
    void QEITaskFxn (UARg arg0、UARg arg1)
    {
    uint32_t qeVelocity = 0;
    uint32_t qePosition = 0;
    int32_t qeDirection = 0;
    
    //禁用正交编码器。
    QEIDisable (QEI0_BASE);
    
    QEIConfigure (QEI0_BASE、(QEI_CONFIG_CAPTURE_A_B | QEI_CONFIG_RESET_IDX | QEI_CONFIG_POSIONY | QEI_CONFIG_SWAP)、1000);
    
    //配置速度。
    QEIVelocityConfigure (QEI0_BASE、QEI_VELDIV_1、30000000);
    
    //注意:对于“ui32Period”,TM4C129NCPDT 支持120MHz 运行,因此我必须采用
    //ui32Period = 1/4 (120MHz)= 30000000
    
    //位置设置。
    QEIPositionSet (QEI0_BASE、0);
    
    //启用正交编码器速度。
    QEIVelocityEnable (QEI0_BASE);
    
    //启用正交编码器。
    QEIEnable (QEI0_BASE);
    
    //延迟一段时间...
    Task_sleep (1000);
    
    while (1)
    {
    //读取编码器位置。
    qePosition = QEIPositionGet (QEI0_BASE);
    System_printf ("\r\n++++++++ QEI.c:qePosition ={%d}++++++ \r\n"、qePosition);
    System_flush ();
    
    //读取编码器方向。
    qeDirection=QEIDirectionGet (QEI0_BASE);
    System_printf ("\r\n++++++++ QEI.c:qeDirection ={%d}++++++ \r\n"、qeDirection);
    System_flush ();
    
    //读取编码器速度。
    QeiVelocity = QEIVelocityGet (QEI0_BASE);
    System_printf ("\r\n++++++++ QEI.c:qeiVelocity ={%d}++++++ \r\n"、qeiVelocity);
    System_flush ();
    
    Task_sleep (1000);
    }
    
    
    

    此致、

    Nimesh

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

    您好、Nimesh、

    你们在解决问题方面的坚持不懈精神感到自豪和高兴。   (主要是您自己-有一些/有一些指导。)   非常好,就是这样!

    然而-我们不应该"深入挖掘"-现在您已经从"速度函数"中获得(部分)响应了吗?

    您在前面采用了值10K (10、000) w/in "QEIConfig()"-而今天的帖子显示该值已降至1K。   (10分之一!)   我们是否可以问:"如何确定这一新价值?"   您是否(真正)在电机旋转一周期间实现1K 编码器脉冲?

    另外,今天的 QEIVelocityConfig()揭示了30M (30,000,000)-过去是1K (1,000)-这是一个(真正)重大的变化-它不是吗?   在前面的一篇文章中、我们发现该参数的单位是"系统时钟节拍"、因此您使用30/120可得到1/4秒、或250ms 作为"速度测量周期"。   (以及之前的-建议您"考虑"更改"您使用"太小"(1K)参数的效果。)

    很明显-添加的"光圈"(速度函数计算的时间)使您能够成功。   由于您的"测量孔径(或窗口)为1/4秒"-您是否必须将该结果乘以4才能实现(最有可能的) RPS?   (电机每秒转数)  、然后再乘以60 (即 RPS * 60)、得出 RPM。   (每 分钟电机旋转数)  您还必须注意-"1,000参数(在 QEIConfig()中)也可能影响此类计算。   您可以通过"速度控制"电机旋转来确定这一点、并观察"速度"功能的输出。

    请注意、带电机控制的情况下- RPM 占主导地位-和(其他)测量(但不包括 RPS)是"异常"、不太可能被"普遍"认可...  (您可能希望向畜群中心移动"更多"...)