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设备的使用方法,在使用时配合邮箱或消息队列进行数据处理。