Stap 3: De software, een beetje theorie
De manier om het gebruiken van een AC dimmer/fader is vrij eenvoudig zodra u de basisprincipes begrijpt:
In AC de macht gevoed aan de lamp is direct gerelateerd aan de totale oppervlakte van de sinuswave, de lamp kan geregeld worden doordat alleen een voorspelbare deel van dat sinuswave doorheen de lamp kan stromen.
Als dergelijke we nodig een referentie punt op dat sinus van waar we berekenen wanneer de lamp moet worden ingeschakeld.
Het gemakkelijkste referentiepunt te gebruiken is de zogenaamde 'nul crossing': het moment dat het licht door nul gaat.
Er is volledige de helft van de sinuswave beschikbaar voor verzenden via de lamp na elke nul overtocht.
Dus is wat de software moet doen de zerocrossing kunt ontdekken en dan wachten op een vastgestelde hoeveelheid tijd op die sinuswave om over te schakelen op de TRIAC.
Er zijn 2 belangrijke netto frequenties in de wereld: 100 Hz in Europa en het grootste deel van Azië en Afrika en 120 Hz in de Amerika's (en delen van de Caribean). Er zijn 2 grote spanningen in de wereld: 110-120V en 220-240V, maar ze zijn niet belangrijk voor de wiskunde hier.
Voor gebruiksgemak zal ik de 50Hz frequentie als voorbeeld nemen:
50Hz is 50 golven per seconde.
Iedere sinuswave duurt dus 1000ms/50 = 20ms (miliseconden)
Aangezien er 2 sinuspeaks in een golf die dat na elke nul detectie betekent is er een 10ms periode die we kunnen reguleren.
Moeten we de lamp ontbranden direct aan het begin van die periode, de lamp ontvangt volle kracht, doen we het aan het einde van die periode van de 10ms die de lamp geen ower ontvangt en doen we het halverwege, ontvangt de lamp half vermogen.
Als we zijn met behulp van TRIACs, is wat de software moet doen te wachten tot het nulpunt op de sinuscurve, neem nota van die wacht op een bepaalde hoeveelheid tijd binnen die periode 10ms te sturen een puls naar de TRIAC.
Als het verzendt die pols bij 5ms, zal alleen de lamp branden op halve kracht.
In het Circuit, de nul detectie wordt gedaan door de biphase optocoupler en is beschikbaar als de X-signaal op het bord.
Er zijn eigenlijk 2 manieren voor een microcontroller om dat signaal te detecteren:
1-een continu 'polling' van de overschrijding van de nul-pin
2-met behulp van een interrupt aan het programma niet zeggen dat er een nul kruising was
Het belangrijkste verschil tussen de twee is dat in 'polling' everytime de computer doorloopt de hoofdlus moet controleren de pin. Als uw programma bezig een heleboel andere dingen is, het wellicht te laat bij de controle op de nul kruising pin, terwijl bij het gebruik van een interrupt, het maakt niet uit wat het programma bezig met is. De interrupt is soort 'te tikken op het op de schouder' zeggen "Hey look, iets kwam dat u moet wonen nu".
Nadat de nul overschrijding wordt ontdekt dat het programma nodig heeft om te wachten voor een bepaalde hoeveelheid tijd en schakel over op de TRIAC.
Ook hier, kan dat wachten worden gedaan op twee verschillende manieren
1 - door de uitgifte van een 'wachten' commando
2-met behulp van een timer-interrupt
Nogmaals, deze beide methoden hebben hun pro's en con's De opdracht 'geduld' ('vertraging' in Arduino taal) letterlijk laten we de computer wacht de vereiste tijd en het kan niets anders in de tussentijd. Als de lamp op lage kracht brandt door te laten de computer wacht zeggen 9ms, dat dat elke 10ms betekent de computer wordt verteld om te wachten 9ms: ergo het zal inactief zijn 90% van de tijd. Dat is fijn als je controller wordt alleen gebruikt om te controleren van de lamp, maar als het moet doen andere dingen dan weinig tijd overblijft.
Met behulp van een timer-interrupt is dat opgelost. Eigenlijk wat dat betekent is dat het programma de timer vertelt: ¨Hey, die ik zojuist gehoord hebben we een nul kruising, ik heb te doen iets anders, maar u wacht enkel 4.5ms en schakel over op de Triac "zodat het programma gaat over het is vrolijk, manier en 4.5ms (als voorbeeld) nadat het kreeg aankondiging er was een 0-kruising, de timer schakelt over op de TRIAC.
Polling: (Let op dit is een ruwe voorbeeld ter illustratie van polling, natuurlijk moet het sommige verbetering)
int AC_LOAD=3; // We use pin 3 to ignite the TRIAC int state; // integer to store the status of the zero crossing void setup() { pinMode(AC_LOAD, OUTPUT);// Set AC Load pin as output } void loop() { state=digitalRead(AC_LOAD); if (state=1) { delayMicroseconds(5000); // =5 ms=half power digitalWrite(AC_LOAD, HIGH); // triac firing }
Gedreven onderbreken:
Voor het gebruik van een interrupt, eerst we stellen dat maximaal. Op de Arduino die is als volgt:
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 }
Wat dit zegt is dat de interrupt is aangesloten als u wilt onderbreken 0, het gaat om een functie genaamd "zero_crosss_int" en het reageert op een stijgende flank op de pin.
In de Zero_cross_int-functie die het programma naar na de interrupt springt bepalen we de tijd die we wachten moeten voor de ontploffing van de TRIAC. We zullen ook een beetje functionaliteit toevoegen. We willen niet alleen één niveau set die de lamp brandt op, we willen toevoegen sommige functies voor het regelen van het lichtniveau in stappen.
Daarvoor heb ik besloten de volledig willekeurige hoeveelheid 128 stappen. Dat betekent dat elke stap 10ms/128 = 10000us/128 = 75us (in feite is 78, maar ik krijg dat later). De totale dimtime wordt dan berekend uit 75 x (1 tot 128). Het nummer tussen 1-128, die bepalend is voor ons niveau van dimmen, we toewijzen aan de variabele integer 'dimmer'
void zero_crosss_int() // function to be fired at the zero crossing to dim the light { int dimtime = (75*dimming); // For 60Hz =>65 delayMicroseconds(dimtime); // Off cycle digitalWrite(AC_LOAD, HIGH); // triac firing delayMicroseconds(10); // triac On propagation delay (for 60Hz use 8.33) digitalWrite(AC_LOAD, LOW); // triac Off }
Wat gebeurt er hier is dat de eerste berekend, doordat de dimtime (= de tijd moet worden gewacht voordat de triac is ontslagen)
Vervolgens wacht die hoeveelheid tijd, vervolgens wacht die hoeveelheid tijd en branden de Triac. De Triac weer wordt uitgeschakeld na nul kruising, maar we gaan al een laag om op te schrijven de TRIAC-pin om te voorkomen dat per ongeluk ontsteking in de volgende cyclus. We moeten een beetje wachten maar weten zeker de TRIAC aanstaat, dus we 10us wachten. Nu (10000-10) / 128 is nog 78 maar ik vond 75 goed te werken. Voel je vrij om gebruik te maken van 78 maar.
Het enige wat dan nog moet doen in het hoofdprogramma is het niveau waarop we de lamp branden wilt instellen:
void loop() { for (int i=5; i <= 128; i++){ dimming=i; delay(10); }
Wat er gebeurt hier is een eenvoudige lus die de lamp omhoog in een 128 stappen regelt. Ik heb besloten om nog maar niet te beginnen bij 1 maar op 5 omdat op dat niveau kunnen er enkele timing-problemen die zorgen de lamp dat kunnen knippert.
Het bovenstaande programma is slechts een voorbeeld van hoe de controle van de lamp, uiteraard u wilt sommige andere functionaliteit toe te voegen in plaats van alleen maar een lamp die omhoog en omlaag gaan in helderheid.
Met behulp van een timer:
Als u uw tijd efficiënt wilt moet u een interrupt voor het overschrijden van een nul-detectie en een timer gebruikt om te bepalen van de hoeveelheid tijd te wachten.
Een programma zou er ongeveer als volgt:
Initialiseren
Instellen van de diverse constanten en variabelen die je nodig hebt en omvatten de bibliotheken gebruikt (zoals de TimerOne-bibliotheek)
Setup
Setp de pinnen en de 2 interrupts
De nul-crosssing interrupt verwijst naar een functie en dus doet de timer onderbreken
Nul-Kruis function
Instellen van een boolean die aangeeft of een nul Kruis is opgetreden
Timer-functie
Als wij de helderheid weer in 128 stappen, dan de timer-functie regelen is ingesteld om te worden aangeroepen wanneer de tijd van een stap is verstreken (bijvoorbeeld 75us) en die vervolgens controleert als het aantal stappen doorgegeven gelijk aan het aantal stappen instellen is. Als dat het geval, de Triac aanstaat