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 folgt
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?
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
Eine einfachere Methode könnte sein:
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.
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
Photon001