AC 230V (50Hz) PWM Dimmer macht Schwierigkeiten

Und einmal mehr macht mir mein nicht vorhandenes Englisch Probleme…

Was ich habe:
Einen Arduino Mega (Clon)
Einen AC Licht Dimmer für PWM Steuerung
Eine LED Glühlampe zu Testzwecken.

Einen Code zum Probieren habe ich hier gefunden:

/*

AC Voltage dimmer with Zero cross detection
Author: Charith Fernanado Adapted by DIY_bloke
License: Creative Commons Attribution Share-Alike 3.0 License.
Attach the Zero cross pin of the module to Arduino External Interrupt pin
Select the correct Interrupt # from the below table 
(the Pin numbers are digital pins, NOT physical pins: 
digital pin 2 [INT0]=physical pin 4 and digital pin 3 [INT1]= physical pin 5)
check: <a href="http://arduino.cc/en/Reference/attachInterrupt">interrupts</a>

Pin    |  Interrrupt # | Arduino Platform
---------------------------------------
2      |  0            |  All -But it is INT1 on the Leonardo
3      |  1            |  All -But it is INT0 on the Leonardo
18     |  5            |  Arduino Mega Only
19     |  4            |  Arduino Mega Only
20     |  3            |  Arduino Mega Only
21     |  2            |  Arduino Mega Only
0      |  0            |  Leonardo
1      |  3            |  Leonardo
7      |  4            |  Leonardo
The Arduino Due has no standard interrupt pins as an iterrupt can be attached to almosty any pin. 
In the program pin 2 is chosen
2      |  0            |  All -But it is INT1 on the Leonardo
*/
int R1 = 29;
int AC_LOAD = 4;    // Output to Opto Triac pin
int dimming = 128;  // Dimming level (0-128)  0 = ON, 128 = OFF

void setup()
{
  pinMode(R1, OUTPUT);
 
  pinMode(AC_LOAD, OUTPUT);// Set AC Load pin as output
  attachInterrupt(0, zero_crosss_int, RISING);  // Choose the zero cross interrupt # from the table above
}

//the interrupt function must take no parameters and return nothing
void zero_crosss_int()  //function to be fired at the zero crossing to dim the light
{
  // Firing angle calculation : 1 full 50Hz wave =1/50=20ms 
  // Every zerocrossing thus: (50Hz)-> 10ms (1/2 Cycle) 
  // For 60Hz => 8.33ms (10.000/120)
  // 10ms=10000us
  // (10000us - 10us) / 128 = 75 (Approx) For 60Hz =>65

  int dimtime = (75*dimming);    // For 60Hz =>65    
  delayMicroseconds(dimtime);    // Wait till firing the TRIAC    
  digitalWrite(AC_LOAD, HIGH);   // Fire the TRIAC
  delayMicroseconds(10);         // triac On propogation delay 
         // (for 60Hz use 8.33) Some Triacs need a longer period
  digitalWrite(AC_LOAD, LOW);    // No longer trigger the TRIAC (the next zero crossing will swith it off) TRIAC
}

void loop()  { 
  digitalWrite(R1, HIGH);
  for (int i=5; i <= 128; i++){
    dimming=128;
    delay(10);
   }
}

Mein Leuchtmittel hängt hinter einem Relais, daher minimal angepasst.

Leider finde ich den Dimmer nicht unter Fritzing, daher kein Schaltplan.
+5V und GND sind am selben (MW 5A) Netzteil wie der Arduino Clone,
der PWM Eingang ist auf PIN 4,
der Z-C Anschluß des Dimmers ist auf PIN 2 geklemmt (Interrupt 0, wenn ich das richtig verstanden habe.

Was ich machen möchte:
Das Leuchtmittel in 5 Stufen dimmen (20% 40% 60% 80% 100%)

Was mit dem Testcode passiert:
Leuchtmittel startet mit einem Aufblitzen
Leuchtmittel geht kurz aus
Leuchtmittel leuchtet volle Leistung
Leuchtmittel dimmt herunter
Leuchtmittel geht aus
und dann von vorne

Leuchtmittel startet mit einem Aufblitzen
Leuchtmittel geht kurz aus

Da das Leuchtmittel (denke ich) kapazitiv ist, ist die Phasenabschittssteuerung richtig.

Trotzdem bekomme ich (z.B 50% Leistung) nicht hin.

Könnt Ihr mir kleinem Trotteltier helfen?

230V LED-Lampen, bei denen es nicht ausdrücklich dabei steht, sind in der Regel nicht dimmbar.

Es steht dimmbar auf der Packung.
Das Dimmen funtioniert auch.
Nur nicht so, wie ich es wünsche.

Stell doch erst mal stabile Dimm-Zustände her und schau ob das funktioniert. Und dazu noch eine gute alte Glühbirne statt LEDs, dann sehen wir weiter.

Klaus_ww:
Stell doch erst mal stabile Dimm-Zustände her und schau ob das funktioniert. Und dazu noch eine gute alte Glühbirne statt LEDs, dann sehen wir weiter.

Und genau das habe ich verscuht und bekomme es nicht hin.
Aber eine Glühampe könnte ich mal suchen gehen.

Glühlampe gefunden.
Damit klappt es wesentlich besser....
Vielleicht bekomme ich es doch noch hin.
Danke für den Tipp.

Gerne - ich drück die Daumen dass es klappt.

Vielleicht passt der Dimmer nicht zur Led? Die sind da etwas pingelig. Eine Glühlampe lässt sich mit jedem Dimmer dimmen.

So ganz klappt es immer noch nicht.
Ich habe zwar einen Bereich gefunden, in der auch meine zickiges LED Leuchtmittel sich flackerfrei dimmen läßt…ABER…
Das ganze läßt sich nicht in meinen Sketch einbinden.
Könnte daran liegen, dass das Beispiel mit delayMicroseconds arbeitet.
Uff…gibt es eine Möglichkeit, dass auf millis umzumünzen?

Ich hab echt ein Brett vorm Kopf…

void zero_crosss_int()  //function to be fired at the zero crossing to dim the light
{
 int dimtime = (75*DimmWert1);    // For 60Hz =>65    
 delayMicroseconds(dimtime);    // Wait till firing the TRIAC    
 digitalWrite(DimmPin1, HIGH);   // Fire the TRIAC
 delayMicroseconds(10);         // triac On propogation delay 
                                 // (for 60Hz use 8.33) Some Triacs need a longer period
 digitalWrite(DimmPin1, LOW);    // No longer trigger the TRIAC (the next zero crossing will swith it off) TRIAC
}

Wie sieht Deine Nulldurchgangsdetektierung aus?
Grüße Uwe

uwefed:
Wie sieht Deine Nulldurchgangsdetektierung aus?
Grüße Uwe

Ich bin mir nicht sicher, ob ich die Frage richtig verstanden habe, aber der Pin Z-0 des Dimmers ist am Pin 2 des Arduino Mega-Clon angeklemmt.
Und da bekommt er beim Nulldurchgang vom Intrrupt ein Signal.
Richtig? (hoffentlich blamier ich mich jetzt nicht mit meinem frisch angelesenen Halbwissen…)

Jetzt ist es mir zu spät, aber morgen versuch ich mal das hier:

int DimmWert1 = 50;
int DimmPin1 = 3;

void setup() 
{ 
attachInterrupt(0, zero_crosss_int, RISING);
pinMode(DimmPin1, OUTPUT);
}

void zero_crosss_int()  
{
 int dimtime1 = (75*DimmWert1);    
 unsigned long Dimmstart1 = micros();    
 if(micros()- Dimmstart1 >= dimtime1)
   { digitalWrite(DimmPin1, HIGH);  }
 unsigned long DimmPause1 = micros();
 if(micros()- DimmPause1 >= 10)
   { digitalWrite(DimmPin1, LOW);  }
}

Was haltet ihr davon?

Das Modul
Triac-Modul.jpg

hat laut Foto einen MOC3042 montiert.

Das ist ein Optokoppler mit Zero Crossing Triac Ausgang. Da ein Triac nicht an Gleichstrom genutzt werden kann ( er schaltet nicht mehr aus) nehme ich, aus Mangel an einem Schaltbild und zu schlechter Fotos um die Leiterbahnen verfolgen zu können, an, daß dieser zur Ansteuerung des Leistungstriac auf der Platine verwendet wird. Da dieser wie schon gesagt ein Zero Crossing Typ ist kann er nicht zur Phasenanschnitsteuerung verwendet werden. Es kann lediglich eine Vollwellensteuerung realisiert werden, was aber bei jeglichen Lampen nicht sinnvoll ist da diese zu flacker anfangen.
Abschließend kann ich sagen, daß diese Hardware NIEMALS zum Dimmen mittels Phasenanschnittsteuerung funktionieren wird.

Grüße Uwe

Triac-Modul.jpg

Wenn Du die Beschreibung mit viel Phantasie und in erinnerung Behälst daß sie durch ein schlechtes Übersetzungsprogramm aus einer zu Deutsch schlecht kompatiblen Sprache erfolgt ist dann kann man aus folgendem:

Puls überspringen Modulation:
Eine andere Möglichkeit, dies zu tun, ist die Pulse-Skip-Modulation. Mit PSM werden ein oder mehrere vollständige Zyklen (Sinuswellen) auf die Last übertragen und dann ein oder mehrere Zyklen nicht. Obwohl effektiv, ist es keine gute Art, Licht zu dimmen, da es eine Chance zum Flackern gibt. Obwohl es verlockend sein könnte, sollte man bei PSM immer eine volle Sinuswelle an die Last weitergeben, nicht eine halbe Sinus, da in diesem Fall die Last faktisch von DC gespeist wird, was für die meisten AC-Lasten nicht gut ist. Der Unterschied zwischen Vorderkantenschneiden und PSM besteht hauptsächlich in der Software: In beiden Fällen wird eine Schaltung benötigt, die den Nulldurchgang erkennt und die einen Triac steuern kann.

verstehen, daß das Modul für "Puls überspringen Modulation" geeignet ist und nicht für " Vorderkantenschneiden".
Sprich Vollwellenmodulation und nicht Phasenanschnittsteuerung.

Außerdem ist es falsch daß man bei Vollwellenmodulation eine Netzsychronisation braucht. Zündimpulsen nur immer länger als 10mS sein um 2 Halbwellen durchzulassen.

Grüße Uwe

Macht es da einen Unterschied, dass ich eine PhasenABschnittsteuerung anstrebe?
Ich meine...
Perfekt läuft es zwar nicht (der flackerfreie Bereich ist relativ klein), aber für meine Bedürfnisse reicht es.
Gäbe es ein Bauteil, dass besser geeignet wäre?

Und einmal mehr komme ich nicht weiter, weil ich meinen Denkfehler nicht finde.
Ich hab mal alles auf nötigste runter gebrochen…

Dieser Sketch funktioniert:

int R1 = 29;
int DimmPin1 = 4;    
int DimmWert1 = 90;  
int EinschaltZeit1 = 0;

void setup()
{
  pinMode(R1, OUTPUT);
  digitalWrite(R1, HIGH); //Relais für Leuchte ein
  pinMode(DimmPin1, OUTPUT);
  attachInterrupt(0, zero_crosss_int, RISING);  // PIN 2 am Mega- Clone
}
void zero_crosss_int()  
{
  EinschaltZeit1 = (75*DimmWert1);    // For 60Hz =>65    
  delayMicroseconds(EinschaltZeit1);    // Wait till firing the TRIAC    
  digitalWrite(DimmPin1, HIGH);   // Fire the TRIAC
  delayMicroseconds(10);         // triac On propogation delay 
         // (for 60Hz use 8.33) Some Triacs need a longer period
  digitalWrite(DimmPin1, LOW);    // No longer trigger the TRIAC (the next zero crossing will swith it off) TRIAC
}
void loop()  
  {
    /* 
   for (int i=50; i <= 95; i++){
    DimmWert1=i;
    delay(100); */
   }

Dieser Nicht:

int R1 = 29;
int DimmPin1 = 4;    
int DimmWert1 = 90;  
int EinschaltZeit1 = 0;
bool DimmMerker1 = LOW;
unsigned long Dimmstart1 = 0;
unsigned long DimmPause1 = 0;

void setup()
{
  pinMode(R1, OUTPUT);
  digitalWrite(R1, HIGH); //Relais für Leuchte ein
  pinMode(DimmPin1 , OUTPUT);
  attachInterrupt(0, zero_crosss_int, RISING); 
}
  
void zero_crosss_int()  
{
  EinschaltZeit1 = (75*DimmWert1);    
  Dimmstart1 = micros();    
  if(micros()- Dimmstart1 >=  EinschaltZeit1 && DimmMerker1 == LOW)
    { digitalWrite(DimmPin1, HIGH);
      DimmMerker1 = HIGH;
      DimmPause1 = micros();
      }
  
  if(micros()- DimmPause1 >= 10 && DimmMerker1 == HIGH)
    { digitalWrite(DimmPin1, LOW);
      DimmMerker1 = LOW;}
}

void loop()  { 
 /*
  for (int i=50; i <= 95; i++){
    DimmWert1=i;
    delay(100);
   }*/
   }

Wo liegt mein Denkfehler?

Tiff48317:
Macht es da einen Unterschied, dass ich eine PhasenABschnittsteuerung anstrebe?

Phasenabschnittsteuerungen gehen nicht mit einfachen Triacs. Das dürfte bei so Billig-Dimmern schwierig werden. Es gibt Dimmer die beides können, aber das ist dann was professionelles und nichts zum Basteln

Aber wieso machst du dir bei Leuchtmitteln darum Gedanken? Anschnitt oder Abschnitt spielt nur bei kapazitiven oder induktiven Lasten eine Rolle wenn ich das richtig sehe.

Serenifly:
Aber wieso machst du dir bei Leuchtmitteln darum Gedanken? Anschnitt oder Abschnitt spielt nur bei kapazitiven oder induktiven Lasten eine Rolle wenn ich das richtig sehe.

und bei Led-Leuchtmitteln. Die sind aufgrund der internen Elektronik nicht so einfach zu dimmen wie Glühlampen. Soweit ich weis, müssen es Dimmer sein die für kapazitive Lasten geeignet sind. Die 'billigen' R/L Dimmer gehen da nicht.

Das Dimmen funktioniert ja!
Nur den Sketch bekomme ich nicht von Delay auf Millis umgeschrieben...
schaut ganz trottellieb Könnt ihr mir da helfen?

Zeichne mal das Schaltbild des Moduls.
Wenn der TRISC über den MOC3042 angesteuert wird dann zündet er diesen nur im Spannungsnulldurchgang. Darum kannst Du den Triac nicht später zünden und somit Phasenanschnittsteuerung realisieren.

Das Dimmen funktioniert ja!

Nicht richtig, nicht mit dieser Hardware.

grüße Uwe

uwefed:
Zeichne mal das Schaltbild des Moduls.
Wenn der TRISC über den MOC3042 angesteuert wird dann zündet er diesen nur im Spannungsnulldurchgang. Darum kannst Du den Triac nicht später zünden und somit Phasenanschnittsteuerung realisieren.
Nicht richtig, nicht mit dieser Hardware.

grüße Uwe

Uff... bin total überfordert und reichlich frustriert.


Gefunden HIER.

Ich würde mich übrigens auch mit "nicht richtig" zufrieden geben.