Stap 4: Software
Ik ben een softwareingenieur van de handel, zodat dit deel de meest gedetailleerde is.
Summery: wanneer de Arduino eerste laarzen de Setup-methode wordt aangeroepen. Daar instellen ik een paar van de variabelen en de uitvoer locaties tot later gebruikt worden. zeroCrossInterupt() heet / liep telkens de AC van positieve naar negatieve spanning doorkruist. Het zal de zeroCross vlag voor elk kanaal instellen en de timer te starten. De loop-methode heet voortdurend voor eeuwig. Om te schakelen op de uitvoer, moet de TRIAC alleen worden geactiveerd voor 10 microseconden. It's time to trigger hij TRIAC als zeroCross gebeurd zal de output aanzetten tot het einde van de AC-fase.
Er waren een paar voorbeelden online die ik gebruikte om dit project begonnen. Het belangrijkste ding dat ik niet kon vinden had meerdere TRIAC uitgangen. Anderen gebruikt de functie vertraging PWM de output, maar dat zou niet werken in mijn geval omdat de ATMEGA moet luisteren naar DMX de allertijden. Ik dit opgelost door de TRIAC op zoveel ms pulserende na nul-cross. Door de pulserende de TRIAC dichter om nul-cross de meer voor de zonde wordt Golf uitgevoerd.
Hier is wat de helft 120VAC zonde Golf lijkt op een oscilloscoop, hierboven.
De ISP814 is aangesloten als u wilt onderbreken 1. Dus wanneer het ontvangt signaal dat de AC van positief overgangen naar negatief of vise versa het wordt de zeroCross voor elk kanaal ingesteld op true en start van de stopwatch.
In de loop-methode controleert het elk kanaal als zeroCross waar is en de tijd voor het activeren is het voorbij zal de TRIAC pulse voor 10 microseconden. Dit is genoeg om de TRIAC inschakelen. Zodra een TRIAC is ingeschakeld op het tot zeroCross zal blijven. Het licht zou knipperen toen de DMX circa 3% dus ik toegevoegd de afknotten daar te voorkomen. Dit werd de Arduino te traag wordt veroorzaakt, en de pols zou soms leiden tot de volgende golf van de zonde in de plaats van de laatste 4% van de Golf.
Ook in de loop waarde ik de PWM van de status-LED's. Deze LED's kunnen de interne PWM gegenereerd door de Arduino omdat er geen zorgen over de zeroCross van AC te gebruiken. Zodra de PWM ligt zal de Arduino blijven bij die helderheid totdat andere wijze verteld.
Zoals opgemerkt in de bovenste commentaren teneinde een DMX-interrupt op pin 2 en uitgevoerd bij 20 MHz zul je sommige van de bestanden voor de Arduino-toepassing bewerken. In HardwareSerial.cpp die een stuk van de code moet worden verwijderd, dit stelt ons in staat om te schrijven van onze eigen interrupt-oproep. Deze methode van ISR is aan de onderkant van de code om de DMX-interrupt. Als u gaat een Arduino gebruiken als een ISP-programmeur, zorg ervoor dat u uw wijzigingen aan HardwareSerial.cpp ongedaan maken anders zullen de ATMEGA328 op het brood bord onbereikbaar. De tweede wijziging is een makkelijker een. Het bestand boards.txt moet worden gewijzigd om de nieuwe 20MHz kloksnelheid.
Brightness[CH]=map(DmxRxField[CH],0,265,8000,0);
Helderheid toegewezen aan 8000, want dat is de hoeveelheid microseconden voor 1/2 een sinusgolf AC bij 60hz. Dus bij volledige helderheid 256 DMX het programma 1/2 verlaten zal de AC sinusgolf ON voor 8000us. Ik kwam met 8000 via raden en controleren. Doen de wiskunde voor 1000000us / 60hz/2 = 8333 dus dat zou een beter getal, maar hebben de extra 333us over hoofd voorziet de TRIAC te openen en eventuele jitter in het programma is waarschijnlijk een goed idee.
Op Arduino 1.5.3 dat ze verhuisd van de locatie van het bestand HardwareSerial.cpp. Het is nu /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/HardwareSerial0.cpp moet u commentaar uit dit hele als blok beginnen met lijn 39: #if defined(USART_RX_vect)
Anders zal je eindigen met deze fout: core/core.a(HardwareSerial0.cpp.o): In functie '__vector_18':