# ADC
## Overview
An analog-to-digital converter (ADC) is a device that converts analog signals into digital signals.
The ADC APIs provide a set of common functions for ADC data transfer, including:
- Opening or closing an ADC device
- Obtaining the analog-to-digital (AD) conversion result
**Figure 1** ADC physical connection

## Available APIs
**Table 1** APIs of the ADC driver
Category
|
API
|
Description
|
Managing ADC devices
|
AdcOpen
|
Opens an ADC device.
|
AdcClose
|
Closes an ADC device.
|
Obtaining the conversion result
|
AdcRead
|
Reads the AD conversion result.
|
## Usage Guidelines
### How to Use
The figure below illustrates how to use the APIs.
**Figure 2** Using ADC driver APIs

### Opening an ADC Device
Call **AdcOpen** to open an ADC device.
```c
DevHandle AdcOpen(int16_t number);
```
**Table 2** Description of AdcOpen
Parameter
|
Description
|
number
|
ADC device number.
|
Return Value
|
Description
|
NULL
|
Failed to open the ADC device.
|
Device handle
|
Handle of the ADC device opened.
|
For example, open device 1 of the two ADCs (numbered 0 and 1) in the system.
```c
DevHandle adcHandle = NULL; /* ADC device handle /
/* Open the ADC device. */
adcHandle = AdcOpen(1);
if (adcHandle == NULL) {
HDF_LOGE("AdcOpen: failed\n");
return;
}
```
### Obtaining the AD Conversion Result
```c
int32_t AdcRead(DevHandle handle, uint32_t channel, uint32_t *val);
```
**Table 3** Description of AdcRead
Parameter
|
Description
|
handle
|
ADC device handle.
|
channel
|
ADC device channel number.
|
val
|
AD conversion result.
|
Return Value
|
Description
|
0
|
The operation is successful.
|
Negative number
|
Failed to obtain the AC conversion result.
|
### Closing an ADC Device
Call **AdcClose** to close the ADC device after the ADC communication is complete.
```c
void AdcClose(DevHandle handle);
```
**Table 4** Description of AdcClose
Parameter
|
Description
|
handle
|
ADC device handle.
|
Return Value
|
Description
|
None
|
No value is returned if the ADC device is closed.
|
Example:
```c
AdcClose(adcHandle); /* Close the ADC device. */
```
## Example
This following example shows how to use ADC APIs to manage an ADC device on a Hi3516D V300 development board.
The basic hardware information is as follows:
- SoC: hi3516dv300
- The potentiometer is connected to channel 1 of ADC device 0.
Perform continuous read operations on the ADC device to check whether the ADC is functioning.
Example:
```c
#include "adc_if.h" /* Header file for ADC APIs */
#include "hdf_log.h" /* Header file for log APIs */
/* Define device 0, channel 1. */
#define ADC_DEVICE_NUM 0
#define ADC_CHANNEL_NUM 1
/* Main entry of ADC routines. */
static int32_t TestCaseAdc(void)
{
int32_t i;
int32_t ret;
DevHandle adcHandle;
uint32_t Readbuf[30] = {0};
/* Open the ADC device. */
adcHandle = AdcOpen(ADC_DEVICE_NUM);
if (adcHandle == NULL) {
HDF_LOGE("%s: Open ADC%u fail!", __func__, ADC_DEVICE_NUM);
return -1;
}
/* Perform 30 times of AD conversions continuously and read the conversion results. */
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__);
/* Close the ADC device. */
AdcClose(adcHandle);
return 0;
}
```