- Cos'è l'ADC (conversione da analogico a digitale)
- ADC nel microcontrollore AVR Atmega16
- Componenti richiesti
- Schema elettrico
- Impostazione dei registri di controllo ADC in Atmega16
- Programmazione di Atmega16 per ADC
Una caratteristica comune utilizzata in quasi tutte le applicazioni integrate è il modulo ADC (convertitore da analogico a digitale). Questi Convertitori analogico digitali possono leggere tensione da sensori analogici come sensore di temperatura, sensore di inclinazione, Sensore di corrente, flessione del sensore, ecc In questo tutorial impareremo cosa è ADC e come utilizzare ADC in Atmega16. Questo tutorial include il collegamento di un piccolo potenziometro al pin ADC di Atmega16 e 8 LED vengono utilizzati per visualizzare la tensione variabile del valore di uscita ADC rispetto alla variazione del valore di ingresso ADC.
In precedenza abbiamo spiegato ADC in altri microcontrollori:
- Come utilizzare ADC in ARM7 LPC2148 - Misurazione della tensione analogica
- Come utilizzare l'ADC in STM32F103C8 - Misurazione della tensione analogica
- Come utilizzare l'ADC in MSP430G2 - Misurazione della tensione analogica
- Come utilizzare ADC in Arduino Uno?
- Utilizzo del modulo ADC del microcontrollore PIC con MPLAB e XC8
Cos'è l'ADC (conversione da analogico a digitale)
ADC è l'acronimo di Analog to Digital Converter. In elettronica, un ADC è un dispositivo che converte un segnale analogico come corrente e tensione in codice digitale (forma binaria). Nel mondo reale la maggior parte dei segnali sono analogici e qualsiasi microcontrollore o microprocessore comprende il linguaggio binario o digitale (0 o 1). Quindi, per far capire ai microcontrollori i segnali analogici, dobbiamo convertire questi segnali analogici in forma digitale. ADC fa esattamente questo per noi. Sono disponibili molti tipi di ADC per diverse applicazioni. Pochi ADC popolari sono flash, approssimazioni successive e sigma-delta.
Il tipo più economico di ADC è l' approssimazione successiva e in questo tutorial verrà utilizzato l'ADC ad approssimazione successiva. In un tipo di ADC ad approssimazione successiva, una serie di codici digitali, ciascuno corrispondente a un livello analogico fisso, vengono generati successivamente. Un contatore interno viene utilizzato per il confronto con il segnale analogico in conversione. La generazione viene interrotta quando il livello analogico diventa appena maggiore del segnale analogico. Il codice digitale corrisponde al livello analogico è la rappresentazione digitale desiderata del segnale analogico. Questo conclude la nostra piccola spiegazione sull'approssimazione successiva.
Se vuoi esplorare l'ADC in modo molto approfondito, puoi fare riferimento al nostro precedente tutorial su ADC. Gli ADC sono disponibili sotto forma di IC e anche i microcontrollori sono dotati di ADC integrato al giorno d'oggi. In questo tutorial useremo l' ADC integrato di Atmega16. Parliamo dell'ADC integrato di Atmega16.
ADC nel microcontrollore AVR Atmega16
Atmega16 ha un ADC integrato a 10 bit e 8 canali. 10 bit corrisponde a quello se la tensione di ingresso è 0-5 V, verrà suddiviso in un valore di 10 bit, ovvero 1024 livelli di valori analogici discreti (2 10 = 1024). Ora 8 canali corrispondono agli 8 pin ADC dedicati su Atmega16 dove ogni pin può leggere la tensione analogica. La porta completa A (GPIO33-GPIO40) è dedicata al funzionamento dell'ADC. Per impostazione predefinita, i pin PORTA sono pin IO generali, significa che i pin della porta sono multiplexati. Per poter utilizzare questi pin come pin ADC dovremo configurare alcuni registri dedicati al controllo ADC. Questo è il motivo per cui i registri sono noti come registri di controllo ADC. Parliamo di come impostare questi registri per iniziare a far funzionare l'ADC integrato.
Pin ADC in Atmega16
Componenti richiesti
- Atmega16 Microcontroller IC
- Oscillatore in cristallo da 16 Mhz
- Due condensatori da 100 nF
- Due condensatori da 22pF
- Premi il bottone
- Cavi per ponticelli
- Breadboard
- USBASP v2.0
- Led (qualsiasi colore)
Schema elettrico
Impostazione dei registri di controllo ADC in Atmega16
1. Registro ADMUX (registro di selezione multiplexer ADC) :
Il registro ADMUX serve per la selezione del canale ADC e la selezione della tensione di riferimento. L'immagine sotto mostra la panoramica del registro ADMUX. La descrizione è spiegata di seguito.
- Bit 0-4: bit di selezione del canale.
MUX4 |
MUX3 |
MUX2 |
MUX1 |
MUX0 |
Canale ADC selezionato |
0 |
0 |
0 |
0 |
0 |
ADC0 |
0 |
0 |
0 |
0 |
1 |
ADC1 |
0 |
0 |
0 |
1 |
0 |
ADC2 |
0 |
0 |
0 |
1 |
1 |
ADC3 |
0 |
0 |
1 |
0 |
0 |
ADC4 |
0 |
0 |
1 |
0 |
1 |
ADC5 |
0 |
0 |
1 |
1 |
0 |
ADC6 |
0 |
0 |
1 |
1 |
1 |
ADC7 |
- Bit-5: viene utilizzato per regolare il risultato a destra oa sinistra.
ADLAR |
Descrizione |
0 |
Regola il risultato a destra |
1 |
Regola il risultato a sinistra |
- Bit 6-7: vengono utilizzati per selezionare la tensione di riferimento per l'ADC.
REFS1 |
REFS0 |
Selezione del riferimento di tensione |
0 |
0 |
AREF, Vref interna disattivata |
0 |
1 |
AVcc con condensatore esterno al pin AREF |
1 |
0 |
Riservato |
1 |
1 |
Riferimento di tensione 2,56 interno con condensatore esterno sul pin AREF |
Ora inizia a configurare questi bit di registro nel programma in modo tale da ottenere la lettura e l'output dell'ADC interno su Tutti i pin di PORTC.
Programmazione di Atmega16 per ADC
Di seguito viene fornito il programma completo. Masterizza il programma in Atmega16 usando JTAG e Atmel Studio e ruota il potenziometro per variare il valore dell'ADC. Qui, il codice è spiegato riga per riga.
Inizia con la creazione di una funzione per leggere il valore convertito ADC. Quindi passare il valore del canale come "chnl" nella funzione ADC_read .
unsigned int ADC_read (chnl char non firmato)
I valori dei canali devono essere compresi tra 0 e 7 poiché abbiamo solo 8 canali ADC.
chnl = chnl & 0b00000111;
Scrivendo '40' cioè '01000000' nel registro ADMUX abbiamo selezionato PORTA0 come ADC0 dove sarà collegato l'ingresso analogico per la conversione digitale.
ADMUX = 0x40;
Ora questo passaggio implica il processo di conversione ADC, in cui scrivendo ONE in ADSC Bit nel registro ADCSRA iniziamo la conversione. Dopodiché, attendi che il bit ADIF restituisca il valore al termine della conversione. Interrompiamo la conversione scrivendo "1" in ADIF Bit nel registro ADCSRA. Quando la conversione è completa, restituisci il valore ADC.
ADCSRA - = (1 <
Qui la tensione di riferimento dell'ADC interna viene selezionata impostando il bit REFS0. Successivamente, abilita ADC e seleziona il prescaler come 128.
ADMUX = (1 <
Ora salva il valore ADC e invialo a PORTC. In PORTC, sono collegati 8 LED che mostreranno l'uscita digitale in formato 8 bit. L'esempio che abbiamo mostrato varia la tensione tra 0V e 5V utilizzando un potenziometro da 1K.
i = ADC_read (0); PORTC = i;
Il multimetro digitale viene utilizzato per visualizzare la tensione di ingresso analogico nel pin ADC e 8 LED vengono utilizzati per mostrare il valore corrispondente a 8 bit dell'uscita ADC. Basta ruotare il potenziometro e vedere il risultato corrispondente sul multimetro e sui LED luminosi.
Di seguito sono riportati il codice completo e il video funzionante.