查看: 2626|回复: 1

ADC模块和QTIMER模块

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

    [LV.8]以坛为家I

    3301

    主题

    6548

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32040
    最后登录
    2024-4-28
    发表于 2019-12-26 10:34:41 | 显示全部楼层 |阅读模式
    为方便参加恩智浦大学生智能车设计竞赛的同学们,成都逐飞科技设计制作了i.MX RT1064核心板,并配套开发了相应的函数库。

    本文为逐飞科技来稿,在此分享给大家,对不参加智能车竞赛的朋友也有很大的帮助作用。

    点此回顾往期内容“GPIO详解”,“FAST GPIO模块详解与使用示例”。

    各位朋友好,逐飞科技连载的“基于RT1064的智能车应用入门指导”开发分享又来投稿啦!今天分享ADC和QTIMER两个模块的使用,感谢来自恩智浦的支持,感谢梁平老师帮忙检查修改文中错误。接下来进入我们今天分享的主题----“ADC模块详解与使用示例”&“QTIMER模块详解与使用示例”。

    ADC模块函数和使用示例

    1. ADC功能

    ADC(Analog-to-Digital Converter)的作用是将模拟量转换为数字量,从而使得MCU具有采集模拟信号的能力。
    ADC主要有逐次逼近型、积分型ADC、并行比较A/D转换器、压频变换型ADC、∑-Δ型ADC、∑-Δ型ADC。

    RT1064内置的ADC属于逐次逼近型,并且具有1MS/s采样速率。

    2. ADC库函数
    以下函数均位于zf_adc.c和zf_adc.h:
    28.png
    adc_init函数参数
    29.png
    adc_convert函数参数
    30.png
    adc_mean_filter函数参数
    31.png
    3. ADC使用示例
    ADC采集外部引脚电压

    #include "headfile.h"

    uint16 ad_one_result;
    uint16 ad_mean_result;

    int main(void)
    {
        DisableGlobalIRQ();
        board_init();  //务必保留,本函数用于初始化MPU 时钟 调试串口  
      
        adc_init(ADC_1,ADC1_CH0_B14,ADC_8BIT); //初始化B14为ADC功能 分辨率为8位  
      
        //总中断最后开启  
        EnableGlobalIRQ(0);
        while(1)
        {
           //ADC采集一次  
            ad_one_result = adc_convert(ADC_1,ADC1_CH0_B14);
            //ADC采集10次并求取平均  
            ad_mean_result = adc_mean_filter(ADC_1,ADC1_CH0_B14,10);
        }
    }
    编程要点1:所有的ADC都应该初始化之后才能使用。
    编程要点2:同一个模块下所有的分辨率都必须一样。假设ADC1初始化了通道0和通道1,但是在初始化时通道0先初始化了分辨率为10位,然后通道1初始化了分辨率为8位,则ADC整个模块下所有的通道都为8位。




    QTIMER模块函数和使用示例


    1. QTIMER功能


    QTIMER(Quad Timer)是四路定时器,可以用于实现编码器的正交解码功能。


    2. QTIMER库函数
    以下函数均位于zf_qtimer.c和zf_qtimer.h:
    32.png
    qtimer_quad_init函数参数
    33.png
    qtimer_quad_get函数参数
    34.png
    qtimer_quad_clear函数参数
    35.png
    3. QTIMER使用示例


    QTIMER采集编码器


    #include "headfile.h"       //包含头文件  
      
    int main(void)
    {
        DisableGlobalIRQ();
        board_init();  //务必保留,本函数用于初始化MPU时钟调试串口  
      
        //初始化QTIMER_0模块,A相使用C0,B相使用C1  
        //编码器A相与C0连接,编码器B相与C1连接  
        qtimer_quad_init(QTIMER_0,QTIMER1_TIMER0_C0,QTIMER1_TIMER1_C1);
          
        //总中断最后开启  
        EnableGlobalIRQ(0);
      
        while(1)
        {
            qtimer_quad_get(QTIMER_0,QTIMER1_TIMER0_C0);     //获取数值  
            qtimer_quad_clear(QTIMER_0,QTIMER1_TIMER0_C0);   //清零以重新开始计数
            systick_delay_ms(100);                           //延时100毫秒  
        }
    }
    编程要点1:一个QTIMER有四路定时器,每两个定时器构成一个正交解码器,因此一个QTIMER就可完成两个编码器的数据采集。


    编程要点2:在初始化时,后面两个引脚参数不可随意设置,只能根据选择的模块编号,查阅zf_qtimer.h文件查找该模块支持的引脚有哪些,然后从所支持的引脚中进行选择。错误的设置例如:初始化时模块设置为QTIMER_2,然而引脚却使用QTIMER_0下的C0引脚,这是不可行的。


    使用注意事项:如果使用的是直接输出方向的编码器,则务必保证编码器的脉冲引脚与单片机的A相进行连接,方向引脚与单片机的B相进行连接。如果使用的是正交解码的编码器,则编码器的两个脉冲引脚可随意与单片机AB相进行连接。

    本期逐飞科技“基于RT1064的智能车应用入门指导”之“ADC模块详解与使用示例”&“QTIMER模块详解与使用示例”专题分享就到这里,大家在使用库的过程中如果遇到什么问题、或发现不足、或对库有什么建议请及时联系“逐飞科技”,我们将尽快完善。
    PS:通过QQ群(逐飞科技__智能车③部:824575535)可以联系到我们,群里也方便大家讨论交流,也可与管理员私信,保障该开源库有问题时可以及时得到解决。然后再分享给各位使用,形成良性循环。接下来我们将会分章节详细介绍多个模块的使用。感谢关注“逐飞科技”,下期再见!





    作者:范兵@逐飞科技                                       文章出处:恩智浦MCU加油站

    签到签到
    回复

    使用道具 举报

    该用户从未签到

    3

    主题

    7

    帖子

    0

    注册会员

    Rank: 2

    积分
    67
    最后登录
    2022-3-7
    发表于 2021-8-29 23:39:29 | 显示全部楼层
    请问一下, 上面这些接口是SDK自带的吗? 我下载的SDK中,怎么没有这些接口。只有QTMR_Init、QTMR_StartTimer这样的接口。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-28 23:03 , Processed in 0.119148 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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