Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PWM son siglas en inglés que significan Pulse Width Modulation y que lo
podemos traducir a español como Modulación de ancho de pulso. Puede ser que
esto no te diga nada de momento, pero al terminar el artículo tomará todo el sentido
del mundo.
La modulación de ancho de pulso está formada por una señal de onda
cuadrada que no siempre tiene la misma relación entre el tiempo que esta en alto y
el tiempo que está en bajo.
En la siguiente imagen vemos una señal que varía entre 5 voltios y 0 voltios.
A lo largo del tiempo la señal varía entre dos valores de tensión. Durante un tiempo
determinado la señal se encuentra en el nivel alto (en este caso 5v ) y durante otro
periodo de tiempo se encuentra en el segundo valor de tensión (en este caso 0v).
PWM 90%
Cuando el ciclo es de 20%, como en la siguiente imagen, la señal estará el 20% del
tiempo en nivel alto y el 80% en nivel bajo.
PWM 20%
Lo cierto es que al variar el duty cycle de una señal PWM, lo que estamos haciendo
es variar su tensión media y esta es la clave por la cual usamos tanto el PWM.
Cunado una señal media de tensión atraviesa ciertos componentes electrónicos,
puede hacer que su comportamiento cambie. Por ejemplo, los LED, los motores de
corriente continua o ventiladores, incluso altavoces y zumbadores.
Si tenemos un LED conectado a un microcontrolador, podemos variar el brillo con el
que se enciende el LED variando la señal PWM a la que se sometemos.
LED resistencia controlado por PWM
Si le enviamos una señal de 100% de ciclo de trabajo, el LED se encenderá con todo
su potencia óptica y por tanto con todo su brillo. Si lo conectamos a una señal del
50% de duty cycle, el LED se encenderá con la mitad de su brillo.
Otra opción puede ser controlar la velocidad de un motor de corriente continua, por
ejemplo los que usan algunos ventiladores de PC, aunque se puede usar con
cualquier motor de corriente continua tal y como vimos en un tutorial anterior
sobre controlar un motor de corriente continua con PWM.
Cuando varía el ciclo de trabajo, varía la velocidad ya que varia la tensión media en
el bobinado del motor. Con un ciclo de trabajo de 100%, el motor girará a la máxima
velocidad. Al reducir el ciclo de trabajo, se reducirá la velocidad.
Otro clásico es enviar una señal PWM que varia su duty cycle a un altavoz o
zumbador para generar sonidos y melodías de manera sencilla y rápida. Un ejemplo
puedeser cuando tocamos la Marcha Imperial en el tutorial sobre sensores
capacitivos con Arduino.
INTERRUPCIONES EN ARDUINO
Arduino dispone de dos tipos de eventos en los que definir interrupciones.
Por un lado tenemos las interrupciones de timers (que veremos en su
momento al hablar de temporizadores. Por otro lado, tenemos
las interrupciones de hardware, que responden a eventos ocurridos en
ciertos pines físicos.
Dentro de las interrupciones de hardware, que son las que nos ocupan en
esta entrada, Arduino es capaz de detectar los siguientes eventos.
RISING, ocurre en el flanco de subida de LOW a HIGH.
FALLING, ocurre en el flanco de bajada de HIGH a LOW.
CHANGING, ocurre cuando el pin cambia de estado (rising + falling).
LOW, se ejecuta continuamente mientras está en estado LOW.
UNO 2 3
Nano 2 3
Mini Pro 2 3
Mega 2 3 21 20 19 18
Leonardo 3 2 0 1 7
Modelo INT0 INT1 INT2 INT3 INT4 INT5
LA FUNCIÓN ISR
La función asociada a una interrupción se denomina ISR (Interruption Service
Routines) y, por definición, tiene que ser una función que no recibe nada y no
devuelva nada.
Dos ISR no pueden ejecutarse de forma simultánea. En caso de dispararse
otra interrupción mientras se ejecuta una ISR, la función ISR se ejecuta una
a continuación de otra.
CREAR INTERRUPCIONES EN
ARDUINO
Para definir una interrupción en Arduino usamos la función:
No obstante, es más limpio emplear la función digitalPinToInterrupt(), que
convierte un Pin a la interrupción equivalente. De esta forma se favorece el
cambio de modelo de placa sin tener que modificar el código.
PROBANDO LAS INTERRUPCIONES EN
ARDUINO
Para probar las interrupciones en Arduino, vamos a emplear una salida digital
de Arduino para emular una señal digital. En el mundo real, sería otro
dispositivo (un sensor, otro procesador…) el que generaría esta señal, y
nosotros la captaríamos con Arduino.
Conectamos mediante un cable el pin digital 10 al pin digital 2, asociado a la
interrupción 0.
7 void setup() {
8 pinMode(emuPin, OUTPUT);
9 pinMode(LEDPin, OUTPUT);
10 pinMode(intPin, INPUT_PULLUP);
19 delay(150);
20 }
21
22 void blink() {
23 state = !state;
24 digitalWrite(LEDPin, state);
25 }
El siguiente código empleamos el mismo pin digital para emular una onda
cuadrada, esta vez de intervalo 2s (1s ON y 1s OFF).
En cada interrupción actualizamos el valor de un contador. Posteriormente,
en el bucle principal, comprobamos el valor del contador, y si ha sido
modificado mostramos el nuevo valor.
Al ejecutar el código, veremos que en el monitor serie se imprimen números
consecutivos a intervalos de dos segundos.
7
8 void setup()
9 {
10 pinMode(emuPin, OUTPUT);
11
12 pinMode(intPin, INPUT_PULLUP);
13 Serial.begin(9600);
14 attachInterrupt(digitalPinToInterrupt(intPin), interruptCount, LOW);
15 }
16
17 void loop()
18 {
23 delay(1000);
24
25
26 if (counter != ISRCounter)
27 {
28 counter = ISRCounter;
29 Serial.println(counter);
30 }
31 }
32
33 void interruptCount()
34 {
35 ISRCounter++;
36 timeCounter = millis();
37 }