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]);
}
}