Go Down

Topic: AC 230V (50Hz) PWM Dimmer macht Schwierigkeiten (Read 586 times) previous topic - next topic

Tiff48317

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:
Code: [Select]

/*

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?
__________________________________________________
Eine präzise gestellte Frage enthält meist bereits 80% der Antwort.
Die mit dem Postit vor der Stirn...
                                               ...und dem Brett vor dem Kopf.

MicroBahner

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

Tiff48317

Es steht dimmbar auf der Packung.
Das Dimmen funtioniert auch.
Nur nicht so, wie ich es wünsche.
__________________________________________________
Eine präzise gestellte Frage enthält meist bereits 80% der Antwort.
Die mit dem Postit vor der Stirn...
                                               ...und dem Brett vor dem Kopf.

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.
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

Tiff48317

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.
__________________________________________________
Eine präzise gestellte Frage enthält meist bereits 80% der Antwort.
Die mit dem Postit vor der Stirn...
                                               ...und dem Brett vor dem Kopf.

Tiff48317

Glühlampe gefunden.
Damit klappt es wesentlich besser....
Vielleicht bekomme ich es doch noch hin.
Danke für den Tipp.
__________________________________________________
Eine präzise gestellte Frage enthält meist bereits 80% der Antwort.
Die mit dem Postit vor der Stirn...
                                               ...und dem Brett vor dem Kopf.

Klaus_ww

Gerne - ich drück die Daumen dass es klappt.
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

MicroBahner

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

Tiff48317

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...


Code: [Select]
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
}
__________________________________________________
Eine präzise gestellte Frage enthält meist bereits 80% der Antwort.
Die mit dem Postit vor der Stirn...
                                               ...und dem Brett vor dem Kopf.

uwefed

Wie sieht Deine Nulldurchgangsdetektierung aus?
Grüße Uwe

Tiff48317

#10
Aug 21, 2019, 10:48 pm Last Edit: Aug 21, 2019, 10:52 pm by Tiff48317
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:


Code: [Select]
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?
__________________________________________________
Eine präzise gestellte Frage enthält meist bereits 80% der Antwort.
Die mit dem Postit vor der Stirn...
                                               ...und dem Brett vor dem Kopf.

uwefed

#11
Aug 22, 2019, 12:52 am Last Edit: Aug 22, 2019, 12:58 am by uwefed
Das Modul

https://de.banggood.com/AC-Light-Dimmer-Module-For-PWM-Control-1-Channel-3_3V5V-Logic-AC-50hz-60hz-220V-110V-p-1244351.html?cur_warehouse=CN
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

uwefed

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:
Quote
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 

Tiff48317

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?
__________________________________________________
Eine präzise gestellte Frage enthält meist bereits 80% der Antwort.
Die mit dem Postit vor der Stirn...
                                               ...und dem Brett vor dem Kopf.

Tiff48317

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:
Code: [Select]
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:
Code: [Select]

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?
__________________________________________________
Eine präzise gestellte Frage enthält meist bereits 80% der Antwort.
Die mit dem Postit vor der Stirn...
                                               ...und dem Brett vor dem Kopf.

Go Up