WebElektronika

AD átalakító használata a PIC32MX130F064B mikrovezérlőnél

person access_time 2014.12.11.
Korábban megnéztük a PIC32MX családban (PIC32MX795F512L) található AD átalakító használatát gyakorlati oldalról, készítettünk programot, közvetlenül írtuk a konfigurációs regisztereket. Most azonban makrókat hívunk segítségül, igyekeztünk mindent makrókkal megoldani.


Egyik korábbi cikkünkben már érintettük a PIC32MX család AD átalakítójának a használatát, igaz, akkor a PIC32MX795F512L mikrovezérlőt alkalmaztuk. Most megint megnézzük ezt a témakört, de már a bemutatott tesztpanel-t használjuk fel, illetve csak makrókat  (plib.h) alkalmazunk a különböző konfigurációs regiszterek közvetlen írása helyett.

A PIC32MX130F064B mikrovezérlő AD átalakítójának blokkvázlata látható a következő ábrán.
 

blokkvazlat
1. ábra   Az AD átalakító blokkvázlata
 

A tesztelés során használt panelnek három analóg bemenete van (A0, A1, A4), amelyek közöl csak egy csatlakozik a potenciométer csúszkájához. A cikk írásakor mi az AN0-t használtuk fel.
 

Tekintettel arra, hogy csak makrókkal szeretnénk beállítani mindent, tehát az AD átalakítót sem az AD1CONx regiszterek írásával konfiguráljuk fel, hanem makrókat fogunk használni. Ezeknek a makróknak a leírása megtalálható a fordító "doc" könyvtárában, a "Microchip-PIC32MX-Peripheral-Library.chm" file-ban. Néhány felhasznált makró látható az első táblázatban.
 

Makrók nevei Makrók leírása
ADC_FORMAT_INTG 16 bites egész ábrázolás
ENABLE_AN0_ANA AN0 analóg bemenet
ADC_AUTO_SAMPLING_ON automatikus mintavétel engedélyezés
ADC_VREF_AVDD_AVSS ref. feszültségek : Vref+ : AVdd;  Vref- : AVss
ADC_SCAN_OFF nincs scan-nelés az AN0-tól
ADC_SAMPLES_PER_INT_2 minden második AD IT-nél történik megszakítás
ADC_SAMPLE_TIME_15 AD mintavétel 15*Tad


1. táblázat   Néhány felhasznált makró
 

 

Példa 1.

Az átalakítandó analóg jel az AN0-ás bemenetre (RA0/AN0) kerül. 

Először tiltjuk makróval a JTAG-et, ezt követően a "B" portot beállítjuk kimenetnek. A "B" port irányának beállítása után minden portbitet nullázunk (mPORTBClearBits()).

Ezt követően az "SetChanADC10()" makróval az AD átalakító multiplexerét állítjuk be (referenciafeszültségek, melyik analóg bemenet kerüljön a kimenetre), majd az "OpenADC10()" makróval a AD átalakító működését határozzuk meg (pl.: órajel forrása, legyen-e scan, mikor legyen megszakítás, stb).

A beállítások után engedélyezzük az AD átalakító űködését a "EnableADC10()"-vel. A while(1) végtelen ciklusban megvárjuk, amíg megszakítás történik (tehát az AD átalakítás véget ér), majd az eredményt megjelenítjük a "B" port kimenetén. Ezt a várakozást úgy érjük el, hogy egy újabb while ciklust alkalmazunk, ahol a "mAD1GetIntFlag()" visszatérési értékét figyeljük.

Fontos, hogy a mikrovezérlőben lévő flag-ek szoftveresen törlendők, ezért az AD átalakító megszakításkérését jelző flag-et is nekünk kell szoftveresen törölnünk (mAD1ClearIntFlag()).
 

#include <p32xxxx.h>
#include <plib.h>

#define P1  ADC_FORMAT_INTG | ADC_CLK_AUTO | ADC_AUTO_SAMPLING_ON
#define P2  ADC_VREF_AVDD_AVSS | ADC_SCAN_OFF | ADC_SAMPLES_PER_INT_2 |
            ADC_ALT_BUF_ON
#define P3  ADC_SAMPLE_TIME_15
#define P4  SKIP_SCAN_ALL

main()
{
    mJTAGPortEnable(DEBUG_JTAGPORT_OFF);
    mPORTBSetPinsDigitalOut(BIT_0 | BIT_1 | BIT_2 | BIT_3 | BIT_4 | BIT_5 | BIT_6 |
                           BIT_7);
    mPORTBClearBits(BIT_0 | BIT_1 | BIT_2 | BIT_3 | BIT_4 | BIT_5 | BIT_6 | BIT_7);
    
    SetChanADC10(ADC_CH0_NEG_SAMPLEA_NVREF | ADC_CH0_POS_SAMPLEA_AN0 | 
                    ADC_CH0_NEG_SAMPLEB_NVREF);

    OpenADC10(P1,P2,P3,ENABLE_AN0_ANA,P4);

    EnableADC10();

    while(1)
    {
        while(!mAD1GetIntFlag());
        LATB = ADC1BUF0;    
        mAD1ClearIntFlag();
    }
}

 

Példa 2.

Ennek a példának a felépítése nagyon hasonlít az előző példához, de itt az átalakított analóg értéket átadjuk a "Futofeny()" függvénynek. 

A potenciométerrel a futófénynek a sebességét tudjuk beállítani.
 

#include <p32xxxx.h>
#include <plib.h>

#define P1  ADC_FORMAT_INTG | ADC_CLK_AUTO | ADC_AUTO_SAMPLING_ON
#define P2  ADC_VREF_AVDD_AVSS | ADC_SCAN_OFF | ADC_SAMPLES_PER_INT_2 |
           ADC_ALT_BUF_ON
#define P3  ADC_SAMPLE_TIME_15
#define P4  SKIP_SCAN_ALL

void Futofeny(int parameter);

main()
{
    mJTAGPortEnable(DEBUG_JTAGPORT_OFF);
    mPORTBSetPinsDigitalOut(BIT_0 | BIT_1 | BIT_2 | BIT_3 | BIT_4 | BIT_5 | BIT_6 |
                            BIT_7);
    mPORTBClearBits(BIT_0 | BIT_1 | BIT_2 | BIT_3 | BIT_4 | BIT_5 | BIT_6 | BIT_7);
    
    SetChanADC10(ADC_CH0_NEG_SAMPLEA_NVREF | ADC_CH0_POS_SAMPLEA_AN0 | 
                    ADC_CH0_NEG_SAMPLEB_NVREF);

    OpenADC10(P1,P2,P3,ENABLE_AN0_ANA,P4);

    EnableADC10();

    while(1)
    {
        while(!mAD1GetIntFlag());
        mAD1ClearIntFlag();
        Futofeny(ADC1BUF0);
    }
}

void Futofeny(int parameter)
{
    int i, k;
    for(i = 1; i <= 255; i *= 2)
    {
        for(k = 0; k <= 10 * parameter; k++);
        
        LATB = i;
    }
}