Arduino kontrollerade ljus dimmer (4 / 15 steg)
Steg 4: Arduino kontrollerade ljus dimmer: programvaran
Som diskuterades i föregående teoretiska sida, är programvaran ganska lätt.
Om du vill utveckla din egen programvara, allt du behöver göra är:
Vänta på zerocrossing
Vänta en viss tid mellan 0 och 9090 mikrosekunder (9090 = 10.000-10)
slå på yr TRIAC
Vänta om 10us (det vill säga tid du behöver se till att TRIAC är på)
Stäng av yr TRIAC (i själva verket du endast ta bort triggersignal till TRIAC, TRIAC kommer att bo tills nästa zerocrossing)
Jag skissar bara kort flödet av det program som jag använde:
(göra säker du läsa "Anmärkning" nedan)
Noll X-ing signalen genererar ett avbrott.
Vid 50Hz som avbryter är varje 10ms eller 10.000uS
Vid 60Hz som avbryter är varje 8.333 ms eller 8333 oss
Avbryta rutin sedan växlar på Triac efter en viss tid. Då ligger i huvudprogrammet ögla.
Programmet varierar dimmerfunktion från Full till bort i 128 steg (det är bara ett val som gjordes, kan vara 100 steg också), vid 50 Hz behöver vi stegen vara 75 uS och vid 60Hz måste de vara 65 uS
Det fungerar på följande sätt:
Avbryta funktionen "zero_crosss_int" anropas varje gång en noll-korsning upptäcks, som är 100times/sekund. Det är enda funktion är att ange den tid som Triac är påslagen för att värdet på variabeln "mörkläggning"
I det viktigaste kretsar av programmet ligger det faktiska värdet av variabeln
/*
Växelspänning dimmer med noll cross upptäckt
Författare: Charith Fernanado < en href = "http://www.inmojo.com" > http://www.inmojo.com
< /a >
Av DIY_bloke
Licens: Creative Commons Attribution Share-Alike 3.0 License.
Bifoga noll cross pin av modulen till Arduino externa avbryta pin
Välja rätt Interrupt # från den tabellen nedan
(Pin-koder är digital pins, inte fysiska stift:
Digital stift 2 [INT0] = fysiska pin 4 och digital pin 3 [INT1] = fysiska stift 5)
Kontrollera: < en href = "http://arduino.cc/en/Reference/attachInterrupt" > http://www.inmojo.com
< /a >
PIN-kod | Interrrupt # | Arduino plattform
---------------------------------------
2 | 0 | Alla - men det är INT1 på Leonardo
3 | 1 | Alla - men det är INT0 på Leonardo
18 | 5 | Arduino Mega endast
19 | 4 | Arduino Mega endast
20 | 3 | Arduino Mega endast
21 | 2 | Arduino Mega endast
0 | 0 | Leonardo
1 | 3 | Leonardo
7 | 4 | Leonardo
Arduino förfallodatum har inga standard avbrott stift som en iterrupt kan kopplas till almosty någon pin.
I programmet är stift 2 valt
*/
int AC_LOAD = 3; Utgång till Opto Triac pin
int mörkläggning = 128; Ljusreglering nivå (0-128) 0 = ON, 128 = OFF
void setup()
{
pinMode (AC_LOAD, OUTPUT); / / ställa in AC Load pin som utgång
attachInterrupt (0, zero_crosss_int, RISING); Välj noll korset avbryta # från tabellen ovan
}
avbryta funktionen måste ta utan parametrar och returnerar inget
void zero_crosss_int() //function för att eldas på noll korsningen till dämpa ljuset
{
Bränning vinkel beräkningen: 1 full 50Hz våg = 1/50 = 20ms
Varje zerocrossing således: (50Hz) -> 10ms (1/2 cykel)
För 60Hz = > 8.33ms (10.000/120)
10ms = 10000us
(10000us - 10us) / 128 = 75 (ca) för 60Hz = > 65
int dimtime = (75 * dimming); För 60Hz = > 65
delayMicroseconds(dimtime); Vänta tills skjuter TRIAC
digitalWrite (AC_LOAD, hög); Brand på TRIAC
delayMicroseconds(10); Triac på spridningsuppgift fördröjning
(för 60Hz 8,33) behöver vissa Triacs en längre period
digitalWrite (AC_LOAD, låg); Inte längre utlöser TRIAC (nästa noll korsning kommer swith bort det) TRIAC
}
void loop() {
för (int jag = 5; jag < = 128; i ++) {
mörkläggning = i.
Delay(10);
}
}
Om programmet: teoretiskt i slingan du kunde låta variabel "i" börja från "0". Men eftersom tidpunkten i avbrottet är lite av en närhet med hjälp av "0" (fullt på) skulle kunna skruva upp tidpunkten lite. samma sak gäller för 128 (Full av) men som verkar vara mindre kritiska. Väder "5" eller kanske "1" är gränsen för din ställa in är en fråga om försökande, ditt utbud kan gå från t.ex. 2 till 126 i stället för 0-128. Om någon har ett mer exakt sätt att ställa upp tidpunkten i avbrottet skulle jag gärna höra den.
Självklart inte är det nödvändigt att arbeta med avbrott. Det är också möjligt att hålla polling noll korsning PIN-koden för att gå till 0.
Om programvaran fungerar med ett avbrott att bestämma tidpunkten för noll crosssing, det är fortfarande inte så effektiv eftersom tid (dimtime) vi behöver vänta efter den noll passerar innan triac avfyras är bokstavligen "väntar" i noll korset avbryta funktion.
Det vore mer effektivt att ange en timer avbryta brand i rätt ögonblick så under tiden arduino kan göra något annat. Ett sådant program kan hittas i steg
OBS
Jag vill bara upprepa ovanstående uttalande: detta program är en demo av hur du kan kontrollera dimmer. Det är inte effektivt program som det tillbringar större delen av sin tid på att vänta. Det är därför inte de mest lämpliga att kombinera med andra uppgifter för processorn. Om du behöver en effektivare program använder en timer i stället för fördröjning