Stap 4: De code van de arduino
In de volgende stap bespreken we hoe u kunt besturen dit circuit met de Arduino-code. U kunt gewoon downloaden en uitvoeren van onze code. De rest van deze stap gaat in de bloederige details van hoe de code werkt. Houd er rekening mee dat sommige delen van onze code zijn gebaseerd op de Arduino AC fase controle tutorial en we opnieuw een deel van die code gebruikt, zoals het is.
De Arduino UNO bord bevat een ATmega328P 16MHz microprocessor. Om te activeren AC fase bedieningscircuit op precies getimede intervallen we interrupt functies van de timer van de hardware van ATmega328 gebruikt. Dus, als u niet bekend met concepten zoals timers, register overflows en prescaling bent, dat dit artikel legt hen beter.
Voordat we ingaan op de codering die wij moeten doen sommige eenvoudige berekeningen. De AC-signaal is 60 Hz. (maak je geen zorgen als u 50Hz in uw land hebt, kunt u opnieuw berekenen het gemakkelijk) Dit betekent het AC signaal kruist nul, piek positieve spanning bereikt, kruist nul opnieuw, piek negatieve spanning bereikt en terug naar nul 60 keer per seconde. De periode (lengte van de tijd die hiervoor nodig) is 1/60 of 0.01667 seconden (16.67 milliseconden). Dus, een halve cyclus of de tijd tussen twee nul-kruising pulsen treedt op in 8.33 milliseconden.
Vanaf hier bepalen wij tijdsintervallen in de code van de klok graven, niet door seconden. De Arduino Klok draait op 16 MHz, oftewel 16,000,000 cycli per seconde: één klokcyclus 0.0625 microseconden neemt. Één die helft cyclus van het signaal van de AC 60 Hz bevat 133,333 klokcycli. De 16-bits timer (timer1) van de Arduino Uno kan alleen tellen tot 65535. We moeten zo configureren dat met een prescaler. In deze code gebruikten we een 256 prescaler. Met de 256 prescaler betekent een halve cyclus ongeveer 520 timer stappen. Om praktische redenen (lichte wijzigingen in aanbod frequentie en triac operationele vertragingen) vonden we het als 450. Dit verzekert dat de triac-stuurprogramma heeft tijd om uit te schakelen voordat de volgende halve cyclus. Dus we geregeld de wachttijd voordat de triac binnen het bereik 1-450 binnen elke halve cyclus inschakelen om te bepalen het vermogen. We Comparateur wedstrijd interrupts hiervoor gebruikt. We gebruikten timer overloop interrupts te controleren van het signaal naar triac gate en de pulsbreedte ingesteld op 4 timer telt. Hier, nul wanneer de pols wordt verzonden naar de GATE van de triac, het zal de AC-levering inschakelen en ON zal blijven, zelfs nadat de pols wordt verwijderd totdat u de volgende keer dat de AC-Golf. (Als u niet bekend bent met de Triac bediening is dit een goed artikel.) Hierdoor hoeft niet wij te maken over het uitschakelen van de triac.
Volgende codefragment toont de AC fase beheersing van logica.
#define analyse 2 / /nul Kruis detecteren
#define GATE 9 / /triac poort
#define PULSE 4 / /trigger pulsbreedte (graven)
Timer1(16-bit) instellen
OCR1A = 100; initialiseren van de comparator
TIMSK1 = 0X03; Comparateur A inschakelen en overloop interrupts
TCCR1A = 0X00; Timer-besturingselement registreert set voor
TCCR1B = 0X00; normale werking, timer uitgeschakeld
instellen op nul kruising interrupt
attachInterrupt (0, zeroCrossingInterrupt, stijgt);
nul Kruis gedetecteerd
ongeldig zeroCrossingInterrupt() {}
TCCR1B = 0X04; timer met kloof door 256 ingang start
TCNT1 = 0; opnieuw instellen van de timer - graaf van nul - graven totdat deze overeenkomt met de waarde van de comparator
}
Comparateur match - bereikt van de verwachte vertraging
ISR(TIMER1_COMPA_vect) {}
digitalWrite(GATE,HIGH); set triac poort naar hoge - install
TCNT1 = 65536-PULSE; trigger pulsbreedte
}
overloop van de timer1 - pulse bereikt de breedte
ISR(TIMER1_OVF_vect) {}
digitalWrite(GATE,LOW); triac poort uitschakelen
TCCR1B = 0X00; uitschakelen van de timer om te stoppen met onbedoelde triggers
}
Temperatuur controle
Nu zijn we klaar met het lastigste onderdeel van onze code. Vervolgens is het bepalen van de macht (of de vertragingstijd) volgens de huidige waarde van de temperatuur en de temperatuur van de gewenste doelgroep. We gebruikten om te lezen van de temperatuur de Adafruit_MAX31855 bibliotheek. We gebruikten ter uitvoering van het controlemechanisme PID controle logica. Maak je geen zorgen als het klinkt een beetje ingewikkeld. Gelukkig hebben wij een Arduino library daarvoor. Het volgende fragment toont de code daarvoor.
#define 3
#define CS 4
#define CLK 5
Adafruit_MAX31855 thermokoppel (CLK, CS, DO);
dubbele setPoint, Input, Output; Define variabelen we verbinding met maken zullen
dubbele Kp = 2, Ki = 6, Kd = 1; Geef de links en eerste tuning parameters
PID myPID (Input, Output, & setPoint, Kp, Ki, Kd, DIRECT);
myPID.SetMode(AUTOMATIC);
myPID.SetOutputLimits (0, 449); de reeks
binnen de lus-methode
dubbele c = thermocouple.readCelsius();
Als (isnan(c)) {}
Ik = 450; Ga naar minimaal vermogen als er iets fout gegaan
}
else {}
Input = c; myPID.Compute();
Ik = 450-Output; verlagen van de vertraging, hogere de macht
}
OCR1A = i; Comparateur waarde tot en met i
delay(400); / / wachten voordat het volgende temperatuur lezen
Gebruikersinterface
Programma van de gebruikersinterface gebruikt wij olimex lcd schild bibliotheek samen met Arduino draad bibliotheek. U kunt download de olimex bibliotheek van Olimex website.