rtthread studio与正点原子apollo(7)--ADC设备


前言

本文介绍ADC设备及其相关API的使用。


一、ADC简介

模数转换器(ADC)用于将连续的模拟量转换为嵌入式芯片可以处理的数字量,是数字信号处理的基础。
ADC一般要经过采样、保持、量化和编码几个步骤
在这里插入图片描述
采样即周期性的读取模拟量,采样时间必须满足采样定理,即采样频率至少是模拟信号最大频率的2倍。
量化是将采样的到的数据转换为最小分辨率的整数倍。
编码是将量化后的数值转换为二进制编码。
对于ADC设备有一下几个关键参数:
1.分辨率:以二进制位数来表示,一般有8位、10位、12位、16位等,它说明模数转换器对输入信号的分辨能力,位数越多,误差越小,转换精度也越高,MCU中比较常见的是10位和12位分辨率。
2.精度:精度是在ADC最小刻度基础上叠加各种误差的参数,是可以直接衡量ADC采样精准的指标。因此,分辨率高不代表精度一定高,要做好各个方面的工作,尽量降低系统误差。
3.采样率:采样率一般是指芯片每秒采集信号的个数。比如1KHz/s,表示1s内,这个ADC可以采集1K个点。采样率越高,采集的点数越多,那么对信号的还原度就越高。

二、访问ADC设备

RT-Thread中ADC设备的介绍及API函数说明参考官方文档
ADC设备

访问ADC设备的步骤:
(1)查找设备

#define ADC_DEV_NAME        "adc1"  /* ADC 设备名称 */
rt_adc_device_t adc_dev;            /* ADC 设备句柄 */
/* 查找设备 */
adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);

(2)使能ADC通道

#define ADC_DEV_CHANNEL     5       /* ADC 通道 */
/* 使能设备 */
rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);

(3)读取ADC采样值

#define REFER_VOLTAGE       330         /* 参考电压 3.3V,数据精度乘以100保留2位小数*/
#define CONVERT_BITS        (1 << 12)   /* 转换位数为12位 */
rt_uint32_t value;
/* 读取采样值 */
value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
/* 转换为对应电压值 */
vol = value * REFER_VOLTAGE / CONVERT_BITS;
rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);

(4)关闭ADC通道

/* 关闭通道 */
rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);

三、ADC设备使用实例

1.ADC配置过程

(1)在RT-Thread studio中创建工程,使能ADC功能在这里插入图片描述
(2)打开board.h文件,按提示配置ADC
在这里插入图片描述
第一步:在(1)中已完成
第二步:取消宏定义注释,开启要使用ADC设备的功能

#define BSP_USING_ADC1

第三步:在stm32cubemx中配置ADC功能,并将生成的
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
拷贝到board.c文件后面
在这里插入图片描述
第四步:打开stm32f7xx_hal_config.h文件,取保开启宏定义
#define HAL_ADC_MODULE_ENABLED
在这里插入图片描述

2ADC设备使用完整例程

#include <rtthread.h>
#include <rtdevice.h>

#define ADC_DEV_NAME "adc1"//定义ADC设备名称
#define ADC_CHANNAL  5//定义ADC设备通道
#define REF_VOL  3.3//定义参考电压
#define CONVERT_BIT  12//ADC位数
#define SAMPLE_NUM  8//采样次数

rt_thread_t tid1=RT_NULL;
rt_uint32_t value;
float vol;

static void ADC_entry(void * parameter)
{
    rt_adc_device_t adc_dev;//定义ADC设备句柄
    adc_dev=(rt_adc_device_t)rt_device_find(ADC_DEV_NAME);//查找ADC设备
    rt_adc_enable(adc_dev, ADC_CHANNAL);//使能ADC通道
    while(1)
    {
        for(int i=0;i<SAMPLE_NUM;i++)
        {
            value+=rt_adc_read(adc_dev, ADC_CHANNAL);//读取ADC设备的值
            rt_thread_mdelay(5);
        }
        value=value/SAMPLE_NUM;
        vol=value*REF_VOL/4096.0;//计算采样对应的模拟值
        value=0;
        rt_thread_mdelay(5);
    }
}


static int ADC_INIT(void)
{
    tid1=rt_thread_create("adc_sample", ADC_entry, RT_NULL, 1024, 25, 10);
    rt_thread_startup(tid1);
    return RT_EOK;
}

总结

本文介绍了ADC设备的使用方法,在使用时配合邮箱或消息队列进行数据处理。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值