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: 16046, Oldal olvasási idő: kb. 12 perc
Egyszerű ADC konverzióA következőkben néhány mintaprogramot mutatunk be az egyszerű ADC konverzió használatára. Az egyszerű ADC konverzió esetünkben azt jelenti, hogy egy csatornát kiválasztunk és csak egyetlen konverziót végünk. Természetesen a programunkat szervezhetjük úgy, hogy egymás után több csatornára vonatkozóan is végzünk egy egyszerű konverziót. Az alábbi programban a Launchpad kártya kb.3,5 V-os VCC tápfeszültségét használjuk pozitív referenciaként, a negatív referencia pedig a közös pont (VSS) lesz. A programban három csatorna jelét mérjük meg egymás után, ciklikusan. Az A5 (Chan 5, P1.5 láb) analóg bemenetre kapcsoljuk valamilyen 0 - 3,5 V közötti jelet, amit meg akarunk mérni. Emellett megmérjük a fél tápfeszültséget (Chan 11), és a belső hőmérő jelét is (Chan 10). A mérés eredményeit a 4_uart_soft mintaprogramban bemutatott módszerrel, egyirányú szoftveres UART kezeléssel (csak adatküldés) kiíratjuk. Paraméterek: 9600 baud, 8 adatbit, nincs paritásbit, 2 stopbit. Megjegyzés: a 2 stop bit küldésének itt nincs különösebb jelentősége, a PC oldalon ne is 2 bites, hanem csak 1 stop bites üzemmódot állítsunk be! A 2 stop bit küldése valójában az 1 stop bit vételének biztonságát szolgálja. A CPU a gyárilag kalibrált 1 MHz-es DCO órajelet használja, az ADC pedig a saját ADC10OSC oszcillátort. Hardver követelmények:
4_1. lista: A 4_adc_simple_vcc program listája
A program ismertetését a függvények bemutatásával kezdjük, annál is inkább, mert az ADC inicializálása és az egycsatornás mérés lebonyolítása egyetlen függvényben található, a főprogram csak a mérés és a kiíratás szervezését és az átszámításokat végzi. ADC_single_meas()Ez a függvény beállítja az ADC üzemmódját, kiválasztja a bemenő paraméter által megadott anaalóg csatorná, elindít egy konverziót és megvárja annak végét, majd visszatér a konverzió eredményével. Az ADC inicializálása előtt előbb törölnünk kell az ENC bitet. Az ADC10CTL0 regiszterben ezután csak a mintavételezési időt (itt most nem sietünk, ezért a maximumra állthatjuk), és a feszültségreferencia módot (esetünkben VCC és VSS a pozitív és a negatív referencia) állítjuk be, illetve az ADC10ON bit '1'-be állításával bekapcsoljuk az ADC-t. Az ADC10CTL1 regiszterben az ADC10SSELx bitmezőt nullára állítjuk (az ADC saját oszcillátora, ADC10OSC adja az órajelet), s az INCHx bitmezőben beállítjuk a kiválasztani kívánt csatorna sorszámát. Megjegyzés: Vigyázzunk arra, hogy az INCHx bitmező a 212 helyiértéken kezdődik, ezért a függvény paraméterének megadásához vagy a mikrovezérlő leíró állományában található makrókat használjuk (például INCH_5, INCH_10, INCH_11), vagy pedig a csatorna sorszámot 12 bináris helyiértékkel léptessük balra (például AN5 kiválasztásához: 5<<12). A beállítások után újraengedélyezzük az ADC konverziót az ENC bit '1'-be állításával, és elindítjuk a konverziót az ADC10SC bit '1'-be állításával. A konverzió végét a foglaltságot jelző BUSY bit vagy a megszakításkérő bit figyelésével oldhatjuk meg. A konverzió eredményét az ADC10MEM regiszterből olvashatjuk ki. sw_uart_putc() - egy karakter kiküldése. Lényegében ugyanaz, amit az első oldalon bemutatott soros kommunikációnál használtunk, csak most 2 stop bitet küldünk. sw_uart_puts() - egy nullával lezárt karaktersorozat kiküldése. sw_uart_out4hex() - egy előjel nélküli 16 bites szám kiíratása négy hexadecimális számjeggyel. Ezt a konverzió nyers eredményének kiíratására használjuk, ellenőrzés céljából. sw_uart_outdec() - egy előjeles 32 bites szám kiíratása, adott számú tizedesjegy levágásával. Feltételezzük, hogy a kiírandó szám a levágott tizedesjegyek számának megfelelően 10-zel, 100-zal, ezerrel, stb-vel fel van szorozva. Például ha a hőmérsékletet egy tizedesjeggyel akarjuk kiíratni, akkor a kiírandó számot tizedfokokban kell megadni. Ha a feszültséget V-ban három tizedesjeggyel akarjuk kiíratni, akkor a kiírandó számot millivoltokban kell megadni. A főprogramA főprogram inicializáló részében letiltjuk az őrkutyát, beállítjuk a gyárilag kalibrált 1 MHz-es DCO frekcenciát, kimenetre állítjuk a P1.1 portlábat (soros kommunikáció TX kimenet). A P1.3 bemeneten beállítjuk a belső felhúzást, végül a P1.5 bemeneten (AN5 analóg csatorna) engedélyezzük az analóg funkciót. A főprogram végtelen ciklusában 2 másodperces késleltetés után végzünk egy mérést az AN5 csatornában (a kívülről bevezet analóg jel mérése), az AN11 csatornában (ebben a belső analóg csatornában a tápfeszültség fele mérhető), és az AN10 csatornában (ebben a belső hőmérő jele mérhető). Feszültség és hőmérséklet meghatározásaA fenti példában VR+ = 3,5 V, illetve ezredvoltokban kifejezve 3500 mV, VR- = 0 V, a 10 bites ADC "végkitérése" pedig 1023. A konverzió NADC eredményéből tehát a millivoltokban kifejezett feszültség az alábbi képlettel számítható ki: VIN = NADC * 3500 mV/1023 Megjegyzés: A mért feszültséget azért millivoltokban fejezzük ki, mert így tudjuk az egész ábrázolás ellenére három tizedesjeggyel kiíratni a voltban mért feszültséget. A hőmérséklet meghatározása egy kicsit bonyolultabb. Itt a VIN = NADC * 3500 mV/1023 és a VIN = T * 3,55 mV/°C + 986 mV képletekből kell kiindulni (az utóbbi formula a mikrovezérlő adatlapjában található ), ahol T a Celsius skálán mért hőmérséklet. Ezekből kifejezve a hőmérsékletet, a következő kifejezést kapjuk: T = NADC * 3500/(1023 * 3,55) - 986/3,55 Ha hőmértsékletet tizedfokokban akarjuk meghatározni, akkor 3500 helyett 35000-et, 986 helyett pedig 9860-at kell írnunk. Ha a törteket például 256-tal bővítjük, akkor egészaritmetikával is kényelmesen kezelhető képletet kapunk: T = (NADC * 2467 - 711030)/256 A 256-tal történő osztást természetesen jobbraléptetéssel is meg tudjuk oldani. Futási eredmény
A program futási eredménye az alábbi ábrán látható. A putty.exe programot használtuk terminálként, s esetünkben a Launchpad kártya a COM3 virtuális soros porton volt elérhető. Sárga nyílakkal megjelöltük azokat a helyeket, amikor a bemenő adatokat megváltoztattuk. AN5 (chan 5) esetében az eredetileg végkitérésbe állított potmétert eltekertük, a beépített hőmérő (chan 10) esetében pedig a mikrovezérlő tokját melegítettük.
4_1. ábra: A 4_adc_simple_vcc program futásának eredménye A 2,5 V-os belső referencia használataA következő példaprogramban a mikrovezérlő 2,5 V-os beépített referencia forrását használjuk pozitív referenciaként, a negatív referencia pedig most is a közös pont (VSS) lesz. A program minden másban megegyezik az előző mintapéldával, tehát ugyanúgy három csatorna jelét mérjük meg egymás után, ciklikusan. Arra azonban ügyelnünk kell, hogy az alacsonyabb referencia feszültség miatt a bemeneti tartomány lecsökken. Így az A5 (Chan 5, P1.5 láb) analóg bemenetre most csak 0 - 2,5 V közötti jelet adhatunk, ebben a tartományban tudunk csak mérni. Most is megmérjük a fél tápfeszültséget (Chan 11), és a belső hőmérő jelét is (Chan 10). Mindkét belső jel belefér a 0 - 2,5 V közötti tartományba. Mivel az 4_adc_simple_ref2 program csak néhány részletben különbözik az előző programtól, itt most csak azokat a függvényeket mutatjuk be, amelyeket megváltoztattunk. 4_2. lista: Részletek a 4_adc_simple_ref programból (Az itt nem listázott programrészek megegyeznek a 4_adc_simple_vcc mintapéldával)
Az ADC beállítása és a konverzió indítása, valamint az eredmény kiolvasás most is egyetlen függvényben lett begvalósítva, az ADC_single_meas_REF2_5V() függvényben. Az ADC beállításánál annyi a különbség, hogy az ADC10CTL0 regiszter beállításánál most az SREFx bitmezőbe 1-et írunk (a pozitív referencia most VCC helyett Vref+ lesz), valamint bekapcsoljuk a belső referenciát és a 2,5 V-os referencia értéket választjuk ki (tehát Vref+ = 2,5 V lesz). A főprogramban az a fő különbség, hogy a mért feszültségek meghatározásánál 3500 mV helyett most 2500 mV-ot írtunk. A fél tápfeszültség mérésénél nem tévedésből írtunk 5000 mV-ot, hanem azért, hogy a fél tápfeszültség helyett annak kétszeresét, vagyis a magát a tápfeszültséget írassuk ki (hogy ne kelljen fejben szorozgatnunk). A hőmérséklet meghatározásánál nem kell a képletet újra levezetni, elegendő a szorzót átskálázni a referencia feszültségek arányában: szorzó = 2467 *2500/3500 = 1762. Az additív tag értéke természetesen nem változik. A program futási eredménye az alábbi ábrán látható. Sárga nyílakkal megjelöltük azokat a helyeket, amikor a bemenő adatokat megváltoztattuk. AN5 (chan 5) esetében az eredetileg 1 V körüli értékre állított potmétert eltekertük, a beépített hőmérő (chan 10) esetében pedig a mikrovezérlő tokját melegítettük.
4_2. ábra: A 4_adc_simple_ref2 program futásának eredménye Ebben a programban a chan 11 csatorna mérése is hasznos információt adott, hiszen segítségével meghatározhattuk a tápfeszültség pillanatnyi értékét. Különösen fontos ez az információ akkor, amikor 6 MHz-nél magasabb frekvencián járatjuk a mikrovezérlőt, hiszen ebben az esetben a tápfeszültség függvénye, hogy mekkor frekvencia engedhető meg. Ha nem figyelünk rá, hogy mekkora a tápfeszültség, akkor a mikrovezérlő működése megbízhatatlanná válhat. Az 1,5 V-os belső referencia használataHarmadik példánkban (4_adc_simple_ref1) a mikrovezérlő 1,5 V-os beépített referencia forrását használjuk pozitív referenciaként, a negatív referencia pedig most is a közös pont (VSS) lesz. Ügyeljünk arra, hogy az alacsonyabb referencia feszültség miatt a bemeneti tartomány lecsökken. Így az AN5 (Chan 5, P1.5 láb) analóg bemenetre most csak 0 - 1,5 V közötti jelet adhatunk, ebben a tartományban tudunk csak mérni. Emiatt most nem tudjuk megmérni a fél tápfeszültséget (Chan 11), mert az meghaladja a mérési tartomány felső határát. Ezért a most az AN5 csatorna mellett csak a belső hőmérő jelét (Chan 10) mérjük, ami belefér a 0 - 1,5 V közötti tartományba. Mivel az 4_adc_simple_ref1 program csak néhány részletben különbözik az előző programoktól, itt is csak azokat a függvényeket mutatjuk be, amelyeket megváltoztattunk. 4_3. lista: Részletek a 4_adc_simple_ref1 programból (Az itt nem listázott programrészek megegyeznek a 4_adc_simple_vcc mintapéldával)
Az ADC beállítását és a konverzió indítását, valamint az eredmény kiolvasását végző ADC_single_meas_REF1_5V() függvényben az előző példához képest csupán annyi a különbség, hogy A REF2_5V bitet nem állítjuk '1'-be, így Vref+ = 1,5 V lesz. A főprogramban az a fő különbség, hogy a mért feszültségek meghatározásánál a referencia feszültség helyébe 1500 mV-ot írtunk. A fél tápfeszültség mérése most nem végezhető el, ezért a főprogram végtelen ciklusában csak két csatorna mérése ismétlődik. A hőmérséklet meghatározásánál most 256 helyett 65536-tal (216) szoroztuk fel a képletben szereplő konstansokat, emiatt most osztás gyanánt 16 helyiértékkel kell jobbraléptetni az eredményt. A program futási eredménye az alábbi ábrán látható. Sárga nyílakkal megjelöltük azokat a helyeket, amikor a bemenő adatokat megváltoztattuk. AN5 (chan 5) esetében az eredetileg 1 V-ra állított potmétert eltekertük, a beépített hőmérő (chan 10) esetében pedig a mikrovezérlő tokját melegítettük.
4_3. ábra: A 4_adc_simple_ref1 program futásának eredménye Az ADC megszakítások használataA fenti programokban egy várakozó ciklusban időzött a program, amíg a konverzió eredményére vártunk. Energiatakarékosság szempontjából ez pazarlás, hiszen a CPU-ra nincs szükség. Az MSP430G2231 mikrovezérlő gyári mintapéldái között található msp430g2x31_adc10_01.c programon keresztül bemutatjuk, hogy a program LPM0 módban is várakozhat a konverzió végére, a felébresztést pedig az ADC programmegszakítási kérelmét kiszolgáló eljárásban valósíthatjuk meg. Ez a program az A1 analóg bemenetre (P1.1 portláb) bevezetett analóg feszültséget méri. Ha a bejövő feszültság nagyobb, mint a referenciaként használt VCC tápfeszültség fele, akkor a P1.0 kimenetre kötött LED (a Launchpad kártya piros LED-je) világítani fog, a 0.5 Vcc-nél alacsonyabb feszültségek esetén pedig kialszik. Az alábbi lista a program magyar megjegyzésekkel ellátott változatát mutatja be (4_adc1_interrupt.c). 4_4. lista: A 4_adc_interrupt program listája
A cikk még nem ért véget, lapozz! Értékeléshez bejelentkezés szükséges! |
Bejelentkezés
Hirdetés |