„USB mérőműszerek használata” változatai közötti eltérés

A Fizipedia wikiből
(Új oldal, tartalma: „== Bevezetés == A mérési gyakorlat célja olyan eszközök megismerése, melyek egyszerű modellként szolgálnak összetett számítógépvezérelt mérőrendszerek…”)
 
(myDAQ programozása)
83. sor: 83. sor:
 
<syntaxhighlight lang=csharp>
 
<syntaxhighlight lang=csharp>
 
  Task InTask = new Task()
 
  Task InTask = new Task()
 +
</syntaxhighlight>
 +
 +
Figyelem: ha a Task-ot több függvényből is el akarjuk érni, például egy gombnyomáshoz rendelt eseményben illetve egy timer eseményben, akkor célszerű globális változóként deklarálnunk! Miután létrehoztuk a Task-ot, a következő feladat beállítanunk, hogy milyen funkcót rendelünk hozzá. Feszültség mérés esetén ez a következőképpen néz ki:
 +
 +
<syntaxhighlight lang=csharp>
 +
InTask.AIChannels.CreateVoltageChannel("Dev1/ai0", "",
 +
                    AITerminalConfiguration.Rse, Minimumvoltage, Maximumvoltage,
 +
                    AIVoltageUnits.Volts);
 +
</syntaxhighlight>
 +
 +
A fenti függvény paraméterei sorrendben: az eszköz terminálja, jelen esetben a "0" jelű analóg bemenet. Ezt követi egy név, ami a Task-ot azonosítja - ez opcionális, ha nem akarjuk használni, akkor írjunk üres string-et, ahogyan a példában is van. A követekező a terminál konfigurációja, a példa esetén Rse = Referenced single ended - azaz a (-) terminál le van földelve. Másik lehetőség a Differential beállítás, ekkor sem a (+) sem a (-) csatlakozó nincs összekötve a földdel, a két csatlakozó közötti feszültség különbséget méri a kártya. Ezt követi a minimum illetve maximum feszültség, amit mérni akarunk. Ez azért szükséges, mert az adatgyűjtő kártya ez alapján állítja be, hogy milyen méréshatárt használjon. Végül meg kell adni, hogy mi a mértékegysége annak amit mérünk, jelen esetben Volt. Ezzel a függvényhívással tehát be is állítottuk az adatgyűjtő kártyát. Ahhoz, hogy adatot olvassunk be még szükségünk lesz egy reader objektumra, amit így hozhatunk létre:
 +
 +
<syntaxhighlight lang=csharp>
 +
reader = new AnalogSingleChannelReader(InTask.Stream);
 +
</syntaxhighlight>
 +
 +
A fenti utasításokat egyszer kell kiadni, amikor elindítjuk a mérést és konfiguráljuk az eszközünket, ezért ezeket célszerű például a mérést indító gombhoz rendelt eseményben elhelyeznünk.
 +
 +
Ahhoz, hogy adatot olvassunk be, a következő függvényt kell meghívjuk:
 +
 +
<syntaxhighlight lang=csharp>
 +
double data = reader.ReadSingleSample( ) ;
 +
</syntaxhighlight>
 +
 +
Ezzel tehát egy adatpontot olvasunk be. Ha timer-t használunk a mérés időzítésére, akkor tehát célszerű ezt a timer eseményen belül elhelyezni.
 +
 +
A mérés leállításakor, miután már nem akarjuk használni a Task-ot, a következő metódussal törölhetjük azt és szabadíthatjuk fel az erőforrásokat:
 +
 +
<syntaxhighlight lang=csharp>
 +
InTask.Dispose();
 
</syntaxhighlight>
 
</syntaxhighlight>
  

A lap 2015. április 15., 19:05-kori változata

Tartalomjegyzék

Bevezetés

A mérési gyakorlat célja olyan eszközök megismerése, melyek egyszerű modellként szolgálnak összetett számítógépvezérelt mérőrendszerekhez. Ezek kezelésén keresztül elsajátíthatóak az automatizált mérésvezérlés és -kiértékelés alapelvei és módszerei.

USB hőmérő

USB homero front.jpg

Az első vizsgált műszer egy a PC-hez USB-n csatlakozó hőmérő, amely -50°C és 125°C között mér 0.0625°C felbontással. Az eszköz lekérdezése standard soros protokollon keresztül történik. A gyakorlat során áttekintjük az utasításkészlet implementálását Microsoft Visual Studio C# környezetben, megvizsgáljuk a grafikus megjelenítés és - további felhasználásra - tárolás kérdéseit, valamint becslést adunk az eszköz különböző jellemzőire.

Segítség a programozáshoz: Példaprogram

Az FT232RL USB-soros átalakító használatához szükséges driver (Virtual Com Port) itt található.


Elektromos felépítés

USB homero blockdiagram.png

Az eszköz blokkvázlata a jobb oldali ábrán látható, három egységet különíthetünk el, melyek a nyomtatott áramköri lapon található három integrált áramkör köré csoportosulnak.

Hőmérő IC

Az érzékelő SOT-23-5 tokozású, MCP9800 típusú áramkör, amely tartalmaz egy félvezető hőmérsékleti szenzort, valamint elvégzi a szükséges analóg-digitális átalakítást: a hőmérsékleti értékek elméletileg a -128°C...+128°C tartományba eshetnek 12 bit felbontással, amely alapján adódik az áramkör 0.0625°C felbontása. A gyakorlatban az eszköz működése csak -50°C és 125°C között garantált. Fontos megjegyezni, hogy a mérés pontossága lényegesen kisebb, mint a digitális felbontás: az adatlap szerint mintegy 1°C hibára számíthatunk a teljes működési tartományban.

Az áramkör egy kétvezetékes, ún.I2C buszon kommunikál a mikrokontrollerrel.

Mikrokontroller

Az Atmel gyártmányú, ATMEGA48 típusú eszköz több feladatot lát el: egyrészt mintegy 500ms időközönként lekérdezi a hőmérő IC-től a hőmérsékletet, másrészt azt binárisról ASCII formátumúvá alakítja, ezzel lehetővé téve, hogy a mérésvezérlő programban közvetlenül felhasználható legyen. A kontroller parancsértelmezőként is funkcionál: a soros porton érkező karaktereket figyelve a megfelelőekre reagál.

A vezérlő további feladata, hogy hardveres hibákra lehetőség szerint reagáljon és értesítse a felhasználót. Esetünkben a hőmérő IC hibás működésére, valamint a soros porti kommunikáció hibájára egy piros LED bekapcsolásával reagál.

Az áramkör a számítógép felé soros (Universal Asynchronous Receiver-Transmitter, UART) porton kommunikál. A felhasznált RxD és TxD vonalak -- a feszültségszintektől eltekintve -- megfelelnek a számítógép RS-232 portjának hasonló kivezetéseinek.

Soros-USB átalakító

Mivel a hardveresen megvalósított soros port egyre ritkább a személyi számítógépeken, egy további egység beépítése vált szükségessé: az FTDI FT232RL típusú áramkör egy összetett USB device IC. Mérőeszközünkben átjárót biztosít a mikrovezérlő soros portja és a számítógép USB portja között. A gyártó honlapjáról letölthető driver segítségével az eszköz teljesen transzparensen működik, az operációs rendszer számára egy újabb - virtuális - soros portként látszik (COMx), és a Visual Studio SerialPort osztálya segítségével kezelhető.

Az eszköz a kommunikációt egy kék LED villogtatásával jelzi.

Parancskészlet

A mérőeszköznek az alábbi két egykarakteres utasítása van, melyet whitespace karakterrel (újsor, space, Tab) kell lezárni. A parancsértelmezés nem érzékeny a kis- és nagybetűkre.

  • Read: A hőmérő visszaadja az aktuális mért hőmérsékletet 4 tizedesjegy felbontással.
  • Info: A műszer szoftverének adatait adja vissza.

Soros kommunikáció beállításai

A számítógépen a soros portot a következő beállításokkal kell használni. Az alábbiakat a SerialPort osztály tulajdonságai segítségével állíthatjuk be.

  • Baud rate=38400
  • Data bits=8
  • Stop bits=1
  • Paritás nincs.

Feladatok

  1. Készítsünk mérőprogramot, amely megadott időközönként beolvassa a hőmérsékleti adatokat a műszertől, ezeket grafikusan ábrázolja egy ZedGraphControl objektum segítségével, és elmenti egy szöveges file-ba! A mérőprogram felületén TextBox segítségével jelenítsük meg az aktuális beolvasott értéket, valamint legyen lehetőség a mérési időköz változtatására!
  2. Egy 10 hosszúságú mozgóátlag segítségével simítsuk ki a nyers adatokat: Számoljuk ki és ábrázoljuk a legutóbbi 10 beérkezett adat átlagát! Bizonyítsuk be, hogy az átlagolás jó hatással van az adatok szórására: Számítsuk ki és ábrázoljuk a nyers, valamint az átlagolt adatok szórását! Előbbihez felhasználhatjuk az előbbi mozgóátlagban található adatokat, az utóbbihoz a legutóbbi átlagolt adatokból is hozzunk létre egy 10 elemű tömböt!
  3. hőmérő felmelegítésével, majd lehűtésével becsüljük meg az eszköz időállandóját! Ehhez feltehetjük, hogy a hőmérő hőfokkülönbsége a környezethez képest ΔT(t)=ΔT0exp(-t/τ) függvény szerint változik. Különbözik-e az eredmény, ha a nyers, illetve a simított adatsorral dolgozunk?

NI myDAQ adatgyűjtő kártya

MyDAQ photo.jpg

A második feladat során a National Instruments cég által, kifejezetten oktatási célra gyártott NI myDAQ típusú mérőkártyát használjuk. A mérőkártya USB porton keresztül vezérelhető, funkcióit Visual C# környezetben a NI DAQmx driver segítségével érhetjük el, ez ingyenesen letölthető a következő linken: DAQmx. A kártya működését az NI Measurement & Automation Explorer (MAX) program segítségével ellenőrizhetjük. A mérés során egy GMR szenzor jelét mintavételező programot készítünk.

Óriás mágneses ellenállás jelensége

Giga6.png


A gigantikus mágneses ellenállás jelenségéről a "Haladó Fizika Laboratórium 2" c. tárgy Gigantikus mágneses ellenállás vizsgálata mérése során tanulhattok részletesen. A jelenség megértéséhez képzeljük el a jobboldali ábrán feltüntetett elrendezést. Vegyünk két mágneses vékonyréteget, melyeket egy vékony, nemmágneses réteg választ el. A felhasznált anyagok és a nemmágneses réteg vastagságának megfelelő megválasztásával elérhető, hogy a két mágneses vékonyréteg között egy ún. antiferromágneses csatolás alakul ki, magyarul külső mágneses tér hiányában a két réteg mágnesezettsége egymással ellentétes irányú lesz. Erre az elrendezésre megfelelő nagyságú külső mágneses teret kapcsolva a két réteg mágnesezettségét beforgathatjuk egymással párhuzamos irányba. A mágnesezettség párhuzamos (parallel, P) állása esetén az elrendezés ellenállása lényegesen kisebb, mint az ellentétes (antiparallel, AP) beállás esetén, így külső mágneses tér alkalmazásával jelentős ellenállás-csökkenést tudunk elérni. Ezt a jelenséget hívjuk óriás mágneses ellenállásnak. A jelenséget a következő egyszerű modellel szemléltethetjük: Bontsuk fel az elektromos áramot fel illetve le spinű elektronokra. A le spinű elektronok egy felfelé álló mágnesezettségű rétegen lényegesen nehezebben haladnak át, mint egy lefelé álló mágnesezettségűn. Jelöljük egy mágneses réteg ellenállását egy bizonyos spinű elektronokra nézve \setbox0\hbox{$R_1$}% \message{//depth:\the\dp0//}% \box0%-el ha a réteg mágnesezettségi iránya megegyezik az elektronok spinirányával, illetve \setbox0\hbox{$R_2$}% \message{//depth:\the\dp0//}% \box0%-vel, ha a mágnesezettség iránya ellentétes az elektronok spinirányával. A fel és le spinű elektronokat független áramcsatornaként kezelve parallel és antiparallel mágnesezettségű rétegek eredő ellenállása az alsó ábrán szemléltetett helyettesítő képpel modellezhető.

Giga7.png

Fejezzük ki a fenti két ellenállást \setbox0\hbox{$R_1 = R+\Delta R, R_2=R-\Delta R$}% \message{//depth:\the\dp0//}% \box0% alakban. Így a parallel és antiparallel beállás esetén az ellenállás:

\[ R_{AP} {{=}} \frac{R_1 + R_2}{2} {{=}}R \ \  ,\ \  R_p {{=}} \frac{2R_1R_2}{R_1 + R_2} {{=}}R- \frac{\Delta R^2}{R} < R_{AP} \]

Azaz a P elrendezés ellenállása valóban kisebb mint az AP elrendezésé.

GMR szenzor

A mérés keretében egy olyan integrált áramkört fogunk használni, amely 4 darab GMR ellenállás híd kapcsolásával valósít meg egy mágneses szenzort. Az eszköz adatlapját itt találhatjátok:
GMR sensor.png
. A jobboldali ábrán láthatjátok az eszköz kapcsolását. Mágneses tér nélkül mind a négy ellenállás értéke megegyezik, a kimenetek közötti feszültség különbség zérus. Ha mágneses térbe tesszük az eszközt, az árnyékolatlan GMR-oknak lecsökken az ellenállása, így az OUT- láb a földhöz, míg az OUT+ láb a tápfeszültséghez kerül közelebb, így a két kimenet között feszültség különbséget mérhetünk. A mért feszültség különbség kis mágneses tér esetén arányos a mágneses indukció nagyságával, majd telítésbe megy. Az eszköz tápfeszültség (V+) lábát kössük a myDAQ +5V fix kimenetére valamint a V- lábat kössük a GND csatlakozóra. Végül az OUT+/- lábakat kössük a myDAQ egyik analóg bemenetének +/- termináljaihoz.

myDAQ programozása

Az adatgyűjtő kártya programozásához a DAQmx driver API (Application Programming Interface) rutinjait fogjuk használni. Ezeket a függvényekkel érhetjük el az adatgyűjtő kártya különböző funkcióit. Ahhoz, hogy mérni tudjunk, először megfelelően konfigurálnunk kell az eszközt. Minden egyes funkcióhoz (pl. feszültség mérés, feszültség kiadása) amit használni akarunk a mérés során egy úgynevezett Task-ot kell létrehoznunk:

 Task InTask = new Task()

Figyelem: ha a Task-ot több függvényből is el akarjuk érni, például egy gombnyomáshoz rendelt eseményben illetve egy timer eseményben, akkor célszerű globális változóként deklarálnunk! Miután létrehoztuk a Task-ot, a következő feladat beállítanunk, hogy milyen funkcót rendelünk hozzá. Feszültség mérés esetén ez a következőképpen néz ki:

 InTask.AIChannels.CreateVoltageChannel("Dev1/ai0", "",
                    AITerminalConfiguration.Rse, Minimumvoltage, Maximumvoltage,
                    AIVoltageUnits.Volts);
A fenti függvény paraméterei sorrendben: az eszköz terminálja, jelen esetben a "0" jelű analóg bemenet. Ezt követi egy név, ami a Task-ot azonosítja - ez opcionális, ha nem akarjuk használni, akkor írjunk üres string-et, ahogyan a példában is van. A követekező a terminál konfigurációja, a példa esetén Rse = Referenced single ended - azaz a (-) terminál le van földelve. Másik lehetőség a Differential beállítás, ekkor sem a (+) sem a (-) csatlakozó nincs összekötve a földdel, a két csatlakozó közötti feszültség különbséget méri a kártya. Ezt követi a minimum illetve maximum feszültség, amit mérni akarunk. Ez azért szükséges, mert az adatgyűjtő kártya ez alapján állítja be, hogy milyen méréshatárt használjon. Végül meg kell adni, hogy mi a mértékegysége annak amit mérünk, jelen esetben Volt. Ezzel a függvényhívással tehát be is állítottuk az adatgyűjtő kártyát. Ahhoz, hogy adatot olvassunk be még szükségünk lesz egy reader objektumra, amit így hozhatunk létre:
 reader = new AnalogSingleChannelReader(InTask.Stream);

A fenti utasításokat egyszer kell kiadni, amikor elindítjuk a mérést és konfiguráljuk az eszközünket, ezért ezeket célszerű például a mérést indító gombhoz rendelt eseményben elhelyeznünk.

Ahhoz, hogy adatot olvassunk be, a következő függvényt kell meghívjuk:

 double data = reader.ReadSingleSample( ) ;

Ezzel tehát egy adatpontot olvasunk be. Ha timer-t használunk a mérés időzítésére, akkor tehát célszerű ezt a timer eseményen belül elhelyezni.

A mérés leállításakor, miután már nem akarjuk használni a Task-ot, a következő metódussal törölhetjük azt és szabadíthatjuk fel az erőforrásokat:

 InTask.Dispose();

Feladatok

  1. Készítsünk mérőprogramot, amely megadott időközönként beolvassa a hőmérsékleti adatokat a műszertől, ezeket grafikusan ábrázolja egy ZedGraphControl objektum segítségével, és elmenti egy szöveges file-ba! A mérőprogram felületén TextBox segítségével jelenítsük meg az aktuális beolvasott értéket, valamint legyen lehetőség a mérési időköz változtatására!
  2. Vizsgáljuk meg a GMR effektus hőmérséklet függését! Egy mágnest a szenzorhoz közel helyezve vigyük telítésbe a szenzort és jegyezzük fel a mért feszültség különbséget valamint a szoba hőmérsékletét. Ismételjük meg a mérést miután a szenzort folyékony nitrogénnel lehűtöttük.


Jegyzőkönyv készítése

A jegyzőkönyv szerepe -- hasonlóan a korábbi laborokhoz -- a mérési feladat megoldásának dokumentálása, valamint a saját eredmények bemutatása. Ennek megfelelően tartalmaznia kell a vizsgált jelenség vagy feladat rövid összefoglalását, részletesen be kell mutatnia a méréshez felhasznált eszközöket, mérőrendszert. A jegyzőkönyv fontos része az adatok kiértékelése és diszkussziója, azaz a nyers adatok további analízise is.

A jegyzőkönyvhöz külön, betömörítve csatoljuk a program forráskódját!