Conţinut
- Cum să dați intrare ADC
- Eșantionarea unui semnal DC
- Eșantionarea unui semnal de curent alternativ cu ADC
- Testarea ADC
- Cod Exemplu ADC pentru dsPic
- Configurarea modulului ADC
- 1. Setați portul ca intrare și în modul analogic
- 2. Selectați Intrări analogice pentru eșantionare
- 3. Selectați referința la tensiune
- 4. Selectați Formatul de ieșire al datelor
- 5. Selectați Sursa declanșatorului de conversie
- 6. Selectați modul de eșantionare
- 7. Selectați Ceasul de conversie
- 8. Decideți dacă eșantionarea simultană este necesară sau nu (opțional)
- 9. Selectați sursa ceasului de conversie (opțional)
- 10. Determinați dacă este necesară scanarea intrării (opțional)
- ADC se întrerupe în dspic30f și dspic33f
- Cod de întrerupere pentru ADC-uri în dspic30f și dspic33f
Autorul și-a finalizat proiectul de inginerie din ultimul an cu microcontrolerele dsPic, obținând o perspectivă extinsă asupra acestor dispozitive.
Dispozitivele dsPic oferă un modul puternic ADC (analogic la convertizor digital) care poate preleva probe la viteze de până la 1 msps. Poate fi utilizat într-o varietate de moduri și moduri diferite pentru a se potrivi nevoilor proiectului dumneavoastră.
Acest tutorial are ca scop predarea elementelor de bază ale modulelor de conversie A / D către toți cei care își încep proiectele cu dsPics.
Cum să dați intrare ADC
Primul pas este să configurați hardware-ul necesar pentru a da intrare ADC-ului.
Eșantionarea unui semnal DC
Pentru testarea inițială, puteți utiliza un potențiometru conectat la o sursă de 5 V și puteți da direct intrarea pinilor analogici ADC.
Eșantionarea unui semnal de curent alternativ cu ADC
Pentru a testa un semnal de curent alternativ (tensiuni sau curenți de linie), va trebui să:
- Reduceți semnalul la nivelul de tensiune necesar cu ajutorul transformatoarelor.
- Schimbați nivelul semnalului astfel încât valorile negative sub zero să fie deplasate în sus. ADC-urile din Pics nu sunt capabile să probeze semnale negative.
Acest proiect de circuit de referință vă poate ajuta cu circuitele de schimbare a nivelului:
Testarea ADC
După configurarea codului și hardware-ului necesar, trebuie să existe o modalitate de a testa dacă ADC eșantionează corect în modul solicitat sau nu. Deoarece nu puteți arunca o privire în MCU pentru a vedea dacă totul merge corect, vă sugerez două moduri:
- Puteți conecta un depanator la Pic, precum cel din imaginea de mai sus. În modul de depanare, puteți verifica valoarea din registrele ADCBUF0 până la 10 pentru a vedea dacă acestea sunt încărcate cu valori eșantionate corect.
- Puteți trimite valorile ADCBUF să înregistrați UART în detaliu și să le monitorizați pe un PC cu ajutorul monitorului serial.
Cod Exemplu ADC pentru dsPic
#include "xc.h" #define FCY 20000000 #define FPWM 3600 #include xc.h> #include stdio.h> #include delay.h> #include libpic30.h> #include dsp.h> #include math.h > _FOSC (CSW_FSCM_OFF & XT_PLL8); // Oscilator extern, PLLx8 _FWDT (WDT_OFF); // Cronometru câine de supraveghere dezactivat _FBORPOR (MCLR_DIS); // Dezactivați resetarea ADCValue; void init_ADC (void) {TRISB = 0xFFFF; // Setați ca port de intrare ADPCFG = 0x0000; // Selectarea tuturor pinilor analogici în modul analog ADCHSbits.CH0SA = 1; ADCHSbits.CH0NA = 0; //ADCHSbits.CH123SA = 0; //ADCHSbits.CH123NA = 0; IEC0bits.ADIE = 1; // Activați întreruperea ADC IPC2bits.ADIP = 1; // set interrupt priorty-6 ADCSSLbits.CSSL0 = 0; // Omiteți scanarea de intrare pentru pinul analog AN0, AN1, AN2 ADCSSLbits.CSSL1 = 0; ADCSSLbits.CSSL2 = 0; ADCON3bits.SAMC = 0; // Timp de eșantionare automată 6TAD // timpul maxim de eșantionare ADCON3bits.ADRC = 0; // selectarea sursei de ceas de conversie derivată din ceasul sistemului ADCON3bits.ADCS = 9; // Selectarea ceasului de conversie 6Tcy ADCON1bits.ADSIDL = 0; // Selectarea funcționării modului continuu în modul inactiv ADCON1bits.FORM = 1; // Selectarea ieșirii datelor în format întreg semnat ADCON1bits.SSRC = 0; // Selectarea intervalului de control al motorului PWM încheie eșantionarea și începe conversia ADCON1bits.SIMSAM = 0; // Mostre CH0, CH1, CH2, CH3 simultan ADCON1bits.ASAM = 0; // Selectarea eșantionării începe imediat după finalizarea ultimei conversii. Bitul SAMP este setat automat ADCON1bits.SAMP = 0; // Cel puțin un amplificator de probă / reținere A / D eșantionează ADCON2bits.VCFG = 0; // Biti de configurare referință tensiune ADCON2bits.CSCNA = 0; // Dezactivați scanarea de intrare ADCON2bits.CHPS = 0; // Selectarea canalului de conversie CH0 ADCON2bits.SMPI = 0; // Selectarea unui eșantion de conversie pe întrerupere ADCON2bits.ALTS = 0; // Folosește setările multiplexorului de intrare MUX A ADCON2bits.BUFM = 0; // Buffer configurat ca un buffer de 16 cuvinte ADCBUF (15 ... 0) ADCON1bits.ADON = 1; // Convertorul A / D este PORNIT} void readADC () {//ADCON1bits.SAMP = 1; // începe eșantionarea, urmează conversia automată // __ delay_ms (100); ADCON1bits.SAMP = 0; // începe eșantionarea, va urma conversia automată în timp ce (! ADCON1bits.DONE); // așteptați pentru a finaliza conversia ADCValue = ADCBUF0; // citiți rezultatul conversiei} void main (void) {init_ADC (); date int; while (1) {readADC (); date = ADCValue; }}
Configurarea modulului ADC
Modulul ADC poate fi inițializat și configurat cu ajutorul codului dat mai sus. Urmează un ghid pas cu pas.
Pașii de la 1 la 7 sunt esențiali. După 7, oricare sau toate pot fi omise.
1. Setați portul ca intrare și în modul analogic
- Portul B, pe care sunt prezenți pinii de intrare ADC, trebuie setat ca port de intrare. (linia - 21).
- Acestea trebuie setate în modul de intrare analogică de către registrul ADPCFG. (linia - 22).
2. Selectați Intrări analogice pentru eșantionare
Intrările analogice trebuie conectate la un „canal ADC” pentru eșantionare. De obicei există mai multe intrări analogice decât canale; de exemplu, dsPic30f4011 are 09 intrări analogice, dar numai 04 canale ADC. Prin urmare, trebuie să selectați acum pinul de intrare analogic conectat la canalul ADC. Acest lucru se face cu ajutorul registrului ADCHS.
- Aici AN1 este selectat ca intrare pin analogic la canalul 0. (linia - 2).
- Numărul de canale determină numărul de probe simultane posibile.
- Controlerul poate preleva probe alternativ între Mux A și Mux B.
Configurări posibile ale ADCHS | Configurarea pinului de intrare Analouge rezultată | Linie de cod |
---|---|---|
Canalul 0 -> Mux A | Orice pin anlouge de la AN0 - AN8 poate fi selectat pentru a da intrare canalului 0 prin Mux A. | ADCHSbits.CH0SA = 1; sau orice alt număr în funcție de pin |
Canalele 1, 2 și 3 -> Mux A | Intrarea canalului 1 este AN3, canalul 2 -> AN4, canalul 3 -> AN5 | ADCHSbits.CH123SA = 1; |
Canalul 0 -> Mux B. | Orice pin anlouge de la AN0 - AN8 poate fi selectat pentru a da intrare canalului 0 prin Mux B | ADCHSbits.CH0SB = 1; sau orice alt număr în funcție de pin |
Canalele 1, 2 și 3 -> Mux B. | Intrarea canalului 1 este AN3, canalul 2 -> AN4, canalul 3 -> AN5 | ADCHSbits.CH123SB = 1; |
3. Selectați referința la tensiune
Trebuie selectată o referință de tensiune pentru a se potrivi cu domeniul de intrare al intrărilor analogice. Există două opțiuni pentru aceasta:
- Vcc și Gnd pot fi făcute limite de referință superioare și inferioare.
- O tensiune de referință externă poate fi aplicată pe pinul AVref.
Acest lucru se face cu ajutorul bitului VCFG din registrul ADCON2. (linia - 47)
VCFG | Vref (mai mare) | Vref (inferior) |
---|---|---|
0 | AVdd | AVss |
1 | Vref + extern | AVss |
2 | AVdd | Vref extern - |
3 | Vref + extern | Vref extern - |
4. Selectați Formatul de ieșire al datelor
Formatul de ieșire al datelor eșantionate prin ADC poate fi de asemenea specificat cu ajutorul bitului FORM în registrul ADCON1, conform tabelului de mai jos:
FORMĂ | Format ieșire date |
---|---|
0 | întreg |
1 | număr întreg semnat |
2 | fracționat |
3 | fracționat semnat |
5. Selectați Sursa declanșatorului de conversie
Conversia analogică la cea digitală din interiorul modulului ADC poate fi inițiată de mai multe surse de declanșare, determinate de biții SSRC din registrul ADCON1 conform tabelului următor:
SSRC | Sursa declanșatorului de conversie |
---|---|
0 | Ștergerea manuală a bitului SAMP încheie eșantionarea și începe conversia. |
1 | Tranziția activă pe pinul INT0 termină eșantionarea și începe conversia. |
2 | Temporizatorul 3 compară eșantionarea sfârșitului meciului și începe conversia. |
3 | Încheierea ciclului PWM încheie eșantionarea și începe conversia. |
7 | Conversie automată declanșată de contorul intern. |
6. Selectați modul de eșantionare
Eșantionarea pe canalele ADC poate fi inițiată cu oricare dintre următoarele:
- Setarea manuală a bitului SAMP în cod.
- Automat după sfârșitul ultimei conversii.
Acest lucru este decis de bitul ASAM din registrul ADCON1.
ASAM | Mod |
---|---|
0 | Eșantionarea începe când bitul SAMP este setat |
1 | Eșantionarea începe imediat după sfârșitul ultimei conversii. |
7. Selectați Ceasul de conversie
Orice conversie analogică la digitală cu modulul A / D necesită 12 perioade de ceas. Perioada unui singur ciclu de ceas poate fi configurată cu ajutorul biților ADCS din registrul ADCON3. Valoarea plasată în ADCS este o valoare de șase biți. Acest lucru poate fi calculat din următoarele formule:
Valoarea minimă a Tad care poate fi utilizată este de 154 nanosecunde.
8. Decideți dacă eșantionarea simultană este necesară sau nu (opțional)
Eșantionarea simultană poate fi activată de bitul SIMSAM din registrul ADCON1. Eșantionarea simultană captează eșantioanele tuturor canalelor de intrare exact în același moment. Dacă eșantionarea simultană este dezactivată, canalele vor fi eșantionate unul după altul.
9. Selectați sursa ceasului de conversie (opțional)
În majoritatea cazurilor, sursa ceasului de conversie este selectată pentru a fi ceasul sistemului, setând bitul ADRC din registrul ADCON3 la 0.
10. Determinați dacă este necesară scanarea intrării (opțional)
- Acest pas poate fi omis în majoritatea aplicațiilor.
- Scanarea de intrare poate fi activată de bitul CSNA din registrul ADCON2.
Canalul 0 al modulului ADC poate fi configurat pentru a scana mai multe intrări analogice. Aceasta poate fi utilizată dacă sunt surse multiple de intrare și nu toate sunt active în același timp.
ADC se întrerupe în dspic30f și dspic33f
În loc să utilizați funcția readADC () în corpul principal pentru a citi valorile din modulul ADC, o întrerupere este utilizată pentru a îndeplini aceeași funcție în majoritatea aplicațiilor avansate.
Pentru mai multe informații despre întreruperi, consultați acest tutorial detaliat: Cum se utilizează întreruperile în micro-controlere Pic
Cod de întrerupere pentru ADC-uri în dspic30f și dspic33f
#define FCY 30000000 #include xc.h> #include stdio.h> #include delay.h> #include libpic30.h> #include math.h> #include p30F4011.h> _FOSC (CSW_FSCM_OFF & FRC_PLL16); // Fosc = 16x7,5MHz, adică 30 MIPS _FWDT (WDT_OFF); // Cronometru câine de supraveghere dezactivat _FBORPOR (MCLR_DIS); void Interrupt_Init (void) {IEC0bits.ADIE = 1; // Activați întreruperea ADC IPC2bits.ADIP = 6; // setați prioritatea de întrerupere = 6} void __attribute __ ((întrerupere, auto_psv)) _ ADCInterrupt (void) {while (! ADCON1bits.DONE); // așteptați pentru a finaliza eșantionul de conversie.Va = ADCBUF0; sample.Vb = ADCBUF1; IFS0bits.ADIF = 0; } int main (void) {// Faceți din RD0 o ieșire digitală _TRISD0 = 0; Interrupt_Init (); ADC_Init (); while (1) {_LATD0 = 1; __delay32 (15000000); _LATD0 = 0; __delay32 (15000000); }}
- Ar trebui selectată o sursă de declanșare a conversiei pentru ca întreruperea ADC să funcționeze corect conform instrucțiunilor din pasul 5.
- Eșantionarea trebuie făcută în modul automat. (Bit ASAM)
- Frecvența declanșării întreruperii ADC poate fi controlată cu ajutorul biților SMPI din registrul ADCON2. (linia 50).
Acest articol este corect și fidel, după cunoștințele autorului. Conținutul are doar scop informativ sau de divertisment și nu înlocuiește consilierea personală sau sfatul profesional în probleme de afaceri, financiare, juridice sau tehnice.