Skip to content

ADC设备

ADC简介

ADC(Analog-to-Digital Converter)模数转换器,是指将连续变化的模拟信号转换为离散的数字信号的器件。真实世界的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式,模数转换器可以实现这个功能。ADC位宽为12bit,最高采样率可以到360KSPS(360K、180K,90K,45K四个档位可选)。

AP板子上与ADC相关的有:ADC_A、ADC_B两个外部ADC输入脚,电池电压以及芯片温度。

驱动支持

访问ADC设备前,需要保证相关驱动配置已选中。

Windows环境:利用RT-Thread官方env工具直接在代码根目录下执行menuconfig进入配置。

Linux环境:在代码根目录下执行scons --menuconfig进入配置。

ADC驱动所在路径如下:

RT-Thread Components -> Device Drivers -> Using ADC device drivers

访问ADC设备接口

访问ADC设备,库中提供了以下接口:

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

查找ADC设备

查找ADC设备,函数原型如下所示:

rt_device_t rt_device_find(const char* name);
  • 参数

    [IN]name:ADC设备名称,目前注册到的系统中的ADC设备名称为"adc"。

  • 返回值

    RT_NULL:失败,设备不存在。

    非RT_NULL:成功,该返回值是操作ADC设备的句柄,在后续的接口中作为函数入参。

使能ADC设备

使能指定ADC设备,函数原型如下所示:

rt_err_t rt_adc_enable(rt_adc_device_t dev, rt_uint32_t channel);
  • 参数

    [IN]dev:ADC设备句柄,查找设备函数的返回值。

    [IN]channel:ADC通道,支持的通道对应枚举ADC_CHANNEL_CONFIG中定义的值,详细如下:

    // 所在头文件相对路径 "libraries/UC8088_HAL_Driver/inc/uc_adda.h"
    typedef enum
    {
        ADC_CONFIG_CHANNEL_A = 1,       // 对应板子ADC_A引脚
        ADC_CONFIG_CHANNEL_B,           // 对应板子ADC_B引脚
        ADC_CONFIG_CHANNEL_C,           // 开发板不支持
        ADC_CONFIG_CHANNEL_BAT,         // 电池电压通道
        ADC_CONFIG_CHANNEL_TEMP_A,      // 环境温度
        ADC_CONFIG_CHANNEL_TEMP_B,      // 板子温度
        ADC_CONFIG_CHANNEL_TEMP_C,      // 芯片温度通道
    } ADC_CHANNEL_CONFIG;
    
  • 返回值

    0:正常。

    其他:错误,RT-Thread定义的错误类型。

读取ADC数据

读取ADC采样的数据,函数原型如下所示:

rt_uint32_t rt_adc_read(rt_adc_device_t dev, rt_uint32_t channel);
  • 参数

    [IN]dev:ADC设备句柄,查找设备函数的返回值。

    [IN]channel:ADC通道,支持的通道对应枚举ADC_CHANNEL_CONFIG中定义的值

    注:调用时,需要与前述使能ADC设备的channel保持一致。

  • 返回值

    返回ADC数值,0或非零。

关闭ADC设备

关闭ADC设备,函数原型如下所示:

rt_err_t rt_adc_disable(rt_adc_device_t dev, rt_uint32_t channel);
  • 参数

    [IN]dev:ADC设备句柄,查找设备函数的返回值。

    [IN]channel:ADC通道,支持的通道对应枚举ADC_CHANNEL_CONFIG中定义的值

    注:调用时,需要与前述使能ADC设备的channel保持一致。

  • 返回值

    0:正常。

    其他:错误,RT-Thread定义的错误类型。

ADC使用示例

使用示例需要配置menuconfig打开配置(默认关闭),路径如下:

wiota APP -> open adc, default close(_ADC_APP_)

以下提供ADC测试实例,测试步骤如下:

  1. 根据ADC设备名称,获取ADC设备句柄。
  2. 使能ADC设备,指定采样通道。
  3. 读取ADC数据。
  4. 关闭ADC设备。
#include <rtthread.h>
#ifdef _ADC_APP_
#include <rtdevice.h>
#include "uc_adc_app.h"
#include "uc_adda.h"

#define ADC_DEVICE_NAME    "adc"
#define ADC_DEV_CHANNEL     ADC_CONFIG_CHANNEL_A

static rt_device_t adc_dev = NULL;

int adc_app_init(void)
{
    rt_err_t ret = RT_EOK;

    adc_dev = rt_device_find(ADC_DEVICE_NAME);
    if (adc_dev == RT_NULL)
    {
        rt_kprintf("find %s failed!\n", ADC_DEVICE_NAME);
        return RT_EEMPTY;
    }

    return ret;
}

int adc_app_read_value(rt_uint32_t *value)
{
    rt_err_t ret = RT_EOK;

    if (adc_dev == RT_NULL)
    {
        rt_kprintf("find %s failed!\n", ADC_DEVICE_NAME);
        return RT_EEMPTY;
    }

    rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
    *value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
    rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);

    return ret;
}

void adc_app_sample(void)
{
    int ret = 0;
    rt_uint32_t value = 0;

    rt_kprintf("adc test demo.\r\n");

    ret = adc_app_init();
    if (ret != RT_EOK)
    {
        rt_kprintf("init adc device failed!\n");
        return;
    }

    while (1)
    {
        ret = adc_app_read_value(&value);
        if(ret == RT_EOK)
        {
            rt_kprintf("adc value = %d.\r\n", value);
        }
        else
        {
            rt_kprintf("read adc failed.\r\n");
        }
    }
}

#endif
Back to top