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.

[参考译文] TMS570LS1227:eQEP 模块存在主要问题!

Guru**** 2943430 points

Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1018349/tms570ls1227-having-major-problems-with-the-eqep-module

器件型号:TMS570LS1227
主题中讨论的其他器件:HALCOGEN

大家好、我让 eQEP 模块在正交计数模式下与正交编码器一起运行。 我已经设置了一个位置比较中断、该中断将随每个单元位置事件触发、并且我可以每次成功读取位置计数器。

问题是我需要测量设备事件之间的时间,而我一直在尝试使用捕获周期寄存器(QCPRD)而没有成功。 我看到的值在连续读取之间发生了巨大变化,而编码器的波形 非常稳定。 我没有看到任何捕获溢出错误标志(COEF)、但我确实偶尔会看到一个捕获方向错误标志(CDEF)、但有关这意味着什么的信息很少。 我还尝试了 HALCoGen 示例(非 ISR 版本)、得到了相同的结果!

我已经尝试了我能看到的所有内容,您能提供帮助吗?

代码如下。

 

int main (空)

/*用户代码开始(3)*/

 

       /*在 Cortex R4中启用 IRQ 中断*/

       _enable_interrupt_();

 

       gioInit();

       etpwmInit();

       adcInit();

       hetInit();

       QEPInit();

       HAL_DisplayInit();

       HAL_unipolarWaveInit();

 

       /*启用位置计数器*/

       eqepEnableCounter (eqepREG1);

 

       /*启用位置比较*/

       eqepEnablePosnCompare (eqepREG1);

 

       /*启用单位定时器。 *

       eqepEnableUnitTimer (eqepREG1);

       /*启用捕获定时器和捕获周期锁存。 *

       eqepEnableCapture (eqepREG1);

 

 while (1)

      {

        //应用程序代码

      }

 

 

 

/*位置比较中断。 每次 eQEP 位置计数器改变时触发*/

void    eqepNotification (eqepbase_t * eQEP、uint16标志)

   COPY++;

 

   /**加载位置比较值*/

   eqepREG1->QPOSCMP = COPY+1U;

 

   pulsePeriod = eqepREG1->QCPRD;

 

   /**读取位置计数器*/

   编码值= eqepReadPosnCount (eqepREG1);

 

   eqepREG1->QCLR =(uint16) 0xFFFFFFU;

 

 

 

 

 

以下是 eQEP.c

 

#include "eQEP.h"

#include "sys_vim.h"

 

/*函数

*

 

/*用户代码开始(0)*/

/*用户代码结束*/

 

/**@fn void QEPInit (void)

*  @brief 会初始化 eQEP 驱动程序

*

*  此函数用于初始化 eQEP 模块。

*

/* sourceId:eQEP_sourceId_001 */

/* DesignId:eQEP_DesignId_001 */

/*要求:HL_QEP_SR1 */

QEPInit ()

 

/*用户代码开始(1)*/

/*用户代码结束*/

 

 /**-清除位置计数器寄存器  */

 eqepREG1->QPOSCNT = 0x00000000U;

 

 /**-初始化位置计数器值寄存器  */

 eqepREG1->QPOSIINIT = 0x00000000U;

 

 /**-设置最大位置计数器值  */

 eqepREG1->QPOSMAX = 0x000003E7U;

 

 /**-设置初始位置比较值  */

 eqepREG1->QPOSCMP = 0x00000001U;

 

 /**-清除时基  */

 eqepREG1->QUTMR   = 0x00000000U;

 

 /**-配置单位周期寄存器  */

 eqepREG1->QUPRD   = (UINT32) 0x00000000U;

 

 /**-清除看门狗定时器寄存器 */

 eqepREG1->QWDTMR  =  (uint16) 0x00000000U;

 

 /**-配置看门狗周期  */

 eqepREG1->QWDPRD  = (uint16) 0x0000U;

 

/*用户代码开始(2)*/

/*用户代码结束*/

 

 /**-设置解码器控制寄存器

 *    -选择位置计数器模式

 *    -启用/禁用同步输出

 *    -选择同步输出引脚  

 *    -选择外部时钟速率(分辨率)

 *    -启用/禁用交换正交时钟输入

 *    -启用/禁用使用频闪灯对索引脉冲进行门控。

 *    -启用/禁用对 QEPA 输入无效

 *    -启用/禁用对 QEPB 输入无效

 *    -启用/禁用对 QEPI 输入无效

 *    -启用/禁用对 QEPS 输入求反  

 *

 eqepREG1->QDECCTL =(uint16)((uint16)((uint16) eQEP_Quadrature_count << 14U)

                      |(uint16)((uint16) 0U << 13U)

                                  |(uint16)((uint16) eQEP_index_PIN << 12U)

                                  |(uint16)((uint16) eQEP_resolution_2x << 11U)

                                  |(uint16)((uint16) 0U << 10U)

                                  |(uint16)((uint16) 0U << 9U)

                                  |(uint16)((uint16) 0U << 8U)

                                  |(uint16)((uint16) 0U << 7U)                                

                                  |(uint16)((uint16) 0U << 6U)                         

                                  |(uint16)((uint16) 0U << 5U)

                                  |(uint16) 0x0000U);

 

 /**-设置 eQEP 控制寄存器

 *    -选择位置计数器复位模式

 *    -启用和选择位置计数器的神户事件初始化

 *    -启用和选择位置计数器的索引事件初始化

 *    -启用/禁用位置计数器的软件初始化。

 *    -选择位置计数器的选通事件锁存。

 *    -选择位置计数器的索引事件锁存。

 *    -选择 eQEP 捕捉锁存模式

 *                        

 eqepREG1->QEPCTL  =(uint16)((uint16) eQEP_MAX_POSITION << 12U)

                      |(uint16)((uint16) 0U <<11U)

                                  |(uint16)(((uint16) eQEP_directon_DEPENDENT << 10U)

                      |(uint16)((uint16) 0U << 9U)

                                  |(uint16)(((uint16) eQEP_Rising _EDGE << 8U)

                                  |(uint16)((uint16) 1U <<7U)

                                  |(uint16)(((uint16) eQEP_Rising _EDGE << 6U)

                                  |(uint16)(((uint16) eQEP_LATCH_RISE_EDGE << 4U)

                                  |(uint16)(((uint16) eQEP_ON_POSITION COUNTER_READ << 2U)

                                  |(uint16) 0x0000U);

                                  

 /**-设置 eQEP 位置控制寄存器

 *    -启用/禁用位置比较阴影。

 *    -选择位置比较阴影加载模式。

 *    -选择同步输出的极性。

 *    -选择位置比较同步输出脉冲宽度。

 *                  

 eqepREG1->QPOSCTL =(uint16)((uint16) 0U << 15U)

                                  |(uint16)(((uint16) eQEP_QPOSCNT_EQPSCMP << 14U)

                                  |(uint16)(((uint16) eQEP_ACTIVE_HIGH << 13U)

                                  |(uint16)((uint16) 0x000U)                              

                                  |(uint16) 0x0000U);

 

 /**-设置 eQEP 捕捉控制寄存器

 *    -选择捕获定时器时钟预分频器。

 *    -选择单位位置事件预分频器。

 *                               

 eqepREG1->QCAPCTL =(uint16)((uint16) eQEP_PS_32 << 4U)//

                                  |(uint16)((uint16) eQEP_PS_2)//单位事件

                                  |(uint16) 0x0000U);

 

/*用户代码开始(3)*/

/*用户代码结束*/

 

 /**-清除中断标志寄存器 */                                

 eqepREG1->QCLR    =(uint16) 0xFFFFFFU;

 

 /**-设置 eQEP 中断使能寄存器

 *    启用/可拨动 UTO 中断

 *    启用/可拨号 IEL 中断

 *    启用/可拨号 SEL 中断

 *    启用/可调 PCM 中断

 *    启用/可 Diable PCR 中断

 *    启用/可 Diable PCO 中断

 *    启用/可拨号 PCU 中断

 *    启用/可拨号 WTO 中断

 *    启用/可数字 QDC 中断

 *    启用/可拨号 QPE 中断

 *    启用/可拨号 PCE 中断

 *  

 eqepREG1->QEINT   =(uint16)((uint16) 0U << 11U)

                                  |(uint16)((uint16) 0U << 10U)

                                  |(uint16)((uint16) 0U << 9U)

                                  |(uint16)((uint16) 0U << 8U)

                                  |(uint16)((uint16) 0U << 7U)

                                  |(uint16)((uint16) 0U << 6U)

                                  |(uint16)((uint16) 0U << 5U)

                                  |(uint16)((uint16) 0U <<4U)

                                  |(uint16)((uint16) 0U << 3U)       

                                  |(uint16)((uint16) 0U << 2U)

                                  |(uint16)((uint16) 0U << 1U);

 

 /**-清除捕获定时器寄存器 */

 eqepREG1->QCTMR   =(uint16) 0x0000U;

 

 /**-清除捕获周期寄存器*/  

 eqepREG1->QCPRD   =(uint16) 0x0000U;

 

 /**-清除周期锁存寄存器*/                             

 eqepREG1->QCPRDLAT =(uint16) 0x0000U;

 

/*用户代码开始(4)*/

/*用户代码结束*/

 

 /**-清除位置计数器寄存器  */

 eqepREG2->QPOSCNT = 0x00000000U;

 

 /**-初始化位置计数器值寄存器  */

 eqepREG2->QPOSIINIT = 0x00000000U;

 

 /**-设置最大位置计数器值  */

 eqepREG2->QPOSMAX = 0x00000000U;

 

 /**-设置初始位置比较值  */

 eqepREG2->QPOSCMP = 0x00000000U;

 

 /**-清除时基  */

 eqepREG2->QUTMR   = 0x00000000U;

 

 /**-配置单位周期寄存器  */

 eqepREG2->QUPRD   = (UINT32) 0x00000000U;

 

 /**-清除看门狗定时器寄存器 */

 eqepREG2->QWDTMR  =  (uint16) 0x00000000U;

 

 /**-配置看门狗周期  */

 eqepREG2->QWDPRD  = (uint16) 0x0000U;

 

/*用户代码开始(5)*/

/*用户代码结束*/

 

 /**-设置解码器控制寄存器

 *    -选择位置计数器模式

 *    -启用/禁用同步输出

 *    -选择同步输出引脚  

 *    -选择外部时钟速率(分辨率)

 *    -启用/禁用交换正交时钟输入

 *    -启用/禁用使用频闪灯对索引脉冲进行门控。

 *    -启用/禁用对 QEPA 输入无效

 *    -启用/禁用对 QEPB 输入无效

 *    -启用/禁用对 QEPI 输入无效

 *    -启用/禁用对 QEPS 输入求反  

 *

 eqepREG2->QDECCTL =(uint16)((uint16)((uint16) eQEP_DIRECT_COUNT << 14U)

                      |(uint16)((uint16) 0U << 13U)

                                  |(uint16)((uint16) eQEP_index_PIN << 12U)

                                  |(uint16)((uint16) eQEP_resolution_1x << 11U)

                                  |(uint16)((uint16) 0U << 10U)

                                  |(uint16)((uint16) 0U << 9U)

                                  |(uint16)((uint16) 0U << 8U)

                                  |(uint16)((uint16) 0U << 7U)                                

                                  |(uint16)((uint16) 0U << 6U)                                

                                  |(uint16)((uint16) 0U << 5U)

                                  |(uint16) 0x0000U);

 

 /**-设置 eQEP 控制寄存器

 *    -选择位置计数器复位模式

 *    -启用和选择位置计数器的选通事件初始化

 *    -启用和选择位置计数器的索引事件初始化

 *    -启用/禁用位置计数器的软件初始化。

 *    -选择位置计数器的选通事件锁存。

 *    -选择位置计数器的索引事件锁存。

 *    -选择 eQEP 捕捉锁存模式

 *                        

 eqepREG2->QEPCTL  =(uint16)((uint16) eQEP_MAX_POSITION << 12U)

                      |(uint16)((uint16) 0U << 11U)

                                  |(uint16)(((uint16) eQEP_directon_DEPENDENT << 10U)

                      |(uint16)((uint16) 0U << 9U)

                                  |(uint16)(((uint16) eQEP_Rising _EDGE << 8U)

                                  |(uint16)((uint16) 0U << 7U)

                                  |(uint16)(((uint16) eQEP_Rising _EDGE << 6U)

                                  |(uint16)(((uint16) eQEP_LATCH_RISE_EDGE << 4U)

                                  |(uint16)(((uint16) eQEP_ON_POSITION COUNTER_READ << 2U)

                                  |(uint16) 0x0000U);

                                  

 /**-设置 eQEP 位置控制寄存器

 *    -启用/禁用位置比较阴影。

 *    -选择位置比较阴影加载模式。

 *    -选择同步输出的极性。

 *    -选择位置比较同步输出脉冲宽度。

 *                  

 eqepREG2->QPOSCTL =(uint16)((uint16) 0U << 15U)

                                  |(uint16)(((uint16) eQEP_QPOSCNT_EQPSCMP << 14U)

                                  |(uint16)(((uint16) eQEP_ACTIVE_HIGH << 13U)

                                  |(uint16)((uint16) 0x000U)                              

                                  |(uint16) 0x0000U);

 

 /**-设置 eQEP 捕捉控制寄存器

 *    -选择捕获定时器时钟预分频器。

 *    -选择单位位置事件预分频器。

 *                               

 eqepREG2->QCAPCTL =(uint16)((uint16) eQEP_PS_8 << 4U)

                                  |(uint16)((uint16) eQEP_PS_512)

                                  |(uint16) 0x0000U);

 

/*用户代码开始(6)*/

/*用户代码结束*/

 

 /**-清除中断标志寄存器 */                                

 eqepREG2->QCLR    =(uint16) 0xFFFFFFU;

 

 /**-设置 eQEP 中断使能寄存器

 *    启用/可拨动 UTO 中断

 *    启用/可拨号 IEL 中断

 *    启用/可拨号 SEL 中断

 *    启用/可调 PCM 中断

 *    启用/可 Diable PCR 中断

 *    启用/可 Diable PCO 中断

 *    启用/可拨号 PCU 中断

 *    启用/可拨号 WTO 中断

 *    启用/可数字 QDC 中断

 *    启用/可拨号 QPE 中断

 *    启用/可拨号 PCE 中断

 *  

 eqepREG2->QEINT   =(uint16)((uint16) 0U << 11U)

                                  |(uint16)((uint16) 0U << 10U)

                                  |(uint16)((uint16) 0U << 9U)

                                  |(uint16)((uint16) 0U << 8U)

                                  |(uint16)((uint16) 0U << 7U)

                                  |(uint16)((uint16) 0U << 6U)

                                  |(uint16)((uint16) 0U << 5U)

                                  |(uint16)((uint16) 0U <<4U)

                                  |(uint16)((uint16) 0U << 3U)

                                  |(uint16)((uint16) 0U << 2U)

                                  |(uint16)((uint16) 0U << 1U);

 

 /**-清除捕获定时器寄存器 */

 eqepREG2->QCTMR   =(uint16) 0x0000U;

 

 /**-清除捕获周期寄存器*/  

 eqepREG2->QCPRD   =(uint16) 0x0000U;

 

 /**-清除周期锁存寄存器*/                             

 eqepREG2->QCPRDLAT =(uint16) 0x0000U;

 

/*用户代码开始(7)*/

/*用户代码结束*/

 

 

 

 

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

    您好!

    我正在研究您的代码、很快就会回来。