I det här projektet ska vi utforma en krets för temperaturmätning. Denna krets är utvecklad med hjälp av " LM35 ", en linjär spänningssensor. Temperaturen mäts vanligtvis i "Celsius" eller "Faraheit". ”LM35” -sensorn ger utdata baserat på skalans storlek.
LM35 är en tre-stifts transistorliknande enhet. Den har VCC, GND och OUTPUT. Denna sensor ger variabel spänning vid utgången baserat på temperatur.
Som visas i figuren ovan kommer varje +1 ° C höjning av temperaturen att vara + 10mV högre effekt. Så om temperaturen är 0◦C kommer sensorns utgång att vara 0V, om temperaturen är 10◦C kommer sensorns uteffekt att vara + 100mV, om temperaturen är 25◦C kommer sensorns uteffekt att vara + 250mV.
Så för nu med LM35 får vi temperatur i form av variabel spänning. Denna temperaturberoende spänning ges som ingång till ADC (analog till digital omvandlare) på ATMEGA32A. Det digitala värdet efter erhållen konvertering visas i 16x2 LCD som temperatur.
Komponenter krävs
Hårdvara: ATMEGA32 mikrokontroller, strömförsörjning (5v), AVR-ISP-PROGRAMMER, JHD_162ALCD (16x2LCD), 100uF kondensator (två delar), 100nF kondensator, LM35 temperatursensor.
Programvara: Atmel studio 6.1, progisp eller flash magi.
Kretsschema och förklaring
I kretsen är PORTB på ATMEGA32 ansluten till dataporten på LCD-skärmen. Här bör man komma ihåg att inaktivera JTAG-kommunikationen i PORTC ot ATMEGA genom att ändra säkringsbyten, om man vill använda PORTC som en normal kommunikationsport. I 16x2 LCD finns det 16 stift överallt om det finns en bakgrundsbelysning, om det inte finns något bakgrundsbelysning kommer det att finnas 14 stift. Man kan driva eller lämna bakljuset. Nu i de 14 stiften finns 8 datastift (7-14 eller D0-D7), 2 effektmatningsstiften (1 & 2 eller VSS & VDD eller GND & + 5v), 3 : e stift för kontrastreglering (VEE-styr hur tjock tecknen bör vara visas), 3 kontrollstift (RS & RW & E).
I kretsen kan du observera att jag bara har tagit två kontrollstift eftersom det ger flexibiliteten för bättre förståelse. Kontrastbiten och LÄS / SKRIV inte ofta så att de kan kortslutas till marken. Detta sätter LCD i högsta kontrast och läsläge. Vi behöver bara kontrollera ENABLE- och RS-stift för att skicka tecken och data i enlighet därmed.
De anslutningar som görs för LCD ges nedan:
PIN1 eller VSS ------------------ jord
PIN2 eller VDD eller VCC ------------ + 5v ström
PIN3 eller VEE --------------- mark (ger maximal kontrast bäst för en nybörjare)
PIN4 eller RS (Registrera val) --------------- PD6 för uC
PIN5 eller RW (Läs / skriv) ----------------- mark (sätter LCD i läsläge underlättar kommunikationen för användaren)
PIN6 eller E (Aktivera) ------------------- PD5 för uC
PIN7 eller D0 ----------------------------- PB0 för uC
PIN8 eller D1 ---------------------------- PB1 för uC
PIN9 eller D2 ---------------------------- PB2 för uC
PIN10 eller D3 ---------------------------- PB3 för uC
PIN11 eller D4 ---------------------------- PB4 för uC
PIN12 eller D5 ----------------------------- PB5 för uC
PIN13 eller D6 ---------------------------- PB6 för uC
PIN14 eller D7 ---------------------------- PB7 för uC
I kretsen kan du se att vi har använt 8-bitars kommunikation (D0-D7) men detta är inte obligatoriskt, vi kan använda 4-bitars kommunikation (D4-D7) men med 4-bitars kommunikationsprogram blir lite komplext så jag har valt 8-bitars kommunikation.
Så från enbart observation från ovanstående tabell ansluter vi 10 stift LCD till styrenhet där 8 stift är datapinnar och 2 stift för kontroll. Spänningsutgången från sensorn är inte helt linjär; det blir en högljudd. För att filtrera bort bruset måste en kondensator placeras vid sensorns utgång som visas i figuren.
Innan vi går vidare måste vi prata om ADC i ATMEGA32A. I ATMEGA32A kan vi ge analog ingång till någon av åtta PORTA-kanaler, det spelar ingen roll vilken kanal vi väljer eftersom alla är desamma. Vi ska välja kanal 0 eller PIN0 för PORTA. I ATMEGA32A har ADC 10 bitars upplösning, så att styrenheten kan känna av en känsla av en minsta förändring av Vref / 2 ^ 10, så om referensspänningen är 5V får vi en digital utgångsinkrement för varje 5/2 ^ 10 = 5mV. Så för varje 5mV-steg i ingången kommer vi att öka en på digital utgång.
Nu måste vi ställa in ADC-registret baserat på följande villkor:
1. Först och främst behöver vi aktivera ADC-funktionen i ADC.
2. Eftersom vi mäter rumstemperatur behöver vi inte riktigt värden över hundra grader (1000 mV uteffekt av LM35). Så vi kan ställa in maximalt värde eller referens för ADC till 2,5V.
3. Styrenheten har en triggerkonverteringsfunktion, det vill säga ADC-konvertering sker först efter en extern trigger, eftersom vi inte vill att vi behöver ställa in register för att ADC ska kunna köras i kontinuerligt frikörningsläge.
4. För varje ADC är omvandlingsfrekvensen (analogt värde till digitalt värde) och noggrannheten för digital utgång omvänt proportionell. Så för bättre noggrannhet för digital utgång måste vi välja lägre frekvens. För lägre ADC-klocka ställer vi in förförsäljningen av ADC till maximalt värde (128). Eftersom vi använder den interna klockan på 1MHZ kommer klockan till ADC att vara (1000000/128).
Det här är de enda fyra sakerna vi behöver veta för att komma igång med ADC. Alla ovanstående fyra funktioner är inställda av två register.
RÖD (ADEN): Denna bit måste ställas in för att aktivera ADC-funktionen i ATMEGA.
BLÅ (REFS1, REFS0): Dessa två bitar används för att ställa in referensspänningen (eller max ingångsspänningen vi ska ge). Eftersom vi vill ha referensspänning 2,56V, bör båda REFS0 och REFS1 ställas in, enligt tabellen.
LIGHT GREEN (ADATE): Denna bit måste ställas in för att ADC ska kunna köras kontinuerligt (frilöpande läge).
PINK (MUX0-MUX4): Dessa fem bitar är avsedda att berätta ingångskanalen. Eftersom vi ska använda ADC0 eller PIN0 behöver vi inte ställa in några bitar som i tabellen.
BRUN (ADPS0-ADPS2): dessa tre bitar är för att ställa in prescalar för ADC. Sice vi använder en prescalar på 128, vi måste ställa in alla tre bitarna.
MÖRK GRÖN (ADSC): denna bituppsättning för att ADC ska starta omvandlingen. Denna bit kan inaktiveras i programmet när vi behöver stoppa konverteringen.
För att göra detta projekt med Arduino, se denna handledning: Digital termometer med Arduino
Programmeringsförklaring
Arbetet med TEMPARATURMÄTNING förklaras bäst steg för steg av C-koden nedan:
#include // header för att aktivera dataflödeskontroll över stift
#define F_CPU 1000000 // berättar styrenhetens kristallfrekvens
#omfatta
#define E 5 // ger namnet "aktivera" till 5: e stift PORTD, eftersom den är ansluten till LCD-stift
#define RS 6 // ger namnet "registerselection" till 6: e stift PORTD, eftersom den är ansluten till LCD RS-stift
ogiltig send_a_command (osignerad char kommando);
ogiltig send_a_character (osignerad char karaktär);
ogiltig send_a_string (char * string_of_characters);
int main (void)
{
DDRB = 0xFF; // sätta portB och portD som utgångsstift
DDRD = 0xFF;
_delay_ms (50); // ger fördröjning på 50 ms
DDRA = 0; // Tar portA som ingång.
ADMUX - = (1 <
ADCSRA - = (1 <0)
{
send_a_character (* string_of_characters ++);
}
}