Table of Contents
Analog Output
An analog signal is one that can have any value over a continuous range. Arduino employs an approximation to analog outputs and calls these outputs “analog” outputs—even though they are actually a special implementations of Boolean (i.e., “digital”) output.
PWM
Arduino achieves analog-like outputs by using a technique called Pulse Width Modulation (PWM). PWM is technique where a Boolean output is switched on and off very quickly (in the case of the Arduino Uno, it's about 490 times per second). The ratio of the time the output is in the HIGH state to the total period time (i.e., time HIGH + time LOW) is called the duty cyle. If the duty cycle is 100%, then the output will appear to be at maximum output. If the duty cycle is 50%, then the output will appear to be at half the maximum output; a duty cycle of 25% makes the output appear to be at a quarter of maximum. Arduino lets you the duty cycle of its PWM outputs to one of 256 (0 to 255) values,
So one way that Arduino “analog” outputs are not really analog outputs is that they are actually rapidly switched “digital” outputs. Another way that Arduino “analog” outputs are not really analog outputs is that you are only able to set the duty cycle to one of 256 values. If you want something in between any two values, you're stuck.
Check the documentation for your Arduino device to determine which outputs can be used as analog outputs and which can only be used as digital outputs.
Arduino outputs are not unlimited super-sources! Each model has different specifications regarding the maximum current that a pin can output (or absorb). Exceeding these limits may permanently damage the Arduio microcontroller chip.
Example
The example below (taken verbatim from the Arduino Fade tutorial) is an example of using Arduino's PWM to ramp-up and down the brightness of an LED using a timer.
- Fade.ino
/* Fade This example shows how to fade an LED on pin 9 using the analogWrite() function. This example code is in the public domain. */ int led = 9; // the pin that the LED is attached to int brightness = 0; // how bright the LED is int fadeAmount = 5; // how many points to fade the LED by // the setup routine runs once when you press reset: void setup() { // declare pin 9 to be an output: pinMode(led, OUTPUT); } // the loop routine runs over and over again forever: void loop() { // set the brightness of pin 9: analogWrite(led, brightness); // change the brightness for next time through the loop: brightness = brightness + fadeAmount; // reverse the direction of the fading at the ends of the fade: if (brightness == 0 || brightness == 255) { fadeAmount = -fadeAmount ; } // wait for 30 milliseconds to see the dimming effect delay(30); }