ADC
Overview
Function
An analog-to-digital converter (ADC) converts analog signals into digital signals for storage and computing. In addition to the power cable and ground cable, the ADC requires only one cable to connect to the target device. The following figure shows the physical connection of the ADC.
Figure 1 ADC physical connection
The ADC module provides a set of APIs to complete AD conversion, including:
- Opening or closing an ADC device
- Obtaining the analog-to-digital (AD) conversion result
Basic Concepts
-
Resolution
The number of binary bits that can be converted by an ADC. A greater number of bits indicates a higher resolution.
-
Conversion error
Difference between the actual and theoretical digital values output by an ADC. It is expressed by a multiple of the least significant bit. Generally, the maximum output error is used.
-
Transition time
Time required by an ADC to perform a complete conversion.
Working Principles
In the Hardware Driver Foundation (HDF), the ADC module uses the unified service mode for API adaptation. In this mode, a service is used as the ADC manager to handle external access requests in a unified manner. The unified service mode applies when the system has multiple device objects of the same type. If the independent service mode is used in this case, more device nodes need to be configured and more memory resources will be consumed.
Constraints
The ADC module can read data only in polling mode.
Usage Guidelines
When to Use
ADC devices are used to convert analog voltage or current into digital parameters. For example, an ADC can be used with an NTC resistor to measure temperature, or can be used to convert the output of an analog sensor into a digital parameter.
Available APIs
The following table describes the APIs of the ADC module. For more information, see //drivers/hdf_core/framework/include/platform/adc_if.h.
Table 1 APIs of the ADC driver
API | Description |
---|---|
DevHandle AdcOpen(uint32_t number) | Opens an ADC device. |
void AdcClose(DevHandle handle) | Closes an ADC device. |
int32_t AdcRead(DevHandle handle, uint32_t channel, uint32_t *val) | Obtains the AD conversion result. |
How to Develop
The following figure illustrates how to use ADC APIs.
Figure 2 Process of using ADC APIs
Opening an ADC Device
Call AdcOpen() to open an ADC device.
DevHandle AdcOpen(int16_t number);
Table 2 Description of AdcOpen
Parameter | Description |
---|---|
number | ADC device number. |
Return Value | Description |
NULL | The operation fails. |
Device handle | The operation is successful. The handle of the ADC device opened is returned. |
Example: Open device 1 of the two ADCs (numbered 0 and 1) in the system.
DevHandle adcHandle = NULL; /* ADC device handle /
/* Open ADC device 1. */
adcHandle = AdcOpen(1);
if (adcHandle == NULL) {
HDF_LOGE("AdcOpen: fail\n");
return;
}
Obtaining the AD Conversion Result
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 | Pointer to the AD conversion result. |
Return Value | Description |
0 | The operation is successful. |
Negative value | The operation fails. |
Example: Obtain the AD conversion result of channel 1.
uint32_t value;
int32_t ret;
ret = AdcRead(adcHandle, 1, &value);
if (ret != 0) {
HDF_LOGE("ADC read fail!\n");
return;
}
Closing an ADC Device
Call AdcClose() to close the ADC device after the ADC communication is complete.
void AdcClose(DevHandle handle);
Table 4 Description of AdcClose
Parameter | Description |
---|---|
handle | ADC device handle. |
Return Value | Description |
N/A | N/A |
Example:
AdcClose(adcHandle); /* Close the ADC device. */
Example
The following example shows how to use ADC APIs to manage an ADC device on a Hi3516D V300 board.
The hardware information is as follows:
-
SoC: hi3516dv300
-
The potentiometer is connected to channel 1 of ADC 0.
Perform continuous read operations on the ADC device to check whether the ADC is functioning.
Example:
#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
#define ADC_TEST_NUM 30
/* Main entry of ADC routines. */
static int32_t TestCaseAdc(void)
{
int32_t i;
int32_t ret;
DevHandle adcHandle = NULL;
uint32_t readBuf[ADC_TEST_NUM] = {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 < ADC_TEST_NUM; i++) {
ret = AdcRead(adcHandle, ADC_CHANNEL_NUM, &readBuf[i]);
if (ret != HDF_SUCCESS) {
HDF_LOGE("%s: ADC read fail!:%d", __func__, ret);
AdcClose(adcHandle);
return -1;
}
}
HDF_LOGI("%s: ADC read successful!", __func__);
/* Close the ADC device. */
AdcClose(adcHandle);
return 0;
}