ANVÄNDARHANDLEDNING FÖR MÄTNING AV ACCELERATION HOS BILBANEBIL Per-Emil Eliasson, Claes Fälth, Manne Gustafson, Andreas Gustafsson 6 juni 2003
INNEHÅLL Industriprojekt ISY Innehåll 1 Inledning 2 2 Allmänt om systemet 3 3 Mjukvara 3 3.1 Funktioner i MATLAB....................... 3 4 Felkällor 5 4.1 Accelerometer........................... 5 4.2 Kommunikation.......................... 6 4.3 Databehandling.......................... 7 A Bilagor 8 A.1 MATLAB-kod............................ 8 A.1.1 make_getaccelerationtime.m.............. 8 A.1.2 getacceleration.m.................... 8 A.2 C-kod (getacceleration.c).................... 9 sida 1
1 INLEDNING Industriprojekt ISY 1 Inledning Dokumentet beskriver de funktioner som används för att erhålla aktuellt accelereometrvärde från bilbanebilen. För en mer detaljerad dokumentation se slutrapport. sida 2
3 MJUKVARA Industriprojekt ISY 2 Allmänt om systemet Mätningen utförs i följande steg, vilket även ses grafiskt i figur 1 1. Accelerometern registrerar en acceleration och skickar ut en pulsbreddsmodulerad signal som anger hur stor accelerationen är. 2. Signalen läses av i en Basic Stamp II (BS2). Bredden på pulsen översätts till ett binärt tal (12 bitar) som sedan skickas seriellt till en sändare. Informationen skickas i två byte, á åtta bitar. 3. Sändaren tar emot datan och skickar denna radiomodulerad till en mottagare, vilken i sin tur skickar den mottagna signalen seriellt till en BS2. Informationen läggs ut parallellt på pinnar från BS2. 4. Mätkortet i datorn (NI PCI-6602) läser in de parallella bitarna och kan sedan översätta dessa till ett absolut värde på accelerationen. Genom att anropa en dll-fil ifrån MATLAB kan sedan detta värde användas vid reglering etc. 3 Mjukvara I systemet skrivs mjukvara i både c-kod, som kommunicerar med mätkortet, och MATLAB-kod. C-koden kompileras till en dll-fil genom att anropa filen make_getaccelerationtime.m ifrån MATLAB-prompten. Funktionen getaccelerationtime kan sedan anropas för att få pulsbredden för accelerometervärdet. I MATLAB har funktionen getacceleration implementerats, vilken översätter pulsbredden till ett absolut värde på accelerationen. En översikt av de olika filerna och deras syfte ses i tabell 1. 3.1 Funktioner i MATLAB Mätvärden som genereras av systemet beskrivet i avsnitt 2 kan användas genom att använda MATLAB. För att få aktuellt accelerationsvärde från sida 3
3 MJUKVARA Industriprojekt ISY Figur 1: Översiktisschema för accelarationsmätning. Tabell 1: Översikt av kodfiler. För mer information se fullständig kod i bilaga Namn getaccelerationtime.c Syfte Läsa av mätkortets port och översätta de binära bitarna till ett heltal som anger pulsbredden hos accelerometern. make_getaccelerationtime.m Kompilerar getaccelerationtime.c och genererar en dll-fil, som kan anropas ifrån getacceleration.m MATLAB. Funktion i MATLAB som översätter pulsbredden till ett absolut accelerationsvärde. sida 4
4 FELKÄLLOR Industriprojekt ISY accelerometern anropas funktionen getacceleration, vilken returnerar det önskade värdet. Dock bör man vara medveten om att mätvärdet endast uppdateras med en frekvens av 50 Hz. Därför bör funktionen anropas med en högsta frekvens om just 50 Hz. Funktionen getacceleration har följande MATLAB-syntax: [value,flag] = getacceleration; Förutom mätvärdet returnerar getacceleration även en flagga som signalerar (flag=1) om mätvärdets storlek inte är rimlig. Om värdet överstiger ±2g kan värdet förkastas eftersom detta ligger utanför mätområdet för accelerometern. 4 Felkällor I detta avsnitt avser vi att redogöra för de fel som vi funnit påverkar mätvärdet. De olika delsystemen accelerometer, kommunikation och databehandling behandlas i nämnd ordning. 4.1 Accelerometer Den felkälla vi funnit vara av störst betydelse för det slutgiltiga mätvärdet är vibrationer som uppkommer vid drift på grund av motorn. Dessa detekteras av accelerometern och ger därför utslag i mätvärdet. Vi har inte lyckats identifiera någon metod att eliminera detta fel. Förslagsvis filtreras värdena för att få bort det mesta av detta fel. Vidare har accelerometerns montering stor betydelse för noggrannheten. Om accelerometern monteras snett detekteras inte den verkliga accelerationen i bilens färdriktning, utan en funktion av denna som är beroende av den vinkeln mellan accelerometerns detektionsriktning och bilens färdriktning. Sambandet illustreras i figur 2. Notera att felmontering kan ske både i höjd- och sidled. Ytterligare ett fel som påverkar mätvärdet via accelerometern är banans lutning. Detta fel ger samma utslag som felmontering i höjdled. Detta bör också tas i beaktning vid kalibrering av accelerometerns nollnivå. Andra tänkbara fel i samband med själva mätningen är sida 5
4 FELKÄLLOR Industriprojekt ISY Bilens färdriktning θ Accelerometerns mätriktning Figur 2: Felvridning av accelerometer. Accelerometern mäter i fel riktning jämfört med bilens färdriktning. accelerometerns temperaturkänslighet, denna är dock liten i förhållande till övriga faktorer. Inte heller tyder någonting på att strömförsörjningen från skenan eller fälten från motorn påverkar accelerometern. 4.2 Kommunikation Kommunikationen sker uteslutande digitalt, varför störningskänsligheten i detta delsystem är god. Vi har inte sett några tecken på att de accelerationsvärden som skickas från accelerometern skulle ha ändrats på vägen. Däremot sker överföringen förstås med ett givet antal bitar, vilket ger en minsta möjliga upplösning på de accelerationer som kan detekteras. Våra mätningar visar dock att upplösningsfelet är försumbart i förhållande till de fel som skakning och felmontering ger upphov till. Vad användaren dock bör ha ta i beaktande är att det tar en viss tid för accelerationsvärdet att överföras från mätpunkten till datorn. Vid vissa tillfälle har störningar i radiolänken observerats. Det yttrar sig som orimligt höga eller låga värde på accelerationen. Vad detta beror på vet vi inte, men det skulle kunna vara andra radiovågor som stör. sida 6
4 FELKÄLLOR Industriprojekt ISY 4.3 Databehandling I databehandlingsdelen används talformat som gör att ingen upplösning tappas i detta steg. Även här kan dock en viss tidsfördröjning finnas. Denna är dock svår att uppskatta och är beroende av i vilket operativsystem som koden körs och vilka program som samtidigt körs på systemet. sida 7
A BILAGOR Industriprojekt ISY A Bilagor A.1 MATLAB-kod A.1.1 make_getaccelerationtime.m % ================================================ % Filnamn : m a k e _ g e t A c c e l e r a t i o n T i m e.m % % M a k e f i l e f o r g e t A c c e l e r a t i o n T i m e. c % % Anropas i f r a n MatLab prompten och g e n e r e r a r % g e t A c c e l e r a t i o n T i m e. d l l som sedan kan a n r o p a s % i f r a n MatLab f o r a t t f a a k t u e l l p u l s b r e d d f o r % a c c e l e r o m e t e r n i b i l e n. % ================================================ mex g c IC :\ Program\N a t i o n a l getaccelerationtime. c Instruments\ NI DAQ\Include mex g getaccelerationtime. obj C:\ Program\N a t i o n a l Instruments\ NI DAQ\Lib\nidaq32b. l i b A.1.2 getacceleration.m % ================================================ % Filnamn : g e t A c c e l e r a t i o n.m % % Omvandlar p u l s b r e d d t i l l ä a c c e l e r o m e t e r v r d e % % Anropas i f r a n MatLab prompten och r e t u r n e r a r d e t a k t u e l l a % a c c e l e r a t i o n s v a r d e t ( i [ g ] ) och en f l a g g a, f l a g, som ar % hog ( = 1 ) da a c c e l e r a t i o n s v a r d e t ar o r i m l i g t % ( p u l s b r e d d o v e r 5 0 0 0 e l l e r mindreä n 0 ). % % Bor a n r o p a s med h o g s t 5 0 Hz e f t e r s o m d e t ar med den f r e k v e n s som % ä a c c e l e r a t i o n s v r d e t f r a n b i l e n u p p d a t e r a s. % % ================================================ sida 8
A BILAGOR Industriprojekt ISY function [ accvalue, flag ] = g e t A c c e l e r a t i o n k =2/1160; % For omrakning t i l l [ g ] m=1 k 3 0 8 0 ; % " flag = 0 ; time = double ( getaccelerationtime ) ; i f time > 5 0 0 0 or time < 0 flag = 1 ; end accvalue = ( k time+m) ; A.2 C-kod (getacceleration.c) / ================================================================= Filnamn : g e t A c c e l e r a t i o n T i m e. c R e t u r n e r a r a k t u e l l t ä a c c e l e r a t i o n s v r d e hos b i l e n. Vardet u p p d a t e r a s med 5 0 Hz. Anropas v i a MatLab med a c c t i d = g e t A c c e l e r a t i o n T i m e ; dar a c c t i d m o t s v a r a r a c c e l e r o m e t e r n s p u l s b r e d d. Detta v a r d e o v e r s a t t s t i l l a b s o l u t a c c e l e r a t i o n i MatLab s e MatLab kod f o r g e t A c c e l e r a t i o n.m f o r mer i n f o. Koden kan k o m p i l e r a s med kommandot m a k e _ g e t A c c e l e r a t i o n T i m e i MatLab ================================================================= / # include "mex. h" # include " nidaqex. h" # include " math. h" short utsign [ 3 2 ] ; i 3 2 b u f f e r ; i n t b i n t e s t [ 3 2 ] ; i n t datain_bin [ 1 5 ] ; i 3 2 datain_dec ; / / K o n v e r t e r a r h e l t a l t i l l b i n a r t t a l void dec2bin ( i n t value, i n t binary [ 3 2 ] ) { sida 9
A BILAGOR Industriprojekt ISY } i n t i = 0 ; while ( value! = 0 & & i < 3 2 ) { binary [ i ] = value % 2 ; value = value / 2 ; i = i + 1 ; } i f ( i = = 0 ) i = 1 ; / / K o n v e r t e r a r b i n a r t t a l t i l l h e l t a l i 3 2 bin2dec ( i n t binary [ 1 5 ] ) { i n t val = 1, i =0; i 3 2 value = 0 ; } while ( i < 1 5 ) { value + = val binary [ i ] ; val = val 2 ; i = i + 1 ; } return value ; void mexfunction ( i n t nlhs, mxarray plhs [ ], i n t nrhs, const mxarray prhs [ ] ) { i 1 6 i S t a t u s = 0 ; i 1 6 idevice = 1 ; i 1 6 i P o r t = 0 ; u32 check = 0 ; plhs [ 0 ] = mxcreatedoublematrix ( 1, 1,mxREAL ) ; / / Vanta åp t i l l a t e l s e f o r a t t l a s a f r a n BS2 while ( check = = 0 ) { i S t a t u s = DIG_In_Line ( idevice, 0, 3 0, & check ) ; } sida 10
A BILAGOR Industriprojekt ISY / / Las h e l a 32 b i t a r s p o r t e n i S t a t u s = DIG_In_Prt ( idevice, iport, & b u f f e r ) ; / / K o n v e r t e r a v a r d e t f r a n 32 b i t a r s p o r t e n f r a n h e l t a l t i l l b i n a r t. dec2bin ( buffer, b i n t e s t ) ; / / P l o c k a ut de i n t r e s s a n t a b i t a r n a datain_bin [ 0 ] = b i n t e s t [ 1 3 ] ; datain_bin [ 1 ] = b i n t e s t [ 1 4 ] ; datain_bin [ 2 ] = b i n t e s t [ 1 6 ] ; datain_bin [ 3 ] = b i n t e s t [ 1 7 ] ; datain_bin [ 4 ] = b i n t e s t [ 1 8 ] ; datain_bin [ 5 ] = b i n t e s t [ 2 1 ] ; datain_bin [ 6 ] = b i n t e s t [ 2 2 ] ; datain_bin [ 7 ] = b i n t e s t [ 2 3 ] ; datain_bin [ 8 ] = b i n t e s t [ 2 4 ] ; datain_bin [ 9 ] = b i n t e s t [ 2 5 ] ; datain_bin [ 1 0 ] = b i n t e s t [ 2 6 ] ; datain_bin [ 1 1 ] = b i n t e s t [ 2 7 ] ; datain_bin [ 1 2 ] = b i n t e s t [ 2 8 ] ; datain_bin [ 1 3 ] = b i n t e s t [ 2 9 ] ; datain_bin [ 1 4 ] = 0 ; / / K o n v e r t e r a de b i n a r a b i t a r n a t i l l h e l t a l datain_dec = ( i 3 2 ) bin2dec ( datain_bin ) ; } / / R e t u r n e r a v a r d e t ( h e l t a l ) mxgetpr ( plhs [ 0 ] ) = datain_dec ; sida 11