fritzler-avr.de
Tipps
Phasenanschnitt mit AVR (dimmen)

Phasenanschnitt mit dem AVR ist softwaremäßig recht einfach und benötigt nur einen Timer sowie einen externen Interrupt. Bevor es zur Software kommt, ersteinmal ein paar Vorschläge zum Aufbereiten des Nulldurchgangssignals und Triacsteuerung.

ACHTUNG! Beim Dimmen wird mit lebensgefährlicher Netzspannung hantiert, daher nur Nachbauen, wenn die nötigen Kenntnisse vorhanden sind. Absichern nicht vergessen. Ich übernehme keinerlei Haftung wenn sich jemand selbst oder andere grillt!

Der Nulldurchgang lässt sich direkt aus der Netzspannung gewinnen mit einem Optokoppler, allerdings wird hier recht viel geheizt. R2 kann weggelassen werden, wenn der interne AVR Pullup verwendet wird.

Wird die Schaltung von einem Trafo versorgt, kann der Optokoppler auch hinter diesem geschalten werden. R1 muss je nach Trafospannung selber berechnet werden. Bei der Scheitelspannung des Trafos muss der maximale Strom der LED fließen. Für R2 gilt dasselbe wie oben.

Ich habe dann noch diese Schaltung hier gefunden und möchte diese nicht vorenthalten. Mit 2x 1 MegaOhm an 230V frisst diese auch nicht viel Strom, laut Simulation 30mW RMS. Am Optokoppler gibt es pro Nulldurchgang einen Nadelimpuls. Quelle

So wird der Triac angesteuert. Der Optokoppler trennt den AVR von den 230V, hier muss ein Typ ohne Nulldurchgangskennung verwendet werden. C4 und L1 bilden einen Netzfilter um die Oberwellenschweinereien beim Schalten vom Netz fernzuhalten. R5 und C3 bilden ein Snubberglied um hohe Spannungsspitzen vom Triac fernzuhalten und L3 dient der Strombegrenzung.

Um die Phase (a) anzuschneiden, muss nach dem Nulldurchgang ein wenig gewartet und dann der Triac gezündet werden. Wird der Triac recht früh gezündet (b) bekommt die Last viel Energie ab, wird er später gezündet (c) bekommt die Last weniger Energie.

  1. //ATmega16
  2.  
  3. //jede Flanke löst ISR aus
  4. MCUCR = (1 << ISC10);
  5. GICR = (1 << INT1);
  6.  
  7. //Overflow und Compare ISR aktiv
  8. TIMSK = (1 << OCIE2) | (1 << TOIE2);
  9.  
  10. //Nulldurchgang
  11. ISR (INT1_vect) {
  12.    OCR2 = Zuendwinkel;
  13.    PORTD &= ~(1<<7); //Triac aus
  14.    TCNT2 = 0; //Timer reset
  15.    TCCR2 = 0b0000101; //Timer starten
  16. }
  17.  
  18. //Triac zünden
  19. ISR (TIMER2_COMP_vect) {
  20.    PORTD |= (1<<7); //Zündimpuls ein
  21.    TCNT2 = 250;   //Overflow auslösen
  22. }
  23.  
  24. //Timer und Zündimpuls abschalten
  25. ISR (TIMER2_OVF_vect) {
  26.    PORTD &= ~(1<<7);
  27.    TCCR2 = 0b0000000;
  28.    TCNT2 = 0;  
  29. }

Dieses verhalten wird in der Software realisiert, indem bei einer Flanke aus der Nulldurchgangserkennung der INT ISR aufgerufen wird. Dieser Startet den Timer, wann der Triac zünden soll wird durch das OCR2 Register bestimmt. Umso höher der Wert im Register umso später wird gezündet.
Ist der Zählwert des Timers gleich dem OCR2 Wert, wird Compare ISR aufgerufen, diese schaltet den Portpin für den Triacoptokopler ein und setzt das Zählregister hoch, damit nach kurzer Zeit der Zähler überlauft. Der ISR des Überlaufs setzt den Portpin wieder auf Low und resettet den Timer. Der ist jetzt wieder scharf gestellt für den nächsten Nulldurchgang.

Für den externen Interrupt müssen die Register so gesetzt sein, dass jede Flanke ein Interrupt auslöst. Als Timer ist jeder nutzbar, er muss im normalmode laufen und der Compare sowie der Overflow Interrupt müssen gesetzt sein. Der Vorteiler des Timers wird so gesetzt, dass er ungefähr 10ms für einen Durchlauf benötigt. Bei einem 16bit Timer muss "TCNT2 = 250" so geändert werden, dass er kurz vor einem Overflow steht.

Home - Tipps

Kontakt - Haftungsausschluss - Impressum