I dette prosjektet skal vi designe en krets for måling av temperatur. Denne kretsen er utviklet ved bruk av " LM35 ", en lineær spenningssensor. Temperaturen måles vanligvis i “Celsius” eller “Faraheitt”. “LM35” -sensoren gir utgang basert på skalaen av celsius.
LM35 er en tre-pinners transistorlignende enhet. Den har VCC, GND og OUTPUT. Denne sensoren gir variabel spenning ved utgangen basert på temperatur.
Som vist i figuren ovenfor, vil det for hver +1 celsius temperaturøkning være + 10mV høyere effekt. Så hvis temperaturen er 0◦C vil utgangen fra sensoren være 0V, hvis temperaturen er 10◦C vil utgangen fra sensoren være + 100mV, hvis temperaturen er 25◦C vil utgangen fra sensoren være + 250mV.
Så foreløpig med LM35 får vi temperatur i form av variabel spenning. Denne temperaturavhengige spenningen er gitt som inngang til ADC (analog til digital omformer) av ATMEGA32A. Den digitale verdien etter oppnådd konvertering vises i 16x2 LCD som temperatur.
Komponenter kreves
Maskinvare: ATMEGA32 mikrokontroller, strømforsyning (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), 100uF kondensator (to deler), 100nF kondensator, LM35 temperaturføler.
Programvare: Atmel studio 6.1, progisp eller flash magi.
Kretsdiagram og forklaring
I kretsen er PORTB på ATMEGA32 koblet til dataporten på LCD-skjermen. Her bør man huske å deaktivere JTAG-kommunikasjonen i PORTC ot ATMEGA ved å endre sikringsbyte, hvis man vil bruke PORTC som en vanlig kommunikasjonsport. I 16x2 LCD er det 16 pinner overalt hvis det er baklys, hvis det ikke er noe bakgrunnslys, vil det være 14 pinner. Man kan drive eller la baklyspinnene ligge. Nå i de 14 pinnene er det 8 datapinner (7-14 eller D0-D7), 2 strømforsyningspinner (1 & 2 eller VSS & VDD eller GND & + 5V), 3. pin for kontrastkontroll (VEE-styrer hvor tykke tegnene skal være vist), 3 kontrollpinner (RS & RW & E).
I kretsen kan du se at jeg bare har tatt to kontrollpinner, da dette gir fleksibiliteten til bedre forståelse. Kontrastbiten og LES / SKRIV brukes ikke ofte slik at de kan kortsluttes til bakken. Dette setter LCD i høyest kontrast og lesemodus. Vi trenger bare å kontrollere ENABLE- og RS-pinner for å sende tegn og data tilsvarende.
Tilkoblingene som gjøres for LCD er gitt nedenfor:
PIN1 eller VSS ------------------ bakken
PIN2 eller VDD eller VCC ------------ + 5v strøm
PIN3 eller VEE --------------- bakken (gir maksimal kontrast best for en nybegynner)
PIN4 eller RS (Register Selection) --------------- PD6 for uC
PIN5 eller RW (lese / skrive) ----------------- bakken (setter LCD i lesemodus letter kommunikasjonen for brukeren)
PIN6 eller E (Aktiver) ------------------- PD5 for uC
PIN7 eller D0 ---------------------------- PB0 av uC
PIN8 eller D1 ---------------------------- PB1 av uC
PIN9 eller D2 ---------------------------- PB2 av uC
PIN10 eller D3 ---------------------------- PB3 av uC
PIN11 eller D4 ---------------------------- PB4 av uC
PIN12 eller D5 ---------------------------- PB5 av uC
PIN13 eller D6 ---------------------------- PB6 av uC
PIN14 eller D7 ---------------------------- PB7 av uC
I kretsen kan du se at vi har brukt 8bit kommunikasjon (D0-D7) men dette er ikke obligatorisk, vi kan bruke 4bit kommunikasjon (D4-D7) men med 4 bit kommunikasjon blir programmet litt komplekst så jeg har valgt 8 bit kommunikasjon.
Så fra bare observasjon fra tabellen ovenfor kobler vi 10 pinner LCD til kontrolleren der 8 pinner er datapinner og 2 pinner for kontroll. Spenningsutgangen fra sensoren er ikke helt lineær; det vil være bråkete. For å filtrere ut støyen må en kondensator plasseres ved utgangen til sensoren som vist på figuren.
Før vi går videre må vi snakke om ADC av ATMEGA32A. I ATMEGA32A kan vi gi Analog inngang til hvilken som helst av åtte PORTA-kanaler, det spiller ingen rolle hvilken kanal vi velger, ettersom alle er like. Vi skal velge kanal 0 eller PIN0 for PORTA. I ATMEGA32A har ADC 10 bit oppløsning, slik at kontrolleren kan oppdage en følelse av en minimum endring av Vref / 2 ^ 10, så hvis referansespenningen er 5V får vi en digital utgangsøkning for hver 5/2 ^ 10 = 5mV. Så for hver 5mV økning i inngangen vil vi ha en økning på en på digital utgang.
Nå må vi sette registeret over ADC basert på følgende vilkår:
1. først og fremst trenger vi for å aktivere ADC-funksjonen i ADC.
2. Siden vi måler romtemperatur, trenger vi egentlig ikke verdier utover hundre grader (1000mV utgang på LM35). Så vi kan sette opp maksimumsverdi eller referanse for ADC til 2,5V.
3. Kontrolleren har en utløserkonverteringsfunksjon, det betyr at ADC-konvertering bare finner sted etter en ekstern utløser, siden vi ikke vil at vi trenger å sette registrene for at ADC skal kjøre i kontinuerlig frikjøringsmodus.
4. For enhver ADC er konverteringsfrekvensen (analog verdi til digital verdi) og nøyaktigheten av digital utgang omvendt proporsjonal. Så for bedre nøyaktighet av digital utgang må vi velge mindre frekvens. For mindre ADC-klokke setter vi forhåndssalget til ADC til maksimumsverdi (128). Siden vi bruker den interne klokken på 1MHZ, vil klokken til ADC være (1000000/128).
Dette er de eneste fire tingene vi trenger å vite for å komme i gang med ADC. Alle de ovennevnte fire funksjonene er satt av to registre.
RØD (ADEN): Denne biten må stilles inn for å aktivere ADC-funksjonen til ATMEGA.
BLÅ (REFS1, REFS0): Disse to bitene brukes til å stille inn referansespenningen (eller maks inngangsspenning vi skal gi). Siden vi ønsker å ha referansespenning 2,56V, bør begge REFS0 og REFS1 stilles, ved tabellen.
LIGHT GREEN (ADATE): Denne biten må være satt for at ADC skal kjøre kontinuerlig (friløpsmodus).
PINK (MUX0-MUX4): Disse fem bitene er for å fortelle inngangskanalen. Siden vi skal bruke ADC0 eller PIN0, trenger vi ikke å sette noen biter som ved tabellen.
BRUN (ADPS0-ADPS2): disse tre bitene er for å sette prescalar for ADC. Så vi bruker en prescalar på 128, vi må sette alle tre biter.
MØRK GRØNN (ADSC): denne biten er satt for at ADC skal starte konvertering. Denne biten kan deaktiveres i programmet når vi trenger å stoppe konverteringen.
For å lage dette prosjektet med Arduino, se denne veiledningen: Digital termometer ved bruk av Arduino
Programmering Forklaring
Arbeid med TEMPARATURMÅLING forklares best trinn for trinn av C-koden gitt nedenfor:
#include // header for å aktivere datastrømskontroll over pins
#define F_CPU 1000000 // forteller kontrollerens krystallfrekvens festet
#inkludere
#define E 5 // gi navn “aktiver” til 5 th pin av PORTD, siden den er koblet til LCD aktivere pin
#define RS 6 // gi navnet “registerselection” til 6 th pin av PORTD, ettersom er forbundet med LCD-RS tapp
ugyldig send_a_command (usignert char-kommando);
ugyldig send_a_character (usignert char Character);
ugyldig send_a_string (char * string_of_characters);
int main (ugyldig)
{
DDRB = 0xFF; // setter portB og portD som utgangspinner
DDRD = 0xFF;
_forsink_ms (50); // gir forsinkelse på 50 ms
DDRA = 0; // Tar portA som inngang.
ADMUX - = (1 <
ADCSRA - = (1 <0)
{
send_a_character (* string_of_characters ++);
}
}