Unabhängiger AC-Dimmer mit mehreren Kanälen unter Verwendung von Arduino

Ich möchte mit Arduino einen unabhängig gesteuerten AC-Dimmer mit 8 Kanälen bauen. Ich habe erfolgreich einen Einkanal-Dimmer getestet, aber ich stecke fest, ihn auf 8 Kanäle zu erweitern. Die Schaltung, auf die ich mich beziehe, ist wie folgtEinkanal-Dimmerschaltung

Der Arduino-Code, den ich verwende, ist wie folgt

/*
AC Voltage dimmer with Zero cross detection
Author: Charith Fernanado http://www.inmojo.com
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)

 Pin    |  Interrrupt # | Arduino Platform
 ---------------------------------------
 2      |  0            |  All
 3      |  1            |  All
 18     |  5            |  Arduino Mega Only
 19     |  4            |  Arduino Mega Only
 20     |  3            |  Arduino Mega Only
 21     |  2            |  Arduino Mega Only

In the program pin 2 is chosen
 */

int AC_LOAD = 3;    // Output to Opto Triac pin
int dimming = 128;  // Dimming level (0-128)  0 = ON, 128 = OFF
/* Due to timing problems, the use of ‘0’ can sometimes make the circuit 
flicker. It is safer to use a value slightly higher than ‘0’
*/
void setup()
{
  pinMode(AC_LOAD, OUTPUT);// Set AC Load pin as output
  attachInterrupt(0, zero_crosss_int, RISING);  
// Chooses '0' as interrupt for the zero-crossing
}
// 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

  // 10ms=10000us
  // (10000us - 10us) / 128 = 75 (Approx) For 60Hz =>65
  int dimtime = (75*dimming);    // For 60Hz =>65     
  delayMicroseconds(dimtime);    // Off cycle
  digitalWrite(AC_LOAD, HIGH);   // triac firing
  delayMicroseconds(10);         // triac On propogation delay
                                 //(for 60Hz use 8.33)
  digitalWrite(AC_LOAD, LOW);    // triac Off
}
void loop()  {
 for (int i=5; i <= 128; i++)
{
 dimming=i;
 delay(10);
 }
 }

Irgendwelche Ideen, wie ich den Code und die Schaltung erweitern kann, um mit 8 Kanälen zu arbeiten, die UNABHÄNGIG gesteuert werden können?

Ihr Diagramm und Code-Snippet für nur einen Kanal. Wenn Sie Ihr Problem genau fragen, wird die Antwort näher an der Lösung liegen!

Antworten (2)

Ohne eine eingehende Codeüberprüfung liegt das Problem wahrscheinlich hier:

delayMicroseconds(dimtime);    // Off cycle
digitalWrite(AC_LOAD, HIGH);   // triac firing
delayMicroseconds(10);         // triac On propogation delay

Die Verzögerungsfunktionen bewirken, dass die CPU eine Schleife durchläuft und keine andere Verarbeitung durchgeführt werden kann.

Ein besserer Weg wäre, eine Timer-Routine zu erstellen und sie für jeden Kanal aufzurufen. Dazu müsste eine Variable zugewiesen werden

  • der voreingestellte Wert (der Wert, bei dem der Timer-Ausgang einschaltet),
  • der tatsächliche Wert (der aktuelle Zeitwert) und
  • der Ausgangszustand (Timer fertig oder nicht).

Eine einfachere Methode könnte sein:

  • Teilen Sie Ihren Halbzyklus in eine diskrete Anzahl von Schritten von beispielsweise 50 μs auf.
  • Fügen Sie in Ihrer Hauptschleife einen Zähler hinzu, der beim Nulldurchgang zurückgesetzt wird und alle 50 μs inkrementiert.
  • Vergleichen Sie in der Schleife den Dimmerpegel für jeden Kanal mit dem Timer und schalten Sie diesen Kanal ein, wenn der Dimmerpegel überschritten wird.

Geben Sie hier die Bildbeschreibung ein

Abbildung 1. Beziehung zwischen Strom und Auslösewinkel.

Beachten Sie, dass sich der erzeugte Strom aufgrund der sinusförmigen Netzspannungswellenform nicht linear mit dem Auslösewinkel ändert. Kleine Änderungen um die Spitzenspannung haben eine größere Wirkung als näher am Nulldurchgang. Möglicherweise möchten Sie dies in Ihrem Code beheben, wenn der visuelle Effekt nicht mit Ihrer Dimmereinstellung übereinstimmt.

Danke für Ihre Antwort. Ich werde Ihre Vorschläge berücksichtigen und versuchen, weiter an meinem Code für mehrere Kanäle zu arbeiten
Gern geschehen. Versuchen Sie, Verzögerungen in Ihrem Code zu vermeiden. Verwenden Sie stattdessen Timer. Auf diese Weise kann Ihr Mikro in der Zwischenzeit andere Dinge tun. Verzögerungen sind sehr verlockend, aber sie sind schlechte Praxis, und ich denke, alle Tutorials, die sie verwenden, bringen die Benutzer zu einem schlechten Start.

Wenn Sie ein bereits getestetes und fertiges Board verwenden möchten, verwenden Sie dieses. Jeder Kanal wird unabhängig gesteuert. 8-Kanal-Arduino-AC-Dimmer

Dieses Board ist ein Hardwaremodul. Es bleibt immer noch die ursprüngliche Frage, wie man für acht Kanäle programmiert. Wenn Sie die angegebenen Codebeispiele überprüfen, finden Sie möglicherweise eine Lösung, die die Pausenanweisung vermeidet , die die Ursache des ursprünglichen Problems ist. Fügen Sie das mit einer Erklärung in Ihren Beitrag ein, und Sie haben möglicherweise eine gute Antwort.