SÁNDOR MÁTÉ F632YZ
Önálló laboratórium Árszorzós mérleg megvalósítása mikrokontrollerrel Specifikáció: A feladatom egy mérleg modul analóg adatának feldolgozása különböző mikrokontrollerekkel. A mérleg modul 4db nyúlásmérő bélyeggel van ellátva, amelyből kettőnek nő, kettőnek pedig csökken az ellenállása megnyúlás hatására. Az adatokat elsősorban egy Arduino Uno panel segítségével fogjuk feldolgozni, majd a megjelenítés számítógépen végezzük LabVIEW segítségével. A mérleg modul kimenete egy analóg jel ami mV-os nagyságrendű, ezt egyrészt szűrni, erősíteni kell, hogy a mikrokontrollerek beépített A/D átalakítójával digitalizálni tudjuk, másrészt az analóg jelet egy nagyfelbontású ∑-∆ típusú A/D átalakítóval digitalizáljuk, aminek van beépített programozható erősítője. Így látható lesz a nagypontosságú és a mikrokontrollerekbe alapból beépített A/D átalakító közti különbség. A mérleg modult 6 vezetékes elrendezésben használjuk, mert elég távol van az erősítő és A/D átalakító egységtől. Az eszköz blokkvázlatát az 1. ábra mutatja. Az illesztő áramkör, az A/D átalakító és a műszererősítő a modul oldalán kap helyet egy kis dobozban, a dobozon még lesz két visszajelző LED is. Egy zöld és egy piros, az egyik azt jelzi, hogy a ∑-∆ A/D átalakító készen van a konvertálással, a másik pedig azt, hogy túl van terhelve a modul.
MCU Vanalog
Analog
A/D NAU7802
A/D
I2C
1. ábra, blokkvázlat
Mérleg modul: A mérleg modulról nincs sok információ, ez egy egyedileg készített eszköz, amit 4 nyúlásmérő bélyeggel láttak el, amik az 1. ábrának megfelelően vannak kapcsolva. Ebből kifolyólag nem tudunk pontos adatokat a mérlegről. A laborban található súlykészlettel és egy nagypontosságú multiméterrel felvettem a mérleg karakterisztikáját, ez mutatja ez 2. ábra. A karakterisztikából látszik, hogy az Uki feszültség lineárisan változik a terhelés függvényében. A vörös pöttyözött vonal mutatja a végpontokra illesztett egyenest, ha ehhez viszonyítunk látható, hogy a legrosszabb esetben sincs a két egyenes között 1 rácsnyi eltérés, ami 20uV. A vörös vonaltól való eltérés jelentős része valószínűleg, a külső, rárakódott zajok miatt van. 1
Mérleg karakterisztikája: Súly 0 20 50 100 120 150 200 220 250 300 320 350 400 420 450 500 [g] Uki 3,45 3,48 3,53 3,6 3,64 3,69 3,75 3,79 3,84 3,91 3,95 4,01 4,07 4,11 4,15 4,23 [mV]
Mérleg modul karakterisztikája 4,3 4,2 4,1
Uki [mV]
4 3,9 3,8 3,7 3,6 3,5 3,4 0
50
100
150
200
250
300
350
400
450
500
Súly [g] 2. ábra, mérleg modul karakterisztikája
NAU7802 A/D átalakító és annak illesztése: Az A/D átalakító egy ∑-∆ típusú átalakító, amely nagyon nagy felbontással tud átalakítani, cserébe nagyon lassan. Ez jelen esetben 24 bites és másodpercenként 10-80 mintát vesz, ám 80 mintánál már jóval csökken a kvantálási zajelnyomás. Az átalakító 24 bites, de a hasznos bitszám legjobb esetben is csak 23, ami azt jelenti, hogy megegyezik egy 23 bites ideális A/D átalakítóval. A ∑-∆ átalakítók két részből állnak, az első, ami a ∆ modulációt végzi, ez képzi az impulzusokat és a második, ami impulzusokat számol. A 3. ábrán egy ∑-∆ átalakító blokkvázlata látható, illetve adott bemeneti jelre a különböző pontokon lévő feszültség idődiagramja.
2
3. ábra, ∑-∆ A/D átalakító működése időtartományban
Az 1. pont az ábrán az átalakító bemenetére érkező jel, ami a bal oldali esetben 0,2V, a jobb oldaliban 0,4V. A 2. pont a korábban bemenetre érkező már ∆ modulált alakja, ezt kivonjuk a bemenetből, ez 3. pont és innentől kezdve kezdi el integrálni (4. pont), egészen, amíg el nem éri a 0V-os határértéket. Ekkor képzünk belőle egy impulzust (5. pont), amit egy számláló számlál. A számláló értékét előre definiált időközönként áttöltjük a bufferbe, a buffer értékét pedig kiküldjük a kimenetre. Az adott időintervallumban lévő impulzusok száma adja meg az analóg jel digitálissá alakított értékét. A ∆ moduláció egy nagyon rövid impulzusból képez egy szélesebbet, ennek az ideje előre kiszámolt és az 3
eszköz belső feszültségeitől függ. Látható, hogy a bal oldali 0,2V-os bementnél jóval kevesebb impulzus generálódik, mint a jobb oldalon lévő 0,4V-os bemeneti jelszintnél. A NAU7802-es A/D átalakító két differenciális bemenettel rendelkezik, ebből egyet fogunk használni, illetve ezzel az IC-vel meg lehet valósítani 6 vezetékes mérést is, ezt a funkcióját úgy fogjuk használni, hogy a REF+ jel az a modul tápfeszültségének a fele lesz, ami kb. 2,5V, így tudjuk a legpontosabban illeszteni a jelet az A/D átalakítóhoz. A REF- jel az analóg föld lesz. Az alkatrész belső blokkvázlata a 4. ábrán látható. Az eszköz továbbá rendelkezik egy beépített programozható LDO regulátorral is, ezt nem fogjuk használni, helyette külső analóg tápfeszültséget biztosítunk, mert más alkatrész számára is szükséges. A külső analóg tápfeszültség 5V lesz. A bemenő jelet a beépített PGA erősítővel fogjuk erősíteni a 128szorosára, ezen kívül használni fogjuk a beépített, a hálózati feszültségek által keltett zavarok elnyomására használt FIR szűrőt. Ehhez a szűrőhöz pedig szükség van egy nagy pontosságú külső kristály rezonátorra, így a beépített belső oszcillátort nem fogjuk használni. Az átalakító I2C adatbuszon keresztül kommunikál a hozzá csatolt mikrokontrollerrel a 0b0101010 fix címen. Az átalakítót az adatbuszon nem csak lekérdezni kell a konvertált értékről, hanem itt is kell felkonfigurálni, olyan beállításokat kell neki megadni, mint pl.: milyen belső perifériákat használjon, azokat, hogy használja, végezzen-e kalibrációt, illetve, hogy hogyan adja ki a már átalakított adatot. A különböző beállításokat úgy kell megadni az átalakítónak, hogy egy írási ciklust kezdeményezünk, majd kiadjuk az átalakító címét, azután annak a regiszternek a címét, amiben az átalakító tartja az adott beállítások, majd azt, hogy mire akarjuk módosítani az adott beállításokat. Lehet sorozatos írási műveletet is végez, ilyenkor az átalakító magától lépteti az írandó regiszter címet, csak az első regiszter címet kell megadni és utána az adatokat szépen sorban. Az átalakító rendelkezik egy DRDY kimenettel is, ami azt jelzi, hogy készen van-e az IC egy digitalizálással, ezt ki lehet azzal is váltani, hogy bekapcsoljuk a streaming módot, ami azt jelenti, hogy ha kész a konverzió lehúzza az SDA vezeték alacsony logikai szintre, jelen esetben most használjuk a DRDY kimenetet is, mert ez más mikrokontrollerekhez megszakítást tud generálni.
4. ábra, NAU7802 belső blokkvázlata
4
Műszererősítő és annak illesztése: Ahhoz hogy tudjuk használni a mikrokontroller beépített A/D átalakítóját, az analóg jelet fel kell erősítenünk, mivel a jel mV-os nagyságrendbe esik. A mérleg modul kimeneti jele szimmetrikus, ami azt jelenti, hogy mindkét kimeneti vezetéken egy-egy olyan jel jelenik meg, ami 2,5V körüli értékkel rendelkezik a földhöz képest. Ebből úgy nyerjük ki az információt, hogy a két jelet kivonjuk egymásból, ekkor eltűnik a 2,5V-os közös módusú komponensük és megmarad a mV-os nagyságrendű differenciális komponensük. Ezt a műveletet egy műszererősítő segítségével tudjuk elvégezni a legkönnyebben, hiszen ezek az eszközök magas közös módusú elnyomással rendelkeznek és a bemeneti impedanciájuk nagyon nagy. Erre a célra az AD623-as műszererősítőt választottam, mert 100Hz-nél kisebb frekvenciákon 110dB a közös módusú elnyomása, kb. 2GΩ a bemeneti ellenállása, nem igényel szimmetrikus tápfeszültséget és rail-to-rail típusú, ami azt jelenti, hogy a tápfeszültséghez illetve a földhöz képest nagyon közeli kimeneti értékeket is tud produkálni. A műszererősítőnek szüksége van egy referencia jelre is, ami kb. 1,25V kell, hogy legyen, hiszen ezt úgy kell megválasztani, hogy a kimeneti tartomány kb. fele legyen. A műszererősítő erősítését egy külső ellenállással lehet beállítani, ezt úgy fogjuk megtenni, hogy amikor akkora súlyt rakunk rá, hogy már a talapzatba ütközik a modul karja, akkor beállítjuk úgy az ellenállást, hogy az erősítő 2,5V-ot adjon ki. Arduino Uno felkonfigurálása: Mivel a fő célunk az, hogy mikrokontrollerhez illesszük a mérleg modult ezért a LabVIEW-os szoftver csak a mérési eredmények megjelenítésére illetve különböző beállítások módosítására szolgál, az adatok feldolgozását, átlagolását, az A/D átalakító felkonfigurálást, kalibrálását az Arduino Uno panel végzi és a végső adatot küldi el soros porton a PC-nek, amin a LabVIEW szoftver fut. Az Arduino Uno panelen futó szoftverben különböző funkciók lesznek implementálva, melyek a következőek:
külső A/D átalakító felkonfigurálása külső A/D átalakító kalibrálása A/D átalakító értékének ofszetelése, ha szükséges, pl.: víz súlyának mérése a tároló edény súlya nélkül átlagolás, mozgó átlag segítségével külső/belső A/D átalakító kiválasztása ráhelyezett tárgy tömegének kiszámítása
Az 5. ábrán a szoftver folyamatábráját láthatjuk.
5
START
Változók inicializálása
Külső A/D átalakító felkonfigurálása
Utasítás feldolgozás
Külső vagy belső A/D átalakítót használunk?
Belső
Belső A/D átalakítóval mérünk
Külső
Külső A/D átalakítóval mérünk
Ofszetelünk?
Igen
Ofszetelés elvégzése
Igen
Átlagolás elvégzése
Nem
Átlagolunk? Nem
A/D vagy tömeg érték?
A/D
A/D érték kiküldése
Tömeg
Tömeg érték számítása
Tömeg érték kiküldése
5. ábra, a szoftver folyamatábrája
6
Mint látható, a program indítás után a futása során használt globális változókat hozza létre először, itt tároljuk a külső A/D átalakító címét, a regiszter címét, amiben a kimeneti adat első bájtja van, a soros porton kiküldött értéket, az ofszet értékét, az átlagolni kívánt minták számát és különböző logikai értékeket, ami a későbbi feldolgozáshoz kell. Ezután meghívjuk a setup() függvényt. A setup() függvény gondoskodik arról, hogy elindítsuk a kommunikációt, a szükséget protokollokon, itt foglaljuk le a parancs feldolgozó puffer méretét és nullázzuk azt, beállítjuk a 12-es digitális lábat bemenetnek és kiválasztjuk, hogy a belső A/D átalakítónkhoz külső referenciát használunk. Ezután elkezdjük a külső A/D átalakító felkonfigurálását, ez úgy működik, hogy először töröljük a regisztereinek az értékeit, majd egy regiszter írásával normál üzemi állapotba helyezzük, ez kb. 200 µs-ig tart. Ezután a különböző regiszterekbe beírjuk a kívánt értékeket. Most beállítjuk, hogy a belső erősítőt használjuk 128-as erősítéssel, külső analóg feszültséget használunk, külső oszcillátort használunk és a DRDY láb jelezze, ha kész a konverzió pozitív logika szerint. Ezután még lefuttatunk egy kalibrálást is a setup() függvényben és ezzel a függvény végére értünk. Most kezdődik a loop() függvény, ami a főciklus és végtelenszer ismételünk, amíg az eszköz be van kapcsolva. A fő ciklusba belépve létrehozunk néhány segédváltozót is, ilyen például a conv_ready változó, ami azt jelzi, hogy elkészült-e az A/D átalakító a konverzióval és ki lehet belőle olvasni az adatot. A változók deklarálása után előzőleg beállított logikai változó értéke alapján eldöntjük, hogy melyik A/D átalakítót használjuk és beolvassuk az átalakított értéket. A külső A/D átalakítónál külön meg kell formáznunk az értéket ugyan is itt 3 bájtból áll. Ezután ofszeteljük el az értéket, ha ez a funkció be van kapcsolva. Ezután átlagolunk, ha az a funkció be van kapcsolva. Az átlagolásnál a hagyományos mozgó átlagolás módszerét használjuk, ehhez létrehozunk egy 256B méretű cirkuláris puffert, ehhez megfelelően generáljuk a tömb indexelését, a tömbnek csak azt a részét használjuk, amennyi adott elem átlagolásához kell. A következő lépésben megnézzük, hogy A/D értéket vagy tömeg értéket kell kiküldenünk, ha tömeget, akkor átszámítjuk az A/D értéket tömeggé. Végül kiírjuk az eredmény UART-on. Ezután újrakezdők a főciklus. A parancsokat egy érdekes függvény kezeli le, ami először úgy tűnhet interrupt vezérelt, ám a valóságban nem az, ez serialEvent() függvény, ami automatikusan a főciklus futásai között fut le. A feladata, hogy ha érkezett UART-on egy karakter, akkor azt hozzá fűzi a pufferhez, ha beérkezet az új sor karakter, akkor meghívja a parancsot lekezelő függvényt és törli a puffert. Fontos megemlíteni még a calibrate() kalibráló függvényt, ami a külső A/D átalakító belső kalibrálási funkcióját használja ki és csak ofszet hibát tud eltűntetni. Arduino Uno LabVIEW-hoz való illesztése: Az Arduino panelt soros porton fogjuk illeszteni a szoftverhez nem pedig valamiféle előre elkészített pluginnal, mert itt a LabVIEW szoftver feladata csak a megjelenítés és vezérlés, de a feldolgozást alapvetően mikrokontrollerrel végezzük. Az Arduino panel a számítógéppel 9600 Baud-os sebességgel, 8 adatbittel, paritásbit nélkül, 1 stopbittel kommunikál. Kapcsolási rajz: Az 6. ábrán látható a kapcsolási rajz. Alulról indulva látható két műveleti erősítős kapcsolás, a bal oldali arra, szolgál, hogy ha a mérleg kiterhelése meghalad egy bizonyos szintet, akkor felkapcsol egy LED-et ezzel jelezve, hogy a mérleg túl van terhelve. Azt a szintet, hogy mikor jelezzen, mi állíthatjuk be egy potenciométer segítségével, a beállított szintet fogja összehasonlítani az analóg műszererősítő kimenetével, és ha az nagyobb, mint a megadott jelünk felkapcsolja a LED-et. A jobb oldali műveleti erősítős kapcsolás hasonlóan működik, ám itt azt jelezzük, hogy a külső A/D átalakító elkészült egy átalakítással és ez kiolvasható. A következő részlete a kapcsolásnak a tápegység részt mutatja be. A kapcsolást védjük fordított polaritás ellen egy Schottky diódával, azért ilyet választottam, mert lényegesen kisebb a maradékfeszültsége, mint a hagyományos diódáknak és ez illeszkedik a feszültség regulátorhoz, ami szintén kis feszültség esik. A feszültség regulátor után külön választottuk az analóg illetve a digitális táplálást és az analóg és digitális földet. A következő kapcsolás részlet a műszererősítő, 7
ez a rész felelős azért, hogy a mikrokontroller egy analóg értéket is kapjon és abból a saját A/D átalakítójával képezzen digitális értéket. Mivel kb. 2,5V-os analóg referencia jelet szolgáltatunk a mikrokontrollernek így nincs szükség nagy erősítésre, az erősítést RV2-es potenciométerrel lehet pontosan beállítani. A következő kapcsolásrészleten pedig a külső A/D átalakító kapcsolása látható, amit majdnem teljesen az ajánlott kapcsolás szerint kötöttük be, annyi különbség van, hogy a referencia feszültséget, egy ellenállás osztóval megfeleztük, így 2,5V lesz a referencia feszültség. Az A/D átalakító rendelkezik beépített oszcillátorral, ám ez túl pontatlan ahhoz, hogy használjuk a hálózati feszültség által keltet zavarok elnyomására beépített szűrőt, így külső oszcillátort csatoltunk hozzá.
6. ábra, kapcsolási rajz
Nyomtatott áramkör: A 7. ábrán látható egy előzetes verziója a NYÁK tervnek, ez ebben a félévben nem lett elkészítve, ez csak egy kiindulási alap a következő félévi munkához. A NYÁK terv úgy lett megtervezve, hogy a bal oldalán helyezkedjen el az a rész, ahol csatlakozunk a mérleg modulhoz és elkezdjük az adatok feldolgozását. A Jobb oldalon lévő csatlakozón küldjük tovább az adatokat a mikrokontroller felé. A NYÁK felső részén található a tápegység rész. A 0 Ohm-os ellenállások csak szemléltetésnek maradtak benne a NYÁK tervnek ebben a verziójában. A jobb zavartűrés miatt a nyákot még felületi fémezéssel is el kell majd látni a későbbiekben, ez majd akkor lesz lényeges, ha már a NYÁK terv többi része fix.
8
7. ábra, nyákterv
LabVIEW alkalmazás blokk diagramja: A 8. ábrán látható a LabVIEW-val készült alkalmazás blokk diagramja. Az 1-es számmal jelölt helyen, egy végtelen ciklusban maraduk, amíg meg nem nyomjuk a „START” gombot. A „START” gomb megnyomása előtt kell beállítanunk, hogy hogy melyik portonra csatlakozik az Arduino panelünk. Miután megnyomtuk a „START” gombot átlépünk a 2. ponthoz, amikor inicializáljuk a kommunikációt az Arduino panellal. Az inicializálásnál beállítjuk, hogy 9600 Baud-os sebességgel kommunikálunk, 8 adatbitet küldünk, nincs paritásbit és 1 stopbit van. Az inicializálás timeout-ja 10 másodperc, beállítottuk, megadtuk, hogy az üzeneteket \CR \LF karakterekkel zárjuk le. Ezután átlépünk a 3. ponthoz. Az első 3 pont szigorúan szekvenciálisan követi egymást, nem lehet egyiket se kihagyni és nem futhat velük párhuzamosan semmi. A 3. pontban létrehozunk egy 1024 double méretű tömböt, amiben a grafikonon megjelenített adatokat fogjuk tárolni. Ezt a tömböt is cirkuláris pufferként fogjuk használni. Erre a tömbre azért van szükség, hogy meg tudjuk mondani a grafikonon látható minimum és maximum értéket meg tudjuk mondani, illetve a tömeg-A/D értékpárokhoz megadásokhoz is ezt használjuk. A 4. pontban egy CASE szerkezet látható, ennek a segítségével küldjük ki az utasításokat az Arduino panel számára. Az 5. pontban jelezzük ki, illetve választjuk ki a tömbből a maximum és minimum értékeket. A 6. pontban látható a logikai, ami a lenyomott gombokból meghatározza, hogy milyen int értéket adjon a 4. pontban tárgyalt CASE szerkezetnek. A 7. pontban látható a beérkezett információ számmá konvertálása és megjelenítése a grafikonon.
9
8. ábra, LabVIEW blokk diagram
LabVIEW alkalmazás kezelőfelülete: A 9. ábrán látható a LabVIEW alkalmazás kezelőfelülete. A mért értékek megjelenítésére szolgáló időgrafikon alatt találhatóak a kezelőszervek, a visszajelző lámpák és az adott, illetve minimum és maximum értékek megjelenítésére szolgáló ablakok. A visszejelző lámpák az mutatják meg, hogy amit látunk az az A/D átalakítóból kijövő digitális érték, vagy tömeg érték, aminek a mértékegysége gramm. A másik két jelzőlámpa pedig azt mutatja meg, hogy melyik A/D átalakítót használjuk. Azokban az esetekben, amikor egy legördülő menüből kell kiválasztanunk, hogy milyen értéket szeretnék beállítani a kiválasztás után meg kell nyomnunk az adott legördülő menü alatt lévő „Beállít” gombot, mert csak így fog az adott beállítás érvényre jutni. A tömeg méréséhez két értéket kell megadnunk a minimum és a maximum értéket, amivel terheljük a mérleget. A tömeg értékek megadása ügy működik, hogy ráhelyezzük a súlyt a mérlegre, megvárjuk, míg kb. beáll, a grafikonon már nem látszanak korábbi terhelések eredményei, ezután beírjuk, hogy mekkora sülyt helyeztünk rá és elküldjük az értéket az Arduino panelnek. A „START” gombbal lehet elkezdeni a mérést, a „STOP” gombbal pedig meg lehet állítani a mérést. A „START” gomb megnyomása előtt be kell állítanunk, hogy melyik porton található az Arduino panel. Az „AD Kalibrálás” gombbal lehet a 24-bites A/D átalakító ofszet hibáját kiküszöbölni. A „Relatív nulla” és „Normál nulla” gombokkal lehet a mérté értéket ofszetelni, pl.: ha mérlegen már van egy pohár, akkor vehetjük ezt a nulla értéknek és ehhez képest mérjük a tömeget.
10
9. ábra, a LabVIEW program kezelőfelülete
Források: https://en.wikipedia.org/wiki/Delta-sigma_modulation http://www.nuvoton.com/resource-files/NAU7802%20Data%20Sheet%20V1.7.pdf https://www.arduino.cc/en/Reference/HomePage
11