查看: 2106|回复: 0

[分享] RT1064学习笔记(2)--编码器例程(Encoder Demo)

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3299

    主题

    6546

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32024
    最后登录
    2024-4-25
    发表于 2020-5-13 16:52:01 | 显示全部楼层 |阅读模式
    RT1064学习笔记(2)--编码器例程(Encoder Demo)


    RT1064之编码器例程
    Ps:本例程主要作用是,展示如何使用QTIMER模块来实现正交解码。
    主板为:逐飞RT1064 + 母板


    一,QTMR—四路通道定时器
    1)简介:与 PIT(周期中断定时器)和 GPT(通用定时器)相比 QTMR 定时器(Quad Timer) 功能更
    强大。 第一, RT1052 拥有 4 个片上 QTMR 定时器模块,每个 QTMR 定时器模块包含四个
    通道,每个通道都可以单独作为一个定时器使用,每个通道都可触发中断可产生 DMA 请
    求。 QTMR 最多提供 16 个定时器。第二, QTMR 模块的每个通道可以配置为多种工作模
    式。


    2)工作模式介绍(只介绍正交解码):正交编码模式( Quadrature-Count Mode) , 正交编码模式用于获得编码器转动角度,编码器的 PHASEA 和 PHASEB 分别连接到定时器的主计数源(primary count source)
    和辅助计数源。


    3)QTMR定时器有四个模块,每个模块有四个不同的通道


    4)代码
    1. <font size="3" face="微软雅黑"> //一个QTIMER可以 创建两个正交解码
    2. //初始化 QTIMER_1 A相使用QTIMER1_TIMER0_C0 B相使用QTIMER1_TIMER1_C1
    3.     qtimer_quad_init(QTIMER_1,QTIMER1_TIMER0_C0,QTIMER1_TIMER1_C1);
    4.    
    5.     //初始化 QTIMER_1 A相使用QTIMER1_TIMER2_C2 B相使用QTIMER1_TIMER3_C24
    6.     qtimer_quad_init(QTIMER_1,QTIMER1_TIMER2_C2,QTIMER1_TIMER3_C24);

    7.     qtimer_quad_init(QTIMER_2,QTIMER2_TIMER0_C3,QTIMER2_TIMER3_C25);
    8.     qtimer_quad_init(QTIMER_3,QTIMER3_TIMER2_B18,QTIMER3_TIMER3_B19);

    9.     //将C0与 D0使用杜邦线链接起来
    10.     //将C2与 D1使用杜邦线链接起来
    11.     //将C3与 D2使用杜邦线链接起来
    12.     //将B18与 D3使用杜邦线链接起来
    13.         
    14.     //将C1 C3 C24 B19 接地,可以看到采集到的数据为5.
    15.    
    16.     //如果直接连接编码器的A B相,那么则可以直接采集编码器数据
    17. </font>
    复制代码
    5)QTIMER正交解码初始化
    1. <font size="3" face="微软雅黑">//-------------------------------------------------------------------------------------------------------------------
    2. //  @brief      QTIMER正交解码初始化
    3. //  @param      qtimern         选择QTIMER模块(QTIMER_1、QTIMER_2)
    4. //  @param      phaseA          选择正交解码 A端口
    5. //  @param      phaseB          选择正交解码 B端口
    6. //  @return     void
    7. //  Sample usage:                                qtimer_quad_init(QTIMER_1, QTIMER1_TIMER0_C0,QTIMER1_TIMER1_C1);
    8. //-------------------------------------------------------------------------------------------------------------------
    9. void qtimer_quad_init(QTIMERN_enum qtimern, QTIMER_PIN_enum phaseA, QTIMER_PIN_enum phaseB)
    10. </font>
    复制代码
    6)QTIMER引脚枚举(部分展示)
    1. <font size="3" face="微软雅黑">QTIMER1_TIMER0_C0 =1*12+3*0,                                                                                        //定时器0 同一时间只能有一个引脚与定时器相关联
    2.     QTIMER1_TIMER1_C1 =1*12+3*1,                                            //定时器1 同一时间只能有一个引脚与定时器相关联
    3.     QTIMER1_TIMER2_C2 =1*12+3*2,                                            //定时器2 同一时间只能有一个引脚与定时器相关联
    4.     QTIMER1_TIMER3_C24=1*12+3*3,                                            //定时器3 同一时间只能有一个引脚与定时器相关联
    5. </font>
    复制代码
    二,PWM——输出捕获
    1)代码
    1. <font size="3" face="微软雅黑">//pwm__int 初始化代码
    2.     pwm_init(PWM1_MODULE3_CHB_D1 , 50, 5000);
    3.     pwm_init(PWM1_MODULE3_CHA_D0 , 50, 5000);
    4.     pwm_init(PWM2_MODULE3_CHB_D3 , 50, 5000);
    5.     pwm_init(PWM2_MODULE3_CHA_D2 , 50, 5000);
    6. </font>
    复制代码
    2)zf_pwm.c 中的初始化代码
    1. <font size="3" face="微软雅黑">//-------------------------------------------------------------------------------------------------------------------
    2. //  @brief      PWM初始化
    3. //  @param      pwmch       PWM通道号及引脚
    4. //  @param      freq        PWM频率
    5. //  @param      duty        PWM占空比
    6. //  @return     void
    7. //  Sample usage:           pwm_init(PWM1_MODULE0_CHB_D13, 50, 5000);     //初始化PWM1  子模块0 通道B 使用引脚D13  输出PWM频率50HZ   占空比为百分之 5000/PWM_DUTY_MAX*100
    8. //                                                        PWM_DUTY_MAX在fsl_pwm.h文件中 默认为50000
    9. //-------------------------------------------------------------------------------------------------------------------
    10. void pwm_init(PWMCH_enum pwmch, uint32 freq, uint32 duty)
    11. </font>
    复制代码
    3)注意事项
    1.关于子模块的解释 具体参考 zf_pwm.h
    1. <font size="3" face="微软雅黑">同一个子模块不同通道只能输出相同频率的PWM,占空比可设置不同
    2. 例如
    3. //PWM1_MODULE0_CHB与PWM1_MODULE0_CHA属于同一个子模块,频率只能一样,但是占空比可以不一样
    4. //PWM1_MODULE0_CHA_D12与PWM1_MODULE1_CHA_D14虽然是同一个PWM模块但是属于不同的子模块可以输出不同频率的PWM
    5. </font>
    复制代码
    4)pw_pwm.h(部分展示)
    1. <font size="3" face="微软雅黑">PWM1_MODULE0_CHB_D13=1*40+5*0,  PWM1_MODULE0_CHB_E24,   //PWM1 子模块0 通道B  引脚可选范围
    2.   PWM1_MODULE0_CHA_D12=1*40+5*1,  PWM1_MODULE0_CHA_E23,   //PWM1 子模块0 通道A  引脚可选范围
    3.    
    4.   PWM1_MODULE1_CHB_D15=1*40+5*2,  PWM1_MODULE1_CHB_E26,   //PWM1 子模块1 通道B  引脚可选范围
    5.   PWM1_MODULE1_CHA_D14=1*40+5*3,  PWM1_MODULE1_CHA_E25,   //PWM1 子模块1 通道A  引脚可选范围
    6.    
    7.   PWM1_MODULE2_CHB_D17=1*40+5*4,  PWM1_MODULE2_CHB_E28,   //PWM1 子模块2 通道B  引脚可选范围
    8.   PWM1_MODULE2_CHA_D16=1*40+5*5,  PWM1_MODULE2_CHA_E27,   //PWM1 子模块2 通道A  引脚可选范围

    9.    PWM1_MODULE3_CHB_B11=1*40+5*6,  PWM1_MODULE3_CHB_C17,   PWM1_MODULE3_CHB_D1, PWM1_MODULE3_CHB_D25,   PWM1_MODULE3_CHB_E13,//PWM1 子模块3 通道B  引脚可选范围
    10.     PWM1_MODULE3_CHA_B10=1*40+5*7,  PWM1_MODULE3_CHA_C16,   PWM1_MODULE3_CHA_D0,    PWM1_MODULE3_CHA_D24,   PWM1_MODULE3_CHA_E12,//PWM1 子模块3 通道A  引脚可选范围
    11. </font>
    复制代码
    三,while循环内执行的代码
    1)
    1. <font size="3" face="微软雅黑">while(1)
    2.     {
    3.         //读取编码器计数值
    4.         encoder1 = qtimer_quad_get(QTIMER_1,QTIMER1_TIMER0_C0 );
    5.         encoder2 = qtimer_quad_get(QTIMER_1,QTIMER1_TIMER2_C2 );
    6.         encoder3 = qtimer_quad_get(QTIMER_2,QTIMER2_TIMER0_C3 );
    7.         encoder4 = qtimer_quad_get(QTIMER_3,QTIMER3_TIMER2_B18);
    8.         
    9.         //清除
    10.         qtimer_quad_clear(QTIMER_1,QTIMER1_TIMER0_C0 );
    11.         qtimer_quad_clear(QTIMER_1,QTIMER1_TIMER2_C2 );
    12.         qtimer_quad_clear(QTIMER_2,QTIMER2_TIMER0_C3 );
    13.         qtimer_quad_clear(QTIMER_3,QTIMER3_TIMER2_B18);
    14.         
    15.         systick_delay_ms(100);
    16.         
    17.     }
    18. </font>
    复制代码
    2) QTIMER正交解码计数获取函数 qtimer_quad_get()
    1. <font size="3" face="微软雅黑">//-------------------------------------------------------------------------------------------------------------------
    2. //  @brief      QTIMER正交解码计数获取
    3. //  @param      qtimern         选择QTIMER模块(QTIMER_1、QTIMER_2)
    4. //  @param      phaseA          选择正交解码 A端口 这个参数需要与qtimer_quad_init函数第二个参数一致
    5. //  @return     int16                        返回脉冲数
    6. //  Sample usage:                                qtimer_quad_get(QTIMER_1, QTIMER1_TIMER0_C0);
    7. //-------------------------------------------------------------------------------------------------------------------
    8. int16 qtimer_quad_get(QTIMERN_enum qtimern, QTIMER_PIN_enum phaseA)
    9. </font>
    复制代码
    3) QTIMER正交解码计数清零函数 qtimer_quad_clear()
    1. <font size="3" face="微软雅黑">//-------------------------------------------------------------------------------------------------------------------
    2. //  @brief      QTIMER正交解码计数清零
    3. //  @param      qtimern         选择QTIMER模块(QTIMER_1、QTIMER_2)
    4. //  @param      phaseA          选择正交解码 A端口 这个参数需要与qtimer_quad_init函数第二个参数一致
    5. //  @return     void
    6. //  Sample usage:                                qtimer_quad_clear(QTIMER_1, QTIMER1_TIMER0_C0);
    7. //-------------------------------------------------------------------------------------------------------------------
    8. void qtimer_quad_clear(QTIMERN_enum qtimern, QTIMER_PIN_enum phaseA)
    9. </font>
    复制代码
    四,主程序展示
    1. <font size="3" face="微软雅黑">#include "headfile.h"


    2. int16 encoder1;
    3. int16 encoder2;
    4. int16 encoder3;
    5. int16 encoder4; // 用来获取编码器的返回值

    6. int main(void)
    7. {
    8.     DisableGlobalIRQ();
    9.     board_init();//务必保留,本函数用于初始化MPU 时钟 调试串口
    10.        
    11.    
    12.     //pwm初始化
    13.     pwm_init(PWM1_MODULE3_CHB_D1,50,5000); //50 频率 5000占空比 计算公式 输出PWM频率50HZ  占空比为百分之 5000/PWM_DUTY_MAX*100
    14.     //                                                        PWM_DUTY_MAX在fsl_pwm.h文件中 默认为50000
    15.     pwm_init(PWM1_MODULE3_CHA_D0,50,5000);
    16.     pwm_init(PWM2_MODULE3_CHB_D3,50,5000);
    17.     pwm_init(PWM2_MODULE3_CHA_D2,50,5000);
    18.    
    19.     ////一个QTIMER可以 创建两个正交解码
    20.     //初始化 QTIMER_1 A相 使用QTIMER1_TIMER0_C0  B相 使用QTIMER1_TIMER1_C1
    21.     qtimer_quad_init(QTIMER_1,QTIMER1_TIMER0_C0,QTIMER1_TIMER1_C1);
    22.    
    23.     //初始化 QTIMER_1 A相使用QTIMER1_TIMER2_C2 B相使用QTIMER1_TIMER3_C24
    24.     qtimer_quad_init(QTIMER_1,QTIMER1_TIMER2_C2,QTIMER1_TIMER3_C24);
    25.    
    26.     qtimer_quad_init(QTIMER_2,QTIMER2_TIMER0_C3,QTIMER2_TIMER3_C25);
    27.     qtimer_quad_init(QTIMER_3,QTIMER3_TIMER2_B18,QTIMER3_TIMER3_B19);
    28.    
    29.       
    30.     //将C0与 D0使用杜邦线链接起来
    31.     //将C2与 D1使用杜邦线链接起来
    32.     //将C3与 D2使用杜邦线链接起来
    33.     //将B18与 D3使用杜邦线链接起来
    34.         
    35.     //将C1 C3 C24 B19 接地,可以看到采集到的数据为5.
    36.    
    37.     //如果直接连接编码器的A B相,那么则可以直接采集编码器数据
    38.    
    39.         //总中断最后开启
    40.     EnableGlobalIRQ(0);
    41.     while (1)
    42.     {
    43.        //读取编码器计数值
    44.         encoder1 = qtimer_quad_get(QTIMER_1,QTIMER1_TIMER0_C0 );//下面的代码只能读取A相 B相尝试发现没有数据
    45.         encoder2 = qtimer_quad_get(QTIMER_1,QTIMER1_TIMER2_C2 );//qtimer_quad_get 这个函数获取 pwm输出频率的 1/10 (与占空比无关)^*
    46.         encoder3 = qtimer_quad_get(QTIMER_2,QTIMER2_TIMER0_C3 );
    47.         encoder4 = qtimer_quad_get(QTIMER_3,QTIMER3_TIMER2_B18);
    48.                
    49.         qtimer_quad_clear(QTIMER_1,QTIMER1_TIMER0_C0 );
    50.         qtimer_quad_clear(QTIMER_1,QTIMER1_TIMER2_C2 );
    51.         qtimer_quad_clear(QTIMER_2,QTIMER2_TIMER0_C3 );
    52.         qtimer_quad_clear(QTIMER_3,QTIMER3_TIMER2_B18);
    53.         
    54.          systick_delay_ms(100);
    55.         
    56.     }
    57. }
    58. </font>
    复制代码
    调试窗口 Value为5(表示接收到pwm波)
    2.png




    文章出处:CSDN

    签到签到
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-25 21:28 , Processed in 0.103674 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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