- Cos'è l'ADC?
- ADC in ARM7-LPC2148
- Pin ADC in ARM7-LPC2148
- Registri ADC in ARM7-LPC2148
- Registrati ADxCR in LPC2148
- ADxGDR: registro dati globale ADC
- Componenti richiesti
- Schema elettrico
- Programmazione ARM7-LPC2148 per ADC
Nel mondo dell'elettronica ci sono molte varietà di sensori analogici sul mercato che vengono utilizzati per misurare temperatura, velocità, spostamento, pressione, ecc. I sensori analogici vengono utilizzati per produrre output che cambiano continuamente nel tempo. Questi segnali provenienti da sensori analogici tendono ad avere un valore molto piccolo da pochi micro-volt (uV) a diversi milli-volt (mV), quindi è necessaria una qualche forma di amplificazione. Per utilizzare questi segnali analogici nel microcontrollore è necessario convertire il segnale analogico in segnale digitale poiché il microcontrollore comprende ed elabora solo segnali digitali. Quindi la maggior parte del microcontrollore ha un'importante funzione incorporata chiamata ADC (convertitore da analogico a digitale). Il nostro microcontrollore ARM7-LPC2148 ha anche una funzione ADC.
In questo tutorial vedremo come utilizzare ADC in ARM7-LPC2148 fornendo una tensione variabile a un pin analogico e visualizzarlo sullo schermo LCD 16x2 dopo la conversione da analogico a digitale. Quindi iniziamo con una breve introduzione su ADC.
Cos'è l'ADC?
Come detto in precedenza, ADC sta per conversione da analogico a digitale e viene utilizzato per convertire i valori analogici dal mondo reale in valori digitali come 1 e 0. Allora quali sono questi valori analogici? Questi sono quelli che vediamo nella nostra vita quotidiana come temperatura, velocità, luminosità ecc. Questi parametri sono misurati come tensioni analogiche dai rispettivi sensori e quindi questi valori analogici vengono convertiti in valori digitali per microcontrollori.
Supponiamo che il nostro intervallo ADC sia compreso tra 0 V e 3,3 V e abbiamo un ADC a 10 bit, ciò significa che la nostra tensione di ingresso 0-3,3 Volt sarà suddivisa in 1024 livelli di valori analogici discreti (2 10 = 1024). Significato 1024 è la risoluzione per un ADC a 10 bit, analogamente per un ADC a 8 bit la risoluzione sarà 512 (28) e per una risoluzione ADC a 16 bit sarà 65.536 (216). LPC2148 ha l'ADC con risoluzione a 10 bit.
Con questo se la tensione di ingresso effettiva è 0 V, l'ADC dell'MCU lo leggerà come 0 e se è 3,3 V l'MCU leggerà 1024 e se è da qualche parte tra come 1,65 V, l'MCU leggerà 512. Possiamo usare quanto segue formule per calcolare il valore digitale che verrà letto dall'MCU in base alla risoluzione dell'ADC e alla tensione di esercizio.
(Risoluzione ADC / Tensione di esercizio) = (Valore digitale ADC / Valore tensione effettiva)
Come per esempio se la tensione di riferimento è 3v:
Abbiamo spiegato in dettaglio ADC nell'articolo precedente.
ADC in ARM7-LPC2148
- L'LPC2148 contiene due convertitori da analogico a digitale.
- Questi convertitori sono convertitori analogico-digitale ad approssimazione successiva a 10 bit.
- Mentre ADC0 ha sei canali, ADC1 ha otto canali.
- Pertanto, il numero totale di ingressi ADC disponibili per LPC2148 è 14.
- Converte la tensione di ingresso solo nell'intervallo (da 0 a 3,3 V). Non deve superare 3,3V la tensione di riferimento. Poiché danneggerà l'IC e fornirà anche valori incerti.
Alcune caratteristiche importanti di ADC in LPC2148
- Ciascun convertitore è in grado di eseguire più di 400000 campioni a 10 bit al secondo.
- Ogni ingresso analogico ha un registro dei risultati dedicato per ridurre l'overhead di interrupt.
- Modalità di conversione Burst per ingressi singoli o multipli.
- Conversione opzionale alla transizione sul pin di ingresso o segnale di corrispondenza del timer.
- Comando di avvio globale per entrambi i convertitori.
Controlla anche come utilizzare ADC in altri microcontrollori:
- Come utilizzare ADC in Arduino Uno?
- Interfacciamento ADC0808 con Microcontrollore 8051
- Utilizzo del modulo ADC del microcontrollore PIC
- Tutorial ADC Raspberry Pi
- Come utilizzare l'ADC in MSP430G2 - Misurazione della tensione analogica
- Come utilizzare ADC in STM32F103C8
Pin ADC in ARM7-LPC2148
Come detto in precedenza, in ARM7-LPC2148 ci sono due canali ADC0 con 6 pin di ingresso analogico e ADC1 con 8 pin di ingresso analogico. Quindi in totale ci sono 14 pin per gli ingressi analogici. Il diagramma seguente mostra i pin disponibili per l'ingresso analogico.
Poiché i pin di ingresso ADC sono multiplexati con altri pin GPIO. Dobbiamo abilitarli configurando il registro PINSEL per selezionare la funzione ADC.
La tabella seguente mostra i pin dell'ADC e il rispettato canale ADC n. In LPC2148. AD0 è il canale 0 e AD1 è il canale 1
Pin LPC2148 |
Canale ADC n |
P0.28 |
AD0.1 |
P0.29 |
AD0.2 |
P0.30 |
AD0.3 |
P0.25 |
AD0.4 |
P0.4 |
AD0.6 |
P0.5 |
AD0.7 |
P0.6 |
AD1.0 |
P0.8 |
AD1.1 |
P0.10 |
AD1.2 |
P0.12 |
AD1.3 |
P0.13 |
AD1.4 |
P0.15 |
AD1.5 |
P0.21 |
AD1.6 |
P0.22 |
AD1.7 |
Registri ADC in ARM7-LPC2148
I registri vengono utilizzati nella programmazione per l'utilizzo della funzione di conversione A / D in LPC2148.
Di seguito è riportato un elenco di registri utilizzati in LPC2148 per la conversione A / D
1. ADCR: registro di controllo da analogico a digitale
Uso: questo registro viene utilizzato per configurare il convertitore A / D in LPC2148
2. ADGDR: Registro dati globali da analogico a digitale
Uso: questo registro ha il bit DONE per il convertitore A / D e il RISULTATO della conversione viene memorizzato qui.
3. ADINTERN: Registro di abilitazione interrupt analogico a digitale
Usa: Questo è un registro Abilita interrupt.
4. ADDR0 - ADDR7: registro dati canale analogico-digitale
Usa: questo registro contiene il valore A / D per i rispettivi canali.
5. ADSTAT: registro di stato da analogico a digitale.
Usa: Questo registro contiene il flag DONE per il rispettivo canale ADC e anche il flag OVERRUN per il rispettivo canale ADC.
In questo tutorial utilizzeremo solo i registri ADCR e ADGDR. Vediamoli in dettaglio
Registrati ADxCR in LPC2148
AD0CR e AD1CR rispettivamente per il canale 0 e il canale 1. È un registro a 32 bit. La tabella sottostante indica i campi di bit per il registro ADCR.
31:28 |
27 |
26:24 |
23:22 |
21 |
20 |
19:17 |
16 |
15: 8 |
7: 0 |
RISERVATO |
BORDO |
INIZIO |
RISERVATO |
PDN |
RISERVATO |
CLKS |
BURST |
CLCKDIV |
SEL |
Vediamo come configurare i singoli registri
1. SEL: i bit da (0 a 7) vengono utilizzati per selezionare il canale per la conversione ADC. Viene assegnato un bit per ogni canale. Ad esempio, impostando il Bit-0, l'ADC farà il campione AD0.1 per la conversione. E l'impostazione del bit -1 renderà AD0.1; allo stesso modo l'impostazione di bit-7 farà la conversione per AD0.7. Il passaggio importante è che abbiamo PINSEL in base alla porta che stiamo utilizzando, ad esempio PINSEL0 per PORT0 in PLC2148.
2. CLCKDIV: I bit da (8 a 15) sono per Clock Divisor. Qui il clock APB (clock ARM Peripheral Bus) è diviso per questo valore più uno per produrre il clock richiesto per il convertitore A / D, che dovrebbe essere inferiore o uguale a 4,5 MHz poiché stiamo usando il metodo di approssimazione successiva in LPC2148.
3. BURST: il bit 16 viene utilizzato per la modalità di conversione BURST.
Impostazione 1: l'ADC eseguirà la conversione per tutti i canali selezionati nei bit SEL.
Impostazione 0: disabiliterà la modalità di conversione BURST.
4. CLCKS: i bit da (17 a 19) tre bit vengono utilizzati per selezionare la risoluzione e il numero di clock per la conversione A / D in modalità burst in quanto è la modalità di conversione A / D continua.
Valore per bit (da 17 a 19) |
Bit (precisione) |
No dell'orologio |
000 |
10 |
11 |
001 |
9 |
10 |
010 |
8 |
9 |
011 |
7 |
8 |
100 |
6 |
7 |
101 |
5 |
6 |
110 |
4 |
5 |
111 |
3 |
4 |
5. PDN: il bit 21 serve per selezionare la modalità di spegnimento dell'ADC in LPC2148.
- A / D è in modalità PDN.
- A / D è in modalità operativa
6. START: i bit da (24 a 26) sono per START. Quando la modalità di conversione BURST è disattivata impostando 0, questi bit START sono utili per quando iniziare la conversione A / D. Lo START viene utilizzato anche per la conversione controllata dal fronte. Questo è quando c'è un ingresso nel pin CAP o MAT di LPC2148 che l'A / D inizia a convertire. Controlliamo la tabella sottostante
Valore per bit (da 24 a 26) |
Pin di LPC2148 |
Funzione di ADC |
000 |
Utilizzato per impostare ADC in modalità PDN Nessun inizio |
|
001 |
Avvia conversione A / D |
|
010 |
CAP0.2 / MAT0.2 |
Avvia la conversione A / D su EDGE selezionato sul pin 27 (ascendente o discendente) sui pin CAP / MAT di LPC2148 |
011 |
CAP0.0 / MAT0.0 |
|
100 |
MAT0.1 |
|
101 |
MAT0.3 |
|
110 |
MAT1.0 |
|
111 |
MAT1.1 |
7. EDGE: il 27 ° bit è per EDGE viene utilizzato solo quando il bit START contiene 010-111. Inizia la conversione quando è presente un input CAP o MAT che puoi vedere nella tabella sopra.
Impostazione : 0 - On Falling Edge
1 - In salita
ADxGDR: registro dati globale ADC
AD0GDR e AD1GDR per il canale ADC 0 e il canale ADC 1 rispettivamente.
È un registro a 32 bit che contiene il RISULTATO della conversione A / D e anche il bit DONE che indica che la conversione A / D è stata eseguita. La tabella sottostante indica i campi di bit per il registro ADGDR.
31 |
30 |
29:27 |
26:24 |
23:16 |
15: 6 |
5: 0 |
FATTO |
OVERRUN |
RISERVATO |
CHN |
RISERVATO |
RISULTATO |
RISERVATO |
1. RISULTATO: Questi bit (da 6 a 15) contengono il risultato della conversione A / D per il canale selezionato nel registro ADCR SEL. Il valore viene letto solo dopo che la conversione A / D è stata completata e ciò è indicato dal bit DONE.
ESEMPIO: per un risultato ADC a 10 bit il valore memorizzato varia da (0 a 1023).
2. CANALE: questi bit da 24 a 26 contengono il numero di canale per il quale viene eseguita la conversione A / D. Il valore digitale convertito è presente nel bit RISULTATO.
ESEMPIO: 000 è per il canale 0 dell'ADC e 001 è per il canale 1 dell'ADC, ecc
3. OVERRUN: il 30 ° bit per OVERRUN viene utilizzato in modalità BURST. Quando si imposta 1, il valore ADC convertito precedente viene sovrascritto dal valore ADC appena convertito. Quando il registro viene letto, cancella il bit OVERRUN.
4. FATTO: il 31esimo bit è per il bit FATTO.
Set 1: quando la conversione A / D è completata.
Set 0: quando il registro viene letto e ADCR scritto.
Abbiamo visto gli importanti registri utilizzati in ADC in LPC2148. Ora iniziamo a utilizzare ADC in ARM7.
Componenti richiesti
Hardware
- Microcontrollore ARM7-LPC2148
- Regolatore di tensione 3.3V IC
- Regolatore di tensione 5V IC
- Potenziometro 10K - 2 n
- LED (qualsiasi colore)
- Display LCD (16X2)
- Batteria da 9V
- Breadboard
- Collegamento dei cavi
Software
- Keil uVision5
- Strumento Flash magico
Schema elettrico
La tabella seguente mostra le connessioni del circuito tra LCD e ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (selezione registro) |
P0.6 |
E (Abilita) |
P0.12 |
D4 (Data pin 4) |
P0.13 |
D5 (Data pin 5) |
P0.14 |
D6 (Data pin 6) |
P0.15 |
D7 (Data pin 7) |
Ulteriori informazioni sull'utilizzo dell'LCD con ARM 7 - LPC2148.
IMPORTANTE: qui stiamo usando due circuiti integrati del regolatore di tensione uno per il display LCD da 5 V e un altro da 3,3 V per l'ingresso analogico che può essere variato dal potenziometro.
Connessioni tra regolatore di tensione 5V con LCD e stick ARM7
Regolatore di tensione 5V IC |
Funzione pin |
LCD e ARM-7 LPC2148 |
1. Perno sinistro |
+ Ve da batteria 9V Input |
NC |
2.Pin centrale |
- Ve da batteria |
VSS, R / W, K di LCD GND di ARM7 |
3.Pin destro |
Uscita + 5V regolata |
VDD, A di LCD + 5V di ARM7 |
Potenziometro con LCD
Un potenziometro viene utilizzato per variare il contrasto del display LCD. Un pot ha tre pin, il pin sinistro (1) è collegato a + 5V e il centro (2) a VEE o V0 del modulo LCD e il pin destro (3) è collegato a GND. Possiamo regolare il contrasto ruotando la manopola.
Collegamento tra LPC2148 e potenziometro con regolatore di tensione 3,3 V.
3.3V regolatore di tensione IC |
Funzione pin |
ARM-7 LPC2148 |
1. Perno sinistro |
- Ve da batteria |
Pin GND |
2.Pin centrale |
Uscita + 3,3 V regolata |
All'ingresso del potenziometro e all'uscita del potenziometro su P0.28 |
3.Pin destro |
+ Ve da batteria 9V Input |
NC |
Programmazione ARM7-LPC2148 per ADC
Per programmare ARM7-LPC2148 abbiamo bisogno dello strumento keil uVision e Flash Magic. Stiamo utilizzando il cavo USB per programmare ARM7 Stick tramite la porta micro USB. Scriviamo il codice usando Keil e creiamo un file esadecimale, quindi il file HEX viene aggiornato su ARM7 stick usando Flash Magic. Per saperne di più sull'installazione di keil uVision e Flash Magic e su come usarli, segui il link Primi passi con il microcontrollore ARM7 LPC2148 e programmalo usando Keil uVision.
In questo tutorial convertiamo la tensione di ingresso analogico (da 0 a 3,3 V) in valore digitale utilizzando l'ADC in LPC2148 e visualizziamo la tensione analogica sul display LCD (16x2). Verrà utilizzato un potenziometro per variare la tensione analogica in ingresso.
Per saperne di più sull'interfacciamento dell'LCD con la modalità a 4 bit ARM7-LPC2148 segui questo link.
Il codice completo per l'utilizzo di ADC con ARM 7 è fornito alla fine di questo tutorial, qui ne spieghiamo alcune parti.
Fasi coinvolte nella programmazione LPC2148-ADC
1. Il registro PINSEL viene utilizzato per selezionare il pin della porta di LPC2148 e la funzione ADC come ingresso analogico.
PINSEL1 = 0x01000000; // Seleziona P0.28 come AD0.1
2. Selezionare il clock e la precisione in bit per la conversione scrivendo il valore nell'ADxCR (registro di controllo ADC).
AD0CR = 0x00200402; // Imposta il funzionamento dell'ADC come 10 bit / 11 CLK per la conversione (000)
3. Avviare la conversione scrivendo il valore nei bit START in ADxCR.
Qui ho scritto al 24 ° bit del registro AD0CR.
AD0CR = AD0CR - (1 << 24);
4. Ora dobbiamo controllare il bit DONE (31 °) del corrispondente ADxDRy (registro dati ADC) poiché cambia da 0 a 1. Quindi usiamo il ciclo while per controllare costantemente se la conversione viene eseguita sul 31 ° bit del registro dati.
while (! (AD0DR1 & 0x80000000));
5. Dopo che il bit di fine è stato impostato su 1, la conversione ha esito positivo, quindi leggiamo il risultato dallo stesso registro dati ADC AD0DR1 e memorizziamo il valore in una variabile.
adcvalue = AD0DR1;
Successivamente utilizziamo una formula per convertire il valore digitale in tensione e memorizzarlo in una variabile denominata tensione .
voltaggio = ((adcvalue / 1023.0) * 3.3);
5. Le seguenti righe vengono utilizzate per visualizzare i valori digitali (da 0 a 1023) dopo la conversione da analogico a digitale.
adc = adcvalue; sprintf (displayadc, "adcvalue =% f", adc); LCD_DISPLAY (displayadc); // Visualizza il valore ADC (da 0 a 1023)
6. Le seguenti righe vengono utilizzate per visualizzare la tensione analogica in ingresso (da 0 a 3,3 V) dopo la conversione da analogico a digitale e dopo il passaggio 5.
LCD_SEND (0xC0); sprintf (voltvalue, "Voltage =%. 2f V", voltage); LCD_DISPLAY (voltvalue); // Display (tensione analogica in ingresso)
7. Ora dobbiamo visualizzare la tensione di ingresso ei valori digitali sul display LCD. Prima di ciò dobbiamo inizializzare il display LCD e utilizzare i comandi appropriati per inviare il messaggio al display.
Il codice seguente viene utilizzato per inizializzare il display LCD
void LCD_INITILIZE (void) // Funzione per preparare l'LCD { IO0DIR = 0x0000FFF0; // Imposta il pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 come OUTPUT delay_ms (20); LCD_SEND (0x02); // Inizializza lcd in modalità operativa a 4 bit LCD_SEND (0x28); // 2 righe (16X2) LCD_SEND (0x0C); // Visualizza sul cursore spento LCD_SEND (0x06); // Incremento automatico del cursore LCD_SEND (0x01); // Visualizza LCD_SEND chiaro (0x80); // Prima riga prima posizione }
Il codice seguente viene utilizzato per visualizzare i valori sul display LCD
LCD_DISPLAY void (char * msg) // funzione per stampare i caratteri inviati uno ad uno { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Invia il nibble superiore IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH per stampare i dati IO0CLR = 0x00000020; // RW LOW Modalità di scrittura delay_ms (2); IO0CLR = 0x00000040; // EN = 0, RS e RW invariati (cioè RS = 1, RW = 0) delay_ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Invia il nibble inferiore IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; delay_ms (2); IO0CLR = 0x00000040; delay_ms (5); i ++; } }
La funzione sottostante viene utilizzata per creare un ritardo
void delay_ms (uint16_t j) // Funzione per creare un ritardo in millisecondi { uint16_t x, i; per (i = 0; i
Di seguito viene fornito il codice completo con il video dimostrativo.