627|1

34

帖子

0

TA的资源

一粒金砂(中级)

【瑞萨RA8D1开发板,基于M85内核的图形MCU测评】RT-Thread ADC获取电压值 [复制链接]

 
 
开发环境:
IDE:MKD 5.38a
开发板:CPKCOR-RA8D1B开发板
MCU:R7FA8D1BHEC332AS00

1 RA8D1 ADC简介

RA8D1有2个ADC单元,每个ADC单元有12位、10位、8位读取数据的格式可以选择,在单元0上有20个ADC通道,而在单元1上有23个ADC通道。 ADC单元具有三种扫描方式分别为:单次描模式、连续扫描模式和分组扫描模式,
RA8D1的 ADC Unit 0 的结构框图如下图所示:
222610kgxgslaryrnxyg5r.png
RA8D1的 ADC Unit 1 的结构框图如下图所示:
222610h8x0whdqxx2bbjiw.png

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官方手册:

3 硬件连接

P006引脚可以连接到MCU内部的 ADC0 外设,从而对电位器输入的模拟信号进行采集。
222610pz2kt637uz04jeek.png

4 RA8D1 ADC配置

接下来配置ADC,只需要简单配置就可使用。双击工程中的 RA Smart Configurator 图标,第一次打开需要配置正确的 FSP 安装路径。
222610z0hhudwqhdhf70f6.png
222610usx22ha6mb9e5xxh.png
  • FSP配置ADC
    1.配置扫描通道对应的引脚
    首先依次点击 “Pins” -> “Peripherals” -> “ADC0” 来配置通道 AN002对应的引脚为 P006。如下图所示。
    222610aoamklpepameafzo.png
    2.配置ADC name、unit、mode,选择扫描的通道编号
    然后依次点击 “Stacks” -> “New Stack” -> “Analog” -> “ADC (r_adc)” 来配置ADC模块。 如下图所示。
    222610seo4te11pphluole.png
    222610ykww6u55rsksfww6.png
    Table 1-1 ADC 属性介绍
    ADC属性 描述
    General > Name 模块实例名
    General > Unit 指定要使用的ADC单元
    General > Resolution 指定转换分辨率
    General > Alignment 指定转换结果对齐方式
    General > Clear after read 读取转换结果后自动清除
    General > Mode 模式
    • Single Scan:单次扫描
    • Continuous Scan:连续扫描
    • Group Scan:组扫描
    General > Double-trigger 双触发
    Input > Channel Scan Mask
    (channel availability varies by MCU)
    该通道位掩码用于使能 ADC 通道;
    若是在组模式下,则是用于指定哪些通道归属于扫描组 A。
    这里要勾选 “Channel 0”,图上由于篇幅关系没有标出来
    Interrupts > Normal/Group A Trigger 正常模式下的或组模式下组A的触发类型。
    这里按照默认,选择软件触发
    Interrupts > Callback 中断回调函数。设置为 adc_callback
    Interrupts > Scan End Interrupt Priority 扫描完成中断优先级
    Extra > ADC Ring Buffer ADC环形缓冲区

    配置完成之后可以按下快捷键“Ctrl + S”保存, 最后点右上角的 “Generate Project Content” 按钮,让软件自动生成配置代码即可。
  • 配置ADC通道
然后打开对应的通道
222610mgp2i0i222myf12f.png

5 ADC代码实现

笔者这里使用ADC0的通道2,核心代码如下:
#define ADC_DEV_NAME "adc0" /* ADC 设备名称 */
#define ADC_DEV_CHANNEL 2 /* ADC 通道 */
#define REFER_VOLTAGE 330 /* 参考电压 3.3V,数据精度乘以100保留2位小数*/
#define CONVERT_BITS (1 << 12) /* 转换位数为12位 */
static int 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 测试验证

编译下载,调试信息如下:
222610hahnm6nmbvhbiiq3.png
从以上打印信息可以看出,adc0已经使能,然后使用MSH命令‘adc_vol_sample’即可使能ADC线程。
222610hubqpfwuzhzdfgnk.png
笔者这里将P006接到GND和3.3V电压上,和实际的电压是相符的。

最新回复

很详细!赞一个!   详情 回复 发表于 2024-7-9 21:13

回复
举报

9

帖子

0

TA的资源

一粒金砂(中级)

很详细!赞一个!


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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表