Sommario:

Introduzione all'ADC nel microcontrollore AVR - per principianti: 14 passaggi
Introduzione all'ADC nel microcontrollore AVR - per principianti: 14 passaggi

Video: Introduzione all'ADC nel microcontrollore AVR - per principianti: 14 passaggi

Video: Introduzione all'ADC nel microcontrollore AVR - per principianti: 14 passaggi
Video: LDmicro 14: I2C LCD & DS3231 Real-Time Clock (Microcontroller PLC Ladder Programming with LDmicro) 2024, Luglio
Anonim
Introduzione all'ADC nel microcontrollore AVR | per principianti
Introduzione all'ADC nel microcontrollore AVR | per principianti

In questo tutorial saprai tutto ADC nel microcontrollore avr

Passaggio 1: cos'è un ADC?

Un ADC, o convertitore da analogico a digitale, consente di convertire una tensione analogica in un valore digitale che può essere utilizzato da un microcontrollore. Ci sono molte sorgenti di segnali analogici che si potrebbe voler misurare. Sono disponibili sensori analogici che misurano la temperatura, l'intensità della luce, la distanza, la posizione e la forza, solo per citarne alcuni.

Passaggio 2: come funziona l'ADC in AVR-Microcontrollore

L'ADC AVR consente al microcontrollore AVR di convertire le tensioni analogiche in valori digitali con poche o nessuna parte esterna. L'ATmega8 dispone di un ADC di approssimazione successiva a 10 bit. ATmega8 ha un ADC a 7 canali su PortC. L'ADC ha un pin di tensione di alimentazione analogico separato, AVCC. AVCC non deve differire più di ± 0.3V da VCC.. Il riferimento di tensione può essere disaccoppiato esternamente al pin AREF. AVCC viene utilizzato come riferimento di tensione. L'ADC può anche essere impostato per l'esecuzione continua (modalità di esecuzione libera) o per eseguire solo una conversione.

Passaggio 3: Formula di conversione ADC

Formula di conversione ADC
Formula di conversione ADC

Dove Vin è la tensione sul pin di ingresso selezionato e Vref il riferimento di tensione selezionato

Passaggio 4: come configurare l'ADC in ATmega8?

Come configurare ADC in ATmega8?
Come configurare ADC in ATmega8?

I seguenti registri sono utilizzati per l'implementazione di ADC in ATmega8

Selezione multiplexer ADC

Passaggio 5: selezione ADLAR

Selezione ADLAR
Selezione ADLAR
Selezione ADLAR
Selezione ADLAR

Risultato regolazione sinistra ADC Il bit ADLAR influisce sulla presentazione del risultato della conversione ADC nel registro dati ADC. Scrivi uno su ADLAR a sinistra per regolare il risultato. Altrimenti, il risultato è corretto

Quando una conversione ADC è completa, il risultato si trova in ADCH e ADCL Quando viene letto ADCL, il registro dati ADC non viene aggiornato finché non viene letto ADCH. Di conseguenza, se il risultato viene lasciato corretto e non è richiesta una precisione superiore a 8 bit, è sufficiente leggere ADCH. In caso contrario, è necessario leggere prima ADCL, quindi ADCH. Bit di selezione del canale analogico Il valore di questi bit seleziona quali ingressi analogici sono collegati all'ADC.

Passaggio 6: selezione ADCSRA

Selezione ADCSRA
Selezione ADCSRA
Selezione ADCSRA
Selezione ADCSRA

• Bit 7 – ADEN: ADC Enable Scrivendo questo bit su uno si abilita l'ADC. Scrivendolo a zero si spegne l'ADC

• Bit 6 – ADSC: ADC avvia conversione In modalità Single Conversion, scrivere questo bit su uno per avviare ogni conversione. In modalità Free Running, scrivi questo bit su uno per avviare la prima conversione.

• Bit 5 – ADFR: Selezione ADC Free Running Quando questo bit è impostato (uno) l'ADC funziona in modalità Free Running. In questa modalità, l'ADC campiona e aggiorna continuamente i registri dati. La cancellazione di questo bit (zero) interromperà la modalità di esecuzione libera.

• Bit 4 – ADIF: Flag di interruzione ADC Questo bit viene impostato quando una conversione ADC viene completata ei registri dati vengono aggiornati. L'interruzione di conversione ADC completata viene eseguita se il bit ADIE e il bit I in SREG sono impostati. L'ADIF viene cancellato dall'hardware durante l'esecuzione del corrispondente vettore di gestione dell'interruzione. In alternativa, l'ADIF viene cancellato scrivendone uno logico nel flag.

• Bit 3 – ADIE: abilitazione interruzione ADC Quando questo bit viene scritto su uno e il bit I in SREG è impostato, viene attivato l'interruzione completa conversione ADC.

• Bit 2:0 – ADPS2:0: Bit di selezione del prescaler ADC Secondo la scheda tecnica, questo prescalare deve essere impostato in modo che la frequenza di ingresso dell'ADC sia compresa tra 50 KHz e 200 KHz. L'orologio ADC è derivato dall'orologio di sistema con l'aiuto di ADPS2:0 Questi bit determinano il fattore di divisione tra la frequenza XTAL e l'orologio in ingresso all'ADC.

Passaggio 7: se si desidera assumere il valore ADC, è necessario eseguire alcuni lavori elencati di seguito

  • Imposta il valore ADC
  • Configura pin LED di uscita
  • Configura l'hardware dell'ADC
  • Abilita ADC
  • Avvia conversioni da analogico a digitale
  • MENTRE per sempre

SE il valore ADC è più alto del valore impostato, accendi il LED ALTRIMENTI spegni il LED

Passaggio 8: Imposta il valore ADC

Codice: uint8_t ADCValue=128;

Passaggio 9: configurare il pin LED di uscita

Codice: DDRB|= (1 << PB1);

Passaggio 10: configurare l'hardware dell'ADC

Configura l'hardware dell'ADC

Questo viene fatto impostando i bit nei registri di controllo per l'ADC. Innanzitutto, impostiamo il prescalare per l'ADC. Secondo la scheda tecnica, questo prescalare deve essere impostato in modo che la frequenza di ingresso dell'ADC sia compresa tra 50 KHz e 200 KHz. L'orologio ADC è derivato dall'orologio di sistema. Con una frequenza di sistema di 1 MHz, un prescaler di 8 risulterà in una frequenza ADC di 125 Khz. La prescalatura è impostata dai bit ADPS nel registro ADCSRA. Secondo la scheda tecnica, tutti e tre i bit ADPS2:0 devono essere impostati su 011 per ottenere il prescaler 8.

Codice: ADCSRA |= (0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

Quindi, impostiamo la tensione di riferimento dell'ADC. Questo è controllato dai bit REFS nel registro ADMUX. Quanto segue imposta la tensione di riferimento su AVCC.

Codice: ADMUX |= (1 << REFS0);

Per impostare il canale passato attraverso il multiplexer all'ADC, i bit MUX nel registro ADMUX devono essere impostati di conseguenza. Dato che stiamo usando ADC5 qui

Codice: ADMUX&=0xF0; ADMUX|=5;

Per mettere l'ADC in modalità di esecuzione libera, impostare il bit ADFR dal nome appropriato nel registro ADCSRA:

Codice: ADCSRA |= (1 << ADFR);

Verrà effettuata un'ultima modifica alle impostazioni per rendere più semplice la lettura del valore ADC. Sebbene l'ADC abbia una risoluzione di 10 bit, molte informazioni spesso non sono necessarie. Questo valore a 10 bit è suddiviso in due registri a 8 bit, ADCH e ADCL. Per impostazione predefinita, gli 8 bit più bassi del valore ADC si trovano in ADCL, mentre i due più alti sono i due bit più bassi di ADCH. Impostando il bit ADLAR nel registro ADMUX, possiamo allineare a sinistra il valore ADC. Questo mette gli 8 bit più alti della misura nel registro ADCH, con il resto nel registro ADCL. Se poi leggiamo il registro ADCH, otteniamo un valore a 8 bit che rappresenta la nostra misurazione da 0 a 5 volt come un numero da 0 a 255. In pratica stiamo trasformando la nostra misurazione ADC a 10 bit in una a 8 bit. Ecco il codice per impostare il bit ADLAR:

Codice:

ADMUX |= (1 << ADLAR); Ciò completa la configurazione dell'hardware ADC per questo esempio. È necessario impostare altri due bit prima che l'ADC inizi a eseguire le misurazioni.

Passaggio 11: abilita ADC

Per abilitare l'ADC, impostare il bit ADEN in ADCSRA:

Codice: ADCSRA |= (1 << ADEN);

Passaggio 12: Avvia la conversione da analogico a digitale

Per avviare le misurazioni ADC, è necessario impostare il bit ADSC in ADCSRA:

Codice: ADCSRA |= (1 << ADSC);

A questo punto, l'ADC inizierà a campionare continuamente la tensione presentata su ADC5. Il codice fino a questo punto sarebbe simile a questo:

Passaggio 13: MENTRE per sempre

L'unica cosa che resta da fare è testare il valore ADC e impostare i LED per visualizzare un'indicazione alta/bassa. Poiché la lettura dell'ADC in ADCH ha un valore massimo di 255, è stato scelto un valore di prova di th per determinare se la tensione era alta o bassa. Una semplice istruzione IF/ELSE nei cicli FOR ci permetterà di accendere il LED corretto:

Codice

if(ADCH >ValoreADC)

{

PORTAB |= (1 << PB0); // Accendi il LED

}

altro

{

PORTAB&= ~(1 << PB0); // Spegni il LED

}

Passaggio 14: alla fine il codice completo è

Codice:

#includere

int principale (vuoto)

{

uint8_t ADCValue=128;

DDRB |= (1 << PB0); // Imposta LED1 come uscita

ADCSRA |= (0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Imposta ADC prescalare su 8 - // Frequenza di campionamento 125KHz 1MHz

ADMUX |= (1 << REFS0); // Imposta il riferimento ADC su AVCC

ADMUX |= (1 << ADLAR); // Regola il risultato ADC sinistro per consentire una facile lettura a 8 bit

ADMUX&=0xF0;

ADMUX|=5; // I valori MUX dovevano essere modificati per utilizzare ADC0

ADCSRA |= (1 << ADFR); // Imposta l'ADC in modalità di esecuzione libera

ADCSRA |= (1 << ADEN); // Abilita ADC

ADCSRA |= (1 << ADSC); // Avvia le conversioni A2D while(1) // Loop Forever

{

if(ADCH > Valore ADC)

{

PORTAB |= (1 << PB0); // Accende il LED1

}

altro

{

PORTE &= ~(1 << PB1); // Spegni il LED1

}

}

restituisce 0;

}

Prima pubblica questo tutorial Clicca qui

Consigliato: