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) | |
Create an AnalogIn, connected to the specified pin. More... | |
AnalogIn (PinName pin) | |
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... | |
operator float () | |
An operator shorthand for read() More... |
AnalogIn hello, world
/* mbed Example Program
* Copyright (c) 2006-2014 ARM Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "mbed.h"
// Initialize a pins to perform analog input and digital output fucntions
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());
wait(0.2f);
}
}
AnalogIn examples
Example one
Control an R/C servo with analog input.
#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.
#include "mbed.h"
AnalogIn input(A0);
int main() {
uint16_t samples[1024];
for(int i=0; i<1024; i++) {
samples[i] = input.read_u16();
wait(0.001f);
}
printf("Results:\n");
for(int i=0; i<1024; i++) {
printf("%d, 0x%04X\n", i, samples[i]);
}
}