In dit project gaan we een schakeling ontwerpen voor het meten van temperatuur. Deze schakeling is ontwikkeld met behulp van " LM35 ", een lineaire spanningssensor. De temperatuur wordt meestal gemeten in "Celsius" of "Faraheite". "LM35" -sensor levert output op basis van schaal van Celsius.
LM35 is een driepins transistorachtig apparaat. Het heeft VCC, GND en OUTPUT. Deze sensor levert een variabele spanning aan de uitgang op basis van temperatuur.
Zoals te zien is in bovenstaande afbeelding, zal voor elke temperatuurstijging van +1 graden Celsius een + 10mV hogere output zijn. Dus als de temperatuur 0 ° C is, is de output van de sensor 0V, als de temperatuur 10 ° C is, is de output van de sensor + 100mV, als de temperatuur 25◦ Celsius is, is de output van de sensor + 250mV.
Dus voor nu krijgen we met LM35 temperatuur in de vorm van variabele spanning. Deze temperatuurafhankelijke spanning wordt gegeven als invoer voor ADC (analoog naar digitaal converter) van ATMEGA32A. De digitale waarde na de verkregen conversie wordt in de 16x2 LCD weergegeven als temperatuur.
Componenten vereist
Hardware: ATMEGA32 Microcontroller, voeding (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), 100uF condensator (twee stuks), 100nF condensator, LM35 temperatuursensor.
Software: Atmel studio 6.1, progisp of flash magie.
Schakelschema en uitleg
In het circuit is PORTB van ATMEGA32 verbonden met datapoort van LCD. Hier moet men onthouden om de JTAG-communicatie in PORTC of ATMEGA uit te schakelen door de zekeringbytes te wijzigen, als men de PORTC als een normale communicatiepoort wil gebruiken. In 16x2 LCD zijn er in totaal 16 pinnen als er een achtergrondverlichting is, als er geen achtergrondverlichting is, zijn er 14 pinnen. Men kan de achterlichtpinnen van stroom voorzien of laten. Nu zijn er in de 14 pinnen 8 datapinnen (7-14 of D0-D7), 2 voedingspinnen (1 & 2 of VSS & VDD of gnd & + 5v), 3 e pin voor contrastregeling (VEE-regelt hoe dik de tekens moeten zijn afgebeeld), 3 controlepennen (RS & RW & E).
In het circuit kun je zien dat ik maar twee controlepennen heb genomen, omdat dit de flexibiliteit van een beter begrip geeft. Het contrastbit en READ / WRITE worden niet vaak gebruikt, zodat ze kunnen worden kortgesloten naar aarde. Dit plaatst LCD in het hoogste contrast en leesmodus. We hoeven alleen de ENABLE- en RS-pinnen te bedienen om tekens en gegevens dienovereenkomstig te verzenden.
De aansluitingen die zijn gemaakt voor LCD worden hieronder gegeven:
PIN1 of VSS ------------------ aarde
PIN2 of VDD of VCC ------------ + 5v voeding
PIN3 of VEE --------------- grond (geeft maximaal contrast het beste voor een beginner)
PIN4 of RS (registerselectie) --------------- PD6 van uC
PIN5 of RW (lezen / schrijven) ----------------- grond (zet LCD in leesmodus vergemakkelijkt de communicatie voor de gebruiker)
PIN6 of E (inschakelen) ------------------- PD5 van uC
PIN7 of D0 ----------------------------- PB0 van uC
PIN8 of D1 ----------------------------- PB1 van uC
PIN9 of D2 ----------------------------- PB2 van uC
PIN10 of D3 ----------------------------- PB3 van uC
PIN11 of D4 ----------------------------- PB4 van uC
PIN12 of D5 ----------------------------- PB5 van uC
PIN13 of D6 ----------------------------- PB6 van uC
PIN14 of D7 ----------------------------- PB7 van uC
In het circuit kun je zien dat we 8bit-communicatie (D0-D7) hebben gebruikt, maar dit is niet verplicht, we kunnen 4bit-communicatie gebruiken (D4-D7) maar met 4-bits communicatie wordt het programma een beetje ingewikkeld, dus ik heb de 8-bit gekozen communicatie.
Dus van louter observatie van bovenaf, verbinden we 10 pinnen van het LCD-scherm met de controller waarin 8 pinnen datapinnen zijn en 2 pinnen voor controle. De door de sensor geleverde spanning is niet volledig lineair; het zal luidruchtig zijn. Om de ruis weg te filteren moet er een condensator aan de uitgang van de sensor worden geplaatst, zoals weergegeven in de afbeelding.
Voordat we verder gaan, moeten we het hebben over ADC van ATMEGA32A. In ATMEGA32A kunnen we analoge invoer geven aan elk van de acht kanalen van PORTA, het maakt niet uit welk kanaal we kiezen, want ze zijn allemaal hetzelfde. We gaan kanaal 0 of PIN0 van PORTA kiezen. In ATMEGA32A heeft de ADC een resolutie van 10 bits, zodat de controller een minimale verandering van Vref / 2 ^ 10 kan detecteren, dus als de referentiespanning 5V is, krijgen we een digitale outputstap voor elke 5/2 ^ 10 = 5mV. Dus voor elke stap van 5mV in de ingang hebben we een toename van één bij digitale uitgang.
Nu moeten we het register van ADC instellen op basis van de volgende voorwaarden:
1. Allereerst moeten we de ADC-functie in ADC inschakelen.
2. Aangezien we de kamertemperatuur meten, hebben we niet echt waarden boven de honderd graden nodig (1000mV output van LM35). We kunnen dus de maximale waarde of referentie van ADC instellen op 2,5 V.
3. De controller heeft een trigger-conversiefunctie, wat betekent dat ADC-conversie alleen plaatsvindt na een externe trigger, omdat we niet willen dat we de registers hoeven in te stellen om de ADC continu vrij te laten draaien.
4. Voor elke ADC zijn de conversiefrequentie (analoge waarde naar digitale waarde) en nauwkeurigheid van digitale uitvoer omgekeerd evenredig. Dus voor een betere nauwkeurigheid van de digitale uitvoer moeten we een lagere frequentie kiezen. Voor mindere ADC-klok stellen we de voorverkoop van ADC in op maximale waarde (128). Omdat we de interne klok van 1MHZ gebruiken, zal de klok van ADC (1000000/128) zijn.
Dit zijn de enige vier dingen die we moeten weten om aan de slag te gaan met ADC. Alle bovenstaande vier kenmerken worden ingesteld door twee registers.
ROOD (ADEN): Dit bit moet worden ingesteld om de ADC-functie van ATMEGA in te schakelen.
BLAUW (REFS1, REFS0): deze twee bits worden gebruikt om de referentiespanning in te stellen (of de maximale ingangsspanning die we gaan geven). Aangezien we een referentiespanning van 2,56 V willen hebben, moeten REFS0 en REFS1 beide worden ingesteld volgens de tabel.
LICHTGROEN (ADATE): Deze bit moet worden ingesteld om de ADC continu te laten werken (vrijloopmodus).
PINK (MUX0-MUX4): deze vijf bits zijn voor het aangeven van het ingangskanaal. Omdat we ADC0 of PIN0 gaan gebruiken, hoeven we geen bits in te stellen zoals bij de tabel.
BRUIN (ADPS0-ADPS2): deze drie bits zijn voor het instellen van de prescalar voor ADC. Omdat we een prescalar van 128 gebruiken, moeten we alle drie de bits instellen.
DONKERGROEN (ADSC): deze bit is ingesteld voor de ADC om de conversie te starten. Dit bit kan in het programma worden uitgeschakeld wanneer we de conversie moeten stoppen.
Zie deze tutorial om dit project met Arduino te maken: Digitale thermometer met Arduino
Uitleg over programmeren
De werking van TEMPARATURE METING kan het beste worden uitgelegd in stap voor stap van de onderstaande C-code:
#include // header om gegevensstroomcontrole over pinnen in te schakelen
#define F_CPU 1000000 // vertellen controller kristalfrequentie aangesloten
# omvatten
#define E 5 // het geven van de naam “enable” om 5 th pin van PORTD, want het is aangesloten op LCD in te schakelen pin
#define RS 6 // het geven van de naam “registerselection” tot 6 th pin van PORTD, omdat is aangesloten op LCD RS pin
void send_a_command (niet-ondertekende tekenopdracht);
void send_a_character (teken zonder teken);
ongeldig send_a_string (char * string_of_characters);
int main (ongeldig)
{
DDRB = 0xFF; // portB en portD als output pinnen zetten
DDRD = 0xFF;
_delay_ms (50); // geeft een vertraging van 50 ms
DDRA = 0; // PortA als invoer gebruiken.
ADMUX - = (1 <
ADCSRA - = (1 <0)
{
send_a_character (* string_of_characters ++);
}
}