Applikation zur Ansteuerung max. 8 Phasenanschnittdimmern auf Triacbasis (230V~). Die Information über den Phasennulldurchgang (Nulldurchgangserkennung/ Zerocrossdetection) muss für phasensynchrones Schalten vorliegen.
Funktionsübersicht
- Dimmwert (Helligkeitswert in 1%-Schritten 0..100% vorgebbar)
- Softstart/Softstopp der Lampen schont die Leuchtmittel (parametrierbare Zeit)
- Aufzeichnung der Lampenbetriebszeit zur Ausfallvorhersage oder zur Berechnug der umgesetzten Energie (Statistik)
- Orientierungslichtfunktion, d.h. Lampe geht für kurze Zeit an, um im Dunkeln den Weg zu leuchten. (Einstellbare Helligkeit und Leuchtdauer).
- Dimmrampe mit Haltefunktion zur Verwendung als Sonnenaufgangs-/ -untergangssimulation (Lichtwecker/Einschlafhilfe)
Hardwarevoraussetzungen
Knotenhardware mit Leistungsausgang zur externen Dimmeransteuerung und Nulldurchgangserkennung an der gleichen Phase wie die zu dimmende Lampe (230V~-Dimmer).
Design und Implementationsdetails
Die Nulldurchgangserkennung schaltet im Flankeninterrupt die Triacansteuerung aus (gilt nur für Dimmwert <100%) und zieht einen Timer auf, der eine gewisse Zeit verstreichen läßt (Phasenanschnittssteuerung). Ist der Timer abgelaufen, so wird der Triac wieder eingeschaltet.
In einer 50Hz-Periode muss der Triac zweimal gezündet werden (einmal in der positiven Halbwelle und einmal in der negativen Halbwelle) => max. ~10ms zwischen 2 Schaltzeitpunkten, d.h. der Timer muss mindestens 10ms überstreichen.
Verwendet wird ein 16Bit-Timer, der mit 6.25MHz getaktet wird und folglich in ~10,5ms einmal überläuft (also 64k Ticks weiterzählt). Daraus ergibt sich eine zeitliche Dimmauflösung von 1/65535s – eine Periode kann quasi in 65535 Schritte unterteilt werden. Das ist deutlich mehr als benötigt. Eine vorgebbare Auflösung von 1%-Schritten reicht bei weitem aus.
Aber: Für die sanften und vor allem sehr langsamen Dimmvorgänge ist es von großem Vorteil, wenn die niedrigen Dimmwerte (z.B. von 1% nach 2%) nicht in einem Sprung umgeschaltet werden, sondern langsam alle ~500 Zwischenschritte (zwischen 1% und 2%) durchfahren werden. Ohne diese Zwischenstufen ist ein deutlicher Helligkeitssprung von 1% nach 2% erkennbar!
Wie wird der Schaltzeitpunkt für die Phasenanschnittsteuerung bestimmt?
Die Lampenhelligkeit ist proportional zur Fläche unter der Leistungskurve. Die Lampenleistung ist das Produkt aus Spannung und Strom, also ist der Graph eine sin²-Kurve (keine Phasenverschiebung, da ohmscher Verbraucher). Da die sin²-Kurve (orangefarbene Kurve) noch „langsamer“ aus dem Nullpunkt kommt, als die Sinuskurve, ist der Beitrag der Fläche der Leistung bei kleinen Phasenanschnittswinkeln sehr klein. Sprich, ob der Triac jetzt zum Zeitpunkt t=0 gezündet wird, oder erst 100µs später spielt praktisch keine Rolle. (100µs wären 1% der Periodendauer; Halbwelle).
Somit läßt sich der Einschaltzeitpunkt weiter eingrenzen und die Auflösung im relevanten (weil sichtbaren) Bereich weiter vergößern!
Experimentell habe ich eine untere Grenze von t(d) = 1ms (= ~7000 Ticks) ermittelt. Wird der Triac früher als 1ms nach Nulldurchgang geschaltet, so ergibt sich daraus keine weitere sichtbare(!) Erhöhung der Helligkeit. Somit wird diese Grenze als untere Einschaltgrenze gesetzt – früher braucht nicht eingeschaltet werden können. Wenn man die gleiche Annahme auch für die obere Grenze macht (obwohl der Triac von sich aus nicht abschaltet), dann ergibt dies einen Bereich von 50.000 Ticks pro 10ms-Periode. => Annahme/Festlegung: Pro Prozent Helligkeitsänderung soll sich der Einschaltzeitpunkt um 500 Ticks nach hinten schieben (Skalierungsfaktor = 500)
Zündzeitpunkt = ZeitoffsetZünden + Skalierungsfaktor*100% – Dimmwert [in %]
Dieser Zeitpunkt muss während jeder Halbwelle der 230V~ Netzspannung neu berechnet werden.
Übrigens: Der Vorgabedimmwert bezieht sich mit seinem Prozentwert rein auf den Einschaltzeitpunkt innerhalb einer Halbwelle und bezeichnet weder die prozentual umgesetzte Leistung, noch die prozentuale Helligkeit bezogen auf die Maximalhelligkeit (Helligkeitsempfinden des Auges).
Veränderung der Helligkeit
Sollen Dimmrampen abgefahren werden (z.B. Softstart/Softstopp oder Sonnenaufgangssimulation), so muss sich der Zündzeitpunkt langsam verschieben. Nach hinten, um die Helligkeit runter zu dimmen und nach vorne, um die Helligkeit zu erhöhen.
Den neuen Solldimmwert ermittelt die Applikation aus der Dimmzeit (Parameter wie schnell der neue Helligkeitswert angefahren werden soll) und dem momentanen Istdimmwert.
Kleines Problem: Bei langsamen Dimmvorgängen, wie z.B. Lichtwecker (0..100% in 60min) muss nicht in jeder 50Hz-Periode ein veränderter Zündzeitpunkt angefahren werden (sondern es ändert sich der Zündzeitpunkt z.B. nur in jeder siebten Periode. Würde man die Änderungsrate pro 10ms-Zyklus berechnen, dann käme man auf 50000Ticks / (60*60*100) 1/s = 0.14. Um einen theoretisch linearen Dimmvorgang durchzuführen, muß also pro Zyklus der Zündzeitpunkt um 0.14 Ticks verschoben werden. Wenn man dies zu Dimmbeginn berechnet und anschliessend immer nur aufaddiert, führt es wegen Rundungsfehlern dann letztendlich dazu, dass der Zielwert nie ganz genau erreicht wird. (Im schlimmsten Fall glimmt die Lampe nach Ablauf der Dimmzeit noch vor sich hin).
Also muss in jedem Zyklus errechnet werden, wann der nächste Änderungszeitpunkt des Zündzeitpunktes kommt. Es wird quasi solange angespart, bis sich ein voller Tick addieren läßt (Bruchteile von Timerticks gibts ja nicht).
Für schnelle Dimmvorgänge, also dann wenn pro Rechenzyklus mehr als ein Tick verändert werden muss, kann dies einfach per: Änderung = (Sollwert – Istwert) / Restdimmzeit errechnet werden.
DoTable Dimmer (DoType 0x13)
DoSi | Beschreibung | Typ/ Länge |
Ort | Min/Max /Default |
Auflösung /Einheit |
Datenart |
0x00 | Dimmwert |
u8 | RAM |
0/100/0 |
1/% | Ctl, Bw, Br |
0x01 | Dimmzeit (pro Dimmvorgang) |
u16 |
EEP | 0/11min /1000ms |
10/ms | Cfg, Bw, Br |
0x02 | Dimmerbetriebszeit [s] |
u32 | EEP | 1/s | Lcfg, Bw, Br | |
0x03 | BegrenzungAnsteuerzeit |
u16 | EEP | -/- /0 (aus) |
10/ms | Cfg, Bw, Br |
0x04 | Restansteuerzeit |
u16 | RAM | 0/18h/- | 10/ms | Ctl, Bw, Br |
0x05 | DimmerAktiv |
u8 | EEP | 0/1/0 | Cfg, Bw, Br | |
0x06 | DimmzeitManuell | u16 | EEP | 0/11min /6000ms |
10/ms | Cfg, Bw, Br |
0x07 | EinHelligkeit |
u8 | EEP | 0/100 /75% |
1/% |
Cfg, Bw, Br |
0x08 | OrientierungsHelligkeit | u8 | EEP | 0/100 /30% |
1/% |
Cfg, Bw, Br |
0x09 | OrientierungsDauer | u16 | EEP | 0/18h /15s |
1/s | Cfg, Bw, Br |
0x0A |
DimmwertAufZeit | raw48 | RAM | komb. Datentyp |
Ctl, Bw, Br |
Der DotParameter „Dimmwert“ kennt folgende Kommandos:
0..100: Helligkeit in Prozent
210: Relative Änderung: +1%
…
224: Relative Änderung -25%
228: Orientierungslicht einschalten; Orientierungslicht wird für einen definierten Zeitraum eingestellt. Orientierungslicht wird nur eingeschaltet, wenn die Lampe gerade dunkler ist, als die OrientierungsHelligkeit. Nach Ablauf der Zeit, wird die Lampe auf 0% gedimmt.
253: Einhelligkeit annehmen (Parameter Einhelligkeit)
254: Helligkeit toggeln (aus <-> EinHelligkeit)
255: Dimmstopp
BoTable Dimmer (DoType 0x13)
BoIndex: 0x00
Zykluszeit: 2000ms (bei Änderung sofort)
Sperrzeit (Inhibittime): 100ms
Datenlänge: 8Byte
Byte |
Beschreibung |
Byte0 | Dimmwert Dimmer0 (Momentanwert) |
Byte1 | Dimmwert Dimmer1 |
Byte2 | Dimmwert Dimmer2 |
Byte3 | Dimmwert Dimmer3 |
Byte4 | Dimmwert Dimmer4 |
Byte5 | Dimmwert Dimmer5 |
Byte6 | Dimmwert Dimmer6 |
Byte7 | Dimmwert Dimmer7 |