Paso 8: Software: Timers y las interrupciones
No sé qué fotos publicar para explicar el software, así que, obviamente, probablemente mejor solo post una foto con un gato. También, el código de arduino completo está disponible para descargar por encima. (lbdOrganPWM.ino)
Timers y las interrupciones
Para poder utilizar el hardware PWM en secuencia con la línea de CA accionar, todo lo que tenemos que hacer es asegurarse de que el contador que se utiliza para el valor de PWM se reposiciona en el cruce por cero de la tensión de línea. Con el circuito de disparo, explicado en el paso 7, atribuimos una interrupción de hardware a este pin a cero los contadores cuando desencadena.
Cada contador se inicializa en el inicio del programa en el modo de generación de forma de onda de modo rápido PWM con ICRn como valor superior. Este modo es lo que hace usando el hardware PWM posibles.
Ya que tenemos 7-bits de resolución en la velocidad de la nota MIDI, queremos acercarnos bastante a esta resolución para la intensidad de la bombilla. Francamente, cualquier cosa por encima de 16 pasos es bastante despreciable, pero puesto que podemos así podríamos. Si fijamos el prescaler de los temporizadores a 1024 (pág. 161 de Atmega2560 hoja de datos), entonces tenemos 16 Mhz / 1024 para nuestro reloj = 15625 Hz. Nuestra frecuencia objetivo de nuestra forma de onda PWM total es 120Hz, para que coincida con el semiciclo de la tensión de línea de 60Hz. Por lo tanto, dividimos 15626/120 para obtener ~ 130. Esto significa que si fijamos nuestros ICRn registro to130, obtenemos una frecuencia que empareja la frecuencia de línea con ~ 130 pasos. Es perfecto ya que contamos con 128 pasos en la velocidad MIDI!
Después de probar esto, hay alguna variación en la frecuencia de línea, y así que acabé utilizando un valor superior (ICRn) de 122. Esto parecía un seguro suficiente valor donde haría que se apago el triac en el cruce de cero. Si vas demasiado lejos más allá del umbral de la cero-cruz, te lo puedes perder y la luz nunca se apaga o atenúa.
Lo último, sobre la configuración del temporizador es la polaridad PWM. Porque una vez que el temporizador llega a su punto queremos hacer que el triac se apaga (esto significa que estamos cerca de la Cruz cero), tenemos que usar el modo invertido del perno PWM, así que cuando el temporizador = 0, el pin es baja. Eso significa que sólo cuando obtenemos un valor de velocidad de 100, que realmente queremos establecer el registro PWM a 127-100 = 27.
Para el manejo de la cero-cruz, la biblioteca arduino tiene una función de este uso de la interrupción de hardware:
attachInterrupt(5,zeroCrossDetect,FALLING);
Donde 5 es el número de interrupción (pin 18 en la Mega), descendente indica sólo se activa en el flanco descendente (1 -> 0, no 0 -> 1) del perno de interrupción, y zeroCrossDetect es la función a continuación.
Trabaja poniendo todos los contadores utilizados por los pines PWM específicos que he elegido a cero en el cero de la Cruz. También establece el modo de generación de prescaler y forma de onda para cada temporizador, la razón de esto es para que el temporizador comienza el ciclo de CA en el inicio del programa, haya no hay offset desde el comienzo.
void zeroCrossDetect() { TCNT1 = 0; TCNT3 = 0; TCNT4 = 0; TCNT5 = 0; TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS10) | (1<<CS12); TCCR3B = (1<<WGM32) | (1<<WGM33) | (1<<CS30) | (1<<CS32); TCCR4B = (1<<WGM42) | (1<<WGM43) | (1<<CS40) | (1<<CS42); TCCR5B = (1<<WGM52) | (1<<WGM53) | (1<<CS50) | (1<<CS52); }