virtualni_voltmetar

Upload: ilet09

Post on 13-Oct-2015

14 views

Category:

Documents


1 download

DESCRIPTION

voltmetar

TRANSCRIPT

Zavrni rad

Kvaliteta usluge u OpenBSD-u

Vjeba iz elektronike i virtualne instrumentacije

VIRTUALNI VOLTMETARNastavnik:

Ivo Mateljan

SADRAJ

11Funkcija voltmetra i definicija efektivne vrijednosti

42Virtualni voltmetar

52.1Prijem signala pomou zvune kartice i teorem uzorkovanja

62.2Pohrana podataka u kruni meuspremnik

92.3Eksponencijalno usrednjavanje signala

112.4Prikaz vrne i efektivne vriijedosti signala

133Koritenje virtualnog voltmetra

1 Funkcija voltmetra i definicija efektivne vrijednostiVoltmetar je ureaj koji mjeri razliku elektrinog potencijala (napon) izmeu dviju razliitih toaka u elektrinom krugu. Voltmetar po dogovoru prikazuje efektivnu vrijednost sinusnog signala, a ako moe izmjeriti efektivnu vrijednost signala proizvoljnog valnog oblika naziva se voltmetar efektivne vrijedbnosti (True RMS Voltmeter).

Slika 2.1 Nekoliko vrsta voltmetara s analognom i digitalnom skalomEfektivna vrijednost signala v(t) se rauna prema izrazu:

(2.1)

Analizirajmo najprije sluaj da signal ima oblik sinusoide:

(2.2)gdje je t vrijeme, Vp vrna vrijednost napona, je kruna frekvencija a fazni kut.

Izmjenini naponski signal iz relacije 2.1 prikazan je na slici 2.2.

Slika 2.2 izmjenini sinusoidalni naponski signal

Efektivna vrijednost se dobije prema izrazu (2.1):

(2.3)

Za peridoini signal frekvencije f, ako integriramo u vremenu T= k/f, (k=1,2,3,..) dobije se:

(2.4)i to je uobiajena definicija efektivne vrijednosti.

Problem nastaje pri realiziranju instrumenta koji mjeri efektivnu vrijednost, jer u praksi niti korisnik niti instrument neznaju period signala, takoer neznaju valni oblik signala. Analiza greke zbog konanog vremena integriranjaTrai se ovisnost efektivne vrijednosti sinusoidnog signala zadanog izrazom (2.3) i vremena integriranja T. Uvodi se supstitucija:

(2.5)

Uvrtavanjem izraza (2.5) u (2.5) dobije se:

(2.10)

Prvi lan pokazuje definicijsku vrijednost efektivne vrijednosti, koja se dobije kada je f =1/T Doprinos kosinusnog lana tada je jednak nuli. Ukoliko f 1/T kosinusni lan nije jednak nuli i on predstavlja greku mjerenja. Ona je manja to je vrijeme integriranja vee (tj ako se integriranjem obuhvati vei broj perioda sinusoide). Maksimalna vrijednost relativne greke iznosi:

Integriranje signala u vremenu T, koje zbog iznesenog razloga mora biti veliko, u digitalnom voltmetru zahtijeva u svakom trenutku pamenje i integriranje velikog broja uzoraka prethodne vrijednosti signala. To nije efikasno rjeenje pa se u praksi za integriranje koriste nisko-propusni RC filtri (ili njihovi ekvivalentni digitalni oblik koji se naziva eksponencijalni integrator) . Blok shema voltmetra je kao na slici 2.4.

Slika 2.4 Princip rada analognog voltmetra

Prvi stupanj vri kvadriranje signala, a drugi stupanj je integrator kojem impulsni odziv ima oblika eksponencijalne funkcije exp(-t/T). Prema teoremu konvolucije dobije se:

(2.12)Na ovaj nain se prati promjena efektivne vrijednosti u vremenu. Uobiajeno se u audio tehnici koriste vremenske konstante od 1s ili 125ms, a ekvivalentni integratori se nazivaju "slow" i "fast" integratori.2 Virtualni voltmetarKod virtualnih instrumenata programski kod zamjenjuje sklopovska rjeenja kod klasinih instrumenata, omoguavajui pritom analizu, obradu i prikaz vie razliitih mjerenih veliina na postojeem raunalnom sustavu bez potrebe za nabavom dediciranog sklopovlja. Program virtualnog voltmetra treba obavljati funkciju analognog voltmetra sa eksponencijalnim usrednjavanjem. Ostvaruje ga se elementima prikazanim na slici 3.1.Na ulazu u zvunu karticu vri se A/D konverzija signala. Virtualni voltmetar preuzima podatke sa zvune kartice i privremeno ih pohranjuje u kruni meuspremnik. Podaci se kvadriraju, idu na obradu u eksponencijalni integrator (eng. exponential averager), korjenuju i prikazuju se na zaslonu raunala (blok shema na slici 3.1).

Slika 3.1 Princip rada virtualnog voltmetraVirtualni voltmetar je realiziran u programskom jeziku C++ i namijenjen koritenju na raunalima s Windows operativnim sustavima. Za prikaz korisnikog suelja koristi se skup programskih biblioteka MFC napisan u C++ jeziku.MFC [4] ili Microsoft Foundation Classes je programska biblioteka koja obuhvaa dijelove Windows API-ja u C++ klasama. Klase su definiranje za kontroliranje i upravljanje mnogih objekata i za predefinirane uobiajene i windows kontrole. MFC koristi C++ makroe za upravljanje porukama (eng. Windows message-handling) putem mapa poruka (eng. Message Maps), iznimke, identifikaciju run-time tipa (eng. RTTI Run-Time Type Identification), serijalizaciju i dinamiko instanciranje klasa. MFC nudi konkretnu strukturu za razliite vizualne C++ alate to omoguuje ureivanje i manipulaciju koda bez parsiranja punog jezika.Program je napisan koritenjem programskog paketa Microsoft Visual Studio 2008 uz koritenje MFC biblioteka. Samo suelje je izraeno koritenjem grafikog alata za izradu suelja unutar Visual Studija.2.1 Prijem signala pomou zvune kartice i teorem uzorkovanjaZvuna kartica [5] (slika 3.1) je raunalna komponenta koja se koristi za obradu zvuka i njegovu pretvorbu iz analognog oblika u digitalni i obratno. Sastoji se od najmanje etiri dijela: ulazno-izlazni konektori - omoguavaju spajanje audio opreme na zvunu karticu za snimanje i reprodukciju zvuka, mikser - ureaj koji spaja analogne signale i prosljeuje ih na AD konverter, AD/DA konverter - najee 16/24-bitni konverter visoke preciznosti sa najveom stopom uzorkovanja do 44,1 ili 48 kHz,

fiziko suelje - suelje kojim se zvuna kartica povezuje sa raunalom. Moe biti izvedeno kao PCI, PCI-E ili USB suelje.

Slika 3.2 Zvuna karticaZvuna kartica signal s linijskog ulaza uzorkuje i kvantizira PCM metodom koristei odabranu razluivost i frekvenciju uzorkovanja i prosljeuje ga programu na koritenje.Digitalni prijenos informacija i digitalna obrada signala zahtijevaju da signali budu prvo dohvaeni na raunalu. Problem kod koritenja zvune kartice za dohvat signala je nemogunost mjerenja istosmjernih napona, i fiksna ulazna osjetljivost koja je najee oko 1 V.

Za komunikaciju sa sklopovljem zvune kartice u Windows operativnim sustavima koriste se sljedee funkcije (tzv. WinMM API): waveInGetDevCaps() vraa podatke o svim zvunim karticama u raunalu i njihovim mogunostima.

waveInOpen() pristupa zvunoj kartici i postavlja je u mod za snimanje podataka. Prosljeuje podatke o formatu i frekvenciji uzorkovanja i pokaziva na korisniki definiranu callback funkciju waveInProc() koja vri prijem podataka sa zvune kartice i prosljeuje ih u meuspremnik waveInPrepareHeader() priprema meuspremnik u koji e zvuna kartica zapisati podatke. waveInAddBuffer() alje zvunoj kartici meuspremnik pripremljen funkcijom waveInPrepareHeader(). waveInClose() prekida snimanje i zatvara komunikaciju sa zvunom karticom.

Navedene funkcije, zajedno s potrebnim strukturama podataka i meuspremnicima, su enkapsulirane u klasi MMRecord koja se koristi u programu virtualnog voltmetra za pristup zvunoj kartici. Klasa MMRecord postavlja karticu u mod snimanja, postavlja kvalitetu uzorkovanja, postavlja veliinu meuspremnika, vri prijenos podataka iz meuspremnika zvune kartice u kruni meuspremnik pozivanjem funkcije ProcessMMBuffer() i na kraju upotrebe, zatvara komunikaciju sa zvunom karticom.typedef BOOL (*ProcessBufferFn)(WAVEHDR *pwh, WAVEFORMATEX *pWaveFormat);

class MMRecord

{

public:

MMRecord();

virtual ~MMRecord();

void SetRecDevices(int irec = WAVE_MAPPER){ m_RecSndCard = irec; }

/* recording part */

int GetRecordDevices(SndDevArray * devlist);

int RecOpen(WORD wChannels,WORD wBitsPerSample,DWORD dwSampleRate,

ProcessBufferFn fnProcess, int nBufferLength=2048);

int RecClose( void);

int RecStart( void);

int RecStop( void);

BOOL IsRecording() { return m_Recording; };

BOOL IsRecDeviceOpened() { return m_RecDeviceOpen; };

BOOL IsFormatSupported(WAVEFORMATEX wfEx, UINT nDev=WAVE_MAPPER);

void ProcessRecBuffer(WAVEHDR *pwh);

HANDLE m_RecEvent;

LPWAVEHDR m_lpWaveHdr;

protected:

WAVEFORMATEX m_WaveFormat;

DWORD m_dwBufferSize;

/* recording part */

BOOL m_Recording;

BOOL m_RecDeviceOpen;

HANDLE m_RecThread;

int m_RecSndCard;

GLOBALHANDLE m_hWaveInHdr[MAXNUMOFBUFFER];

LPWAVEHDR m_lpWaveInHdr[MAXNUMOFBUFFER];

GLOBALHANDLE m_hInBuffer[MAXNUMOFBUFFER];

LPBYTE m_lpInBuffer [MAXNUMOFBUFFER];

HWAVEIN m_hWaveIn;

void * m_pSoundBuffer[MAXNUMOFBUFFER];

void* m_lpData;

ProcessBufferFn m_fnProcessBuffer;

WAVECLASS m_waveClass;

};

Komande za rad voltmetra se realiziraju u klasi CvoltmeterDlg koja kontrolira dogaaje u glavnom Dijalog-prozoru.Snimanje signala zapoima naredbama (u funkciji OnBnClickedCheckRecord() koju aktivira komanda klika na dugme Start). To sunaredbe:// postavi id zvune kartice

SoundAcq.SetRecDevices(m_soundcard_id);

//Otvori zvuni kanal i postavi funkciju za prijenos podataka // u cirkularni buffer

SoundAcq.RecOpen(2,16,44100,ProcessMMBuffer,4096);

//Zaponi prijem

SoundAcq.RecStart();

Funkciju ProcessMMBuffer koristi klasa MMRecord za prijenos podataka iz spremnika multimedije u krune cirkularne meuspremnike za lijevi i desni kanal: CBufLeft i CBufRight.BOOL ProcessMMBuffer( LPWAVEHDR pwh, WAVEFORMATEX *pWF)

{

int len = pwh->dwBufferLength;

short * data = (short *)pwh->lpData;

int numsamples = len /pWF->nChannels /(pWF->wBitsPerSample/8);

float L,R;

m_peakleft = 0;

m_peakright = 0;

if(pWF->nChannels ==1)

return 0;

else {

for(int i=0; im_hWnd, MM_BUFFER_ACQUIRED, 0,0);

return FALSE;

}

Kada se prenesu podaci u cirkularne meuspremnike, alje se poruka glavnom prozoru da je izvren prijem bloka podataka. Komanda MM_BUFFER_ACQUIRED aktivira izvrenje funkcije

LRESULT CvoltmeterDlg::OnRecBufferReady(WPARAM wParam, LPARAM lParam);

u kojoj se vri eksponencijalno usrednjavanje signala i alje poruka da se prikae efektivna vrijednost.

2.2 Pohrana podataka u kruni meuspremnikKada zvuna kartica izvri A/D pretvorbu podatka, prosljeuje ih iz svojih meuspremnika u kruni meuspremnik (eng. Circular Buffer).Kruni ili prstenasti meuspremnik je struktura podataka koja koristi spremnik podataka fiksne veliine na nain da su kraj i poetak meuspremnika povezani. U ovoj strukturi podataka, podaci koji su prvi uli, izlaze prvi. Kruni meuspremnik se koristi kao meuspremnik za podatke koji se stalno osvjeavaju te kada se eli ograniiti potronja memorije uz doputanje prepisivanja preko starih podataka. Koncept krunog meuspremnika prikazan je na slici.

Slika 3.5 Kruni meuspremnikKruni meuspremnik se realizira [7] pomou niza, kojem dva indeksa: back i front, oznaavaju mjesta unosa (back) i dobave (front) iz reda.Poetno je red prazan front = back = 0 Nakon operacija put poveava se indeks back za 1: Operacija get() dobavlja element kojem je indeks jednak front, a zatim se front poveava za jedan. to napraviti kada, nakon viestrukog unosa, back postane jednak krajnjem indeksu niza,

Ideja je da se back ponovo postavi na poetak niza (takvi meuspremnici se nazivaju kruni meuspremnici). Time se maksimalno iskoritava prostor meuspremnika za red. Uoimo da je red popunjen kada je (back+1) % arraysize == front Kruni meuspremnik u programu Virtualni voltmetar realiziran je kao klasa CircAcqBuffer. Neke od funkcija klase CircAcqBuffer su:

Init() postavlja veliinu krunog meuspremnika. Write() zapisuje podatke u meuspremnik. Ova funkcija je preoptereena i moe zapisivati po jedan podatak ili niz podataka. Poveava pokaziva za upis podataka. Read() ita podatke iz meuspremnika. Ova funkcija je preoptereena i moe itati po jedan podatak ili niz podataka. Poveava pokaziva za itanje podataka. AvailableForRead() vraa broj uzoraka koji se trenutno nalaze u meuspremniku. AvailForWrite() vraa broj slobodnih uzoraka u meuspremniku. GetBufferLength() vraa veliinu meuspremnika. GetBlockLength() vraa veliinu uzorka (u bajtima).Virtualni voltmetar koristi dva odvojena kruna meuspremnika za prijem signala na lijevom i desnom kanalu. Kreiramo dva meuspremnika naredbom

CircAcqBuffer CBufLeft, CBufRight;Veliinu meuspremnika odreujemo naredbama:

CBufLeft.Init(4096, 4);

CBufRight.Init(4096, 4);Veliina meuspremnika ovisi o odabranoj razluivosti, frekvenciji uzorkovanja i eljenom vremenskom periodu.2.3 Eksponencijalno usrednjavanje signala

Nakon to kruni meuspremnik zaprimi podatke poalje se poruka MM_BUFFER_ACQUIRED u glavni prozor, koji poziva funkciju OnRecBufferReady u kojoj se podaci redom kvadriraju, integriraju i korjenuju pozivanjem odgovarajuih funkcija.Integrator ili nisko-propusni filtar je RC sklop [8] (slika 3.6) koji ima svojstva proputanja niskih frekvencija, a zapiranja visokih.

Slika 3.6 RC integrator

Odziv RC niskopropusnog filtra (integratora) odreen je diferencijalnom jednadbom:

(3.6)Gdje je T = RC vremenska konstanta integratora.

Odredit emo prijenosnu funkciju ekvivalentnog diskretnog filtra, pretvorbom diferencijalne jednadbe u jednadbu diferencija:

(3.7)iz koje se dalje dobije izraz:

(3.8a)

(3.8b)Primjenom z-transformacije dobije se prijenosna funkcija

(3.10)koja predstavlja nisko-propusni filtar 1. reda u diskretnom podruju.

Ovaj tip filtra se koristi u analognoj i digitalnoj mjernoj tehnici za "eksponencijano" usrednjavanje signala x(t). On daje trend kojim se eksponencijalno pribliava izlazna vrijednost, a veu teinu imaju zadnji uzorci signala.

U virtualnom voltmetru, integrator je definiran u klasi ExpAverager kao funkcija navedena u izrazu 3.8b. Neke od funkcija ExpAveragera su:

Average() rauna srednju eksponencijalnu usrednjenu vrijednost. AverageSquare () rauna srednju kvadratnu eksponencijalno usrednjenu vrijednost. Reset() postavlja vrijednost averagera na nulu. GetAverage() vraa vrijednost averagera.

U programu su definirana dva lana klase ExpAverager,

ExpAverager m_avgLeft;

ExpAverager m_avgRight;U njih se vri zapisivanje podataka iz krunog meuspremnika, kvadriranje podataka i eksponencijalno usrednjavanje, naredbom:

L = m_avgLeft.AverageSquare(CBufLeft.Read());

R = m_avgRight.AverageSquare(CBufRight.Read());L i R slue za privremenu pohranu trenutnih vrijednosti. Podaci se potom korjenuju i pohranjuju u varijable m_vLeft i m_vRight za prikaz na ekranu;

m_vLeft = sqrt(L);

m_vRight = sqrt(R);Vremenska konstanta integriranje je, prema predodreenoj vrijednosti, jednaka 1s.2.4 Prikaz vrne i efektivne vriijedosti signalaNakon to je obrada signala zavrena, podaci se alje na prikaz na ekranu. Za prikaz se koriste dvije klase, CPeakMeter i CDigiStatic [9].Klasa CPeakMeter predstavlja peakmeter. Peakmeter je vizualni instrument koji prikazuje trenutnu razinu audio signala koji prolazi kroz njega. Pojam peak (vrno) oznaava mogunost instrumenta da u bilo kojem trenutku uvijek prikazuje najveu razinu signala. Klasa CPeakMeter prikazuje najveu trenutnu vrijednost signala u logaritamskoj skali, gdje je nulom predstavljena najvea razina signala, a najniom negativnom vrijednou najnia razina signala. Mogu je odabir horizontalnog i vertikalnog prikaza peakmetera (slika 3.7).

Slika 3.7 Horizontalni prikaz peakmeteraPoto peakmeter zahtijeva trenutnu vrijednost signala, za prikaz signala putem klase CPeakMeter nije potrebno usrednjavati signal. Najvanije funkcije klase CPeakMeter su: Init() postavlja orijentaciju peakmetera, rang u decibelima. Refresh() osvjeava prikaz peakmetera.Klasu implementiramo na sljedei nain. U programu definiramo varijablu klase CPeakMeter u koju se pohranjuje trenutna vrijednost signalaCPeakMeter m_peakmeter; Potom definiramo svojstva klase (inkrement, rang u decibelima i orijentaciju):m_peakmeter.Init( 0.01, 90,PEAK_VER_DIR);Varijabla m_peakmeter prima podatke u isto vrijeme kada se podaci iz meuspremnika zvune kartice prenose u kruni meuspremnikKlasa CDigiStatic simulira LCD prikaz podataka. Ova klasa je derivat klase CStatic i vrijednosti prikazuje pomou linija i Beizerovih krivulja.Funkcije koje se mogu koristiti: SetText() postavlja tekstualni sadraj kontrole. Format() formatira i pohranjuje niz znakova i vrijednosti u CDigiStatic. SetColor() postavlja boju znamenki. SetDrawImmediately() trenutno osvjeava prikaz na ekranu. SetBkColor() postavlja boju pozadine. ModifyDigiStyle() postavlja stil kontrole.Klasu implementiramo na sljedei nain. U programu definiramo varijablu klase CDigiStatic u koju se pohranjuje trenutna vrijednost signala:

CDigiStatic m_vPanelLeft;

CDigiStatic m_vPanelRight;Postavljaju se poetne vrijednosti klase (boja, stil):

m_vPanelLeft.ModifyDigiStyle(CDigiStatic::DS_NO_OFF,CDigiStatic::DS_SOFT);

m_vPanelRight.ModifyDigiStyle(CDigiStatic::DS_NO_OFF,CDigiStatic::DS_SOFT);

m_vPanelLeft.SetColor(CDGREEN,CLGREEN);

m_vPanelRight.SetColor(CDGREEN,CLGREEN);

m_vPanelLeft.SetBkColor(CDGREEN);

m_vPanelRight.SetBkColor(CDGREEN);Pozivom funkcije RefreshPanels() sadraj varijabli m_vLeft i m_vRight se mnoi sa ulaznim osjetljivostima gCalValLeft i gCalValRight i zapisuje u m_vPanelLeft i m_vPanelRight:

CString s,val;

m_insenl.GetWindowText(val); gCalValLeft = atof(((const char *)(LPCTSTR)val));

m_insenr.GetWindowText(val); gCalValRight = atof(((const char *)(LPCTSTR)val));

s.Format("%f", m_vLeft*gCalValLeft); m_vPanelLeft.SetText(s+" V");

s.Format("%f", m_vRight*gCalValRight); m_vPanelRight.SetText(s+" V");i podaci se prikazuju na LCD-u u programu.3 Koritenje virtualnog voltmetraPokretanjem programa virtualnog voltmetra otvori se dijalog prikazan na slici 4.1

Slika 4.1 Virtualni voltmetarPoto je cilj napraviti jednostavan i pregledan program sve funkcije potrebne za mjerenje se nalaze u glavnom prozoru. Program prikazuje dva LCD-a za prikaz prave efektivne vrijednosti i vertikalno postavljen peakmeter za prikaz trenutne vrijednosti signala u logaritamskoj skali. Omoguen je odabir zvune kartice, putem padajueg izbornika, u sluaju da raunalo ima vie zvunih kartica. Posjeduje dva polja su za unos ulazne naponske osjetljivosti pojedinog ulaza sa zvune kartice. Mjerenje zapoinje pritiskom na tipku Start. Ulaznu osjetljivost je mogue mijenjati tijekom rada programa.

32

_1420294839.unknown

_1420295408.unknown

_1420307783.unknown

_1420307038.unknown

_1420295030.unknown

_1314519372.unknown

_1420275394.unknown

_1314556738.unknown

_1314170510.unknown

_1314170733.unknown

_1314431549.unknown

_1314170568.unknown

_1314170381.unknown