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测试实例,测试步骤如下:
- 根据ADC设备名称,获取ADC设备句柄。
- 使能ADC设备,指定采样通道。
- 读取ADC数据。
- 关闭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