打印
[其他]

基于RT-Thread使用ADC获取电压值

[复制链接]
1559|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
开发环境:
开发板gd32VF103R-START
RTOS:RT-Thread 4.1.1

1 RT-Thread 的ADC简介
ADC(analog-to-DigitalConverter) 指模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。
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

2 ADC代码实现
GD32VF103R有 2个 ADC,精度为 12 位,每个 ADC 最多有 16 个外部通道。ADC0 和 ADC1 都有 16 个外部通道各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。
GD32有多路ADC,多个通道,笔者这里使用ADC0的通道5,也就是PA5。
接下来配置ADC,只需要简单配置就可使用,当然也可使用其他ADC。这这里使用的是ADC0。


在applications文件夹下新建task.c文件。笔者这里使用的通道5,核心代码如下:
[task.c]
/**
******************************************************************************
* @file                 task.c
* @author               BruceOu
* @lib version          v2.1.0
* @version              V1.0
* @date                 2022-06-03
* @blog                https://blog.bruceou.cn/
* @Official Accounts    嵌入式实验楼
* @Brief                RTT任务
******************************************************************************
*/
/*Includes**********************************************************************/
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

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

#define ADC_DEV_NAME        "adc0"      /* ADC 设备名称 */
#define ADC_DEV_CHANNEL     5          /* ADC 通道 */
#define REFER_VOLTAGE       330         /* 参考电压 3.3V,数据精度乘以100保留2位小数*/
#define CONVERT_BITS        (1 << 12)   /* 转换位数为12位 */

static int adc_vol_sample(intargc, 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);

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


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


笔者这里将PA5接到3.3V电压上,和实际的电压是相符的。
基于RT-Thread的完整工程我就就不贴出来了,请到我的Gitee仓库自取吧。
GD32VF103RRT-Thread仓库地址:https://gitee.com/ouxiaolong/GD3 ... ter/bsp/gd32/risc-v




使用特权

评论回复

相关帖子

沙发
sparrow054| | 2022-6-18 21:28 | 只看该作者
这个配置,真实很秀

使用特权

评论回复
板凳
i1mcu| | 2022-7-5 15:37 | 只看该作者
这个使用的是什么平台?  

使用特权

评论回复
地板
plsbackup| | 2022-7-5 20:01 | 只看该作者
RT-Thread nano可以吗   

使用特权

评论回复
5
wangdezhi| | 2022-7-5 20:27 | 只看该作者
这个不错,学习一下。   

使用特权

评论回复
6
cemaj| | 2022-7-5 21:28 | 只看该作者
感觉RTT系统好复杂呢。  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

610

主题

2261

帖子

0

粉丝