RA6M3 HMI Board 之ADC获取电压值
2023-06-17 13:08:31 嵌入式大杂烩

开发环境:


(相关资料图)

RT-ThreadStudio:v2.2.6

开发板:RA6M3 HMI Board开发板

MCU:R7FA6M3AH3CFB

1 RA6M3 ADC简介

R7FA6M3有2个ADC单元,每个ADC单元有12位、10位、8位读取数据的格式可以选择,在单元0上有13个ADC通道,而在单元1上有16个ADC通道。 ADC单元具有三种扫描方式分别为:单次描模式、连续扫描模式和分组扫描模式,

2 RT-Thread 的ADC简介

ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。

A/D转换主要包括两个内容:采样保持和量化编码,将一个模拟信号进行采样,得到的样点转化为数字量,这是整个A/D转换过程的核心,量化编码分为好多算法,这里不深入研究了。ADC主要参数如下:

1.分辨率

AD转换器输出的数字量的最低位变化一个数时,对应输入模拟量的变化量,A/D转换器的位数越多,能够分辨的最小模拟电压值就越小,分辨率就越大,GD32的A/D转换器是12位的,位数越多,表示分辨率越高,恢复模拟信号时会更精确。

2.相对精度

A/D转换器实际输出数字量与理论值之间的最大差值称为相对精度。

3.转换速度

A/D转换器完成一次转换所需要的时间,一般是us级别的。

应用程序通过 RT-Thread 提供的 ADC 设备管理接口来访问 ADC 硬件,相关接口如下所示:

函数描述
rt_device_find()根据ADC设备名称查找设备获取设备句柄
rt_adc_enable()使能ADC设备
rt_adc_read()读取ADC设备数据
rt_adc_disable()关闭ADC设备

关于ADC的更多资料请参看RT-Thread官方手册:

https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/adc/adc

3 硬件连接

P001引脚可以连接到MCU内部的 ADC 外设,从而对电位器输入的模拟信号进行采集。

4 RA6M3 ADC配置

接下来配置ADC,只需要简单配置就可使用。双击工程中的 RA Smart Configurator 图标,第一次打开需要配置正确的 FSP 安装路径。

FSP配置ADC

1.配置扫描通道对应的引脚

2.配置 name、unit、mode,选择扫描的通道编号

配置ADC通道

然后打开对应的通道

5 ADC代码实现

笔者这里使用的通道1,核心代码如下:

#define ADC_DEV_NAME        "adc0"      /* ADC 设备名称 */#define ADC_DEV_CHANNEL     1           /* ADC 通道 */#define REFER_VOLTAGE       330         /* 参考电压 3.3V,数据精度乘以100保留2位小数*/#define CONVERT_BITS        (1 < < 12)   /* 转换位数为12位 */staticint adc_vol_sample(int argc, char *argv[]){    rt_adc_device_t adc_dev;    rt_uint32_t value, vol;    rt_err_t ret = RT_EOK;    /* 查找设备 */    adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);    if (adc_dev == RT_NULL)    {        rt_kprintf("adc sample run failed! 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("the value is :%d \\n", value);    /* 转换为对应电压值 */    vol = value * REFER_VOLTAGE / CONVERT_BITS;    rt_kprintf("the voltage is :%d.%02d \\n", vol / 100, vol % 100);    /* 关闭通道 */    ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);    return ret;}/* 导出到 msh 命令列表中 */MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample);
6 测试验证

编译下载,调试信息如下:

从以上打印信息可以看出,adc0已经使能,然后使用MSH命令‘adc_vol_sample’即可使能ADC线程。

笔者这里将P001接到GND和3.3V电压上,和实际的电压是相符的。审核编辑:汤梓红

相关新闻: