# ADC
- [概述](#section1)
- [接口说明](#section2)
- [使用指导](#section3)
- [使用流程](#section4)
- [打开ADC设备](#section5)
- [读取AD转换结果](#section6)
- [关闭ADC设备](#section7)
- [使用实例](#section8)
## 概述
- ADC(Analog to Digital Converter),即模拟-数字转换器,是一种将模拟信号转换成对应数字信号的设备。
- ADC接口定义了完成ADC传输的通用方法集合,包括:
- ADC设备管理:打开或关闭ADC设备。
- ADC读取转换结果:读取AD转换结果。
**图 1** ADC物理连线示意图
![](figures/ADC物理连线示意图.png "ADC物理连线示意图")
## 接口说明
**表 1** ADC驱动API接口功能介绍
功能分类
|
接口名
|
描述
|
ADC设备管理接口
|
AdcOpen
|
打开ADC设备
|
AdcClose
|
关闭ADC设备
|
ADC读取转换结果接口
|
AdcRead
|
读取AD转换结果值
|
## 使用指导
### 使用流程
使用ADC设备的一般流程如[图2](#fig2)所示。
**图 2** ADC使用流程图
![](figures/ADC使用流程图.png "ADC使用流程图")
### 打开ADC设备
在进行AD转换之前,首先要调用AdcOpen打开ADC设备。
```c
DevHandle AdcOpen(int16_t number);
```
**表 2** AdcOpen参数和返回值描述
参数
|
参数描述
|
number
|
ADC设备号
|
返回值
|
返回值描述
|
NULL
|
打开ADC设备失败
|
设备句柄
|
打开的ADC设备句柄
|
假设系统中存在2个ADC设备,编号从0到1,那么我们现在打开1号设备。
```c
DevHandle adcHandle = NULL; /* ADC设备句柄 /
/* 打开ADC设备 */
adcHandle = AdcOpen(1);
if (adcHandle == NULL) {
HDF_LOGE("AdcOpen: failed\n");
return;
}
```
### 读取AD转换结果
```c
int32_t AdcRead(DevHandle handle, uint32_t channel, uint32_t *val);
```
**表 3** AdcRead参数和返回值描述
参数
|
参数描述
|
handle
|
ADC设备句柄
|
channel
|
ADC设备通道号
|
val
|
AD转换结果
|
返回值
|
返回值描述
|
0
|
读取成功
|
负数
|
读取失败
|
### 关闭ADC设备
ADC通信完成之后,需要关闭ADC设备。
```c
void AdcClose(DevHandle handle);
```
**表 4** AdcClose参数和返回值描述
参数
|
参数描述
|
handle
|
ADC设备句柄
|
返回值
|
返回值描述
|
无
|
无
|
关闭ADC设备示例:
```c
AdcClose(adcHandle); /* 关闭ADC设备 */
```
## 使用实例
本例程以操作开发板上的ADC设备为例,详细展示ADC接口的完整使用流程。
本例拟对Hi3516DV300某开发板上ADC设备进行简单的读取操作,基本硬件信息如下:
- SOC:hi3516dv300。
- 原理图信息:电位器挂接在0号ADC设备1通道下。
本例程对测试ADC进行连续读取操作,测试ADC功能是否正常。
示例如下:
```c
#include "adc_if.h" /* ADC标准接口头文件 */
#include "hdf_log.h" /* 标准日志打印头文件 */
/* 设备号0,通道号1 */
#define ADC_DEVICE_NUM 0
#define ADC_CHANNEL_NUM 1
/* ADC例程总入口 */
static int32_t TestCaseAdc(void)
{
int32_t i;
int32_t ret;
DevHandle adcHandle;
uint32_t Readbuf[30] = {0};
/* 打开ADC设备 */
adcHandle = AdcOpen(ADC_DEVICE_NUM);
if (adcHandle == NULL) {
HDF_LOGE("%s: Open ADC%u fail!", __func__, ADC_DEVICE_NUM);
return -1;
}
/* 连续进行30次AD转换并读取转换结果 */
for (i = 0; i < 30; i++) {
ret = AdcRead(adcHandle, ADC_CHANNEL_NUM, &Readbuf[i]);
if (ret != HDF_SUCCESS) {
HDF_LOGE("%s: tp ADC write reg fail!:%d", __func__, ret);
AdcClose(adcHandle);
return -1;
}
}
HDF_LOGI("%s: ADC read successful!", __func__);
/* 访问完毕关闭ADC设备 */
AdcClose(adcHandle);
return 0;
}
```