# 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; } ```