1
ADC y PWM
Lenguajes técnicos de programación
CONVERSOR ANÁLOGO/DIGITAL A/D
El Arduino mega 2560 posee 16 canales de entrada, conversores 2
análogos/digitales de 10 bits.
Una señal análoga es una señal continua, por ejemplo una señal entre
0 y 5V es una señal análoga y puede tomar valores (1V, 2V, 2.5 V, etc.).
Una señal digital solo puede tomar dos valores 0V ó 5V, abierto o
cerrado, activado o desactivado.
Un sensor de nivel que genera una señal análoga que indica el nivel
que tiene el tanque en todo momento y la señal será proporcional al
nivel del tanque.
Un conversor A/D convierte la señal análoga en un número digital
(binario), él número es proporcional a la señal análoga.
Lenguajes Técnicos de Programación
CONVERSOR ANÁLOGO/DIGITAL A/D
En el caso del Atmega 2560 el conversor A/D tiene 10 bits y la señal
3
análoga de entrada puede estar entre 0V y 5V, sin embargo el
conversor A/D tiene unos niveles de referencia que indican entre
que valores será la señal análoga.
Lee el valor de tensión en el pin analógico especificado. La placa
Arduino Mega posee 16 canales conectados a un conversor analógico
digital de 10 bits. El rango de entrada puede ser cambiado usando la
función analogReference().
El conversor tarda aproximadamente 100 microsegundos (0.0001
segundos) en leer una entrada analógica por lo que se puede llevar
una tasa de lectura máxima aproximada de 10.000 lecturas por
segundo.
Lenguajes Técnicos de Programación
CONVERSOR ANÁLOGO/DIGITAL A/D
analogReference (tipo) pin 98
4
Configura el voltaje de referencia utilizado para la entrada analógica
(es decir, el valor utilizado como la parte superior del voltaje de
entrada). Las opciones son:
DEFAULT: la referencia por defecto analógico de 5 voltios (5V de la
placa Arduino) o 3,3 voltios (3,3 V en la placa Arduino).
INTERIOR: un built-in de referencia, igual a 1,1 voltios y 2.56 voltios
INTERNAL1V1: una referencia integrada 1.1V INTERNAL2V56: un
built-in de referencia 2.56V
EXTERNO: la tensión aplicada a la patilla AREF (entre 0 y 5V
solamente) se utiliza como referencia.
Lenguajes Técnicos de Programación
Con 10 bits el mayor número binario que se puede tener es 1023, por lo tanto
la resolución del conversor A/D está dada por la fórmula:
resolución
VREF GND
1023 5
Así, por ejemplo, si VREF = +5V y VREF- es 0V, la resolución es 5V/1023 = 4.8mV,
cuando la señal análoga sea 0V le corresponde un número digital =
0000000000 y para 5V será 1111111111.
Si VREF+ = +5V y VREF- se puede determinar en todo momento a que número
digital aproximado corresponde cualquier señal análoga de entrada, con la
fórmula:
VEntrada VEntrada
4.8mV 0.0048V
NOTA:
Para la simulación en proteus del conversor A/D el pin número 100(AVCC) del
Arduino debe estar conectado a VCC ya que de no tener este pin conectado
no simulara el conversor.
Lenguajes Técnicos de Programación
IDENTIFICACION DE ENTRADAS ANALOGAS EN EL ARDUINO MEGA 2560
Lenguajes
Teoría deTécnicos de Programación
la Conmutación
Ejemplo 1
Mostrar en el Monitor serial el valor numérico correspondiente a la señal análoga que
entra por A0 (entrada análoga 0).
int valor; // definir la variable valor como una variable tipo int 7
void setup()
{
Serial.begin(9600);
}
void loop()
{
valor=analogRead(0) ; // selecciona la entrada análoga 0
delay(200); // llama un retardo de 200 milisegundo
Serial.println("CONVERSOR A/D"); // muestra mensaje CONVERSOR A/D
Serial.print ("VALOR = "); // muestra el mensaje VALOR=
Serial.println (valor); // muestra el valor numérico de la conversión
}
Lenguajes Técnicos de Programación
Circuito en Proteus para simular los ejemplos 1 y 2
Lenguajes Técnicos de Programación
Ejemplo 2
Mostrar la el valor de la señal análoga entre 0 y 200, escalando la señal
análoga de entrada
int valor; // definir la variable valor como una variable tipo long 9
void setup()
{
Serial.begin(9600);
}
void loop()
{
valor = analogRead(0) ; // selecciona la entrada análoga 0
delay(200); // llama un retardo de 200 milisegundo
valor = map(valor,0,1023,0,200); //Escaliza la señal
Serial.println("CONVERSOR A/D"); // muestra mensaje CONVERSOR A/D
Serial.print ("VALOR = "); // muestra el mensaje VALOR=
Serial.println(valor); // muestra el valor numérico de la conversión
}
Lenguajes Técnicos de Programación
CIRCUITO LM35
Este circuito es un sensor de temperatura de 3 terminales. Sensa
10
temperaturas entre -55°C y 150°C, y genera 10mV por cada grado
centígrado.
IDENTIFICACIÓN DE LOS PINES DE LM35
Lenguajes Técnicos de Programación
Ejemplo 3
Mostrar la temperatura medida con el sensor de temperatura LM35 en el Monitor serial
11
float valor; // definir la variable valor como una variable tipo long
void setup()
{
Serial.begin(9600);
}
void loop()
{
valor=analogRead(0) ; // selecciona la entrada analoga 0
valor = (5.0*valor*100.0)/1024.0; //Convierte a grados Celsius
delay(200); // llama un retardo de 200 milisegundo
Serial.print("Temperatura: "); // muestra mensaje Temperatura
Serial.println(valor); // muestra el valor numérico de la conversión
}
Lenguajes Técnicos de Programación
CONTROL PWM
PWM tiene diferentes usos:
Cambiar intensidad lumínica de un LED.
12
• Disponer de una salida analógica; si la salida digital está filtrada, esto
proveerá de un voltaje entre el 0% y el 100%.
• Generar señales de audio.
• Proveer de un control de velocidad variable para motores
• Generar una señal modulada, por ejemplo para utilizar un LED infrarrojo para
control remoto.
Lenguajes Técnicos de Programación
CONTROL PWM
La modulación por ancho de pulso (PWM) puede ser utilizada en el
Arduino de diferentes maneras, en esta guía se explica una forma sencilla 13
de cómo hacer un control PWM, Si no está familiarizado con la
Modulación de Ancho de Pulso aquí hay una breve explicación, una señal
PWM es una onda digital cuadrada, donde la frecuencia es constante,
pero la fracción de tiempo en que la señal está encendida (el ciclo de
trabajo) puede variar entre el 0 y el 100%.
Lenguajes Técnicos de Programación
CONTROL PWM
El lenguaje de programación de Arduino hace que el PWM sea fácil de usar;
simplemente llama la instrucción analogWrite (pin, dutyCycle), donde dutyCycle
es un valor entre 0 y 255, donde la sentencia pin es uno de los 15 pines PWM del
Arduino mega (0,1,2,3,4,5,6,7,8,9,10,11,12,13 y 16). La función analogWrite 14
ofrece un interfaz simple al hardware PWM, pero no ofrece ningún control sobre
la frecuencia. (Nótese que a pesar del nombre de la función, la señal de salida es
digital, a menudo haciendo referencia a una onda cuadrada).
Cuando se va a proveer un control variable para motores por medio de una
entrada análoga se debe utilizar la instrucción map, esta instrucción se encarga de
tomar el valor análogo que está definido por defecto del fabricante a 10 bits
(1023) y escalarlo de forma proporcional a 8 bits (255) “o a cualquier otro valor
deseado” esto es con el fin de que no se desborde el timer que solamente es de
255 y para un mejor funcionamiento del PWM.
pwm=map (pwm, 0,1023,0,255);
NOTA: Al igual que el conversor A/D para simular el PWM en proteus debe
colocar el pin 100(AVCC) a VCC.
Lenguajes Técnicos de Programación
Circuito en Proteus para simular el ejemplo 4
15
Lenguajes Técnicos de Programación
Ejemplo 4
Hacer un programa de tal manera que se varíe la velocidad de un motor, de
acuerdo a la señal análoga de entrada.
16
long pwm;
void setup()
{
Serial.begin(9600);
}
void loop()
{
pwm = analogRead(A0); // la variable pwm es igual al valor analogo
pwm = map(pwm, 0, 1023, 0, 255); // Escala el valor de la señal analaoga de 0 a 255
Serial.println(pwm);
analogWrite(2, pwm);
}
Lenguajes Técnicos de Programación
LED RGB
El led RGB tiene 3 diodos LED internos que emiten tres colores diferentes Red - 17
Green – Blue (RGB), claro; Rojo, Verde y Azul.
Lenguajes Técnicos de Programación
LED RGB
18
El LED RGB de 4 pines tiene 1 Cátodos y 3 Ánodo
Lenguajes Técnicos de Programación
LED RGB
Se pueden alimentar los 3 LEDs al mismo tiempo o generar todo tipo 19
de combinaciones. Los Monitores o pantallas con LEDs utilizan LEDs
RGB que actúan como píxeles, y dedicados controladores de video
generan las combinaciones e intensidades adecuadas para darle a
cada LED (píxel) la tonalidad y color correspondiente para generar en
grupo la imagen que se ve.
Si energizamos cada led con resistencias son fijas, los colores serán
fijos. Pero si utilizamos resistencias variables o un sistema modulador
de ancho de pulsos (PWM para LEDs RGB) podremos atenuar o
intensificar los colores combinando infinidad de tonalidades del rojo,
verde y azul, barriendo prácticamente con toda la gama de colores.
Lenguajes Técnicos de Programación
LED RGB
20
Si las resistencias son fijas, los colores serán fijos. Pero si utilizamos
resistencias variables o un sistema modulador de ancho de pulsos
(PWM para LEDs RGB) podremos atenuar o intensificar los colores
combinando infinidad de tonalidades del rojo, verde y azul, barriendo
prácticamente con toda la gama de colores.
Lenguajes Técnicos de Programación
Tabla de Colores RGB
21
• RGB Color Codes Chart • Carta de colores RAL
http://www.rapidtables colores%20rgb.pdf
.com/web/color/RGB_C
olor.htm
Lenguajes Técnicos de Programación
Encender el led RGB de un color diferente de acuerdo al pulsador que se Ejemplo 5
oprima.
int pulsador1 = 37; // pulsador1 en pin 37
int pulsador2 = 36; // pulsador1 en pin 36
int pulsador3 = 35; // pulsador1 en pin 35
int pulsador4 = 34; // pulsador1 en pin 34
22
int pwm2=240,pwm3=255,pwm3=255; //Define valores por defecto
void setup()
{
pinMode(pulsador1, INPUT); // configura el pulsador1 como entrada
pinMode(pulsador2, INPUT); // configura el pulsador2 como entrada
pinMode(pulsador3, INPUT); // configura el pulsador3 como entrada
pinMode(pulsador4, INPUT); // configura el pulsador4 como entrada
}
void loop()
{
if(digitalRead(pulsador1)==HIGH) // Si pulsador 1 esta activado
{
analogWrite(2,pwm2);
analogWrite(3,pwm3);
analogWrite(4,pwm4);
}
Lenguajes Técnicos de Programación
Ejemplo 5
if(digitalRead(pulsador2)==HIGH) // Si pulsador 2 esta activado
{
analogWrite(2,255);
analogWrite(3,0); 23
analogWrite(4,0);
}
if(digitalRead(pulsador3)==HIGH) // Si pulsador 3 esta activado
{
analogWrite(2,0);
analogWrite(3,255);
analogWrite(4,0);
}
if(digitalRead(pulsador4)==HIGH) // Si pulsador 4 esta activado
{
analogWrite(2,0);
analogWrite(3,0);
analogWrite(4,255);
}
}
Lenguajes Técnicos de Programación