Mistake on this page?
Report an issue in GitHub or email us

AnalogIn

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 class reference

Public Member Functions
 AnalogIn (const PinMap &pinmap, float vref=MBED_CONF_TARGET_DEFAULT_ADC_VREF)
 Create an AnalogIn, connected to the specified pin. More...
 AnalogIn (PinName pin, float vref=MBED_CONF_TARGET_DEFAULT_ADC_VREF)
 Create an AnalogIn, connected to the specified pin. More...
float read ()
 Read the input voltage, represented as a float in the range [0.0, 1.0]. More...
unsigned short read_u16 ()
 Read the input voltage, represented as an unsigned short in the range [0x0, 0xFFFF]. More...
float read_voltage ()
 Read the input voltage in volts. More...
void set_reference_voltage (float vref)
 Sets this AnalogIn instance's reference voltage. More...
float get_reference_voltage () const
 Gets this AnalogIn instance's reference voltage. More...
 operator float ()
 An operator shorthand for read() More...

AnalogIn hello, world

/*
 * Copyright (c) 2017-2020 Arm Limited and affiliates.
 * SPDX-License-Identifier: Apache-2.0
 */

#include "mbed.h"

// Initialize a pins to perform analog input and digital output functions
AnalogIn   ain(A0);
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());
        ThisThread::sleep_for(200);
    }
}

AnalogIn examples

Example one

Control an R/C servo with analog input.

/*
 * Copyright (c) 2017-2020 Arm Limited and affiliates.
 * SPDX-License-Identifier: Apache-2.0
 */

#include "mbed.h"

AnalogIn position(A0);
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.
 * SPDX-License-Identifier: Apache-2.0
 */

#include "mbed.h"

AnalogIn input(A0);

#define NUM_SAMPLES 1024

int main()
{
    uint16_t samples[NUM_SAMPLES];

    for (int i = 0; i < NUM_SAMPLES; i++) {
        samples[i] = input.read_u16();
        ThisThread::sleep_for(1);
    }

    printf("Results:\n");
    for (int i = 0; i < NUM_SAMPLES; i++) {
        printf("%d, 0x%04X\n", i, samples[i]);
    }
}

Important Information for this Arm website

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies. If you are not happy with the use of these cookies, please review our Cookie Policy to learn how they can be disabled. By disabling cookies, some features of the site will not work.