În acest proiect vom proiecta un circuit pentru măsurarea temperaturii. Acest circuit este dezvoltat folosind „ LM35 ”, un senzor de tensiune liniară. Temperatura este de obicei măsurată în „Centigrade” sau „Faraheite”. Senzorul „LM35” oferă ieșire pe baza scalei centigrade.
LM35 este un dispozitiv cu tranzistor cu trei pini. Are VCC, GND și OUTPUT. Acest senzor asigură tensiune variabilă la ieșire în funcție de temperatură.
Așa cum se arată în figura de mai sus, pentru fiecare creștere a temperaturii de +1 centigradi va exista o putere de + 10mV mai mare. Deci, dacă temperatura este 0◦centigrad, ieșirea senzorului va fi 0V, dacă temperatura este 10◦ centigrad, ieșirea senzorului va fi + 100mV, dacă temperatura este 25◦ centigrad, ieșirea senzorului va fi + 250mV.
Deci, deocamdată, cu LM35 obținem temperatura sub formă de tensiune variabilă. Această tensiune dependentă de temperatură este dată ca intrare la ADC (analogic la convertor digital) al ATMEGA32A. Valoarea digitală după conversia obținută este afișată pe ecranul LCD de 16x2 ca temperatură.
Componente necesare
Hardware: microcontroler ATMEGA32, sursă de alimentare (5v), PROGRAMATOR AVR-ISP, JHD_162ALCD (16x2LCD), condensator 100uF (două bucăți), condensator 100nF, senzor de temperatură LM35.
Software: Atmel studio 6.1, progisp sau flash magic.
Diagrama și explicația circuitului
În circuit, PORTB de la ATMEGA32 este conectat la portul de date al LCD-ului. Aici ar trebui să vă amintiți să dezactivați comunicarea JTAG în PORTC sau ATMEGA prin schimbarea octeților siguranței, dacă doriți să utilizați PORTC ca un port de comunicație normal. În ecranul LCD 16x2 există 16 pini peste tot dacă există o lumină din spate, dacă nu există lumină din spate vor exista 14 pini. Se poate alimenta sau lăsa pinii luminii din spate. Acum, în cele 14 pinii există 8 pini de date (7-14 sau D0-D7), 2 pini de alimentare (1 & 2 sau VSS & VDD sau gnd & + 5v), 3 rd pini pentru controlul contrastului (VEE-control cât de gros personajele ar trebui să fie afișat), 3 pini de control (RS & RW & E).
În circuit, puteți observa că am luat doar doi pini de control, deoarece acest lucru oferă flexibilitatea unei mai bune înțelegeri. Bitul de contrast și READ / WRITE nu sunt adesea folosite, astfel încât acestea pot fi scurtcircuitate la sol. Acest lucru pune LCD în cel mai mare contrast și modul de citire. Trebuie doar să controlăm ENABLE și pinii RS pentru a trimite caractere și date în consecință.
Conexiunile care se fac pentru LCD sunt date mai jos:
PIN1 sau VSS ------------------ sol
PIN2 sau VDD sau VCC ------------ + 5v putere
PIN3 sau VEE --------------- sol (oferă contrast maxim cel mai bun pentru un începător)
PIN4 sau RS (Selectare înregistrare) --------------- PD6 al uC
PIN5 sau RW (citire / scriere) ----------------- masă (pune LCD în modul de citire facilitează comunicarea pentru utilizator)
PIN6 sau E (Activare) ------------------- PD5 din uC
PIN7 sau D0 ----------------------------- PB0 al uC
PIN8 sau D1 ----------------------------- PB1 al uC
PIN9 sau D2 ----------------------------- PB2 al uC
PIN10 sau D3 ----------------------------- PB3 al uC
PIN11 sau D4 ----------------------------- PB4 al uC
PIN12 sau D5 ----------------------------- PB5 al uC
PIN13 sau D6 ----------------------------- PB6 al uC
PIN14 sau D7 ----------------------------- PB7 al uC
În circuit puteți vedea că am folosit comunicarea pe 8 biți (D0-D7), totuși acest lucru nu este obligatoriu, putem folosi comunicația pe 4 biți (D4-D7), dar programul de comunicare pe 4 biți devine un pic complex, așa că am ales 8 biți comunicare.
Deci, din simpla observare din tabelul de mai sus, conectăm 10 pini de LCD la controler, în care 8 pini sunt pini de date și 2 pini pentru control. Tensiunea de ieșire furnizată de senzor nu este complet liniară; va fi unul zgomotos. Pentru a filtra zgomotul, un condensator trebuie plasat la ieșirea senzorului, așa cum se arată în figură.
Înainte de a merge mai departe, trebuie să vorbim despre ADC al ATMEGA32A. În ATMEGA32A, putem oferi intrare analogică oricăruia dintre cele opt canale ale PORTA, nu contează ce canal alegem, deoarece toate sunt la fel. Vom alege canalul 0 sau PIN0 al PORTA. În ATMEGA32A, ADC are o rezoluție de 10 biți, astfel încât controlerul poate detecta o schimbare minimă a Vref / 2 ^ 10, deci dacă tensiunea de referință este 5V, obținem o creștere digitală a ieșirii pentru fiecare 5/2 ^ 10 = 5mV. Deci, pentru fiecare increment de 5mV în intrare vom avea o creștere de unul la ieșirea digitală.
Acum trebuie să setăm registrul ADC pe baza următoarelor condiții:
1. În primul rând, trebuie să activăm caracteristica ADC în ADC.
2. Deoarece măsurăm temperatura camerei, nu avem nevoie de valori peste sute de grade (ieșire 1000mV a LM35). Deci, putem seta valoarea maximă sau referința ADC la 2,5V.
3. Controlerul are o caracteristică de conversie a declanșatorului, ceea ce înseamnă că conversia ADC are loc numai după un declanșator extern, deoarece nu vrem să fie nevoie să setăm registrele pentru ca ADC să ruleze în modul continuu de rulare liberă.
4. Pentru orice ADC, frecvența conversiei (valoarea analogică la valoarea digitală) și precizia ieșirii digitale sunt invers proporționale. Deci, pentru o mai bună precizie a ieșirii digitale, trebuie să alegem o frecvență mai mică. Pentru un ceas ADC mai mic, setăm pre-vânzarea ADC la valoarea maximă (128). Deoarece folosim ceasul intern de 1 MHz, ceasul ADC va fi (1000000/128).
Acestea sunt singurele patru lucruri pe care trebuie să le cunoaștem pentru a începe cu ADC. Toate cele patru caracteristici de mai sus sunt setate de două registre.
ROȘU (ADEN): Acest bit trebuie setat pentru a activa caracteristica ADC a ATMEGA.
ALBASTRU (REFS1, REFS0): Acești doi biți sunt utilizați pentru a seta tensiunea de referință (sau tensiunea maximă de intrare pe care o vom da). Deoarece dorim să avem tensiunea de referință 2,56V, REFS0 și REFS1 ar trebui să fie setate de tabel.
VERDE LUMINOS (ADATE): Acest bit trebuie setat pentru ca ADC să ruleze continuu (modul de rulare liber).
ROSE (MUX0-MUX4): Acești cinci biți sunt pentru a spune canalului de intrare. Deoarece vom folosi ADC0 sau PIN0, nu trebuie să setăm niciun biți ca în tabel.
BROWN (ADPS0-ADPS2): acești trei biți sunt pentru setarea prescalarului pentru ADC. Deoarece folosim un prescalar de 128, trebuie să setăm toți cei trei biți.
DARK GREEN (ADSC): acest bit setat pentru ca ADC să înceapă conversia. Acest bit poate fi dezactivat în program atunci când trebuie să oprim conversia.
Pentru a face acest proiect cu Arduino, consultați acest tutorial: Termometru digital folosind Arduino
Explicație de programare
Funcționarea MĂSURĂRII TEMPARATURII se explică cel mai bine pas cu pas al codului C dat mai jos:
#include // header pentru a permite controlul fluxului de date peste pini
#define F_CPU 1000000 // indicând frecvența cristalului controlerului atașată
#include
#define E 5 // da numele „permite“ 5 - lea PIN al PORTD, deoarece acesta este conectat la LCD permite PIN -
#define RS 6 // dând numele „registerselection” la al șaselea pin al PORTD, deoarece este conectat la pinul RS LCD
void send_a_command (comandă char nesemnată);
void send_a_character (caracter de caractere nesemnat);
void send_a_string (char * șir_de_caractere);
int main (nul)
{
DDRB = 0xFF; // punerea portB și portD ca pini de ieșire
DDRD = 0xFF;
_delay_ms (50); // oferind o întârziere de 50ms
DDRA = 0; // Luând portA ca intrare.
ADMUX - = (1 <
ADCSRA - = (1 <0)
{
send_a_character (* șir_de_caractere ++);
}
}