- Ce este ADC?
- ADC în ARM7-LPC2148
- Pinii ADC din ARM7-LPC2148
- Registrele ADC în ARM7-LPC2148
- Înregistrare ADxCR în LPC2148
- ADxGDR: Registrul de date globale ADC
- Componente necesare
- Diagrama circuitului
- Programare ARM7-LPC2148 pentru ADC
În lumea electronică există pe piață multe varietăți de senzori analogici care sunt folosiți pentru a măsura temperatura, viteza, deplasarea, presiunea etc. Senzorii analogici sunt utilizați pentru a produce ieșiri care se schimbă continuu în timp. Aceste semnale de la senzorii analogici tind să aibă o valoare foarte mică de la câteva micro-volți (uV) la mai mulți mili-volți (mV), deci este necesară o formă de amplificare. Pentru utilizarea acestor semnale analogice în microcontroler, trebuie să convertim semnalul analogic în semnal digital, deoarece microcontrolerul înțelege și procesează doar semnale digitale. Deci, majoritatea microcontrolerului are o caracteristică importantă încorporată numită ADC (convertor analogic digital). Microcontrolerul nostru ARM7-LPC2148 are, de asemenea, o caracteristică ADC.
În acest tutorial vom vedea cum se utilizează ADC în ARM7-LPC2148 prin furnizarea unei tensiuni variabile unui pin analog și afișarea acestuia pe ecranul LCD de 16x2 după conversia analogică la digitală. Deci, să începem cu o scurtă introducere despre ADC.
Ce este ADC?
Așa cum am spus mai devreme, ADC reprezintă conversia analogică la digitală și este utilizată pentru a converti valorile analogice din lumea reală în valori digitale, cum ar fi 1 și 0. Deci, care sunt aceste valori analogice? Acestea sunt cele pe care le vedem în viața noastră de zi cu zi, cum ar fi temperatura, viteza, luminozitatea etc. Acești parametri sunt măsurați ca tensiuni analogice de către senzorii respectivi și apoi aceste valori analogice sunt convertite în valori digitale pentru microcontrolere.
Să presupunem că gama noastră ADC este de la 0V la 3,3V și avem un ADC de 10 biți, ceea ce înseamnă că tensiunea de intrare 0-3,3 volți va fi împărțită în 1024 nivele de valori analogice discrete (2 10 = 1024). Adică 1024 este rezoluția pentru un ADC pe 10 biți, în mod similar pentru o rezoluție ADC pe 8 biți va fi 512 (28), iar pentru o rezoluție ADC pe 16 biți va fi 65.536 (216). LPC2148 are ADC cu rezoluție de 10 biți.
Cu aceasta, dacă tensiunea de intrare reală este de 0V, atunci ADC-ul MCU-ului îl va citi ca 0 și dacă este de 3,3V, MCU va citi 1024 și dacă este undeva între 1,65v, atunci MCU va citi 512. Putem folosi cele de mai jos formule pentru a calcula valoarea digitală care va fi citită de MCU pe baza rezoluției ADC și a tensiunii de funcționare.
(Rezoluție ADC / Tensiune de funcționare) = (Valoare digitală ADC / Valoare tensiune reală)
De exemplu, dacă tensiunea de referință este 3v:
Am explicat ADC în detaliu în articolul anterior.
ADC în ARM7-LPC2148
- LPC2148 conține două convertoare analog-digitale.
- Acești convertoare sunt convertoare analogice analogice la digitale pe 10 biți succesivi.
- În timp ce ADC0 are șase canale, ADC1 are opt canale.
- Prin urmare, numărul total de intrări ADC disponibile pentru LPC2148 este 14.
- Convertește tensiunea de intrare numai în intervalul (0 la 3,3V). Nu trebuie să depășească 3,3V referința la tensiune. Deoarece va deteriora CI și va oferi, de asemenea, valori incerte.
Unele caracteristici importante ale ADC în LPC2148
- Fiecare convertor capabil să efectueze peste 400000 de probe de 10 biți pe secundă.
- Fiecare intrare analogică are un registru de rezultate dedicat pentru a reduce întreruperile.
- Mod de conversie rafală pentru intrări simple sau multiple.
- Conversie opțională la tranziție pe pinul de intrare sau semnalul de potrivire cu temporizator.
- Comandă Global Start pentru ambii convertoare.
De asemenea, verificați cum să utilizați ADC în alte microcontrolere:
- Cum se utilizează ADC în Arduino Uno?
- Interfațarea ADC0808 cu microcontrolerul 8051
- Utilizarea modulului ADC al microcontrolerului PIC
- Tutorial ADC Raspberry Pi
- Cum se utilizează ADC în MSP430G2 - Măsurarea tensiunii analogice
- Cum se utilizează ADC în STM32F103C8
Pinii ADC din ARM7-LPC2148
După cum am spus Earliar, în ARM7-LPC2148 există două canale ADC0 cu 6 pini de intrare analogici și ADC1 cu 8 pini de intrare analogici. Deci, în total, există 14 pini pentru intrări analogice. Diagrama de mai jos prezintă pinii care sunt disponibili pentru intrarea analogică.
Deoarece pinii de intrare ADC sunt multiplexați cu alți pinii GPIO. Trebuie să le activăm configurând registrul PINSEL pentru a selecta funcția ADC.
Tabelul de mai jos prezintă pinii ADC și numărul canalului ADC respectat în LPC2148. AD0 este canalul 0 și AD1 este canalul 1
LPC2148 Pin |
Canal ADC nr |
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 |
Registrele ADC în ARM7-LPC2148
Registrele sunt utilizate în programare pentru utilizarea funcției de conversie A / D în LPC2148.
Mai jos este o listă a registrelor utilizate în LPC2148 pentru conversia A / D
1. ADCR: Analog la Registrul de control digital
Utilizare: Acest registru este utilizat pentru configurarea convertorului A / D în LPC2148
2. ADGDR: Analog la Digital Global Data Register
Utilizare: Acest registru are bit DONE pentru convertorul A / D, iar REZULTATUL conversiei este stocat aici.
3. ADINTERN: Registru de activare a întreruperii analogice la digitale
Utilizare: Acesta este un registru de activare a întreruperii.
4. ADDR0 - ADDR7: Analog la registrul de date al canalului digital
Utilizare: Acest registru conține valoarea A / D pentru canalele respective.
5. ADSTAT: Analog la Registrul de stare digitală.
Utilizare: Acest registru conține steagul DONE pentru canalul ADC respectiv și, de asemenea, steagul OVERRUN pentru canalul ADC respectiv.
În acest tutorial vom folosi numai registre ADCR și ADGDR. Să vedem despre ele în detaliu
Înregistrare ADxCR în LPC2148
AD0CR și AD1CR pentru canalul 0 și respectiv canalul 1. Este un registru pe 32 de biți. Tabelul de mai jos indică câmpurile de biți pentru registrul ADCR.
31:28 |
27 |
26:24 |
23:22 |
21 |
20 |
19:17 |
16 |
15: 8 |
7: 0 |
REZERVAT |
MARGINE |
START |
REZERVAT |
PDN |
REZERVAT |
CLKS |
IZBUCNI |
CLCKDIV |
SEL |
Să vedem despre cum să configurați registrele individuale
1. SEL: Biții de la (0 la 7) sunt utilizați pentru a selecta canalul pentru conversia ADC. Un bit este alocat pentru fiecare canal. De exemplu, setarea Bit-0 va face ca ADC să probeze AD0.1 pentru conversie. Și setarea bitului -1 va face AD0.1; setarea similară a bit-7 va face conversia pentru AD0.7. Pasul important este că avem PINSEL în funcție de portul pe care îl folosim, de exemplu PINSEL0 pentru PORT0 în PLC2148.
2. CLCKDIV: biții de la (8 la 15) sunt pentru divizorul de ceas. Aici ceasul APB (ARM Peripheral Bus clock) este împărțit la această valoare plus una pentru a produce ceasul necesar pentru convertorul A / D, care ar trebui să fie mai mic sau egal cu 4,5 MHz, deoarece folosim metoda de aproximare succesivă în LPC2148.
3. BURST: Bitul 16 este utilizat pentru modul de conversie BURST.
Setarea 1: ADC va face conversia pentru toate canalele selectate în biți SEL.
Setarea 0: va dezactiva modul de conversie BURST.
4. CLCKS: biții de la (17 la 19) trei biți sunt utilizați pentru selectarea rezoluției și a numărului de ceasuri pentru conversia A / D în modul rafală, deoarece este modul de conversie continuă A / D.
Valoare pentru biți (17-19) |
Biți (acuratețe) |
Nu de Ceas |
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: Bitul 21 este pentru selectarea Modului de oprire a ADC în LPC2148.
- A / D este în modul PDN.
- A / D este în modul operațional
6. START: biții de la (24 la 26) sunt pentru START. Când modul de conversie BURST este OPRIT prin setarea 0, acești biți START sunt utili pentru a începe conversia A / D. START este utilizat și pentru conversia controlată de margine. Atunci când există o intrare în pinul CAP sau MAT al LPC2148, A / D începe să convertească. Să verificăm tabelul de mai jos
Valoare pentru biți (24 - 26) |
Pinii LPC2148 |
Funcția ADC |
000 |
Folosit pentru a seta ADC în modul PDN Fără Start |
|
001 |
Porniți conversia A / D |
|
010 |
CAP0.2 / MAT0.2 |
Porniți conversia A / D pe EDGE selectat pe pinul 27 (în creștere sau în scădere) pe pinii CAP / MAT ai LPC2148 |
011 |
CAP0.0 / MAT0.0 |
|
100 |
MAT0.1 |
|
101 |
MAT0.3 |
|
110 |
MAT1.0 |
|
111 |
MAT1.1 |
7. EDGE: Cel de-al 27- lea bit este pentru EDGE este utilizat numai atunci când bitul START conține 010-111. Începe conversia atunci când există o intrare CAP sau MAT pe care o puteți vedea în tabelul de mai sus.
Setare : 0 - Pe Falling Edge
1 - Pe Rising Edge
ADxGDR: Registrul de date globale ADC
AD0GDR și AD1GDR pentru canalul ADC 0 și respectiv canalul 1 ADC.
Este un registru pe 32 de biți care conține REZULTATUL conversiei A / D și, de asemenea, bitul DONE care indică faptul că a fost efectuată conversia A / D. Tabelul de mai jos indică câmpurile de biți pentru registrul ADGDR.
31 |
30 |
29:27 |
26:24 |
23:16 |
15: 6 |
5: 0 |
TERMINAT |
TRECERE |
REZERVAT |
CHN |
REZERVAT |
REZULTAT |
REZERVAT |
1. REZULTAT: Acești biți (6 la 15) conțin rezultatul conversiei A / D pentru canalul selectat în registrul ADCR SEL. Valoarea este citită numai după finalizarea conversiei A / D și acest lucru este indicat de bitul DONE.
EXEMPLU: Pentru un rezultat ADC de 10 biți, valoarea stocată variază de la (0 la 1023).
2. CANAL: Acești biți 24-26 conțin numărul canalului pentru care se face conversia A / D. Valoarea digitală convertită este prezentă în bitul REZULTAT.
EXEMPLU: 000 este pentru canalul ADC 0 și 001 este pentru canalul ADC 1 etc.
3. OVERRUN: de 30 - lea bit pentru RATATĂ este utilizat în modul burst. Când este setat 1, valoarea ADC convertită anterior este suprascrisă de valoarea ADC nou convertită. Când se citește registrul, șterge bitul OVERRUN.
4. Efectuat: bitul 31 este pentru bit Efectuat.
Setul 1: Când conversia A / D este finalizată.
Set 0: Când registrul este citit și ADCR scris.
Am văzut despre registrele importante care sunt utilizate în ADC în LPC2148. Acum, să începem să folosim ADC în ARM7.
Componente necesare
Hardware
- Microcontroler ARM7-LPC2148
- Regulator de tensiune 3.3V IC
- Regulator de tensiune 5V IC
- Potențiometru 10K - 2 Nr
- LED (orice culoare)
- Afișaj LCD (16X2)
- Baterie de 9V
- Breadboard
- Conectarea firelor
Software
- Keil uVision5
- Instrumentul Flash Magic
Diagrama circuitului
Tabelul de mai jos prezintă conexiunile de circuit între LCD și ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Selectare înregistrare) |
P0.6 |
E (Activare) |
P0.12 |
D4 (pinul de date 4) |
P0.13 |
D5 (pinul de date 5) |
P0.14 |
D6 (pinul 6) |
P0.15 |
D7 (pinul de date 7) |
Aflați mai multe despre utilizarea ecranului LCD cu ARM 7 - LPC2148.
IMPORTANT: Aici utilizăm două circuite integrate cu regulator de tensiune, unul pentru afișajul LCD de 5V și altul de 3,3V pentru intrarea analogică care poate fi variată prin potențiometru.
Conexiuni între regulatorul de tensiune 5V cu stick LCD și ARM7
IC regulator de tensiune 5V |
Funcția Pin |
LCD și ARM-7 LPC2148 |
1. Pin stânga |
+ Ve de la baterie Intrare 9V |
NC |
2. Centrul Pin |
- Vine de la baterie |
VSS, R / W, K de LCD GND din ARM7 |
3. Pinul drept |
Ieșire reglementată + 5V |
VDD, un ecran LCD + 5V din ARM7 |
Potențiometru cu LCD
Un potențiometru este utilizat pentru a varia contrastul afișajului LCD. Un pot are trei pini, pinul stâng (1) este conectat la + 5V și centrul (2) la VEE sau V0 al modulului LCD, iar pinul drept (3) este conectat la GND. Putem regla contrastul rotind butonul.
Conexiune între LPC2148 și potențiometru cu regulator de tensiune de 3,3V
CI regulator de tensiune 3.3V |
Funcția Pin |
ARM-7 LPC2148 |
1. Pin stânga |
- Vine de la baterie |
Pinul GND |
2. Centrul Pin |
Ieșire reglementată + 3.3V |
Pentru intrarea potențiometrului și ieșirea potențiometrului la P0.28 |
3. Pinul drept |
+ Ve de la baterie Intrare 9V |
NC |
Programare ARM7-LPC2148 pentru ADC
Pentru a programa ARM7-LPC2148 avem nevoie de instrumentul keil uVision și Flash Magic. Folosim cablul USB pentru a programa Stick ARM7 prin port micro USB. Scriem cod folosind Keil și creăm un fișier hexagonal și apoi fișierul HEX este afișat pe stick-ul ARM7 folosind Flash Magic. Pentru a afla mai multe despre instalarea keil uVision și Flash Magic și despre modul de utilizare, urmați linkul Noțiuni introductive despre microcontrolerul ARM7 LPC2148 și programați-l folosind Keil uVision.
În acest tutorial convertim tensiunea de intrare analogică (0 până la 3,3V) în valoare digitală utilizând ADC în LPC2148 și afișăm tensiunea analogică pe afișajul LCD (16x2). Se va utiliza un potențiometru pentru a varia tensiunea analogică de intrare.
Pentru a afla mai multe despre interfața LCD cu modul ARM7-LPC2148 pe 4 biți, urmați acest link.
Codul complet pentru utilizarea ADC cu ARM 7 este dată la sfârșitul acestui tutorial, aici ne explica câteva părți din ea.
Pași implicați în programarea LPC2148-ADC
1. Registrul PINSEL este utilizat pentru a selecta pinul portului LPC2148 și funcția ADC ca intrare analogică.
PINSEL1 = 0x01000000; // Selectați P0.28 ca AD0.1
2. Selectați acuratețea ceasului și a bitului pentru conversie scriind valoarea în ADxCR (registrul de control ADC).
AD0CR = 0x00200402; // Setează funcționarea ADC ca 10 biți / 11 CLK pentru conversie (000)
3. Porniți conversia scriind valoarea în biții START în ADxCR.
Aici am scris 24 de mii de biți de registru AD0CR.
AD0CR = AD0CR - (1 << 24);
4. Acum trebuie să verificăm bitul DONE (31) al ADxDRy corespunzător (registrul de date ADC), deoarece se schimbă de la 0 la 1. Deci, folosim bucla while pentru a verifica în mod constant dacă conversia se face pe bitul 31 de registru de date.
while (! (AD0DR1 & 0x80000000));
5. După ce bitul terminat este setat la 1, conversia are succes, apoi citim rezultatul din același registru de date ADC AD0DR1 și stocăm valoarea într-o variabilă.
adcvalue = AD0DR1;
Apoi folosim o formulă pentru a converti valoarea digitală în tensiune și a stoca într-o variabilă numită tensiune .
tensiune = ((adcvalue / 1023.0) * 3.3);
5. Următoarele linii sunt utilizate pentru a afișa valorile digitale (de la 0 la 1023) după conversia analogică la cea digitală.
adc = adcvalue; sprintf (displayadc, "adcvalue =% f", adc); LCD_DISPLAY (displayadc); // Afișați valoarea ADC (0-1023)
6. Următoarele linii sunt utilizate pentru a afișa tensiunea analogică de intrare (0 la 3,3 V) după conversia analogică la digitală și după pasul 5.
LCD_SEND (0xC0); sprintf (tensiune, "Voltage =%. 2f V", tensiune); LCD_DISPLAY (voltvalue); // Afișaj (tensiune analogică de intrare)
7. Acum trebuie să afișăm tensiunea de intrare și valorile digitale pe ecranul LCD. Înainte de aceasta, trebuie să inițializăm afișajul LCD și să folosim comenzile corespunzătoare pentru trimiterea mesajului pe ecran.
Codul de mai jos este utilizat pentru a inițializa ecranul LCD
void LCD_INITILIZE (void) // Funcție pentru a pregăti ecranul LCD { IO0DIR = 0x0000FFF0; // Setează pinul P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 ca OUTPUT delay_ms (20); LCD_SEND (0x02); // Inițializați lcd în modul de operare pe 4 biți LCD_SEND (0x28); // 2 linii (16X2) LCD_SEND (0x0C); // Afișare pe cursor dezactivat LCD_SEND (0x06); // Cursor auto increment LCD_SEND (0x01); // Afișează LCD_SEND clar (0x80); // Prima linie prima poziție }
Codul de mai jos este utilizat pentru a afișa valorile pe ecranul LCD
LCD_DISPLAY void (char * msg) // Functia pentru a imprima caracterele trimise unul câte unul { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Trimite nibble superior IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH pentru a imprima date IO0CLR = 0x00000020; // Mod scriere RW LOW delay_ms (2); IO0CLR = 0x00000040; // EN = 0, RS și RW neschimbate (adică RS = 1, RW = 0) delay_ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Trimite nibble inferior IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; delay_ms (2); IO0CLR = 0x00000040; delay_ms (5); i ++; } }
Funcția de mai jos este utilizată pentru a crea întârziere
void delay_ms (uint16_t j) // Funcție pentru întârzierea în milisecunde { uint16_t x, i; pentru (i = 0; i
Codul complet cu demonstrația video este dat mai jos.