Schritt 8: Software: Timer und Interrupts
Ich weiß nicht, welche Bilder Posten für die Erklärung der Software, also offensichtlich, wahrscheinlich nur post ein Bild mit einer Katze besser zu. Außerdem steht die volle Arduino Code oben herunterladen. (lbdOrganPWM.ino)
Timer und Interrupts
Um die Hardware PWM nacheinander mit der Ac-Linie auslösen zu nutzen, alles, was wir tun müssen, ist sicherzustellen, dass der Zähler, der verwendet wird, um den PWM-Wert ausgegeben in den Nulldurchgang der Netzspannung AC zurückgesetzt wird. Mit der auslösenden Schaltung erklärt in Schritt 7 legen wir einen Hardware-Interrupt auf diesen Pin an die Zähler zurückzusetzen, wenn es ausgelöst wird.
Jeder Timer wird zu Beginn des Programms, um die Wellenform Generierungsmodus schnell PWM Modus mit ICRn als den obersten Wert initialisiert. Dieser Timermodus ist was mit der Hardware PWM möglich macht.
Da wir 7-Bit-Auflösung der Umlaufsgeschwindigkeit der MIDI-Note haben, wollen wir diese Entschließung für die Glühbirne Intensität ziemlich nah. Ehrlich gesagt, etwas über 16 Stufen ist ziemlich vernachlässigbar, aber da können wir wir könnte genauso gut. Also wenn wir die Vorteiler der Timer auf 1024 (s. 161 Atmega2560 Datenblatt)setzen, dann wir 16 Mhz haben / 1024 für unsere Zeitschaltuhr = 15625 Hz. Unser Ziel-Frequenz unserer gesamten PWM-Wellenform ist 120Hz Halbzyklus der 60 Hz Netzspannung übereinstimmen. Also teilen wir 15626/120 ~ 130 erhalten. Das heißt, wenn wir unsere ICRn Register bis130 festgelegt, erhalten wir eine Frequenz entsprechen die Netzfrequenz mit ~ 130 Schritten. Das ist perfekt, da wir in der MIDI-Velocity 128 Schritte haben!
Nach dem Versuch dieses heraus, gibt es einige Unterschiede in der Netzfrequenz und so landete ich mit dem oberen Wert (ICRn) 122. Dies schien wie ein Safe genug Wert wo würde ich sicherstellen, dass ich den Triac am Null-Kreuz ausschalten würde. Wenn Sie zu weit über die Null-Kreuz-Schwelle gehen, verpassen Sie es, und das Licht nie ausgeschaltet oder gedimmt.
Letzte Sache, über die Timer-Config ist die PWM-Polarität. Denn sobald der Timer auf den Endpunkt wollen wir sicherstellen, den Triac schaltet sich aus (in diesem Fall wir in der Nähe der Zero-Cross sind), wir haben den invertierten Modus der PWM Pin, so verwenden, dass bei den Timer = 0, die Pin ist gering. Das nur heißt, wenn wir einen Geschwindigkeitswert von 100 bekommen, wir wollen wirklich das PWM-Register auf 127-100 festgelegt = 27.
Für den Umgang mit dem Null-Kreuz, hat die Arduino-Bibliothek eine eingebaute Funktion für diese mit der Hardware-Interrupt:
Wo 5 den Interrupt Pin-Nummer 18 auf der Mega, FALLING gibt es wird nur auf die fallende Flanke ausgelöst (1 -> 0, nicht 0 -> 1) von den Interrupt-Pin und ZeroCrossDetect ist die Funktion unten.
Es funktioniert durch die Einstellung alle Leistungsindikatoren, die von bestimmten PWM Pins, die ich gewählt habe, am Kreuz Null Null verwendet. Es setzt auch den Vorteiler und Wellenform Generation-Modus für jeden Timer, der Grund dafür ist, dass der Timer startet auf der AC-Zyklus am Anfang des Programms sicherzustellen, gibt es kein Offset vom Anfang.