Stap 4: Arduino gecontroleerd licht dimmer: de software
Zoals besproken in de vorige pagina van de theoretische, is de software vrij eenvoudig.
Wilt u uw eigen software te ontwikkelen is al ubehoefte te doen:
Wachten op de zerocrossing
Een specifieke wachttijd tussen 0 en 9090 microseconden (9090 = 10.000-10)
yr TRIAC inschakelen
Wachten over 10us (dat wil zeggen de tijd moet u ervoor zorgen dat de TRIAC brandt)
Schakel yr TRIAC (in feite, je enige verwijderen de triggersignal aan de TRIAC, de TRIAC zal blijven tot de volgende zerocrossing)
Ik schets kort de stroom van het programma dat ik heb gebruikt:
(zorg ervoor dat je de onderstaande 'Opmerking')
De nul X-ing-signaal genereert een interrupt.
Bij 50Hz die onderbreken is elke 10ms of 10.000uS
Bij 60Hz die onderbreken is-elke 8.333 ms of 8333 ons
De interrupt routine dan de schakelaars op de Triac na een specifieke tijd. Die tijd ligt in de lus van het hoofdprogramma.
Aangezien het programma verschilt het dimmen van volledige uitgeschakeld in 128 stappen (dat is gewoon een keuze die werd gemaakt, zou 100 stappen ook), bij 50 Hz moeten we de stappen voor het worden van 75 Amerikaanse en bij 60Hz moeten ze worden 65 VS
Het werkt als volgt:
De interrupt-functie "zero_crosss_int" wordt aangeroepen telkens wanneer een nul-kruising is gedetecteerd, dat is 100times per seconde. Het enige functie is om de tijd die de Triac is ingeschakeld om de waarde van de variabele 'dimmer'
In de hoofdlus van het programma is de werkelijke waarde van die variabele ingesteld
http://www.inmojo.com http://www.inmojo.com < /a > Pin | Interrrupt # | Arduino Platform---2 | 0 | Alle - maar het is INT1 op de Leonardo-3 | 1 | Alle - maar het is INT0 op de Leonardo-18 | 5 | Arduino Mega enige 19 | 4 | Arduino Mega slechts 20 | 3 | Arduino Mega slechts 21 | 2 | Arduino Mega alleen 0 | 0 | Leonardo 1 | 3 | Leonardo 7 | 4 | The Arduino-Due Leonardo heeft geen standaard interrupt-pinnen als een iterrupt kan worden aangesloten op almosty een pin. In het programma gekozen pin 2 * / int AC_LOAD = 3; Uitvoer naar Opto Triac pin int dimmen = 128; Dimmen van niveau (0-128) 0 = ON, 128 = OFF /* AC Voltage dimmer with Zero cross detection Author: Charith Fernanado <a href="http://www.inmojo.com"> http://www.inmojo.com </a> 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"> http://www.inmojo.com </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 */ int AC_LOAD = 3; // Output to Opto Triac pin int dimming = 128; // Dimming level (0-128) 0 = ON, 128 = OFF void setup() { 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() { for (int i=5; i <= 128; i++){ dimming=i; delay(10); } } de interrupt-functie moet nemen geen parameters en terugkeer niets void zero_crosss_int() //function worden ontslagen bij de nul doorkomst aan dim het licht {/ / Firing hoek berekening: 1 volledige 50Hz Golf = 1/50 = 20ms / / elke zerocrossing dus: (50Hz) -> 10ms (cyclus 1/2) / / voor 60 Hz = > 8.33ms (10.000/120) / / 10ms = 10000us / / (10000us - 10us) / 128 = 75 (ongeveer) voor 60 Hz = > 65 int dimtime = (75 * dimmen); / / voor 60 Hz = > 65 delayMicroseconds(dimtime); / / Wait tot het afvuren van de TRIAC-digitalWrite (AC_LOAD HOGE); Brand de TRIAC-delayMicroseconds(10); Triac op propagation delay / / (voor 60Hz gebruiken 8.33) sommige Triacs moet een langere periode digitalWrite (AC_LOAD, laag); Niet meer leiden tot de TRIAC (de volgende nul overschrijding zal swith op vandoor) TRIAC} int AC_pin = 3;//Pin to OptoTriac byte dim = 0; //Initial brightness level from 0 to 255, change as you like! void setup() { Serial.begin(9600); pinMode(AC_pin, OUTPUT); attachInterrupt(0, light, FALLING);//When arduino Pin 2 is FALLING from HIGH to LOW, run light procedure! } void light() { if (Serial.available()) { dim = Serial.read(); if (dim < 1) { //Turn TRIAC completely OFF if dim is 0 digitalWrite(AC_pin, LOW); } if (dim > 254) { //Turn TRIAC completely ON if dim is 255 digitalWrite(AC_pin, HIGH); } } if (dim > 0 && dim < 255) { //Dimming part, if dim is not 0 and not 255 delayMicroseconds(34*(255-dim)); digitalWrite(AC_pin, HIGH); delayMicroseconds(500); digitalWrite(AC_pin, LOW); } } void loop() { }
Over de software: theoretisch in de lus kunt u variabele 'ik' beginnen '0'. Echter, aangezien de timing in de interrupt is een beetje een benadering met behulp van "0" (volledig op) kon verknoeien de timing een beetje. hetzelfde geldt voor 128 (volledig af) maar dat lijkt minder kritisch. Of '5' of misschien '1' is de limiet voor uw set-up is een kwestie van proberen, uw bereik kan gaan van bijvoorbeeld 2 tot en met 126 in plaats van 0-128. Als iemand een meer precieze manier heeft om de timing in de interrupt zou ik graag horen.
Natuurlijk is het niet nodig om te werken met interrupts. Het is ook mogelijk om de nul kruising pin om naar 0 te gaan houden polling.
Hoewel de software met een interrupt om te bepalen van het moment van nul crosssing werkt, is het nog steeds niet zo efficiënt omdat de tijd (dimtime) we wachten moeten na de nul oversteek voordat de triac wordt afgevuurd is letterlijk 'wachten' in de nul Kruis onderbreken functie.
Het zou efficiënter instellen van een timer onderbreken om te vuren op het juiste moment, zodat in de tussentijd de arduino iets anders kunt doen. Een dergelijk programma kan worden gevonden in stap
OPMERKING
Nogmaals: gewoon de bovenstaande verklaring: dit programma is een demo van hoe u de dimmer controleren kunt. Het is niet en efficiënt programma als het grootste deel van haar tijd te wachten. Het is daarom niet het meest geschikt om te combineren met andere taken van de processor. Wenst u een efficiënter gebruik van de programma een timer in plaats van vertraging