I dette projekt skal vi designe et kredsløb til måling af temperatur. Dette kredsløb er udviklet ved hjælp af " LM35 ", en lineær spændingssensor. Temperatur måles normalt i ”Celsius” eller “Faraheit”. “LM35” -sensor leverer output baseret på skala fra celsius.
LM35 er en trebenet transistorlignende enhed. Det har VCC, GND og OUTPUT. Denne sensor giver variabel spænding ved udgangen baseret på temperatur.
Som vist i ovenstående figur vil der være + 10 mV højere output for hver +1 celsius temperaturforøgelse. Så hvis temperaturen er 0◦C vil sensorens output være 0V, hvis temperaturen er 10◦C vil sensorens output være + 100mV, hvis temperaturen er 25◦C vil sensorens output være + 250mV.
Så indtil videre med LM35 får vi temperatur i form af variabel spænding. Denne temperaturafhængige spænding gives som input til ADC (Analog til Digital Converter) på ATMEGA32A. Den digitale værdi efter opnået konvertering vises i 16x2 LCD som temperatur.
Komponenter, der kræves
Hardware: ATMEGA32 mikrokontroller, strømforsyning (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), 100uF kondensator (to stykker), 100nF kondensator, LM35 temperaturføler.
Software: Atmel studio 6.1, progisp eller flash-magi.
Kredsløbsdiagram og forklaring
I kredsløbet er PORTB på ATMEGA32 forbundet til dataporten på LCD-skærmen. Her skal man huske at deaktivere JTAG-kommunikationen i PORTC ot ATMEGA ved at ændre sikringsbyte, hvis man ønsker at bruge PORTC som en normal kommunikationsport. I 16x2 LCD er der overalt 16 ben, hvis der er baggrundslys, hvis der ikke er baggrundslys, vil der være 14 ben. Man kan tænde eller lade bagbelysningsstifterne stå. Nu i de 14 stifter er der 8 data stifter (7-14 eller D0-D7), 2 Strømforsyning stifter (1 & 2 eller VSS & VDD eller gnd & + 5V), 3 rd pin for kontraststyring (VEE-styringer, hvor tyk tegnene bør være vist), 3 kontrolben (RS & RW & E).
I kredsløbet kan du observere, at jeg kun har taget to kontrolben, da dette giver fleksibiliteten til bedre forståelse. Kontrastbit og LÆS / SKRIV bruges ikke ofte, så de kan kortsluttes til jorden. Dette sætter LCD i højeste kontrast og læsetilstand. Vi skal bare kontrollere ENABLE og RS-ben for at sende tegn og data i overensstemmelse hermed.
Forbindelserne, der foretages for LCD, er angivet nedenfor:
PIN1 eller VSS ------------------ jord
PIN2 eller VDD eller VCC ------------ + 5v strøm
PIN3 eller VEE --------------- jorden (giver maksimal kontrast bedst for en nybegynder)
PIN4 eller RS (Registreringsvalg) --------------- PD6 for uC
PIN5 eller RW (læse / skrive) ----------------- jord (sætter LCD i læsetilstand letter kommunikationen for brugeren)
PIN6 eller E (Aktivér) ------------------- PD5 for uC
PIN7 eller D0 ---------------------------- PB0 for uC
PIN8 eller D1 ---------------------------- PB1 af uC
PIN9 eller D2 ---------------------------- PB2 af uC
PIN10 eller D3 ---------------------------- PB3 af uC
PIN11 eller D4 ---------------------------- PB4 af uC
PIN12 eller D5 ---------------------------- PB5 for uC
PIN13 eller D6 ---------------------------- PB6 af uC
PIN14 eller D7 ---------------------------- PB7 af uC
I kredsløbet kan du se, at vi har brugt 8bit kommunikation (D0-D7) men dette er ikke obligatorisk, vi kan bruge 4bit kommunikation (D4-D7), men med 4 bit kommunikationsprogram bliver lidt komplekst, så jeg har valgt 8 bit meddelelse.
Så fra blot observation fra ovenstående tabel forbinder vi 10 ben på LCD til controller, hvor 8 ben er datapinde og 2 ben til kontrol. Spændingsoutputtet fra sensoren er ikke helt lineært; det vil være støjende. For at filtrere støj ud skal en kondensator placeres ved udgangen af sensoren som vist i figuren.
Før vi går videre, skal vi tale om ADC af ATMEGA32A. I ATMEGA32A kan vi give Analog input til en af otte kanaler i PORTA, det betyder ikke noget, hvilken kanal vi vælger, da alle er ens. Vi vælger kanal 0 eller PIN0 for PORTA. I ATMEGA32A har ADC 10 bit opløsning, så controlleren kan registrere en fornemmelse af en minimal ændring af Vref / 2 ^ 10, så hvis referencespændingen er 5V, får vi en digital udgangsstigning for hver 5/2 ^ 10 = 5mV. Så for hver 5 mV forøgelse i indgangen vil vi have en forøgelse på en ved digital udgang.
Nu skal vi indstille registeret over ADC baseret på følgende vilkår:
1. Først og fremmest skal vi aktivere ADC-funktionen i ADC.
2. Da vi måler stuetemperatur, har vi ikke rigtig brug for værdier ud over hundrede grader (1000mV output af LM35). Så vi kan indstille maksimal værdi eller reference for ADC til 2,5V.
3. Controlleren har en triggerkonverteringsfunktion, hvilket betyder, at ADC-konvertering kun finder sted efter en ekstern trigger, da vi ikke ønsker, at vi skal indstille registre for ADC til at køre i kontinuerlig fri kørselstilstand.
4. For enhver ADC er konverteringsfrekvensen (analog værdi til digital værdi) og nøjagtigheden af det digitale output omvendt proportional. Så for bedre nøjagtighed af digital output skal vi vælge mindre frekvens. For mindre ADC-ur indstiller vi videresalg af ADC til maksimumværdi (128). Da vi bruger det interne ur på 1MHZ, vil uret til ADC være (1000000/128).
Dette er de eneste fire ting, vi har brug for at vide for at komme i gang med ADC. Alle de ovennævnte fire funktioner er indstillet af to registre.
RØD (ADEN): Denne bit skal indstilles for at aktivere ADC-funktionen i ATMEGA.
BLÅ (REFS1, REFS0): Disse to bits bruges til at indstille referencespændingen (eller den maksimale indgangsspænding, vi skal give). Da vi ønsker at have referencespænding 2,56V, skal begge REFS0 og REFS1 indstilles ved bordet.
LIGHT GREEN (ADATE): Denne bit skal indstilles for at ADC'en skal køre kontinuerligt (frit kørselstilstand).
PINK (MUX0-MUX4): Disse fem bits er til at fortælle inputkanalen. Da vi skal bruge ADC0 eller PIN0, behøver vi ikke indstille bits som ved bordet.
BRUN (ADPS0-ADPS2): disse tre bits er til indstilling af prescalar for ADC. Sice vi bruger en prescalar på 128, vi er nødt til at indstille alle tre bits.
MØRK GRØN (ADSC): dette bit sæt til ADC'en til at starte konvertering. Denne bit kan deaktiveres i programmet, når vi skal stoppe konverteringen.
For at lave dette projekt med Arduino, se denne vejledning: Digital termometer ved hjælp af Arduino
Programmering Forklaring
Arbejdet med TEMPARATURMÅLING forklares bedst trin for trin af C-koden nedenfor:
#include // header for at aktivere datastrømskontrol over pins
#define F_CPU 1000000 // fortæller controllerens krystalfrekvens knyttet
#omfatte
#define E 5 // giver navnet ”enable” til 5 th pin af PORTD, da den er forbundet til LCD aktivere pin
#define RS 6 // giver navnet ”registerselection” til 6 th pin af PORTD, da er forbundet til LCD RS pin
ugyldigt send_a_command (usigneret char-kommando);
ugyldigt send_a_character (usigneret char karakter);
ugyldigt send_a_string (char * string_of_characters);
int main (ugyldigt)
{
DDRB = 0xFF; // sætte portB og portD som outputnål
DDRD = 0xFF;
_forsinkelse (50); // giver forsinkelse på 50 ms
DDRA = 0; // Tager portA som input.
ADMUX - = (1 <
ADCSRA - = (1 <0)
{
send_a_character (* string_of_characters ++);
}
}