Salida análoga

En realidad los microcontroladores no pueden generar salidas análogas, pero pueden simularla por medio de una técnica conocidad como PWM: Modulación por Ancho de Pulso (en inglés Pulse-Width Modulation).

Esta técnica consiste en hacer fluctuar rápidamente el estado de un pin digital, cambiando su nivel de LOW a HIGH, o sea de 0v a 5v a alta velocidad y controlando el tiempo que permanece encendido o apagado. Este tiempo es conocido como ciclo de trabajo o “duty cycle”. Por ejemplo, un ciclo de trabajo de 100% corresponde con una salida constante de 5v, mientras que un ciclo de trabajo de 50% corresponde con una salida de 2.5v.

pwm

La modulación por ancho de pulso permite, por ejemplo, cambiar la luminosidad de un LED de manera gradual o controlar la velocidad de un motor de corriente continua.

Arduino cuenta con la función analogWrite() que permite generar modulación por ancho de pulso en los pines digitales 9, 10 y 11 en las placas que usan el Atmega8 y en los pines 3, 5 ,6, 9, 10 y 11 en las nuevas placas que usan Atmega168/328.

El siguiente ejemplo combina lectura y salida análogas. Enciende un LED de manera proporcional a la luz que incide sobre una fotocelda.

Ver también entradas análogas.

/*
Lectura y salida análoga

Lee el estado de una fotocelda ubicada 
en el pin análogo 0 y enciende proporcionalmente 
un LED ubicado en el pin digital 9. 

*/

int pinFotocelda = 0;
// pin análogo donde está ubicada una fotocelda
int pinLed = 9;
// pin digital que permite simular 
// una salida análoga (PWM)
int val = 0;
// variable que almacena la 
// lectura de la fotocelda

void setup(){
 pinMode(pinLed, OUTPUT);
 Serial.begin(9600);
}

void loop(){
 val = analogRead(pinFotocelda);
 val = map(val, 0, 1023, 0, 255);
 // mapea un valor entre 0 y 1023 
 // del convertidor análogo digital 
 // a valores entre 0 y 255
 // 255: parámetro máximo de la función analogWrite()
 // corresponde a un "duty cycle" de 100%,
 // genera una salida de 5v
 analogWrite(pinLed, val);
 //analogWrite(pinLed, 255-(val)); 
 //permite hacer el efecto contrario
 Serial.println(val);
 // permite ver el valor de la lectura 
 // en el monitor serial
}
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s