4 ch DMX Dimmer (4 / 5 steg)
Steg 4: programvara
Jag är en software engineer till yrket så denna del är den mest detaljerade.
Summery: när Arduino första stövlar metoden setup() anropas. Där satt jag upp några av de variabler och platser som utdata ska användas senare. zeroCrossInterupt() kallas / sprang varje gång AC korsar från positiv till negativ spänning. Det kommer att ange zeroCross-flaggan för varje kanal och starta timern. Metoden loop() anropas ständigt för evigt. Om du vill aktivera produktionen, har TRIAC bara utlöses för 10 mikrosekunder. Om det är dags att utlösa han TRIAC och zeroCross har hänt kommer att utdata aktivera fram till slutet av den AC fasen.
Det fanns några exempel online som jag brukade få detta projekt startade. Det viktigaste som jag inte kunde hitta var att ha flera TRIAC utgångar. Andra används funktionen dröjsmål att PWM utdata, men det skulle inte fungera i mitt fall eftersom ATMEGA måste lyssna DMX hela tiden. Jag löste detta genom pulserande TRIAC på så många ms efter noll-cross. Av pulserande TRIAC närmare för att noll-cross mer av sin är våg utdata.
Här är vad den halva 120VAC synd våg ser ut på ett oscilloskop, ovan.
ISP814 är ansluten om du vill avbryta 1. Så när den får signal att AC övergångar från positiv till negativ eller vise versa det anger zeroCross för varje kanal till true och startar stoppuret.
I loop()-metoden kontrollerar varje kanal om zeroCross är sant och tiden att aktivera har gått det kommer puls TRIAC för 10 mikrosekunder. Detta är tillräckligt för att aktivera TRIAC. En gång en TRIAC är vände på det kommer att stanna till zeroCross. Ljuset skulle flimrar när DMX var omkring 3% så jag la klipps in där för att hindra den. Detta orsakades Arduino är för långsam och pulsen skulle ibland utlösa nästa synd våg istället för de sista 4% av vågen.
Också i loop() värdet jag PWM statuslampornas. Dessa lysdioder kan använda interna PWM genereras av Arduino eftersom vi inte har oroa zeroCross av AC. När PWM ligger kommer Arduino fortsätta på den ljusstyrkan tills berättade andra kloka.
Som nämnts i översta kommentarerna för att använda en DMX avbryta på pin 2 och kör på 20 MHz måste du redigera några av Arduino programfilerna. I HardwareSerial.cpp en bit av kod måste tas bort, tillåter detta oss att skriva vår egen avbryta samtalet. ISR metoden är längst ner i koden för att hantera DMX avbrottet. Om du ska använda en Arduino som en ISP programmerare, se till att återställa dina ändringar till HardwareSerial.cpp att annars ATMEGA328 i bröd styrelsen vara onåbar. Den andra ändringen är en easer en. Boards.txt filen har ändras till den nya 20MHz klockfrekvensen.
Brightness[ch]=map(DmxRxField[ch],0,265,8000,0);
Ljusstyrkan kartor till 8000 eftersom det är mängden mikrosekunder för 1/2 en sinuskurva AC på 60hz. Så på full ljusstyrka 256 DMX programmet kommer att lämna 1/2 AC sinusvåg på för 8000us. Jag kom med 8000 via gissning och kontrollera. Gör matten 1000000us / 60hz/2 = 8333 så det kan vara ett bättre tal, men med den extra 333us över huvud kan för TRIAC öppna och alla jitter i programmet är nog en bra idé.
På Arduino 1.5.3 att de flyttat platsen för filen HardwareSerial.cpp. Nu är det /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/HardwareSerial0.cpp du kommer att behöva kommentera ut detta hela om blocket börjar med raden 39: #if defined(USART_RX_vect)
Annars du kommer att sluta med det här felet: core/core.a(HardwareSerial0.cpp.o): I funktionen "__vector_18":