In questo progetto progetteremo un circuito per la misurazione della temperatura. Questo circuito è sviluppato utilizzando " LM35 ", un sensore di tensione lineare. La temperatura viene solitamente misurata in "gradi centigradi" o "faraheite". Il sensore "LM35" fornisce un output basato su una scala di gradi centigradi.
LM35 è un transistor a tre pin come un dispositivo. Ha VCC, GND e OUTPUT. Questo sensore fornisce una tensione variabile all'uscita in base alla temperatura.
Come mostrato nella figura sopra, per ogni aumento di temperatura di +1 centigrado ci sarà un'uscita maggiore di + 10mV. Quindi, se la temperatura è di 0 gradi centigradi, l'uscita del sensore sarà 0 V, se la temperatura è di 10 gradi centigradi, l'uscita del sensore sarà di + 100 mV, se la temperatura è di 25 gradi centigradi, l'uscita del sensore sarà di + 250 mV.
Quindi per ora con LM35 otteniamo la temperatura sotto forma di tensione variabile. Questa tensione dipendente dalla temperatura viene fornita come ingresso all'ADC (convertitore da analogico a digitale) di ATMEGA32A. Il valore digitale dopo la conversione ottenuta viene mostrato nell'LCD 16x2 come temperatura.
Componenti richiesti
Hardware: microcontrollore ATMEGA32, alimentatore (5v), PROGRAMMATORE AVR-ISP, JHD_162ALCD (16x2LCD), condensatore 100uF (due pezzi), condensatore 100nF, sensore di temperatura LM35.
Software: Atmel studio 6.1, progisp o flash magic.
Schema del circuito e spiegazione
Nel circuito, PORTB di ATMEGA32 è collegato alla porta dati di LCD. Qui bisogna ricordarsi di disabilitare la comunicazione JTAG in PORTC o ATMEGA cambiando i byte dei fusibili, se si vuole usare il PORTC come una normale porta di comunicazione. In 16x2 LCD ci sono 16 pin in tutto se c'è una retroilluminazione, se non c'è retroilluminazione ci saranno 14 pin. Si può alimentare o lasciare i perni della retroilluminazione. Ora nei 14 pin ci sono 8 pin dati (7-14 o D0-D7), 2 pin di alimentazione (1 & 2 o VSS & VDD o gnd & + 5v), 3 ° pin per il controllo del contrasto (VEE-controlla quanto dovrebbero essere spessi i caratteri mostrato), 3 pin di controllo (RS & RW & E).
Nel circuito, puoi osservare che ho preso solo due pin di controllo in quanto questo dà la flessibilità di una migliore comprensione. Il bit di contrasto e READ / WRITE non sono usati spesso, quindi possono essere cortocircuitati a massa. Questo mette l'LCD nel più alto contrasto e modalità di lettura. Abbiamo solo bisogno di controllare i pin ENABLE e RS per inviare caratteri e dati di conseguenza.
Di seguito sono riportati i collegamenti effettuati per l'LCD:
PIN1 o VSS ------------------ terra
PIN2 o VDD o VCC ------------ Alimentazione + 5v
PIN3 o VEE --------------- terra (offre il massimo contrasto migliore per un principiante)
PIN4 o RS (selezione registro) --------------- PD6 di uC
PIN5 o RW (lettura / scrittura) ----------------- terra (mette il display LCD in modalità di lettura facilita la comunicazione per l'utente)
PIN6 o E (Abilita) ------------------- PD5 di uC
PIN7 o D0 ----------------------------- PB0 di uC
PIN8 o D1 ----------------------------- PB1 di uC
PIN9 o D2 ----------------------------- PB2 di uC
PIN10 o D3 ----------------------------- PB3 di uC
PIN11 o D4 ----------------------------- PB4 di uC
PIN12 o D5 ----------------------------- PB5 di uC
PIN13 o D6 ----------------------------- PB6 di uC
PIN14 o D7 ----------------------------- PB7 di uC
Nel circuito puoi vedere che abbiamo usato la comunicazione a 8 bit (D0-D7) tuttavia non è obbligatorio, possiamo usare la comunicazione a 4 bit (D4-D7) ma con la comunicazione a 4 bit il programma diventa un po 'complesso quindi ho scelto l'8 bit comunicazione.
Quindi dalla semplice osservazione dalla tabella sopra stiamo collegando 10 pin dell'LCD al controller in cui 8 pin sono pin dati e 2 pin per il controllo. L'uscita di tensione fornita dal sensore non è completamente lineare; sarà rumoroso. Per filtrare il rumore è necessario posizionare un condensatore all'uscita del sensore come mostrato in figura.
Prima di andare avanti dobbiamo parlare dell'ADC di ATMEGA32A. In ATMEGA32A, possiamo fornire un ingresso analogico a uno qualsiasi degli otto canali di PORTA, non importa quale canale scegliamo poiché sono tutti uguali. Sceglieremo il canale 0 o PIN0 di PORTA. In ATMEGA32A, l'ADC ha una risoluzione di 10 bit, quindi il controller può rilevare una variazione minima di Vref / 2 ^ 10, quindi se la tensione di riferimento è 5V otteniamo un incremento dell'uscita digitale per ogni 5/2 ^ 10 = 5mV. Quindi per ogni incremento di 5mV in ingresso avremo un incremento di uno in uscita digitale.
Ora dobbiamo impostare il registro di ADC in base ai seguenti termini:
1.Prima di tutto abbiamo bisogno di abilitare la funzione ADC in ADC.
2. Poiché stiamo misurando la temperatura ambiente, non abbiamo realmente bisogno di valori oltre i cento gradi (uscita 1000 mV di LM35). Quindi possiamo impostare il valore massimo o il riferimento dell'ADC a 2,5V.
3. Il controller ha una funzione di conversione del trigger, il che significa che la conversione dell'ADC avviene solo dopo un trigger esterno, poiché non vogliamo che sia necessario impostare i registri affinché l'ADC funzioni in modalità di esecuzione libera continua.
4. Per qualsiasi ADC, la frequenza di conversione (da valore analogico a valore digitale) e la precisione dell'uscita digitale sono inversamente proporzionali. Quindi, per una migliore precisione dell'uscita digitale, dobbiamo scegliere una frequenza inferiore. Per un clock ADC inferiore, stiamo impostando la prevendita dell'ADC al valore massimo (128). Poiché stiamo utilizzando l'orologio interno di 1 MHZ, l'orologio dell'ADC sarà (1000000/128).
Queste sono le uniche quattro cose che dobbiamo sapere per iniziare con ADC. Tutte le quattro caratteristiche precedenti sono impostate da due registri.
ROSSO (ADEN): questo bit deve essere impostato per abilitare la funzione ADC di ATMEGA.
BLU (REFS1, REFS0): Questi due bit vengono utilizzati per impostare la tensione di riferimento (o la tensione di ingresso massima che daremo). Dato che vogliamo avere una tensione di riferimento di 2.56V, REFS0 e REFS1 dovrebbero essere impostati entrambi, dalla tabella.
VERDE CHIARO (ADATE): questo bit deve essere impostato affinché l'ADC funzioni continuamente (modalità di funzionamento libero).
ROSA (MUX0-MUX4): questi cinque bit servono per indicare il canale di ingresso. Poiché utilizzeremo ADC0 o PIN0, non è necessario impostare alcun bit come da tabella.
MARRONE (ADPS0-ADPS2): questi tre bit servono per impostare il prescalar per ADC. Dato che stiamo usando un prescalar di 128, dobbiamo impostare tutti e tre i bit.
VERDE SCURO (ADSC): questo bit consente all'ADC di avviare la conversione. Questo bit può essere disabilitato nel programma quando è necessario interrompere la conversione.
Per realizzare questo progetto con Arduino, guarda questo tutorial: Termometro digitale con Arduino
Spiegazione della programmazione
Il funzionamento della MISURAZIONE DELLA TEMPARATURA è meglio spiegato passo dopo passo del codice C riportato di seguito:
#include // intestazione per abilitare il controllo del flusso di dati sui pin
#define F_CPU 1000000 // indica la frequenza di cristallo del controller collegata
#includere
#define E 5 // dando il nome "enable" al 5 ° pin di PORTD, poiché è collegato al pin di abilitazione LCD
#define RS 6 // dando il nome "selezione di registro" al 6 ° pin di PORTD, poiché è collegato al pin LCD RS
void send_a_command (comando char non firmato);
void send_a_character (carattere char non firmato);
void send_a_string (char * string_of_characters);
int main (void)
{
DDRB = 0xFF; // inserendo portB e portD come pin di output
DDRD = 0xFF;
_delay_ms (50); // fornisce un ritardo di 50 ms
DDRA = 0; // Prendendo portA come input.
ADMUX - = (1 <
ADCSRA - = (1 <0)
{
send_a_character (* string_of_characters ++);
}
}