Report an issue in GitHub or email us

Use the AnalogIn API to read an external voltage applied to an analog input pin. `AnalogIn()` reads the voltage as a fraction of the system voltage. The value is a floating point from `0.0`(VSS) to `1.0`(VCC). For example, if you have a 3.3V system and the applied voltage is 1.65V, then `AnalogIn()` reads `0.5` as the value.

One of the most common types of analog to digital converters used in microcontrollers today is called the successive-approximation ADC. Successive-approximation is a popular choice in modern microcontrollers because of the fact that it is accurate and low-power and takes up a small amount of space inside of the microcontroller.

Another fairly common type of ADC is the flash ADC. Flash ADCs offer the fastest analog to digital solution. However, because of the way that flash ADCs are built, they use a lot of power and take up a lot of space, in that they use many components.

The resolution for an ADC is the smallest distinguishable change in analog input that causes the digital output to change. For example, a 12-bit ADC in a 3.3V system has 4,096 distinguishable outputs. Therefore, the resolution of a 12-bit ADC is 3.3/4096 = 0.81mV. In an Mbed Enabled system where the digital result from the analog input is in the range of 0.0 to 1.0, a change of 0.81mV in the analog input results in a change in the digital output of 1.0/4096 = 0.00024.

Note: Only certain pins are capable of making these measurements, so check the pinmap of your board for compatible pins.

## AnalogIn hello, world

``````/*
* Copyright (c) 2017-2020 Arm Limited and affiliates.
*/

#include "mbed.h"

// Initialize a pins to perform analog input and digital output functions
DigitalOut dout(LED1);

int main(void)
{
while (1) {
// test the voltage on the initialized analog pin
//  and if greater than 0.3 * VCC set the digital pin
//  to a logic 1 otherwise a logic 0
if (ain > 0.3f) {
dout = 1;
} else {
dout = 0;
}

// print the percentage and 16 bit normalized values
printf("percentage: %3.3f%%\n", ain.read() * 100.0f);
printf("normalized: 0x%04X \n", ain.read_u16());
}
}

``````

### Example one

Control an R/C servo with analog input.

``````/*
* Copyright (c) 2017-2020 Arm Limited and affiliates.
*/

#include "mbed.h"

PwmOut servo(D3);

int main()
{
// servo requires a 20ms period
servo.period(0.020f);
while (1) {
// servo position determined by a pulse width between 1-2ms
servo.pulsewidth(0.001f + 0.001f * position);
}
}

``````

### Example two

This example shows AnalogIn reading 16-bit normalized samples.

``````/*
* Copyright (c) 2017-2020 Arm Limited and affiliates.
*/

#include "mbed.h"

#define NUM_SAMPLES 1024

int main()
{
uint16_t samples[NUM_SAMPLES];

for (int i = 0; i < NUM_SAMPLES; i++) {