Misc

Cum se utilizează ADC-urile în dspic30f și dspic33f

Autor: Peter Berry
Data Creației: 15 Iulie 2021
Data Actualizării: 10 Mai 2024
Anonim
[dsPIC33 Tutorial] Sec.1: Setting up system clock frequency
Video: [dsPIC33 Tutorial] Sec.1: Setting up system clock frequency

Conţinut

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ă:

  1. Reduceți semnalul la nivelul de tensiune necesar cu ajutorul transformatoarelor.
  2. 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:

  1. 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.
  2. 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

  1. Portul B, pe care sunt prezenți pinii de intrare ADC, trebuie setat ca port de intrare. (linia - 21).
  2. 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.

Selectarea diferitelor combinații de intrări analogice ADC și canale pentru dispozitive dspic30f.
(dispozitivele dspic33f pot avea mai multe canale și intrări disponibile)


Configurări posibile ale ADCHSConfigurarea 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:

  1. Vcc și Gnd pot fi făcute limite de referință superioare și inferioare.
  2. O tensiune de referință externă poate fi aplicată pe pinul AVref.

Acest lucru se face cu ajutorul bitului VCFG din registrul ADCON2. (linia - 47)

VCFGVref (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:

SSRCSursa 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:

  1. Setarea manuală a bitului SAMP în cod.
  2. Automat după sfârșitul ultimei conversii.

Acest lucru este decis de bitul ASAM din registrul ADCON1.

ASAMMod

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.

Noi Publicații

Sfaturile Noastre

Filtrare URL: Cum se configurează SquidGuard în pfSense
Internet

Filtrare URL: Cum se configurează SquidGuard în pfSense

am lucrează ca anali t de rețea pentru o firmă de tranzacționare algoritmică. A obținut diploma de licență în tehnologia informației de la UMKC.Filtrarea adre elor URL e te o metodă de blocare a...
Consecințele ignorării atacurilor cibernetice pe site-ul dvs. web
Internet

Consecințele ignorării atacurilor cibernetice pe site-ul dvs. web

Glenn tok e te anali t de i teme cu o diplomă de ma ter în informatică. Ace t articol informativ e bazează pe per pectivele ale profe ionale.Acea ta e te o analiză a prejudiciului cauzat de compa...