Fórum témák

» Több friss téma
Cikkek » Launchpad: ismerkedés az MSP430 mikrovezérlőkkel IV.
Launchpad: ismerkedés az MSP430 mikrovezérlőkkel IV.
Szerző: icserny, idő: Jan 14, 2013, Olvasva: 16049, Oldal olvasási idő: kb. 4 perc
Lapozás: OK   7 / 8

Automatikus csatornapásztázás

A több mérés automatikus lebonyolítását és az adatok automatikus átvitelét nem csak arra használhatjuk, hogy egy csatornában több mérést végezzünk, hanem arra is, hogy több csatornát automatikus végigpásztáztassunk.

Az egyszeri automatikus csatornapásztázás üzemmód (CONSEQx = 1) azt jelenti, hogy először a megadott sorszámú csatornában történik mintavételezés és adatkonverzió, majd eggyel az eggyel ksiebb sorszámú csatornában történik mérés, s ez így folytatódik, amíg vagy az előírt számú mérés meg nem történt, vagy a nulladik csatornát el nem értük.

Az ismételt automatikus csatornapásztázás üzemmód (CONSEQx = 3) esetében a nulladik csatorna (A0) mintavételezése után nem áll le a konverziók sorozata, hanem újra visszaugrik az először mintavételezett csatornára, és a pásztázás mindaddig folytatódik, amíg az előírt darabszámú mérés meg nem történt.

Az automata csatornapásztázást célszerű összekapcsolni a közvetlen adatátvitellel (DTC), hiszen minden konverzió eredménye az ADC10MEM regiszterbe kerül. Ha innen időben nem pakoljuk el az adatot, akkor az felülíródik.

 adc_scan.png

7_1. ábra: Ismételt csatornapásztázás és DTC kombinálása

 

Csatornapásztázás + DTC = teljesítménynövelés

Az automatikus csatornapásztázás és a közvetlen adatátvitel kombinálása növeli a program hatékonyságát. Ha a pásztázást és az adatok elmentését szoftveresen oldanánk meg, akkor az konverziónként kb. 70 utasításciklusnyi CPU időt venne igénybe.

7_1. lista: Fiktív programrészlet, a csatornapásztázás szoftveres kezelésére

  1. // Szoftveres kezelés
  2. Res[pRes++] = ADC10MEM;
  3. ADC10CTL0 &= ~ENC;
  4. if (pRes < NR_CONV)    
  5. {
  6.  CurrINCH++;
  7.  if (CurrINCH == 3)
  8.    CurrINCH = 0;
  9.  ADC10CTL1 &= ~INCH_3;
  10.  ADC10CTL1 |= CurrINCH<<12;
  11.  ADC10CTL0 |= ENC+ADC10SC;
  12. }

Automatikus csatornapásztázás és a DTC használata esetén viszont a méréssorozat alatt nincs szükség a CPU közreműködésére, mindent hardveresen kezel a mikrovezérlő.

  1. // Hardveres kezelés
  2. __low_power_mode_0();

Az automatikus csatornapásztázással és a közvetlen adatátvitellel tehát hatékonyabb alkalmazásokat készíthetünk:

  • Gyorsabb mintavételezés
  • Energiatakarékos üzemmódok

 

Csatornapásztázás három csatornában

A következő program azt mutatja be, hogy hogyan használhatjuk az ADC egyszeri automatikus csatornapásztázás üzemmódjátt a közvetlen adatátvitellel kombinálva. Három csatornában mérünk, az ADC 2,5 V-os belső referenciáját használva.

Esetünkben az A7 (P1.7) analóg bemenetre egy 2,5 V-os feszültségreferencia IC kimenőjelét kötöttük. Ennek jele szerencsére egy hajszállal kisebbnek bizonyult, mint a belső 2,5 V-os referencia, ez tette lehetővé, hogy meg tudjuk mérni. Az A6 (P1.6) bemenetre egy potméterrel leosztott feszültséget kötöttünk, az A5 (P1.5) bemenetre pedig a korábban már bemutatott TC1047A hőmérő jelét vittük be. A lényeg az, hogy a belső referencia értékére való tekintettel mindhárom bemenetre 0 - 2,5 V közötti jelet vezessünk.

 4_adc_scan.png

 7_2. ábra: A 4_adc_scan_ref2 programnál használt kapcsolás vázlata

A mérés eredményeit a szokásos módon, az egyirányú szoftveres UART kezeléssel (csak adatküldés)  kiíratjuk. Paraméterek: 9600 baud, 8 adatbit, nincs paritásbit, 2 stopbit.

A korábbiakhoz hasonló felépítésű  programból itt csak azokat a részleteket mutatjuk be, amelyek eltérnek az előzőektől. Az alábbi függvény egyszeri csatornapásztázást végez a megadott csatornától kezdve. Mivel az általunk mérésre felhasznált analóg csatornák száma (3) kisebb, mint a kezdőcsatorna sorszáma (7) így az ismételet csatornapásztázási mód használatára nincs lehetőség (ahhoz le kellene menni a 0. csatornáig).

7_2. lista: Részlet a 4_adc_scan_ref2 programból (az ADC kezelése)

  1. //-------------------------------------------------------------
  2. // Egyszeri csatornapásztázás, ADC a 2.5V-os belső referenciával
  3. //-------------------------------------------------------------
  4. void ADC_scan_meas_REF2_5V(uint16_t chan, uint16_t *pbuf, uint8_t ndat) {
  5.   ADC10CTL0 &= ~ENC;                   //Az ADC letiltása újrakonfiguráláshoz
  6.   while (ADC10CTL1 & BUSY);            //Várakozás a foglaltság végére
  7.   ADC10CTL0 = ADC10SHT_3               //mintavétel: 64 óraütés
  8.              | ADC10ON                 //Az ADC bekapcsolása
  9.              | SREF_1                  //VR+ = VREF+ és VR- = AVSS
  10.              | REFON                   //Belső referencia bekapcsolása
  11.              | REF2_5V                 //2,5 V-os referencia kiválasztása
  12.              | MSC;                    //Többszörös konverzió egy triggerjelre  
  13.   ADC10CTL1 = ADC10SSEL_0              //ADC10OSC kiválasztása
  14.              | SHS_0                   //ADC10OSC indítja a mintavételezést
  15.              | CONSEQ_1                //Egyszeri csatornapásztázás
  16.              | chan;                   //kezdő csatorna megadása
  17.   ADC10DTC0 &= ~(ADC10TB+ADC10CT);     //Egy blokk mód
  18.   ADC10DTC1 = ndat;                    //ndat konverziót végzünk
  19.   ADC10SA = (unsigned short)pbuf;      //adatok mentése a mutatóval jelzett helyre
  20.   ADC10CTL0 |= ENC + ADC10SC;          //Konverzió engedélyezése és indítása
  21.   while (!(ADC10CTL0 & ADC10IFG));     //Várakozás a konverzió végére
  22. }

A beállításoknál a következő fontos változások vannak:

ADC10CTL0 - az MSC bitet '1'-be állítjuk, hogy egyetlen szoftveres triggerjelre lefusson a mintavétel és konverzió minden előírt csatornában. A megszakítást most nem engedélyezzük.

ADC10CTL1 - a szoftveres triggereléshez SHSx = 0 kell, az egyszeri csatornapásztázást pedig CONSEQx =1 állítja be. A megadott csatorna a legmagasabb sorszámú pásztázandó csatorna legyen!

ADC10DTC1 - ebbe a pásztázandó csatornák darabszámát írjuk (esetünkben ez 3 lesz)

A főprogramban annyi változás van az előzőekhez képest, hogy most egyetlen függvényhívás végzi el a mérést minhárom csatonában. Az adatok átszámítását feszültségre és a kiíratást így egy for ciklusba szervezhetjük. A csatornák száma így egyszerűen bővíthető.

 

7_3. lista: Részlet a 4_adc_scan_ref2 programból (a főprogram)

  1. #include  "io430.h"
  2. #include "stdint.h"
  3. #define TXD       BIT1                      //TXD a P1.1 lábon
  4. uint16_t adc_data[16];                      //Ide kerülnek a mérési adatok
  5.  
  6. void main(void) {
  7. uint8_t i;
  8. int32_t temp;
  9.   WDTCTL = WDTPW + WDTHOLD;            //Letiltjuk a watchdog időzítőt
  10.   DCOCTL = CALDCO_1MHZ;                // DCO beállítása a gyárilag kalibrált
  11.   BCSCTL1 = CALBC1_1MHZ;               // 1 MHz-es frekvenciára
  12.   P1DIR |= TXD;                        //TXD legyen digitális kimenet
  13.   P1OUT |= TXD;                        //TXD alaphelyzete: mark
  14. //--- P1.3 belső felhúzás engedélyezése -----------------------
  15.   P1DIR &= ~BIT3;                      //P1.3 legyen digitális bemenet
  16.   P1OUT |= BIT3;                       //Felfelé húzzuk, nem lefelé
  17.   P1REN |= BIT3;                       //Belső felhúzás engedélyezése  
  18. //--- Analóg csatornák engedélyezése --------------------------
  19.   ADC10AE0 |= BIT5+BIT6+BIT7;          //P1.5, P1.6, P1.7 legyen analóg bemenet
  20.   while(1) {
  21.     delay_ms(2000);
  22. //--- Pásztázó mérés az A7, A6 és A5 csatornákban -------------  
  23.     ADC_scan_meas_REF2_5V(INCH_7, adc_data,3);
  24.     for(i=0; i
  25.       temp = (int32_t)adc_data[i]*2500L/1023L;
  26.       sw_uart_putc(i+48);
  27.       sw_uart_puts(". csat = ");
  28.       sw_uart_outdec(temp,3);
  29.       sw_uart_puts(" V  ");
  30.     }
  31.     sw_uart_puts("\r\n");
  32.   }
  33. }

 

A program futási eredménye az alábbi ábrán látható. A csatornák sorrendje az automatikus pásztázás szerinti, tehát a 0. csatorna A7 (a 2,5 V-os referencia), az 1. csatorna A6 (a potméter kimenete), a 2. csatorna pedig A5 (a TC1047A hőmérő jele). A sárga nyíllal megjelölt szakaszon tekergettük a potmétert. A hőmérő jele 0 ºC-nál 500 mV, s fokonként 10 mV-tal növekszik.

 4_adc_scan_ref2.png

 7_3. ábra: A 4_adc_scan_ref2 program futási eredménye


A cikk még nem ért véget, lapozz!
Következő: »»   7 / 8
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem