查看: 3146|回复: 2

[求助] 请教一下rt1062的qtimer对正交编码器的级联计数问题

[复制链接]

该用户从未签到

3

主题

7

帖子

0

注册会员

Rank: 2

积分
67
最后登录
2022-3-7
发表于 2021-9-23 09:00:40 | 显示全部楼层 |阅读模式
使用场景: 用qtimer对正交编码器进行计数, 需要32bit,所以采用两个qtimer级联的方式。

代码设置如下:目前存在几个问题,需要请教下:

1: 此时怎样对正交编码器的方向进行确认? 发现timer_0(第一级qtimer)减到0之后,就不再变化了;

2:第一级timer 计数到最大值后(65535), 有时第二级timer计数没有加1, 不知道这个是什么原因?


void init_qtimer()
{
        qtmr_config_t qtmrConfig;
        /*
         * qtmrConfig.debugMode = kQTMR_RunNormalInDebug;
         * qtmrConfig.enableExternalForce = false;
         * qtmrConfig.enableMasterMode = false;
         * qtmrConfig.faultFilterCount = 0;
         * qtmrConfig.faultFilterPeriod = 0;
         * qtmrConfig.primarySource = kQTMR_ClockDivide_2;
         * qtmrConfig.secondarySource = kQTMR_Counter0InputPin;
         */
        QTMR_GetDefaultConfig(&qtmrConfig);

        /* Enable at the NVIC */
        //EnableIRQ(QTMR_IRQ_ID);

        qtmrConfig.primarySource = BOARD_FIRST_QTMR_CHANNEL;
        qtmrConfig.secondarySource = BOARD_SECOND_QTMR_CHANNEL;
        QTMR_Init(TMR3, BOARD_FIRST_QTMR_CHANNEL, &qtmrConfig);

        /* Init the second channel to use output of the first channel as we are chaining the first channel
         * and the second channel */
        qtmrConfig.primarySource = kQTMR_ClockCounter0Output;
        qtmrConfig.secondarySource = kQTMR_Counter1InputPin;
        QTMR_Init(TMR3, BOARD_SECOND_QTMR_CHANNEL, &qtmrConfig);

        QTMR_SetTimerPeriod(TMR3, BOARD_FIRST_QTMR_CHANNEL, 65535);
        QTMR_SetTimerPeriod(TMR3, BOARD_SECOND_QTMR_CHANNEL, 65535);

        //TMR3->CHANNEL[BOARD_FIRST_QTMR_CHANNEL].CNTR = 0;
        //TMR3->CHANNEL[BOARD_SECOND_QTMR_CHANNEL].CNTR = 0;

        /* Enable the second channel compare interrupt */
        //QTMR_EnableInterrupts(TMR3, BOARD_SECOND_QTMR_CHANNEL, kQTMR_CompareInterruptEnable);

        /* Start the second channel in cascase mode, chained to the first channel as set earlier via the primary source
         * selection */
        QTMR_StartTimer(TMR3, BOARD_SECOND_QTMR_CHANNEL, kQTMR_CascadeCount);

        /* Start the first channel to count the quad count */
        QTMR_StartTimer(TMR3, BOARD_FIRST_QTMR_CHANNEL, kQTMR_QuadCountMode);
}

回复

使用道具 举报

该用户从未签到

8

主题

38

帖子

0

中级会员

Rank: 3Rank: 3

积分
382
最后登录
2025-3-3
发表于 2021-9-24 14:51:08 | 显示全部楼层
  1. #include "qtimer_enc.h"
  2. #include "fsl_debug_console.h"
  3. #include "fsl_iomuxc.h"

  4. void BOARD_InitQtimerPins()
  5. {
  6.           IOMUXC_SetPinMux(IOMUXC_GPIO_AD_06_TMR4_TIMER2,0);
  7.           IOMUXC_SetPinMux(IOMUXC_GPIO_AD_04_TMR4_TIMER0,0);
  8. }
  9. void Qtimer_Cascade_Mode()
  10. {
  11.     qtmr_config_t qtmrConfig;
  12.    
  13.     QTMR_GetDefaultConfig(&qtmrConfig);
  14.     qtmrConfig.primarySource = kQTMR_ClockCounter0Output;  
  15.     qtmrConfig.secondarySource = kQTMR_Counter0InputPin;     
  16.     QTMR_Init(TMR4, kQTMR_Channel_1, &qtmrConfig);
  17.     QTMR_Deinit(TMR4, kQTMR_Channel_1);           
  18.     QTMR_Init(TMR4, kQTMR_Channel_1, &qtmrConfig);
  19.     TMR4->CHANNEL[kQTMR_Channel_1].CSCTRL = 0;
  20.           TMR4->CHANNEL[kQTMR_Channel_1].COMP1 = 0XFFFF;
  21.     QTMR_StartTimer(TMR4, kQTMR_Channel_1, kQTMR_CascadeCount);
  22.           
  23. }
  24. void qtimer_quad_init()
  25. {
  26.           BOARD_InitQtimerPins();
  27.     qtmr_config_t qtmrConfig;
  28.    
  29.     QTMR_GetDefaultConfig(&qtmrConfig);
  30.     qtmrConfig.primarySource = kQTMR_ClockCounter0InputPin;  //通道A
  31.     qtmrConfig.secondarySource = kQTMR_Counter2InputPin;     //通道B
  32.     QTMR_Init(TMR4, kQTMR_Channel_0, &qtmrConfig);           //第一次初始化便于打开时钟
  33.     QTMR_Deinit(TMR4, kQTMR_Channel_0);                      //复位外设
  34.     QTMR_Init(TMR4, kQTMR_Channel_0, &qtmrConfig);           //重新初始化设置正确的参数
  35.     TMR4->CHANNEL[kQTMR_Channel_0].CSCTRL = 0;
  36.           TMR4->CHANNEL[kQTMR_Channel_0].COMP1 = 0XFFFF;

  37.     QTMR_StartTimer(TMR4, kQTMR_Channel_0, kQTMR_QuadCountMode);
  38.           Qtimer_Cascade_Mode();
  39.        
  40. }

  41. uint32_t qtimer_quad_get()
  42. {
  43.     return (QTMR_GetCurrentTimerCount(TMR4, kQTMR_Channel_0) + QTMR_GetCurrentTimerCount(TMR4, kQTMR_Channel_1) * 65535);
  44. }
复制代码




试试这个,正转增大,反转减小
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

7

帖子

0

注册会员

Rank: 2

积分
67
最后登录
2022-3-7
 楼主| 发表于 2021-9-26 00:22:09 | 显示全部楼层
嗯,刚才试了几次,确实没有跳变的情况,我再多测试测试,谢谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-19 03:54 , Processed in 0.086627 second(s), 21 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表