4226|3

2549

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

【中科蓝讯AB32VG1 RISC-V板“碰上”RTT测评】三:ADC外设的使用 [复制链接]

  本帖最后由 数码小叶 于 2021-4-18 20:50 编辑

 对于ADC,RT-Thread 提供了四个 ADC 设备管理接口函数来访问 ADC 硬件

看上去和之前的按键GPIO一样,这就得益于RT-Thread 提供了一套简单的 I/O 设备模型框架,I/O 设备管理层实现了对设备驱动程序的封装。应用程序通过 I/O 设备层提供的标准接口访问底层设备,设备驱动程序的升级、更替不会对上层应用产生影响。这种方式使得设备的硬件操作相关的代码能够独立于应用程序而存在,双方只需关注各自的功能实现,从而降低了代码的耦合性、复杂性,提高了系统的可靠性。设备驱动框架层是对同类硬件设备驱动的抽象,将不同厂家的同类硬件设备驱动中相同的部分抽取出来,将不同部分留出接口,由驱动程序实现。

 

对于adc,rt_device_find一般返回值是adc0、adc1。。。使用之前需要确认一下,adc设备是否已经注册到系统中

#define ADC_DEV_NAME        "adc0" 

adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
if (adc_dev == RT_NULL)
{
    rt_kprintf("can't find %s device!\n", ADC_DEV_NAME);
    return RT_ERROR;
}

 

这里新建一个新的adc_a0工程

 

 

因为是模板工程,所以ADC是没有打开的,直接使用上面的rt_device_find,肯定会返回RT_ERROR,所以要先打开ADC设备

这样就OK了,先测试一下ADC工作正常不,直接在main线程里添加操作

    adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
    if (adc_dev == RT_NULL)
    {
        rt_kprintf("can't find %s device!\n", ADC_DEV_NAME);
        return RT_ERROR;
    }

    ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);

    value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
    rt_kprintf("\nthe value is :%d \n", value);

    vol = value * REFER_VOLTAGE / CONVERT_BITS;
    rt_kprintf("the vol is :%d \n", vol);
    rt_kprintf("the voltage is :%d.%03d \n", vol / 1000, vol % 1000);

    ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);

 

先拿3v3和GND测试一下测量结果

 

 

下载完成后,通过串口界面可以看到测试结果

 

 

看着很稳定啊,把结果再精确一位试试,因为这精度应该可以达到0.003

 

结果还是相当稳定啊,换掉输入源3v3和GND,加上分压来测试下动态电压

 

 

可以看到,测量分压的时候,就可以显出精度的跳变了

 

 

ADC测试OK,那就可以把这部分写到一个独立的线程里去了,并且把多次测量,求平均加上,最大值最小值暂时就不剔除了

void adc_a0_entry(void *parameter)
{
    rt_err_t ret = RT_EOK;
    rt_uint32_t value[10], value_sum,vol,vol_ave,ii;
    rt_adc_device_t adc_dev;

    while(1)
    {
       adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
       if (adc_dev == RT_NULL)
       {
           rt_kprintf("can't find %s device!\n", ADC_DEV_NAME);
           return ;
       }

       ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);

       for(ii=0;ii<10;ii++)
       {
           value[ii] = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
       }

       for(ii=0;ii<10;ii++)
       {
           rt_kprintf("%d;",value[ii]);
       }

       for(ii=0;ii<10;ii++)
       {
           value_sum += value[ii];
       }
       vol_ave =value_sum /10;
       vol=vol_ave* REFER_VOLTAGE / CONVERT_BITS;
       rt_kprintf("the vol is :%d \n", vol);
       rt_kprintf("the voltage is :%d.%03d \n", vol / 1000, vol % 1000);
       value_sum=0;

       ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
       rt_thread_mdelay(1000);
   }
}

 

经过这几次的操作,对于AB32VG1_Register和AB32VG1_DataSheet目前发现的唯一作用,就是让你知道有多少个管脚,每个管脚的作用是啥,除此之外,再也没有其它了。要不是rt_thread封装了底层,这个根本就无法进行任何操作么,AB32VG1_Register 32页和AB32VG1_DataSheet 13页,你想看着手册去操作,完全是不可能的。

 

最新回复

这不是很适合拿来主义么?   详情 回复 发表于 2021-12-1 13:13
点赞 关注
 
 

回复
举报

1668

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 

官网的手册如果无法参考也太难为人啦

 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

诚如楼主所言,我也感觉 官方的  datasheet 真是搞笑. 该有的都没有.

 

 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

4
 

这不是很适合拿来主义么?

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表