Ontwerp van een ademhalingssensor op basis van een...
Transcript of Ontwerp van een ademhalingssensor op basis van een...
-
Ontwerp van een ademhalingssensor op basis van een
accelerometer
Pepijn Mistiaen
Promotoren: prof. dr. ir. Jan Vanfleteren, dr. ir. Jan Doutreloigne
Begeleider: Benôıt Huyghe
Masterproef ingediend tot het behalen van de academische graad van Master in de ingeni-
eurswetenschappen: elektrotechniek
Vakgroep Elektronica en informatiesystemen
Voorzitter: prof. dr. ir. Jan Vancampenhout
Faculteit Ingenieurswetenschappen
Academiejaar 2008-2009
-
Ontwerp van een ademhalingssensor op basis van een
accelerometer
Pepijn Mistiaen
Promotoren: prof. dr. ir. Jan Vanfleteren, dr. ir. Jan Doutreloigne
Begeleider: Benôıt Huyghe
Masterproef ingediend tot het behalen van de academische graad van Master in de ingeni-
eurswetenschappen: elektrotechniek
Vakgroep Elektronica en informatiesystemen
Voorzitter: prof. dr. ir. Jan Vancampenhout
Faculteit Ingenieurswetenschappen
Academiejaar 2008-2009
-
VOORWOORD
Voorwoord
Hierbij wil ik in de eerste plaats mijn begeleider Benôıt bedanken, voor zijn steun en goede
raad als er problemen opdoken. Zijn ervaring bij bepaalde aspecten van deze scriptie
hebben mij veel bijgebracht. Ook mijn promotoren wil ik bedanken voor het vertrouwen
en de kans om mij te verdiepen in dit onderwerp.
Het mag hier niet ontbreken mijn ouders te vermelden. Zij hebben mij door de jaren heen
gesteund en mij de kansen geboden deze studie te verwezenlijken.
Mijn vriendin, Lorena, en al de andere mensen die me hebben gemotiveerd en gesteund,
mij hebben bijgestaan, mij raad hebben gegeven, enz. Hartelijk bedankt.
Pepijn Mistiaen, augustus 2009
-
TOELATING TOT BRUIKLEEN
Toelating tot bruikleen
“De auteur geeft de toelating deze scriptie voor consultatie beschikbaar te stellen en delen
van de scriptie te kopiëren voor persoonlijk gebruik.
Elk ander gebruik valt onder de beperkingen van het auteursrecht, in het bijzonder met
betrekking tot de verplichting de bron uitdrukkelijk te vermelden bij het aanhalen van
resultaten uit deze scriptie.”
Pepijn Mistiaen, augustus 2009
-
Ontwerp van een ademhalingssensor
op basis van een accelerometerdoor
Pepijn Mistiaen
Promotoren: prof. dr. ir. Jan Vanfleteren, dr. ir. Jan Doutreloigne
Begeleider: Benôıt Huyghe
Masterproef ingediend tot het behalen van de academische graad van Master in de
ingenieurswetenschappen: elektrotechniek
Academiejaar 2008-2009
Vakgroep Elektronica en informatiesystemen
Voorzitter: prof. dr. ir. Jan Vancampenhout
Faculteit Ingenieurswetenschappen
Samenvatting
In dit werk wordt de ontwikkeling van een ademhalingssensor op basis van acelerometersbeschreven. Er werd een hardwareplatform ontworpen, die toelaat om zich te concentrerenop de verdere ontwikkeling van de ademhalingsdetectie algoritmes. Tevens werd een eerstestap gezet in de richting van microcontroller vriendelijke implementatie van deze detectiealgoritmes.
Trefwoorden
ademhalingssensor, SIDS, accelerometer, radix-2/4/8
-
Design of a breathing sensor based onaccelerometers
Pepijn Mistiaen
Supervisor(s): prof. dr. ir. Jan Vanfleteren, dr. ir. Jan Doutreloigne and Benot Huyghe
Abstract— This article covers the steps taken in designing a breathingsensor based on accelerometers. This is meant to be an independant sensorproviding a means to prevent the Sudden Infant Death Syndrome (SIDS).The hardware design is covered, as well as an first step in to the embeddedalgoritms to detect breathing.
Keywords—breathing sensor, SIDS, accelerometer, radix-2/4/8
I. INTRODUCTION
THE Sudden Infant Death Syndrome stands for the suddendeath of an infant of two weeks to one year old with noapparent reason. The breathing sensor is designed to detect thebreathing of the infant and in case breathing stops the parents orcaretaking personnel can be warned about the danger the infantis in.
The breathing sensor has to fulfill a number of demands. Ithas to detect the breathing in a reliable manner. A means towarn somebody if no breathing was detected and the wearingcomfort should be as high as possible. These demands can betranslated into hardware requirements.
With the selected hardware one still needs signal processingalgorithms to detect the breathing. MATLAB was used to anal-yse, develop and evaluate the algoritms.
II. HARDWARE
With the accelerometer the movements of the chest are mea-sured, caused by breathing. These movements are small so asensitive sensor with low noise levels is needed. In general ana-log accelerometers have better characteristics concerning sensi-tivity and noise levels. Although their slightly inferior perfor-mance a digital accelerometer was chosen, bypassing the needof an ADC. They are easy to interface and can be easily linked inan bus configuration, an advantage if using multiple accelerom-eters. They also draw less current than their analog counterparts,an advantage in independant battery powered applications. TheLIS302DL of ST Microelectronics was used in the breathingsensor.
Fig. 1. System architecture final design
The system architecture of the final design is shown infigure 1. Two sensors are connected to the microcontroller(MSP430F149). There is a PC interface, for programming anddebugging purposes. A wireless interface is also present. Abuzzer serves as an audible alarm and the circuit is powered bya coin cell battery.
A photo of the breathing sensor is given in figure 2, it is a one-layered design realised on a flexible substrate using only SMDs.The flexible substrate is to ensure the comfortable wearing. Onecan see three sensor nodes, with two of them connected to thealarm node.
Fig. 2. Photo of the alarm node together with sensor nodes
III. ANALYSIS
Out of the data provided by the accelerometers, the breath-ing has to be detected. For infants until a year old the averagebreathing rate is abount 30 to 40 breaths per minute, which is afrequency ranging from 0.5 Hz to 0.67 Hz. A commercial sys-tem, Nanny Care[1], goes into alarm if the breathing rate dropsbelow 8 breaths per minute or when no breath was detected for20 s. If the same extremes are used, this means a breathing fre-quency of 0.13 Hz still has to be detected. These frequenciesare all close to the DC level so if a peak has to be detected at thebreathing rate a filter to remove the DC level will be necessary.
Figure 3 shows the spectrum of a test measurement on anadult person taking around 16 breaths per minute (0.26 Hz). Therange of the spectrum is limited to 2 Hz and the DC level wasremoved before calculating the spectrum. One can clearly seea peak just above 0.2 Hz, so breathing can be detected with ac-celerometers.
A. Radix-2/4/8 algorithm
To calculate a frequency spectrum with a microcontroller oneneeds an efficient algorithm, minimizing the number of mul-tiplications and memory requirements for storing intermediate
-
Fig. 3. Frequency spectrum of measurement
results. The sample rate of the accelerometer was reduced to25 Hz so a 256 points FFT is sufficient to have an accuracy of0.1 Hz.
The radix-2/4/8 algorithm[3] is derived from the radix-2 algo-rithm[2], which comes down to splitting the basic DFT formula(1) into different parts.
Xk =N−1∑n=0
xne− 2πjN nk with k = 0 . . . N − 1 (1)
The used radix-2/4/8 algorithm combines the split radix-2/4with the split radix-2/8 and the basic radix-2 algorithm. Thebasic butterfly of this algorithm is shown in figure 4. How thesedifferent algorithms are combined into one butterfly is shown infigure 5.
Fig. 4. Radix-2/4/8 butterfly
Fig. 5. Radix-2/4/8 block
To calculate an 256 points FFT, a radix-4 butterfly is neededto divide the FFT in four smaller 64 points FFTs, these are thencalculated with two succesive radix-2/4/8 butterflies.
Calculating the frequency spectrum with this algorithm stillshows a peak around 0.2 Hz, as can be seen in figure 6.
Fig. 6. 256 points FFT calculated with the radix-2/4/8 algorithm
B. Results
With the algoritms in MATLAB some measurements wereperformed. Out of these measurements it was seen it is pos-sible to detect breathing while laying down on the back with asensor on the chest. It could also be detected laying down onthe chest with a sensor on the back. Both positions are posible.This is also why there were two sensor nodes incorporated in thebreathing sensor.
IV. FIRMWARE
The firmware is very basic because none of the breathing de-tection algorithms were ready for implementation. It only com-municates with the sensors and transmits this information withthe PC interface to MATLAB. The SPI protocol is used to com-municate with the sensors. The PC interface is the classic asyn-chronous serial interface.
V. CONCLUSION
A proof of concept was delivered with this work, it was shownthat breathing can be detected with accelerometers. There wasa hardware platform developed to facilate furhter developmentof breathing detection algorithms. A first step towards micro-controller implementation of the algorithms was taken, by theimplementation of the radix-2/4/8 algorithm in MATLAB.
There is still a long way to go to ensure reliable breathingdetection and the detection algorithms still need a lot of devel-opment before implementation in a microcontroller will be evenpossible.
REFERENCES[1] Nanny Care http://www.nannycare.nl[2] James W. Cooley and John W. Tuckey, An algorithm for the machine cal-
culation of complex Fourier series, Mathematics of Computation, pages297-301, April 1965.
[3] Lihong Jia, Yonghong Gao, Jouni Isoaho and Hannu Tenhunen, A newVLSI-oriented FFT algorithm and implementation, ASIC Conference 1998,Proceedings, Eleventh Annual IEEE International, pages 337-341, Septem-ber 1998.
-
INHOUDSOPGAVE INHOUDSOPGAVE
Inhoudsopgave
Voorwoord i
Toelating tot bruikleen ii
Overzicht iii
Extended abstract iv
Inhoudsopgave vi
Gebruikte afkortingen viii
1 Inleiding 1
1.1 Situatieschets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Aanpak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.3 Overzicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 Hardware 3
2.1 Systeemarchitectuur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.1 Sensor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1.2 Controle-eenheid . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1.3 Alarm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1.4 PC interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Keuze componenten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.1 Accelerometer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.2 Microcontroller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 Hulprealisaties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3.1 Sensor breakout-board . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3.2 USB naar serieel interface . . . . . . . . . . . . . . . . . . . . . . . 8
2.4 Finale schakeling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.4.1 Ontwerp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.4.2 Sensornode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
-
INHOUDSOPGAVE INHOUDSOPGAVE
2.4.3 Alarmnode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3 Analyse 17
3.1 Analyse met MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2 Seriële interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.3 Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3.1 Specificaties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.3.2 Wave Digital Filters (WDF) . . . . . . . . . . . . . . . . . . . . . . 19
3.4 FFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.4.1 Vlinder algoritmes . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.4.2 Gesplitste vlinder algoritmes . . . . . . . . . . . . . . . . . . . . . . 27
3.4.3 256 punts FFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.5 Uiteindelijke analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.5.1 Liggend op de rug met sensor op de borst . . . . . . . . . . . . . . 37
3.5.2 Liggend op de borst met de sensor op de rug . . . . . . . . . . . . . 38
3.5.3 Liggend op de rug met sensor op de borst zonder te ademen . . . . 42
4 Firmware 44
4.1 Ontwikkelomgeving . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.2 Interface met de sensor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.3 Interface met de computer . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.4 Hoofd programma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5 Besluit 49
A Source code 50
A.1 MATLAB source code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
A.1.1 Seriële interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
A.1.2 256 punts FFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
A.2 C code voor de microcontroller . . . . . . . . . . . . . . . . . . . . . . . . 56
-
GEBRUIKTE AFKORTINGEN INHOUDSOPGAVE
Gebruikte afkortingen
SIDS Sudden Infant Death Syndrome
ADC Analog to Digital Converter
DMA Direct Memory Access
DIL Dual In Line
EEPROM Electrically Erasable Programmable Read-Only Memory
LED Light Emitting Diode
BOM Bill Of Materials
SMD Surface Mount Device
WDF Wave Digital Filters
FIR Finite Impulse Response
IIR Infinite Impulse Response
GUI Graphical User Interface
DFT Discrete Fourier Transformatie
SPI Serial Peripheral Interface
-
INLEIDING INHOUDSOPGAVE
Hoofdstuk 1
Inleiding
1.1 Situatieschets
Wiegendood, of beter ’Sudden Infant Death Syndrome’ (SIDS) letterlijk vertaald ’syn-
droom van het plots overlijden van een baby’. Het is een syndroom omdat het niet over
de oorzaak gaat maar wel over een duidelijk kenmerk. Het kenmerk is het plots overlijden
van een gezonde baby tussen de drie weken en een jaar. De term wiegendood komt vooral
door het feit dat de baby’s overlijden tijden hun slaap en bijgevolg in hun wieg[1]. De on-
derliggende oorzaak is per definitie niet bekend maar wetenschappers vermoeden dat het
te maken heeft met een onderontwikkeld ademhalingscentrum in de hersenen, waardoor er
geen prikkels worden gegeven als de baby een tekort aan zuurstof heeft. De hier voorge-
stelde ademhalingssensor wil dit syndroom tegen gaan, door de ademhaling te detecteren
en een alarm te geven, kunnen de ouders of verzorgend personeel op de hoogte worden
gebracht van het gevaar waarin de baby verkeerd. Ook stelt het wetenschappers in staat
de ademhaling te bestuderen tijdens de slaap van een baby.
1.2 Aanpak
In eerste instante werden er eisen vooropgesteld waaraan de ademhalingssensor moest
voldoen. Het moet in staat zijn om op een betrouwbare manier de ademhaling te detecteren,
in geval de ademhaling stopt moet het op een bepaalde manier alarm kunnen slaan en er
moet gezorgd worden dat het draagcomfort van de ademhalingssensor zo groot mogelijk is.
Vervolgens werd een rudimentair hardware blokschema opgesteld, waaruit de verschil-
lende hardware componenten gëıdentificeerd konden worden. Denkend aan de functionali-
teit, werden ruwe schattingen gemaakt over de nodige karakteristieken van de verschillende
-
1.3 Overzicht INHOUDSOPGAVE
componenten. In eerste tests moest blijken of deze ruwe schattingen voldoende waren of
moesten worden bijgesteld.
MATLAB werd gebruikt om verschillende algoritmes te testen en vervolgens verschil-
lende implementatiepistes te onderzoeken voor de ademhalingssensor.
Al de opgedane kennis wordt dan gebundeld in het finaal ontwerp van de ademhalings-
sensor.
1.3 Overzicht
In de volgende hoofdstukken vindt de lezer wat de verschillende evoluties waren zowel op
vlak van hardware, analyse en ook op vlak van firmware.
In het hoofdstuk 2 vindt men hoe het hardware gedeelte van deze ademhalingssensor
werd aangepakt, dit omvat een overzicht van de testschakelingen tot een gedetailleerde
beschrijving van het uiteindelijke ontwerp.
Het hoofdstuk 3 toont de lezer hoe de verschillende algoritmes tot stand gekomen zijn.
Ook de verschillende evoluties van die algoritmes om tot een implementatievriendelijk
algoritme te komen.
De firmware wordt beschreven in hoofdstuk 4, er wordt getoond hoe de verschillende
componenten werden geconfigureerd en geprogrammeerd om de beoogde functionaliteit te
behalen.
Er wordt in hoofdstuk 5 een algemeen besluit gevormd en er worden ook pistes meege-
deeld om deze applicatie verder uit te werken en te verbeteren.
-
HARDWARE INHOUDSOPGAVE
Hoofdstuk 2
Hardware
2.1 Systeemarchitectuur
Er moet een bepaalde systeemarchitectuur worden ontworpen waarmee de beoogde functi-
onaliteit wordt gehaald. Het is evident dat om de ademhaling te detecteren er een sensor
zal nodig zijn. Alarm slaan kan op verschillende manieren gebeuren. De omstandigheden
waarin de ademhalingssensor gebruikt wordt verduidelijken welke pistes mogelijk zijn. Het
zal worden gebruikt in de kinderkamer waar praktisch altijd een babyfoon aanwezig is, dus
een auditief alarm is voldoende om de ouders te verwittigen, ook al bevinden deze zich in
een andere kamer. Er is dan natuurlijk nog een component nodig die dit alles regelt en de
verschillende algoritmes herbergt om de ademhaling te detecteren uit de sensorgegevens.
De systeemarchitectuur kan dus worden samengevat in een blokschema zoals in figuur
2.1. Er werd hier ook nog een blok PC interface toegevoegd. Deze blok is nodig als we de
firmware willen debuggen en de algoritmes willen ontwikkelen met MATLAB.
Figuur 2.1: Blokschema van de systeemarchitectuur
-
2.1 Systeemarchitectuur INHOUDSOPGAVE
2.1.1 Sensor
Er is een sensor nodig om de ademhaling te detecteren. Om te weten welke sensoren in
aanmerking komen, is het nodig te begrijpen wat er gebeurt bij het ademhalen.
Bij het ademhalen worden de longen gevuld met lucht, dit heeft als gevolg dat de borst
ook mee uitzet op het ritme van de ademhaling. Er kan bijvoorbeeld een rekstrookje worden
gebruikt om de uitzetting van de borst te meten en zodoende de ademhaling te detecteren.
Daar de uitzetting van de borst ook een beweging is, kan het ook worden geregistreerd met
een accelerometer. Omdat de gemeten verandering in versnelling miniem zal zijn is een
gevoelig exemplaar nodig.
De keuze is uiteindelijk een accelerometer geworden, dit vooral wegens het grote aan-
bod op de markt en er werd al heel wat ervaring opgedaan met deze sensoren binnen de
vakgroep.
2.1.2 Controle-eenheid
Om alles te configureren en de algoritmes voor detectie van de ademhaling uit te voeren is
de voor de hand liggende keuze een microcontroller.
2.1.3 Alarm
Er zijn verschillende componenten in staat om geluid te produceren, in deze toepassing
is het van minder belang welk geluid het precies produceert zolang het maar voldoende
hoorbaar is. Een luidspreker zou het ontwerp te ver drijven en is ook totaal overbodig, een
piezo-elektrische buzzer daarentegen is er prima voor geschikt.
2.1.4 PC interface
Op een microcontroller van tegenwoordig is over het algemeen een seriële poort te vinden, de
huidige computers hebben deze interface echter niet meer (dit geldt zeker voor de laptops).
Deze is door de jaren heen langzaam verdrongen door de USB interface. Ook hier werd
een oplossing gezocht in de vorm van een USB naar seriëel interface.
-
2.2 Keuze componenten INHOUDSOPGAVE
2.2 Keuze componenten
2.2.1 Accelerometer
Een cruciale component in deze toepassing is de accelerometer. Deze moet namelijk de
ademhaling kunnen registreren. Omdat bij de ademhaling de versnellingen klein zijn, is
het belangrijk een sensor te hebben die gevoelig genoeg is en waarbij het ruisniveau zo
laag mogelijk is. Omdat het om een batterij gevoede schakeling gaat werd ook rekening
gehouden met het vermogen die de sensor nodig heeft. Aan de hand van al deze parameters
werden verschillende sensoren vergeleken en uiteindelijk een keuze gemaakt. In tabellen
2.1 tot 2.3 vindt men een overzicht van verschillende accelerometers terug.
Hoewel de analoge sensoren gevoelig beter zijn qua ruis werd toch een digitale sensor ge-
kozen, dit wegens de gemakkelijke interface met de microcontroller. Bovendien verbruiken
deze sensoren over het algemeen minder energie. Bij analoge sensoren zal de analoog naar
digitaal conversie gebeuren door de ADC van de microcontroller, deze conversie maakt dat
de microcontroller nog wat extra energie zal gebruiken. Een voordeel van analoge senso-
ren is dat een eventueel nodige filtering nog voor de ADC kan gebeuren, wat afhankelijk
van de nodige filter heel wat rekenkracht vereist van de microcontroller. Daarbij gaat de
voorkeur uit naar de KXSD9-2050 van Kionix, echter door moeilijke verkrijgbaarheid werd
uiteindelijk de LIS302DL van ST Microelectronics gebruikt als sensor.
2.2.2 Microcontroller
Nog een belangrijke component is de microcontroller, dit is het hart van de schakeling.
Hiermee worden de sensoren geconfigureerd en uitgelezen, waarna met algoritmes de adem-
haling wordt gedetecteerd. De algoritmes kunnen, afhankelijk van de complexiteit heel
rekenintensief zijn. Daarom moet het een performante microcontroller zijn. Gelet op het
feit dat de schakeling gevoed wordt door een batterij, speelt ook het vermogen een rol
en een low power microcontroller is zeker aangewezen. Binnen de vakgroep werd al reeds
meerdere malen gewerkt met de MSP430 familie van Texas Instruments, de MSP430F149
werd gekozen wegens beschikbare headerboards en de aanwezige hardware multiplier blok
en de Direct Memory Access (DMA) blok.
Verder zijn er voor deze toepassing geen speciale componenten gebruikt.
-
2.2 Keuze componenten INHOUDSOPGAVE
Analog Devices
ADXL203 ADXL204 ADXL213
Interface analoog digitaal (PWM)
Assen X,Y
Package 5x5x2mm LCC
Voeding 3 tot 6 V (typ. 5 V) 3 tot 6 V (typ. 3, 3 V) 3 tot 6 V (typ. 5 V)
Vermogen 0, 7 mA @ 5 V 0, 5 mA @ 3, 3 V 0, 7 mA @ 5 V
Bereik ±1, 7 g ±1, 2 gGevoeligheid 1000 mV/g 620 mV/g 30 /g
Ruis
max. 3 mV rms -
typ. 1 mV rms -
110 µg/√
Hz 170 µg/√
Hz 160 µg/√
Hz
Tabel 2.1: Accellerometers van Analog Devices
ST Microelectronics
LIS302SG LIS302DL
Interface analoog digitaal (I2C/SPI)
Assen X,Y,Z
Package 3x5x0,9 LGA-14
Voeding 3 tot 3, 6 V (typ. 3, 3 V)
Vermogen 0, 65 mA @ 3, 3 V 0, 3 mA @ 2, 5 V
Bereik ±2 g ±2 g - ±8 gGevoeligheid 479 mV/g 18 mg/digit - 72 mg/digit
Ruis 200 µg/√
Hz -
LIS331AL LIS331DL
Interface analoog digitaal (I2C/SPI)
Assen X,Y,Z
Package 3x3x1 LGA-16
Voeding 3 tot 3, 6 V (typ. 3, 3 V) 2,16 tot 3, 6 V (typ. 2, 5 V)
Vermogen 0, 65 mA @ 3, 3 V 0, 3 mA @ 2, 5 V
Bereik ±2 g ±2 g - ±8 gGevoeligheid 479 mV/g 18 mg/digit - 72 mg/digit
Ruis 300 µg/√
Hz -
Tabel 2.2: Accelerometers van ST Microelectronics
-
2.3 Hulprealisaties INHOUDSOPGAVE
Kionix
KXPB5-2050 KXRB5-2050 KXSD9-2050
Interface analoog (MUX) digitaal (I2C/SPI)
Assen X,Y,Z
Package 3x5x0,9 LGA
Voeding 2,5 tot 5, 25 V (typ. 3, 3 V)
Vermogen 0, 5 mA @ 3, 3 V 0, 22 mA @ 3, 3 V
Bereik ±2 g ±2 g (±1, 5 g tot ±6 g) ±2 g, 4 g, 6 g, 8 gGevoeligheid 660 mV/g 819, 410, 273 en 205 /g
Ruis 175 µg/√
Hz 75 µg/√
Hz 750 µg/√
Hz
Tabel 2.3: Accelerometers van Kionix
2.3 Hulprealisaties
2.3.1 Sensor breakout-board
Om gemakkelijk aan prototyping te doen werd een adapterprint gemaakt naar de stan-
daard DIL afmetingen, zodat de sensor gemakkelijk te gebruiken is op een breadboard.
Het schema wordt gegeven in figuur 2.2 en de layout in figuur 2.3. Hierbij werden de
ontkoppelcondensatoren en een pull-down weerstand al bij de sensor geplaatst. Een foto
van het sensor breakout-board kan worden bekeken in figuur 2.4.
Figuur 2.2: Schema van het breakout-board voor de sensor
-
2.3 Hulprealisaties INHOUDSOPGAVE
Figuur 2.3: Layout van het breakout-board voor de sensor
Figuur 2.4: Foto van het breakout-board voor de sensor
2.3.2 USB naar serieel interface
Om het debuggen van de firmware te vergemakkelijken werd ook een USB naar seriëel
interface gemaakt. Deze is gebaseerd op de FT232BM chip van FTDI. Het reference
design van de datasheet werd gevolgd waarbij een aparte spanningsregelaar van 3, 3 V
werd bijgezet samen met een jumper om de I/O niveau’s te kunnen kiezen tussen 3, 3 V en
5 V. Verder zijn ook alle RS232 signalen naar buiten gebracht via headers alsook de twee
verschillende voedingsspanningen. Het schema wordt gegeven in figuur 2.5.
Aan de hand van het schema werd ook een layout ontworpen voor deze USB naar
serieel interface. Het ontwerp werd zo compact mogelijk gehouden en heeft de uiteindelijke
afmetingen van 29 mm op 65 mm. Figuur 2.6 toont de layout en figuur 2.7 toont een foto
van de USB naar serieel interface.
Tabel 2.4 geeft een overzicht van alle componenten die nodig zijn om de USB naar
serieel interface te maken.
-
2.3 Hulprealisaties INHOUDSOPGAVE
Figuur 2.5: Schema van de USB naar serieel interface
Figuur 2.6: Layout van de USB naar serieel interface
-
2.3 Hulprealisaties INHOUDSOPGAVE
Naam Code Omschrijving Farnell nr.
IC1 FT232BL USB chip 9519769
IC2 LP5951MF-3.3 spanningsregelaar 1312657
IC3 93C46B-I/SN EEPROM 9758186
L1 BK1608HM102-T ferriet ring 1611990
X1 1734346-1 USB connector 1321918
Y1 PBRC6.00HR50X000 6 MHz kristal 1209939
LED1 5988210107F rode LED 1465997
SV1 2213S-20G header 20 pins 2 rijen 1593446
JP1 2211S-03G header 3 pins 1 rij 1593412
- 0-0142270-3 jumper 4218152
R1,R2 - 27 Ω 0603 9233180
R3 - 1, 5 kΩ 0603 9233407
R4 - 1 MΩ 0603 9233741
R5 - 2, 2 kΩ 0603 9233423
R6 - 10 kΩ 0603 9233504
R7 - 470 Ω 0603 9233334
R8 - 150 Ω 0603 9233270
C1 - 10 nF 0603 431590
C2,C6 - 100 nF 0603 317287
C3,C4 - 1 µF 0603 9402080
C5 - 10 µF 0805 9402136
C7 - 33 nF 0603 431953
Tabel 2.4: BOM USB naar serieel interface
-
2.4 Finale schakeling INHOUDSOPGAVE
Figuur 2.7: Foto van de USB naar serieel interface
2.4 Finale schakeling
2.4.1 Ontwerp
Het uiteindelijk ontwerp van de ademhalingssensor wijkt niet erg af van wat initieel werd
voorgesteld in het blokschema van figuur 2.1. Figuur 2.8 toont dit uiteindelijk ontwerp in
de vorm van een blokschema. Het is ook snel te zien wat nu juist in de sensor en in de
alarmnode zit.
Figuur 2.8: Blokschema van het finaal ontwerp
Er zijn twee sensornodes die verbonden zijn met de alarmnode. Dit komt omdat men
-
2.4 Finale schakeling INHOUDSOPGAVE
in staat moet zijn om de ademhaling te detecteren als de baby zowel op de buik als op de
rug ligt. Daarom plaatsen we een sensornode op de rug en borst.
Er is ook een draadloze verbinding. Via deze weg kunnen de sensorgegevens zonder een
fysieke verbinding door een computer worden uitgelezen en geanalyseerd. Doordat er geen
fysieke verbinding nodig is verhoogt dit het comfort voor de baby. Toch is het noodzakelijk
om de mogelijkheid te hebben een fysieke verbinding met de alarmnode te maken, hoewel
deze bij normaal gebruik niet hoeft te worden gebruikt.
2.4.2 Sensornode
Het wordt als een apart onderdeel behandelt omdat zo de mogelijkheid behouden wordt de
sensor op een ideale plaats te positioneren onafhankelijk van de rest van de schakeling. Het
schema omvat enkel de ontkoppelde condensatoren voor de sensor en is bijgevolg eenvoudig
(figuur 2.9).
Figuur 2.9: Schema van de sensor node
De layout is enkelzijdig, op een flexibel substraat uitgevoerd en is zeer compact ge-
houden (13 mm x 15 mm). Figuur 2.10 toont de layout van de sensornode, hierbij zijn de
contacten voor de verbinding met de alarmnode goed te zien.
De lijst met de gebruikte componenten voor de sensornode is terug te vinden in tabel
2.5.
Naam Code Omschrijving Farnell nr.
IC1 LIS302DL acellerometer 1435588
C1 - 100 nF 0603 1414610
C2 - 10 µF 0603 1463375
Tabel 2.5: BOM sensornode
-
2.4 Finale schakeling INHOUDSOPGAVE
Figuur 2.10: Layout van de sensor node
2.4.3 Alarmnode
De alarmnode is het kloppend hart van de ademhalingssensor. Hierop worden twee sen-
sornodes aangesloten. De microcontroller verwerkt de data van de sensoren en kan alarm
slaan via de buzzer. De gegevens kunnen ook draadloos worden doorgestuurd via de µMiRF
module van Sparkfun.
Het schema voor de alarmnode is gegeven in figuur 2.11. Via een connector kan de
microcontroller worden geprogrammeerd en wordt er ook een seriële verbinding naar buiten
gebracht om het debuggen van de firmware te vergemakkelijken.
Ook de layout van de alarmnode is op een enkelzijdig flexibel substraat uitgevoerd
(figuur 2.12). Het vergde wat creativiteit maar het uiteindelijke resultaat is een layout
zonder draadbruggen. Er werd ook plaats voorzien voor kristallen wanneer een nauwkeu-
rigere tijdsbasis nodig is of om de performantie van de microcontroller op te krikken door
hem wat hoger te klokken. In de layout is plaats voozien om de schakeling van stroom te
voorzien door een knoopcel zodat het geheel kan functioneren zonder dat er een verbinding
van buitenaf nodig is. De uiteindelijke afmetingen van de alarmnode zijn 95 mm x 43 mm.
De componenten nodig om deze alarmnode te maken worden weergegeven in tabel 2.6.
Figuur 2.13 toont een foto van realisatie van de alarmnode en de sensornode. Boven
de alarmnode zijn er drie sensornodes geplaatst, waarvan er twee verbonden zijn met de
alarmnode. In de alarmnode is het makkelijk de verschillende delen te identificeren. Van
links naar rechts staat eerst de houder voor de knoopcel, vervolgens de buzzer waarna de
microcontroller volgt en uiteindelijk de µMiRF module.
-
2.4 Finale schakeling INHOUDSOPGAVE
Figuur 2.11: Schema van de alarmnode
-
2.4 Finale schakeling INHOUDSOPGAVE
Figuur 2.12: Layout van de alarmnode
Naam Code Omschrijving Farnell nr.
IC1 MSP430F149 microcontroller 1103048
B1 SMTU 2430-1-LF CR2430 houder 1216355
A1 KMTG1603 buzzer 1502709
- - Sparkfun uMiRF -
X3 53261-1271 SMD connector 1125363
R1-3 - 47 kΩ 0603 9238689
C3 - 100 nF 0603 1414610
C4 - 10 µF 0603 1463375
C7 - 10 nF 0603 1414609
Optioneel met externe kristallen
C1-2,C5-6 - 12 pF 0603 721979
Q1 - 32, 768 kHz kristal 1448101
X2 - 8 MHz 1611803
Tabel 2.6: BOM alarmnode
-
2.4 Finale schakeling INHOUDSOPGAVE
Figuur 2.13: Foto van de alarmnode samen met sensornodes
-
ANALYSE INHOUDSOPGAVE
Hoofdstuk 3
Analyse
3.1 Analyse met MATLAB
Eenmaal de testschakeling op het breadboard functioneerde kon van start gegaan worden
met het analyseren van de ruwe sensorgegevens met MATLAB. De microcontroller leest
de waarden van de accellerometer uit en verstuurt die vervolgens via de USB naar serieel
interface naar de computer waar met MATLAB de gegevens geanalyseerd kunnen worden.
De gegevens stromen binnen via een USB verbinding, waarbij een normale RS232 seriële
verbinding wordt geëmuleerd via de drivers van de FTDI chip. Om deze gegevens te kunnen
uitlezen met MATLAB moet deze dus toegang kunnen krijgen tot deze seriële poort.
Als de gegevens kunnen worden binnengenomen met MATLAB kan er naar relevante
informatie worden gezocht omtrent de ademhaling. Daar dit een repetitief fenomeen is zal
deze informatie opduiken wanneer we het spectrum van deze gegevens berekenen. Omdat
de frequentie van de ademhaling over het algemeen laag is (< 1 Hz) is het nodig om het
DC niveau van de gegevens te verwijderen d.m.v. een filter.
In de delen die volgen wordt dieper ingegaan op de verschillende onderdelen van de
MATLAB code en de evoluties om tot code te komen die gemakkelijk kan worden gëımplementeerd
in de microcontroller.
3.2 Seriële interface
Om de gegevens van de sensor te kunnen verwerken met MATLAB, werd de microcontroller
geprogrammeerd zodat deze gegevens via de USB naar serieel interface naar de computer
werden gezonden. Deze gegevensstroom moet dan echter nog met MATLAB uitgelezen
worden. De code die hiervoor zorgt is gegeven in het codefragment 3.1.
-
3.3 Filter INHOUDSOPGAVE
Codefragment 3.1: MATLAB code om de seriële poort uit te lezen
function s e r i a l i n t e r f a c e ( )% Opens a s e r i a l communication o b j e c ts1=s e r i a l ( ’ /dev/ttyUSB0 ’ , ’BaudRate ’ , 9600 , ’ Par i ty ’ , ’ none ’ , ’ DataBits ’ , 8 ,
’ StopBits ’ , 1) ;set ( s1 , ’ InputBu f f e rS i z e ’ ,2048) ;fopen ( s1 ) ;
% asynchronous modes1 . ReadAsyncMode = ’ cont inuous ’ ;
% loop to read datawhile ˜quit
i f ( s1 . BytesAva i lab le >= 128)% data proce s s ing code
endendfc lose ( s1 ) ;delete ( s1 ) ;clear s1 ;end
Er wordt dus eerst een object gedefinieerd die de kenmerken bevat van de seriële poort
waarmee er gecommuniceerd zal worden. Deze kenmerken omvatten de naam, de baudrate,
de parity, hoeveel databits en stopbits er zijn. Deze kenmerken moeten natuurlijk gelijk
zijn aan hoe de seriële interface werd geconfigureerd in de microcontroller. De grootte van
de inputbuffer kan ook worden ingesteld. Die moet voldoende groot zijn want eenmaal de
buffer vol is gaat er data verloren. Ook wordt ReadAsyncMode op continuous gezet, zodat
MATLAB continu de seriële poort pollt om te zien of nieuwe data beschikbaar is en deze
in de inputbuffer plaatst.
Dan kan er data worden uitgelezen, er wordt iedere keer gewacht tot er minstens 128
bytes in de inputbuffer aanwezig is, waarna deze uitgelezen en verwerkt kunnen worden.
3.3 Filter
Om een filter te ontwerpen is er informatie nodig over het signaal dat we wensen te de-
tecteren, met name de ademhaling van de baby. Enkele zaken liggen vast door de keuze
van de hardware, andere vloeien voort uit de kenmerken van de ademhaling van een baby.
De normale ademhalingsfrequentie van een baby jonger dan één jaar ligt tussen 30 en 40
-
3.3 Filter INHOUDSOPGAVE
ademhalingen per minuut, dit komt neer op een frequentie van 0, 5 Hz tot 0, 67 Hz. Het
commercieel systeem, Nanny Care[2], dat hetzelfde doel heeft maar op een andere manier
de ademhaling meet, slaat alarm als de ademhalingsfrequentie onder de 8 ademhalingen
per minuut zakt (0, 13 Hz) of als er 20 s geen ademhaling wordt gedetecteerd.
Omdat het signaal bijna altijd een DC component bevat en de gewenste informatie zich
zeer dicht bij DC bevindt in het spectrum, is een filter nodig. Deze filter moet signalen
met een frequentie van 0, 13 Hz doorlaten en tegelijk de DC component van het signaal
voldoende onderdrukken.
Om de nood aan een filter te illustreren volgen figuren van het spectrum van een
ongefilterde en gefilterde meting. In figuren 3.3 (a) en (b) zien we het spectrum van een
ongefilterde meting respectievelijk in hoge resolutie en lage resolutie. In het lage resolutie
spectrum zien we duidelijk dat de piek dicht bij 0, 2 Hz niet meer te onderscheiden valt van
de piek bij DC. In figuren 3.3 (c) en (d) kan men duidelijk de invloed zien van de filter.
3.3.1 Specificaties
De eigenschappen van het signaal dat gemeten moet worden werden hiervoor al genoemd.
Samen met andere factoren die voortvloeien uit de gekozen hardware, leggen deze de spe-
cificaties vast voor de filter. In wat volgt worden alle specificaties op een rijtje gezet.
Daar het te meten signaal een frequentie kan hebben van 0, 13 Hz, moet de doorlaat-
band op zijn minst op deze frequentie beginnen. Laten we deze beginnen op 0, 1 Hz
dan hebben we nog speelruimte.
Van een stopband kunnen we hier niet echt spreken maar de filter moet voldoende
onderdrukking hebben bij 0 Hz.
De sampling frequentie van het signaal is voor de gebruikte accelerometers 100 Hz.
Het is de bedoeling om de filter later in de microcontroller te implementeren dus is
het aangewezen om een type filter te kiezen die perfomant genoeg is zodat hij aan de
specificaties voldoet en tegelijk zo weinig mogelijk de microcontroller belast.
3.3.2 Wave Digital Filters (WDF)
WDF filters zijn gemodelleerd naar de klassieke (analoge) ladderfilters. Ze hebben goede
eigenschappen wat betreft de eisen in verband met de nauwkeurigheid van de coefficiënten,
het dynamisch bereik en zij hebben vooral een uitmuntende stabiliteit bij overflow- en
-
3.3 Filter INHOUDSOPGAVE
(a) (b)
(c) (d)
Figuur 3.1: Hoge resolutie (a) en lage resolutie (b) spectrum van ongefilterde meting, hoge
resolutie (c) en lage resolutie (d) spectrum van gefilterde meting
afrondingsverschijnselen[3]. Dit zijn juist de problemen die optreden bij het implementeren
van digitale filters in microcontrollers.
FIR en IIR filters kampen beide met nadelen wanneer deze moeten worden gëımplementeerd
in microcontrollers. FIR filters hebben een redelijk aantal vermenigvuldigingen nodig voor-
aleer een aanvaardbare onderdrukking wordt bekomen. Vermenigvuldigingen vragen reken-
kracht en als deze moeten uitgevoerd worden op een hoge sample frequentie dan kan dit
heel wat rekenkracht wegnemen. Dit geldt zeker voor steile filters waar het aantal nodige
vermenigvuldigingen snel oplopen. IIR filters aan de andere kant, hebben in verhouding
niet zoveel vermenigvuldigingen nodig om een vergelijkbaar resultaat te bekomen. Door
het recursief karakter van deze filters is de stabiliteit van de filter echter een probleem.
-
3.3 Filter INHOUDSOPGAVE
WDF filters maken kommaf met de beperkingen van zowel de FIR als de IIR filters.
Om een dergelijke filter te ontwerpen werd gebruik gemaakt van een toolbox[4] voor
MATLAB ontwikkeld door TU Delft en gratis ter beschikking. Met deze toolbox kan je
aan de hand van een GUI de specificaties ingeven van de filter en er wordt vervolgens een
filter ontworpen met deze specificaties.
Het resultaat is een filter opgebouwd uit elementaire blokken, vertragingselementen en
allpass blokken. De functie van een vertraginselement is duidelijk, echter wat een allpass
blok inhoudt minder. Figuur 3.3.2 toont het symbool samen met het onderliggende circuit.
Hierin stelt m de coefficiënt voor.
(a) (b)
Figuur 3.2: Een allpass element. (a) stelt het symbool voor en (b) stelt het interne circuit
voor het allpass element
Een implementatie in MATLAB van deze filter is gegeven in code fragment 3.2. Deze
filter voldoet echter niet aan de specificaties, toch geeft het een indruk wat het betekent
qua bewerkingen en complexiteit. Wegens tijdsgebrek werd dit soort filters niet verder
onderzocht en werden de functies van MATLAB gebruikt om de juiste filtering te realiseren.
Codefragment 3.2: MATLAB code voor de 5de-orde WDF filter
function x f i l t = w d f f i l t e r ( x )
% Implementation o f WDF f i l t e r
% F i l t e r c o e f f c i e n t sm1 = 0 .98257 ;m2 = −0.99967;m3 = 0 .99995 ;m4 = −0.99611;m5 = 0 .99994 ;
% f i l t e r c a l c u l a t i o n sfor i =1: length ( x )
a1 12 = a1 21 + ( a1 21 − x ( i ) ) *m1;
-
3.3 Filter INHOUDSOPGAVE
Figuur 3.3: 5de-orde WDF filter
-
3.4 FFT INHOUDSOPGAVE
a1 21 = ( a1 21 − x ( i ) ) *m1 + x( i ) ;a3 12 = a3 21 + ( a3 21 − a2 21 ) *m3;a3 21 = ( a3 21 − a2 21 ) *m3 + a2 21 ;a2 12 = a3 12 + ( a3 12 − a1 12 ) *m2;a2 21 = a1 12 + ( a3 12 − a1 12 ) *m2;a5 12 = a5 21 + ( a5 21 − a4 21 ) *m5;a5 21 = ( a5 21 − a4 21 ) *m5 + a4 21 ;a4 12 = a5 12 + ( a5 12 − x ( i ) ) *m4;a4 21 = ( a5 12 − x ( i ) ) *m4 + x( i ) ;x f i l t ( i ) = ( a4 12 − a2 12 ) /2 ;
end
3.4 FFT
Het spectrum wordt berekend om de ademhaling, die een repetitief signaal is met een
bepaalde frequentie waarbij de frequentie slechts traag veranderd in functie van de tijd, te
detecteren.
Bij het opstellen van de eisen voor de FFT zijn er twee kenmerken belangrijk: ten
eerste de gewenste resolutie en ten tweede de sample frequentie (fs). De accelerometer
spuwt meetwaarden uit met een frequentie van 100 Hz en de kleinste frequentie die we
willen kunnen detecteren is 0, 13 Hz, daaruit volgt:
N =fs
fkleinste=
100
0, 13= 769
We moeten dus de FFT minimaal in 769 punten berekenen om een verschil te maken
tussen DC en de laagst te detecteren frequentie. Afhankelijk van hoe de FFT berekend
wordt, moet N een macht van 2 zijn die het dichtst is bij 1024. Zo wordt dit al snel
een redelijke taak zeker met het oog op een implementatie in een microcontroller, waar
bijvoorbeeld complexe vermenigvuldigingen moeilijk zijn en de databreedte beperkt.
Om N te beperken kan ofwel de resolutie verminderen ofwel fs verminderen. Het
eerste is geen optie daar juist deze minimale ademhalingsfrequentie wenst gedetecteerd
te worden, fs verlagen kan wel, dit heeft echter tot gevolg dat de maximale frequentie
van het spectrum ook lager komt te liggen. Bij een fs van 100 Hz bedraagt de maximaal
te detecteren frequentie in het spectrum 50 Hz. De normale ademhalingsfrequentie van
babies ligt rond 0, 67 Hz, wordt wat marge genomen dan wordt de maximaal te detecteren
frequentie 2 Hz. We kunnen dus zonder zorgen fs verlagen. Als ook de filtering op deze
lagere fs gebeurt geeft dit ook positieve gevolgen voor de rekenintensiteit van de filter.
-
3.4 FFT INHOUDSOPGAVE
Het berekenen van een FFT is een rekenintensieve taak. Wanneer men beschikt over
veel rekenkracht is het minder belangrijk op welke manier de FFT berekend wordt. Het zal
hoogstens iets langer duren en meer energie kosten. Als men een FFT wenst te berekenen
op een microcontroller komt men beperkingen tegen die het moeilijk maken dit te realiseren:
seriële uitvoering van bewerkingen
floating-point bewerkingen vragen heel wat klokcycli
fixed-point bewerkingen zijn beperkt in bereik
beschikbaar geheugen is beperkt
Door de seriële uitvoering van de verschillende bewerkingen moeten tussenresultaten
worden bewaard. De nodige geheugenruimte loopt snel op naarmate N groter wordt. Er
kunnen floating-point berekeningen worden gemaakt met de MSP430 maar dit neemt een
groot aantal klokcycli in beslag. Doordat de bewerkingen snel oplopen naarmate N groter
wordt zou de tijd nodig om een FFT te berekenen lang zijn. Fixed-point bewerkingen
daarentegen vertonen een beperkt dynamisch bereik.
Dit is niet de eerste maal dat deze problemen werden ervaren. Doordat de FFT één
van de basisblokken is als men aan ’signal processing’ wil doen, zijn er heel wat algorit-
mes onderzocht die in meer of mindere mate geschikt zijn om te implementeren in een
microcontroller. Hier werden verschillende vlinderalgoritmes verder onderzocht.
3.4.1 Vlinder algoritmes
Radix-2 algoritme
In 1965 werd een artikel[5] gepubliceerd door James W. Cooley van IBM en John W. Tuc-
key van Princeton waarin een algoritme voorgesteld werd voor de berekening van complexe
fourier transformaties door machines. Het komt erop neer dat bij iedere stap van het algo-
ritme de N punts discrete fourier transformatie (DFT) wordt opgesplitst in twee kleinere
N/2 punts DFT’s. Daardoor wordt dit algoritme ook vaak het radix-2 algoritme genoemd.
Omdat het algoritme de FFT steeds halveert, moet N een macht van 2 zijn.
Wiskundig wordt het algoritme als volgt voorgesteld, startend met de formule voor de
DFT:
Xk =N−1∑n=0
xne− 2πj
Nnk met k = 0 . . . N − 1 (3.1)
-
3.4 FFT INHOUDSOPGAVE
Bij het radix-2 algoritme worden eest de even index nummers berekend, daarna de
oneven index nummers.
Xk =
N2−1∑
m=0
x2me− 2πj
N(2m)k +
N2−1∑
m=0
x2m+1e− 2πj
N(2m+1)k
=M−1∑m=0
x2me− 2πj
Mmk + e−
2πjNk
M−1∑m=0
x2m+1e− 2πj
Nmk
met
{M = N
2
k = 0 . . . N − 1
Er verschijnen dus twee kleinere DFT’s, wordt de DFT in de even punten (2m) El
genoemd en in de oneven punten (2m+ 1) Ol (met l = 0 . . .M −1) kan het geheel opnieuwgeschreven worden als volgt:
Xk =
{Ek + e
− 2πjNkOk als k < M
Ek−M − e− 2πjN (k−M)Ok−M als k ≥M(3.2)
Hierbij werd handig gebruik gemaakt van het feit dat Ek+M = Ek en Ok+M = Ok. De
twee kleinere DFT’s kan men terug op dezelfde manier opsplitsen tot er niet meer verder
gesplitst kan worden.
Er is nog een andere manier om hetzelfde af te leiden. Er wordt terug vertrokken van
vergelijking (3.1), maar we splitsen de som in twee.
Xk =
N2−1∑
n=0
xne− 2πj
Nnk +
N2−1∑
n=0
xn+N2e−
2πjN (n+
N2 )k
=
N2−1∑
n=0
[xn + xn+N
2e−πjk
]e−
2πjNnk
met k = 0 . . . N − 1
Dit kan nog wat compacter worden genoteerd als volgt:
Xk =
N2−1∑
n=0
[xn + (−1)kxn+N
2
]W nkN met
{k = 0 . . . N − 1
W nkN = e− 2πj
Nnk
(3.3)
Hierbij stelt W nkN de zogenaamde twiddle factors voor.
-
3.4 FFT INHOUDSOPGAVE
Dit algoritme kan ook grafisch worden voorgesteld, in figuur 3.4 is een voorbeeld te zien
waarbij N = 8. Het is ook meteen duidelijk waardoor dit algoritme ook vlinderalgoritme
genoemd wordt.
Figuur 3.4: Radix-2 vlinder voor N = 8
Radix-4 algoritme
Wordt de vergelijking (3.1) in plaats van in twee delen in vier delen gesplitst bekomen we
het radix-4 algoritme.
Xk =
N4−1∑
n=0
xne− 2πj
Nnk +
N4−1∑
n=0
xn+N4e−
2πjN (n+
N4 )k +
N4−1∑
n=0
xn+N2e−
2πjN (n+
N2 )k
+
N4−1∑
n=0
xn+ 3N4e−
2πjN (n+
3N4 )k
=
N4−1∑
n=0
[xn + xn+N
4e−
πj2k + xn+N
2eπjk + xn+ 3N
4e−
3πj2k]e−
2πjNnk
met k = 0 . . . N − 1
Verkort genoteerd geeft dit:
Xk =
N4−1∑
n=0
[xn + (−j)kxn+N
4+ (−1)kxn+N
2+ (j)kxn+ 3N
4
]W nkN (3.4)
-
3.4 FFT INHOUDSOPGAVE
Ook dit algoritme kan grafisch voorgesteld worden (figuur 3.5), er moet echter eerst een
radix-2 vlinder worden gebruikt om het op te delen in twee DFT’s met N = 4.
Figuur 3.5: Radix-4 vlinder voor N = 8
3.4.2 Gesplitste vlinder algoritmes
Een vlinderalgoritme kan ook worden gesplitst, hierbij worden de positieve eigenschap-
pen gecombineerd van verschillende vlinderalgoritmes. Deze aanpak helpt om de nodige
rekenkracht verder te verminderen.
Radix-2/4 algoritme
Zoals de titel al doet vermoeden wordt hier het radix-2 en het radix-4 algoritme gecombi-
neerd. Daar bij een radix-2 algoritme de oneven indexen vermenigvuldigd moeten worden
met twiddle factors, worden de oneven indexen berekend met het radix-4 algoritme waar
minder van deze vermenigvuldigingen aanwezig zijn.
In formule vorm ziet dit er zo uit:
-
3.4 FFT INHOUDSOPGAVE
X2k =
N2−1∑
n=0
[xn + xn+N
2
]W 2nkN (3.5)
X4k′+1 =
N4−1∑
n=0
[xn − xn+N
2− j
(xn+N
4− xn+ 3N
4
)]W 4nk
′
N WnN (3.6)
X4k′+3 =
N4−1∑
n=0
[xn − xn+N
2+ j
(xn+N
4− xn+ 3N
4
)]W 4nk
′
N W3nN (3.7)
Waarbij k = 0 . . . N2− 1 en k′ = 0 . . . N
4− 1. Figuur 3.6 stelt dit algoritme grafisch voor.
Figuur 3.6: Radix-2/4 vlinder
Radix-2/8 algoritme
Er kan nog een stap verder worden gegaan door het radix-2 en het radix-8 algoritme
samen te nemen. Het radix-2 algoritme neemt terug de even indexen voor zijn rekening.
Het radix-8 algoritme wordt aangewend om de oneven indexen te berekenen.
De formules voor dit algoritme zijn de volgende:
-
3.4 FFT INHOUDSOPGAVE
X2k =
N2−1∑
n=0
[xn + xn+N
2
]W 2nkN (3.8)
X8k′+1 =
N8−1∑
n=0
[[xn − xn+N
2− j
(xn+N
4− xn+ 3N
4
)](3.9)
+WN8N
[xn+N
8− xn+ 5N
8− j
(xn+ 3N
8− xn+ 7N
8
)]]W 8nk
′
N WnN (3.10)
X8k′+5 =
N8−1∑
n=0
[[xn − xn+N
2− j
(xn+N
4− xn+ 3N
4
)](3.11)
−WN8N
[xn+N
8− xn+ 5N
8− j
(xn+ 3N
8− xn+ 7N
8
)]]W 8nk
′
N W5nN (3.12)
X8k′+3 =
N8−1∑
n=0
[[xn − xn+N
2+ j
(xn+N
4− xn+ 3N
4
)](3.13)
+W3N8
N
[xn+N
8− xn+ 5N
8+ j
(xn+ 3N
8− xn+ 7N
8
)]]W 8nk
′
N W3nN (3.14)
X8k′+7 =
N8−1∑
n=0
[[xn − xn+N
2+ j
(xn+N
4− xn+ 3N
4
)](3.15)
−W3N8
N
[xn+N
8− xn+ 5N
8+ j
(xn+ 3N
8− xn+ 7N
8
)]]W 8nk
′
N W7nN (3.16)
Waarbij k = 0 . . . N2− 1 en k′ = 0 . . . N
8− 1. De grafische voorstelling van dit algoritme is
te zien in figuur 3.7.
Radix-2/4/8 algoritme[6]
De voorgaande twee algoritmes hebben als nadeel dat ze een soort van L-vorm vertonen,
hierdoor worden onregelmatige vormen bekomen in vergelijking met het gebruik van een
vast radix algoritme (bv. radix-2) of een combinatie van vaste radix algoritmes (bv. radix-
2/radix-4). Daardoor wordt het moeilijker om het efficient in hardware pipeline structuren
te implementeren. Voor deze toepassing is dit argument niet echt van toepassing maar er
kan heel wat winst worden geboekt op de omvang van de source code. Dit maakt vooral dat
er minder kans op fouten optreden en het minder beslag legt op het programmageheugen
moest dit een beperkende factor zijn.
Om dit te verhelpen kan men een radix-2/8 vlinder combineren met een radix-2/4 en
radix-2 vlinder. Hierdoor bekomen we terug een regelmatige structuur, te zien in figuur
3.8. Dit kan ook in blokvorm voorgesteld worden zoals in figuur 3.9.
-
3.4 FFT INHOUDSOPGAVE
Figuur 3.7: Radix-2/8 vlinder
Figuur 3.8: Radix-2/4/8 vlinder
Figuur 3.9: Radix-2/4/8 blok
-
3.4 FFT INHOUDSOPGAVE
Om een idee te hebben welke besparingen er mogelijk gemaakt zijn door het radix-2/4/8
algoritme te gebruiken is er een overzicht van de complexe vermenigvuldigingen (twiddle
factors) in tabel 3.1. Hierin kan men duidelijk zien dat er heel wat winst geboekt wordt
met het radix-2/4/8 algoritme.
N = 8n radix-2 radix-4 radix-2/4 radix-2/4/8
8 2 - 2 0
64 98 76 72 48
512 1538 - 1082 824
4096 18434 13996 12774 10168
Tabel 3.1: Overzicht complexe vermenigvuldigingen bij verschillende radix algoritmes[6]
3.4.3 256 punts FFT
Wordt fs verlaagd tot 12, 5 Hz dan volstaat een 256 punts FFT om toch nog in staat te
zijn 8 ademhalingen per minuut te detecteren. Dit betekent dat we met het radix-2/4/8
algoritme eerst een radix-4 vlinder nodig hebben. Dit verdeelt de 256 punts FFT in 4
kleinere FFT’s van 64 punten. Elk van deze 64 punts FFT kan worden onderverdeeld in
acht 8 punts FFT’s met het radix-2/4/8 algoritme. Uiteindelijk moeten de kleine 8 punts
FFT’s nog eens berekend worden met het radix-2/4/8 algoritme. Een blokschema van deze
256 punts FFT kan men zien in figuur 3.10.
De volgende stap is deze FFT in MATLAB code gieten, hiervoor werd de omgekeer-
de weg gevolgd. Beginnen met een elementaire radix-2/4/8 vlinder en dan stelselmatig
opbouwen tot de uiteindelijke 256 punts FFT bereikt wordt.
Het code fragment 3.3 toont de MATLAB code voor een elementaire radix-2/4/8 vlin-
der. Hierbij wordt het berekend in stappen zoals ze ook in figuur 3.8 aangegeven worden,
waarbij a en b de tussenresultaten vormen.
Een volgende stap in de richting van de 256 punts FFT is de 64 punts radix-2/4/8
vlinder, de MATLAB code hiervan is gegeven in code fragment 3.4. Hierin vindt men
duidelijk de structuur terug van de elementaire radix-2/4/8 code. Het belangrijkste verschil
zit in de vermenigvuldiging met de twiddle factoren in de laatste stap. Deze code wordt
in een for-lus 8 maal uitgevoerd juist om de FFT in deze 64 punten te berekenen.
-
3.4 FFT INHOUDSOPGAVE
Figuur 3.10: 256 punts FFT met het radix-2/4/8 algoritme
-
3.4 FFT INHOUDSOPGAVE
Codefragment 3.3: MATLAB code voor een elementaire radix-2/4/8 vlinder
function out = p8 rad i x 2 4 8 ( in )% Elementary 8 po in t radix −2/4/8 b u t t e r f l ya (1 ) = in (1 ) + in (5 ) ;a (2 ) = in (2 ) + in (6 ) ;a (3 ) = in (3 ) + in (7 ) ;a (4 ) = in (4 ) + in (8 ) ;a (5 ) = in (1 ) − in (5 ) ;a (6 ) = in (2 ) − in (6 ) ;a (7 ) = −j *( in (3 ) − in (7 ) ) ;a (8 ) = −j *( in (4 ) − in (8 ) ) ;
b (1 ) = a (1) + a (3) ;b (2 ) = a (2) + a (4) ;b (3 ) = a (1) − a (3 ) ;b (4 ) = −j *( a (2 ) − a (4 ) ) ;
b (5 ) = a (5) + a (7) ;b (6 ) = sqrt (2 ) /2*(1− j ) *( a (6 ) + a (8) ) ;b (7 ) = a (5) − a (7 ) ;b (8 ) = −sqrt (2 ) /2*(1+ j ) *( a (6 ) − a (8 ) ) ;
out (1 ) = b (1) + b (2) ;out (2 ) = b (1) − b (2) ;
out (3 ) = b (3) + b (4) ;out (4 ) = b (3) − b (4) ;
out (5 ) = b (5) + b (6) ;out (6 ) = b (5) − b (6) ;
out (7 ) = b (7) + b (8) ;out (8 ) = b (7) − b (8) ;end
-
3.4 FFT INHOUDSOPGAVE
Codefragment 3.4: MATLAB code voor een 64 punts radix-2/4/8 vlinder
function out = p64 rad i x 2 4 8 ( in )% 64 po in t radix −2/4/8 b u t t e r f l yfor n=1:8
a (n) = in (n) + in (32+n) ;a(8+n) = in (8+n) + in (40+n) ;a(16+n) = in (16+n) + in (48+n) ;a(24+n) = in (24+n) + in (56+n) ;a(32+n) = in (n) − in (32+n) ;a(40+n) = in (8+n) − in (40+n) ;a(48+n) = −j *( in (16+n) − in (48+n) ) ;a(56+n) = −j *( in (24+n) − in (56+n) ) ;
b (n) = a (n) + a(16+n) ;b(8+n) = a(8+n) + a(24+n) ;b(16+n) = a (n) − a(16+n) ;b(24+n) = −j *( a(8+n) − a(24+n) ) ;
b(32+n) = a(32+n) + a(48+n) ;b(40+n) = sqrt (2 ) /2*(1− j ) *( a(40+n) + a(56+n) ) ;b(48+n) = a(32+n) − a(48+n) ;b(56+n) = −sqrt (2 ) /2*(1+ j ) *( a(40+n) − a(56+n) ) ;
out (n) = b(n) + b(8+n) ;out(8+n) =(b(n) − b(8+n) ) *exp(− j *2*pi *(n−1)/16) ;
out (16+n) = (b(16+n) + b(24+n) ) *exp(− j *2*pi *(n−1)/32) ;out (24+n) = (b(16+n) − b(24+n) ) *exp(− j *2*pi *3*(n−1)/32) ;
out (32+n) = (b(32+n) + b(40+n) ) *exp(− j *2*pi *(n−1)/64) ;out (40+n) = (b(32+n) − b(40+n) ) *exp(− j *2*pi *5*(n−1)/64) ;
out (48+n) = (b(48+n) + b(56+n) ) *exp(− j *2*pi *3*(n−1)/64) ;out (56+n) = (b(48+n) − b(56+n) ) *exp(− j *2*pi *7*(n−1)/64) ;
end
-
3.4 FFT INHOUDSOPGAVE
Er rest nog één stap, namelijk de radix-4 vlinder om de 256 punts FFT op te splitsen
in vier 64 punts FFT’s. De MATLAB code voor deze stap is na te lezen in code frag-
ment 3.5, ook hier kan men de vlinderstructuur terugvinden. Er moet hier ook worden
vermenigvuldigt met twiddle factoren.
Codefragment 3.5: MATLAB code voor een 256 punts radix-4 vlinder
function [ out ] = p256 rad ix 4 ( in )% 256 po in t s radix−4 b u t t e r f l yfor n=1:64
out (n) = in (n) + in (n+64) + in (n+128) + in (n+192) ;out (n+64) = ( in (n) − j * in (n+64) − in (n+128) + j * in (n+192) ) *exp(− j *2*pi *(
n−1)/256) ;out (n+128) = ( in (n) − in (n+64) + in (n+128) − in (n+192) ) *exp(− j *2*pi *2*(n−1)/256) ;
out (n+192) = ( in (n) + j * in (n+64) − in (n+128) − j * in (n+192) ) *exp(− j *2*pi*3*(n−1)/256) ;
end
Deze verschillende vlinders moeten gecombineerd worden om de volledige FFT te kun-
nen berekenen, dit wordt gedaan p256_fft.m wat samen met de volledige MATLAB code
te vinden is in appendix A.1.2. Na de uitvoering van de vlinders en de FFT in wezen be-
rekend is moeten de bekomen waarden nog in de juiste volgorde worden gezet. Dit wordt
gedaan aan de hand van arrange_output.m.
Prestaties van het algoritme
Om de prestaties van het algoritme te kunnen evalueren werd een testbench geschreven
(p256_fft_tb.m). Hierin werd random data gegenereerd en vervolgens werd het spectrum
berekend met zowel het radix-2/4/8 algoritme als met de FFT functie van MATLAB zelf.
Beide resultaten werden van elkaar afgetrokken zodat enkel de fout overbleef. Vervolgens
werd de verhouding tussen het spectrum en de fout berekend in dB. Dit werd 100 maal
herhaald en het resultaat is te zien in figuur 3.11. De verhouding ligt rond 310 dB wat laat
besluiten dat het verschil nagenoeg nihil is.
Deze testbench kan ook in een later stadium worden gebruikt om de prestatie van de
gekwantiseerde code te evalueren. Er is echter nog niet tot het kwantiseren van de code
gekomen.
-
3.5 Uiteindelijke analyse INHOUDSOPGAVE
Figuur 3.11: Verhouding van de fout op het radix-2/4/8 algoritme tot de MATLAB FFT
functie
3.5 Uiteindelijke analyse
In de voorgaande punten werden de verschillende onderdelen voor het analyseren van de
gegevens met MATLAB overlopen. Deze moeten allemaal aan elkaar gelinkt worden om
de uiteindelijke analyse uit te kunnen voeren. Dit werd in twee stappen gedaan: namelijk
de data binnen nemen en opslaan middels de geschreven seriële interface in MATLAB en
vervolgens deze bewaarde data analyseren met een script.
De metingen werden uitgevoerd op een testpersoon, dit was een volwassen persoon.
Er werd echter aangenomen dat deze metingen ook voor babies representatief zijn. De
bewegingen die de borst van een baby maakt zijn kleiner, maar het ademhalingsritme
hoger wat als gevolg moet hebben dat de gemeten versnellingen van de bewegingen zelfs
hoger zijn.
In de volgende secties zijn representatieve metingen geanalyseerd in verschillende posi-
ties. Een baby kan zowel op de rug als op de borst slapen, hoewel het laatste niet wordt
aangeraden. De hardware voorziet de mogelijkheid om twee sensoren aan te sluiten, één
op de borst en één op de rug. Zodat in alle omstandigheden minstens één sensor vrij kan
bewegen om de ademhaling te detecteren.
-
3.5 Uiteindelijke analyse INHOUDSOPGAVE
3.5.1 Liggend op de rug met sensor op de borst
Bij deze meting bedroeg het ademhalingsritme ongeveer 16 ademhalingen per minuut wat
neerkomt op 0, 26 Hz. In figuur 3.12 ziet men bovenaan hoe de meting werd binnengenomen
via de seriële interface en onderaan dezelfde meting maar met het DC niveau verwijderd. De
gefilterde meting is wat korter omdat het begin van het gefilterde signaal werd verwijderd.
Het signaal werd slechts geselecteerd waar de filter al min of meer tot rust was gekomen.
Figuur 3.12: Meting en gefilterde meting, liggend op de rug met sensor op de borst
Figuur 3.13 toont een hoge resolutie FFT van de gefilterde meting. Daarnaast wordt
diezelfde FFT nogmaals getoond, beperkt tot het gebied van interesse (0 Hz tot 2 Hz).
Hierin is duidelijk een piek te zien die iets boven de 0, 2 Hz ligt. Het is dus bevestigd dat
de ademhaling kan worden gedetecteerd met accelerometers.
De ademhaling moet worden gedetecteerd en er kan niet lang worden gewacht op genoeg
data om een hoge resolutie FFT te berekenen. Aan een sample frequentie van 25 Hz duurt
het al snel een minuut om een FFT te kunnen berekenen van 1024 punten. Tegen die tijd
moet er reeds alarm geslagen worden indien er geen ademhaling gedetecteerd wordt. Een
256 punts FFT kan worden uitgerekend om de 10 s. Hierbij kan eventueel worden overlapt
en om de 5 s de 256 punts FFT worden berekend. Op deze manier wordt het wel mogelijk
om na een tiental seconden alarm te slaan als er geen ademhaling wordt gedetecteerd.
-
3.5 Uiteindelijke analyse INHOUDSOPGAVE
(a) (b)
Figuur 3.13: Hoge resolutie FFT (a) en tot 2 Hz (b), liggend op de rug met sensor op de
borst
Figuur 3.14 toont vier van deze kleinere 256 punts FFT’s berekend met het radix-2/4/8
algoritme op verschillende tijdstippen in de gefilterde meting. Er duikt telkens een piek op
die rond de 0, 2 Hz gelegen is. Het is ook telkens de grootste zodat deze ook makkelijk te
detecteren valt.
3.5.2 Liggend op de borst met de sensor op de rug
Ook als de baby op de borst ligt moet de ademhaling met een sensor op de rug kunnen wor-
den gedetecteerd. Dit is minder vanzelfsprekend daar de bewegingen minder uitgesproken
zijn. Hier werden ongeveer 15 ademhalingen per minuut geregistreerd wat een frequentie
van 0, 25 Hz met zich meebrengt.
Figuur 3.15 toont terug de meting en de gefilterde meting in het tijdsdomein.
In de hoge resolutie FFT (figuur 3.16) kan men terug een duidelijke piek vinden rond
0, 2 Hz. Er kan dus opnieuw vanuit worden gegaan dat de ademhaling te detecteren valt
wanneer men op de borst ligt met een sensor op de rug geplaatst.
Ook hier werden vier kleinere FFT’s berekend (figuur 3.17). Terug zijn er pieken waar
te nemen rond de 0, 2 Hz. In twee van de vier FFT’s duiken er nog pieken op bij andere
frequenties, namelijk bij deelfiguren (a) en (g). Bij de laatste is de piek bij de ademhaling
enkel de grootste wanneer alleen het gebied tussen 0 Hz en 2 Hz beschouwd wordt.
Het blijkt dus wat moeilijker te zijn om in deze positie de ademhaling te detecteren.
-
3.5 Uiteindelijke analyse INHOUDSOPGAVE
(a) (b)
(c) (d)
(e) (f)
(g) (h)
Figuur 3.14: 256 punts FFT’s op verschillende plaatsen met overeenkomstige beperkte
bereiken tot 2 hertz
-
3.5 Uiteindelijke analyse INHOUDSOPGAVE
Figuur 3.15: Meting en gefilterde meting, liggend op de borst met sensor op de rug
(a) (b)
Figuur 3.16: Hoge resolutie FFT (a) en tot 2 Hz (b), liggend op de borst met sensor op de
rug
-
3.5 Uiteindelijke analyse INHOUDSOPGAVE
(a) (b)
(c) (d)
(e) (f)
(g) (h)
Figuur 3.17: 256 punts FFT’s op verschillende plaatsen met overeenkomstige beperkte
bereiken tot 2 hertz
-
3.5 Uiteindelijke analyse INHOUDSOPGAVE
3.5.3 Liggend op de rug met sensor op de borst zonder te ademen
Het is ook belangrijk te weten of het niet ademen ook te detecteren valt. Deze meting kan
uiteraard geen minuten duren en is dan ook wat korter.
De meting samen met de gefilterde meting worden weergegeven in figuur 3.18.
Figuur 3.18: Meting en gefilterde meting, liggend op de rug met sensor op de borst zonder
te ademen
Een hoge resolutie FFT van de meting wordt gegeven in figuur 3.19(a). Hierin is een
piek waar te nemen maar deze bevindt zich onder de 0, 1 Hz. In deze situatie zou dus
alarm worden geslagen.
-
3.5 Uiteindelijke analyse INHOUDSOPGAVE
(a) (b)
Figuur 3.19: Hoge resolutie FFT (a) en tot 2 Hz (b), liggend op de rug met sensor op de
borst zonder te ademenen
-
FIRMWARE INHOUDSOPGAVE
Hoofdstuk 4
Firmware
4.1 Ontwikkelomgeving
Er is een ontwikkelomgeving nodig om de code voor de microcontroller te compileren en
vervolgens de microcontroller met deze gecompileerde code te programmeren. De gekozen
ontwikkelomgeving hier gebruikt betreft de open source mspgcc[7]. Deze ontwikkelom-
geving is zowel beschikbaar voor Linux als voor Windows en is gebaseerd op de GNU
gcc compiler. Naast de compiler bevat de ontwikkelomgeving ook tools om de code te
debuggen.
Deze ontwikkelomgeving biedt een volwaardig alternatief voor de IAR Kickstart ontwik-
kelomgeving, die weliswaar ook gratis beschikbaar is. Er is echter wel een licentie nodig als
de C-source code groter is dan 1kB. Deze ontwikkelomgeving is trouwens enkel beschikbaar
voor Windows.
4.2 Interface met de sensor
De gekozen sensor LIS302DL ondersteunt zowel de I2C als de SPI communicatie protocol-
len. Hier werd gekozen om d.m.v. het SPI protocol met de sensor te communiceren. Deze
interface laat toe om met een maximum klokfrequentie van 10 MHz te communiceren met
de sensor. De I2C interface daarentegen heeft als maximum klokfrequentie 400 kHz. De
opzet van het SPI protocol is ook heel wat eenvoudiger dan het I2C protocol.
De MSP430F149 heeft twee configureerbare seriële interfaces (USART’s) die zowel SPI
als asynchrone seriële communicatie aankan. Zodoende is het wel verplicht om via het SPI
protocol te communiceren met de sensor als deze dedicated hardware interface gebruikt
wil worden. Dit moet echter geconfigureerd worden. Het code fragment 4.1 toont hoe dit
-
4.2 Interface met de sensor INHOUDSOPGAVE
verwezenlijkt wordt.
Codefragment 4.1: C code voor de configuratie van de SPI interface
void s p i s e t up (void ) {P3SEL |= BIT1 + BIT2 + BIT3 ; // Setup P3 fo r SPI modeP3OUT |= BIT4 ; // Setup P3 .4 f o r enab l ing s l a v eP3DIR |= BIT4 + BIT3 + BIT1 ; // P3 .1 ,3 ,4 i s outputU0CTL |= CHAR + SYNC + MM; // 8− b i t Master SPI modeU0TCTL = CKPL + SSEL SMCLK + STC; // Po lar i t y , SMCLK, 3−wireU0BR0 = BIT1 ; // SPICLK=SMCLK/2U0BR1 = 0x00 ;U0MCTL = 0x00 ;ME1 |= USPIE0 ; // SPI module enab ledUCTL0 &= ˜SWRST; // I n i t i a l i z e SPI s t a t e machine
}
Eerst worden de nodige bits gezet in de poortregisters om de microcontroller te ver-
tellen dat deze verbonden moeten worden met de configureerbare seriële interface en niet
moeten worden gebruikt als gewone I/O poorten. Alsook welke poorten als ouput en input
geconfigureerd worden. Daarna wordt de configureerbare seriële interface geconfigureerd
als een SPI interface. Vervolgens wordt deze gëınitialiseerd en is ze klaar om te gebruiken.
Codefragment 4.2: C code voor het lezen van de SPI interface
signed char s p i r e ad (char addr ) {signed char data ;P3OUT &= ˜BIT4 ; // Enable s l a v eIFG1 &= ˜URXIFG0; // Clear f l a gTXBUF0 = LIS302DL READ + addr ;while ( ! ( IFG1&URXIFG0) ) ; // Wait f o r TX to f i n i s hIFG1 &= ˜URXIFG0; // Clear f l a g from f i r s t dummy by t eTXBUF0 = 0 ; // Dummy wr i t e so we can read datawhile ( ! ( IFG1&URXIFG0) ) ; // Wait f o r RX to f i n i s hdata = RXBUF0;P3OUT |= BIT4 ; // Disab l e s l a v ereturn data ;
}
Data kan via de SPI interface worden gelezen met behulp van codefragment 4.2. Om
een waarde uit te lezen wordt de sensor geactiveerd en wordt het betreffende adres van de
informatie naar de microcontroller gestuurd. Daarvoor hoeft enkel het adres en de leesbit
in de zendbuffer worden geplaatst. Er wordt gewacht tot de verzending voltooid is en dan
-
4.3 Interface met de computer INHOUDSOPGAVE
wordt er een dummybyte in de zendbuffer geplaatst om het antwoord van de sensor binnen
te kunnen klokken. Als het antwoord ontvangen is wordt het doorgegeven.
Codefragment 4.3: C code voor het schrijven naar de SPI interface
void s p i w r i t e (char addr , char va l ) {P3OUT &= ˜BIT4 ; // Enable s l a v eIFG1 &= ˜URXIFG0; // Clear f l a g from f i r s t dummy by t eTXBUF0 = LIS302DL WRITE + addr ;while ( ! ( IFG1&URXIFG0) ) ; // Wait f o r TX to f i n i s hIFG1 &= ˜URXIFG0; // Clear f l a g from f i r s t dummy by t eTXBUF0 = val ;while ( ! ( IFG1&URXIFG0) ) ; // Wait f o r TX to f i n i s hP3OUT |= BIT4 ; // Disab l e s l a v e
}
Het schrijven van data via de SPI interface gebeurt met codefragment 4.3. Schrijven
gebeurt op dezelfde manier als lezen. Er wordt een adres en schrijfbit in de zendbuffer
geplaatst en gewacht tot de verzending voltooid is. Dan wordt de te schrijven data in de
zendbuffer geplaatst en op zijn beurt verzonden naar de sensor.
4.3 Interface met de computer
De communicatie met de computer gebeurt op een gelijkaardige manier. Hiervoor wordt de
tweede configureerbare seriële interface gebruikt. Deze interface wordt hier enkel gebruikt
om data weg te schrijven naar de computer en niet omgekeerd.
Ook hier moet de interface eerst worden geconfigureerd. Codefragment 4.4 verwezenlijkt
dit.
Codefragment 4.4: C code voor de configuratie van de interface met de computer
void uar t s e tup (void ) {P3SEL |= 0xC0 ; // P3 .6 ,7 = USART1 TXD/RXDME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXDUCTL1 |= CHAR; // 8− b i t charac t e rUTCTL1 |= SSEL0 ; // UCLK = ACLKUBR01 = 0x03 ; // 32k/9600 − 3.41UBR11 = 0x00 ; //UMCTL1 = 0x4A ; // ModulationUCTL1 &= ˜SWRST; // I n i t i a l i z e USART s t a t e machine
}
-
4.4 Hoofd programma INHOUDSOPGAVE
De betreffende poorten moeten opnieuw op de juiste manier worden ingesteld. Er wordt
een klok geselecteerd en dan wordt via delers de juiste baudrate ingesteld. Daarna wordt
de interface gëınitialiseerd en is deze klaar voor gebruik.
Codefragment 4.5: C code voor het schrijven naar de interface met de computer
void ua r t wr i t e (char va l ) {while ( ! ( IFG2 & UTXIFG1) ) ; // USART1 TX bu f f e r ready?TXBUF1 = val ; // va l to TXBUF1
}
Data wegschrijven via de interface kan met codefragment 4.5. Er wordt eerst nagegaan
en eventueel gewacht tot data in de zendbuffer kan worden geplaatst. Het wordt vervolgens
in de buffer geplaatst en verzonden via de interface naar de computer.
4.4 Hoofd programma
Het hoofd programma doet eigenlijk niets meer dan de data van de sensor uitlezen en
vervolgens doorzenden naar de computer. De main loop van het programma is gegeven in
codefragment 4.6.
De beide interfaces worden eerst geconfigureerd waarna de sensor wordt ingesteld. Er
wordt meegegeven dat de sensor een interrupt op een poort van de microcontroller genereert
als er een nieuwe meetwaarde ter beschikking is. Vervolgens verkeert de microcontroller in
een oneindige lus waarbij hij controleert of er een nieuwe meetwaarde klaar staat en deze
uitleest als dit zo is. Zodra 4 meetwaarden uitgelezen zijn worden ze bij elkaar opgeteld en
dit resultaat wordt doorgestuurd naar de computer.
De sensor heeft meetwaarden klaar met een frequentie van 100 Hz; door 4 meetwaarden
op te tellen en dan pas door te sturen is de sample frequentie verminderd tot 25 Hz.
De volledige source code is te vinden in bijlage A.2.
-
4.4 Hoofd programma INHOUDSOPGAVE
Codefragment 4.6: C code voor de main loop van het programma
int main (void ) {uar t s e tup ( ) ;s p i s e t up ( ) ;// Conf igure LIS302DL : i n t e r r u p t on INT1 when data i s readys p i w r i t e (LIS302DL REG CTRL3 , LIS302DL INTMODE DATA READY) ;// Enable Z−ax i s and enab l e dev i c es p i w r i t e (LIS302DL REG CTRL1 , LIS302DL CTRL1 PD + LIS302DL CTRL1 Zen
) ;while (1 ) {
i f ( i n t a c c da t a == 1) {outz [ i ] = sp i r e ad (LIS302DL REG OUT Z) ;i f ( i == 3) {
i = 0 ;mz = 0 ;calc mean ( ) ;u a r t w r i t e i n t (mz) ;
}else {
i++;}i n t a c c da t a = 0 ;
}}
}
Codefragment 4.7: C code voor de interrupt afhandeling
i n t e r r up t (PORT1 VECTOR) ge t a c c da ta ( ) {i n t a c c da t a = 1 ;P1IFG &= ˜BIT3 ; // Clear P1 .3 i n t e r r u p t f l a g
}
Codefragment 4.8: C code voor het berekenen van het gemiddelde
void calc mean (void ) {char j ;for ( j =0; j
-
BESLUIT INHOUDSOPGAVE
Hoofdstuk 5
Besluit
In dit werk werd een eerste stap gezet in de ontwikkeling van een ademhalingssensor op ba-
sis van accelerometers. Er werd een hardwareplatform ontwikkeld dat universeel is en niet
enkel beperkt is tot een ademhalingssensor. Dit neemt niet weg dat het met deze bedoeling
werd ontwikkeld. Er werd aangetoond dat het wel degelijk mogelijk is om met accelerome-
ters de ademhaling te detecteren. Een eerste stap in de richting van implementatie van de
algoritmes in de microcontroller werd gezet.
Een proof-of-concept werd afgeleverd, waarmee meteen ook wordt aangegeven dat dit
niet het einde is van de ontwikkeling van deze ademhalingssensor..Het is veeleer een begin.
Het hardware deel staat min of meer op punt, echter op algoritmisch vlak kan er nog veel
verder worden gewerkt. De aanzet werd hier gegeven voor sommige delen, zoals de FFT.
Er rest echter nog heel wat. Het radix-2/4/8 algoritme, hier uitgewerkt, kan het spectrum
berekenen van een reeks complexe getallen. De data waarvan in deze toepassing het spec-
trum berekend wordt zijn echter reëel en er is nog heel wat ruimte om de complexiteit te
verlagen. Er is ook een beperkt deel van dit spectrum waar de gewenste informatie zich
bevindt, dit kenmerk werd niet aangewend om de complexiteit nog verder terug te drin-
gen. Vooraleer het te implementeren valt in de microcontroller moet er ook een kwantisatie
gedaan worden van de algoritmes ontwikkeld in MATLAB.
Voor de filter werden WDF filters onderzocht, maar het is niet gelukt om uit te maken
of deze nu wel of niet geschikt zijn. Slechts een 3de en 5de-orde filter werden in MATLAB
code gegoten en deze bleken niet performant genoeg te zijn. Het moet verder onderzocht
worden of deze wel geschikt zijn voor deze applicatie.
Als algemeen besluit kan gesteld worden dat werd aangetoond dat op basis van acce-
lerometers de ademhaling kan worden gedetecteerd. Om tot een betrouwbare detectie te
komen zijn de eerste stappen gezet maar is nog een lange weg te gaan.
-
SOURCE CODE INHOUDSOPGAVE
Bijlage A
Source code
A.1 MATLAB source code
A.1.1 Seriële interface
MATLAB code voor de seriële interface: serial_interface.m
function s e r i a l i n t e r f a c e ( )
% Opens a s e r i a l communication o b j e c ts1=s e r i a l ( ’ /dev/ttyUSB0 ’ , ’BaudRate ’ , 9600 , ’ Par i ty ’ , ’ none ’ , ’ DataBits ’ , 8 , ’
StopBits ’ , 1) ;set ( s1 , ’ InputBu f f e rS i z e ’ ,2048) ; % in i=512fopen ( s1 ) ;
% asynchronous modes1 . ReadAsyncMode = ’ cont inuous ’ ;
% s e t t i n g up v a r i a b l e s ho l d ing the datadata = zeros (15000 ,1) ; % ho ld s a l l raw dataz = zeros (32 ,1 ) ; % incoming raw data (25Hz)bu f z = zeros (256 ,1 ) ; % bu f f e r raw data
% s e t t i n g up f i g u r eh = f igure ;set (h , ’ KeyPressFcn ’ , @keyHandler ) ;handleZ = plot ( z ) ;t i t l e ( ’ Received data Fs=25Hz ’ ) ;
% reading data from s e r i a l i n t e r f a c e
-
A.1 MATLAB source code INHOUDSOPGAVE
max index = 0 ;quit = 0 ;i =0;k=0;while ˜quit
i f ( s1 . BytesAva i lab le >= 64)z ( : , 1 ) = fread ( s1 , 3 2 , ’ i n t16 ’ ) ;data ( ( k*32+1) : ( ( k+1)*32) ,1 )=z ;k=k+1;i f ( i
-
A.1 MATLAB source code INHOUDSOPGAVE
elsea (1 ) = in (1 ) + in (5 ) ;a (2 ) = in (2 ) + in (6 ) ;a (3 ) = in (3 ) + in (7 ) ;a (4 ) = in (4 ) + in (8 ) ;a (5 ) = in (1 ) − in (5 ) ;a (6 ) = in (2 ) − in (6 ) ;a (7 ) = −j *( in (3 ) − in (7 ) ) ;a (8 ) = −j *( in (4 ) − in (8 ) ) ;
b (1 ) = a (1) + a (3) ;b (2 ) = a (2) + a (4) ;b (3 ) = a (1) − a (3 ) ;b (4 ) = −j *( a (2 ) − a (4 ) ) ;
b (5 ) = a (5) + a (7) ;b (6 ) = sqrt (2 ) /2*(1− j ) *( a (6 ) + a (8) ) ;b (7 ) = a (5) − a (7 ) ;b (8 ) = −sqrt (2 ) /2*(1+ j ) *( a (6 ) − a (8 ) ) ;
out (1 ) = b (1) + b (2) ;out (2 ) = b (1) − b (2) ;
out (3 ) = b (3) + b (4) ;out (4 ) = b (3) − b (4) ;
out (5 ) = b (5) + b (6) ;out (6 ) = b (5) − b (6) ;
out (7 ) = b (7) + b (8) ;out (8 ) = b (7) − b (8) ;
end
MATLAB code voor de 64 punts radix-2/4/8 vlinder: p64_radix_2_4_8.m
function out = p64 rad i x 2 4 8 ( in )
% 64 po in t radix −2/4/8 b u t t e r f l y
a = zeros (1 , 64 ) ;b = zeros (1 , 64 ) ;out = zeros (1 , 64 ) ;i f ( length ( in ) ˜= 64)
disp ( ’Wrong input l ength ! Should be 64 po in t s ’ ) ;
-
A.1 MATLAB source code INHOUDSOPGAVE
elsefor n=1:8
a (n) = in (n) + in (32+n) ;a(8+n) = in (8+n) + in (40+n) ;a(16+n) = in (16+n) + in (48+n) ;a(24+n) = in (24+n) + in (56+n) ;a(32+n) = in (n) − in (32+n) ;a(40+n) = in (8+n) − in (40+n) ;a(48+n) = −j *( in (16+n) − in (48+n) ) ;a(56+n) = −j *( in (24+n) − in (56+n) ) ;
b (n) = a (n) + a(16+n) ;b(8+n) = a(8+n) + a(24+n) ;b(16+n) = a (n) − a(16+n) ;b(24+n) = −j *( a(8+n) − a(24+n) ) ;
b(32+n) = a(32+n) + a(48+n) ;b(40+n) = sqrt (2 ) /2*(1− j ) *( a(40+n) + a(56+n) ) ;b(48+n) = a(32+n) − a(48+n) ;b(56+n) = −sqrt (2 ) /2*(1+ j ) *( a(40+n) − a(56+n) ) ;
out (n) = b(n) + b(8+n) ;out(8+n) =(b(n) − b(8+n) ) *exp(− j *2*pi *(n−1)/16) ;
out (16+n) = (b(16+n) + b(24+n) ) *exp(− j *2*pi *(n−1)/32) ;out (24+n) = (b(16+n) − b(24+n) ) *exp(− j *2*pi *3*(n−1)/32) ;
out (32+n) = (b(32+n) + b(40+n) ) *exp(− j *2*pi *(n−1)/64) ;out (40+n) = (b(32+n) − b(40+n) ) *exp(− j *2*pi *5*(n−1)/64) ;
out (48+n) = (b(48+n) + b(56+n) ) *exp(− j *2*pi *3*(n−1)/64) ;out (56+n) = (b(48+n) − b(56+n) ) *exp(− j *2*pi *7*(n−1)/64) ;
endend
MATLAB code voor de 256 punts radix-4 vlinder: p256_radix_4.m
function [ out ] = p256 rad ix 4 ( in )
% 256 punts radix−4 b u t t e r f l y
i f ( length ( in ) ˜= 256)disp ( ’Wrong input l ength ! Should be 256 po in t s ’ ) ;return ;
-
A.1 MATLAB source code INHOUDSOPGAVE
elsefor n=1:64
out (n) = in (n) + in (n+64) + in (n+128) + in (n+192) ;out (n+64) = ( in (n) − j * in (n+64) − in (n+128) + j * in (n+192) ) *exp(− j *2*
pi *(n−1)/256) ;out (n+128) = ( in (n) − in (n+64) + in (n+128) − in (n+192) ) *exp(− j *2*pi
*2*(n−1)/256) ;out (n+192) = ( in (n) + j * in (n+64) − in (n+128) − j * in (n+192) ) *exp(− j
*2*pi *3*(n−1)/256) ;end
end
MATLAB code om de output te herschikken: arrange_output.m
function out = arrange output ( in ) ;
% Arranges de output a f t e r the l a s t radix −2/4/8 s t a ge
index1 = [0 8 4 12 1 9 5 13 2 10 6 14 3 11 7 1 5 ] ;index2 = [0 128 64 192 32 160 96 224 16 144 80 208 48 176 112 2 4 0 ] ;out = zeros (1 ,256) ;k=0;for i =0:15
for j =0:15k = k + 1 ;out ( index2 ( j +1)+index1 ( i +1)+1) = in (k ) ;
endendend
MATLAB code om de 256 punts FFT te berekenen: p256_fft.m
function [ out ] = p25 6 f f t ( dat )
% func t i on to c a l c u l a t e a 256 po in t s f f t wi th the radix −2/4/8 a l gor i tm
% Fi r s t b u t t e r f l yt1 = p256 rad ix 4 ( dat ) ;
% Second b u t t e r f l yt21 = p64 rad i x 2 4 8 ( t1 ( 1 : 6 4 ) ) ;t22 = p64 rad i x 2 4 8 ( t1 ( 65 : 128 ) ) ;t23 = p64 rad i x 2 4 8 ( t1 (129 : 192 ) ) ;t24 = p64 rad i x 2 4 8 ( t1 (193 : 256 ) ) ;
-
A.1 MATLAB source code INHOUDSOPGAVE
% Third b u t t e r f l yt301 = p8 rad i x 2 4 8 ( t21 ( 1 : 8 ) ) ;t302 = p8 rad i x 2 4 8 ( t21 ( 9 : 1 6 ) ) ;t303 = p8 rad i x 2 4 8 ( t21 ( 17 : 2 4 ) ) ;t304 = p8 rad i x 2 4 8 ( t21 ( 25 : 3 2 ) ) ;t305 = p8 rad i x 2 4 8 ( t21 ( 33 : 4 0 ) ) ;t306 = p8 rad i x 2 4 8 ( t21 ( 41 : 4 8 ) ) ;t307 = p8 rad i x 2 4 8 ( t21 ( 49 : 5 6 ) ) ;t308 = p8 rad i x 2 4 8 ( t21 ( 57 : 6 4 ) ) ;t309 = p8 rad i x 2 4 8 ( t22 ( 1 : 8 ) ) ;t310 = p8 rad i x 2 4 8 ( t22 ( 9 : 1 6 ) ) ;t311 = p8 rad i x 2 4 8 ( t22 ( 17 : 2 4 ) ) ;t312 = p8 rad i x 2 4 8 ( t22 ( 25 : 3 2 ) ) ;t313 = p8 rad i x 2 4 8 ( t22 ( 33 : 4 0 ) ) ;t314 = p8 rad i x 2 4 8 ( t22 ( 41 : 4 8 ) ) ;t315 = p8 rad i x 2 4 8 ( t22 ( 49 : 5 6 ) ) ;t316 = p8 rad i x 2 4 8 ( t22 ( 57 : 6 4 ) ) ;t317 = p8 rad i x 2 4 8 ( t23 ( 1 : 8 ) ) ;t318 = p8 rad i x 2 4 8 ( t23 ( 9 : 1 6 ) ) ;t319 = p8 rad i x 2 4 8 ( t23 ( 17 : 2 4 ) ) ;t320 = p8 rad i x 2 4 8 ( t23 ( 25 : 3 2 ) ) ;t321 = p8 rad i x 2 4 8 ( t23 ( 33 : 4 0 ) ) ;t322 = p8 rad i x 2 4 8 ( t23 ( 41 : 4 8 ) ) ;t323 = p8 rad i x 2 4 8 ( t23 ( 49 : 5 6 ) ) ;t324 = p8 rad i x 2 4 8 ( t23 ( 57 : 6 4 ) ) ;t325 = p8 rad i x 2 4 8 ( t24 ( 1 : 8 ) ) ;t326 = p8 rad i x 2 4 8 ( t24 ( 9 : 1 6 ) ) ;t327 = p8 rad i x 2 4 8 ( t24 ( 17 : 2 4 ) ) ;t328 = p8 rad i x 2 4 8 ( t24 ( 25 : 3 2 ) ) ;t329 = p8 rad i x 2 4 8 ( t24 ( 33 : 4 0 ) ) ;t330 = p8 rad i x 2 4 8 ( t24 ( 41 : 4 8 ) ) ;t331 = p8 rad i x 2 4 8 ( t24 ( 49 : 5 6 ) ) ;t332 = p8 rad i x 2 4 8 ( t24 ( 57 : 6 4 ) ) ;
% Concatenate ou tpu t s t h i r d b u t t e r f l yY1 = [ t301 t302 t303 t304 t305 t306 t307 t308 t309 t310 t311 t312 t313 t314
t315 t316 . . .t317 t318 t319 t320 t321 t322 t323 t324 t325 t326 t327 t328 t329 t330
t331 t332 ] ;
out = arrange output (Y1) ;
MATLAB code van de testbench voor de 256 punts FFT: p256_fft_tb
-
A.2 C code voor de microcontroller INHOUDSOPGAVE
% Testbench s c r i p t f o r the 256 po in t s f f t
close a l l ;
SNR256 = zeros (1 ,100) ;
for i =1:100% Generation o f a random complex inputsequence 256 po in t s f f t ( input
range = [−2048 . . 2048])dat = 4096.*rand (1 ,256) − 2048 + j * (4096 .* rand (1 ,256) − 2048) ;
% Ca lcu l a t i on o f f f t wi th Matlab func t i on f o r r e f e r ence purposesY = f f t ( double ( dat ) ,256) ;
% Ca lcu l a t e 128 po in t s f f t wi th radix −2/4/8 a l gor i thmout = p25 6 f f t ( dat ) ;
% Check r e s u l t se r r s = out − Y;s i g = sum(abs (Y) . ˆ 2 ) /256 ;no i s e = sum(abs ( e r r s ) . ˆ 2 ) /256 ;SNR256( i ) = 10* log10 ( s i g / no i s e ) ;
end
figure ;plot (SNR256) ;
A.2 C code voor de microcontroller
C code voor de SPI interface: spi.c
//************************************************//// Handles the s p i i n t e r f a c e and se tup //// //// By Pepi jn Mist iaen ( lanquarden@gmail . com) ////
//// Fo l lowing p ins are used by the s p i i n t e r f a c e : //// P3 .1 (29) SIMO to SDI //// P3 .2 (30) SOMI to SDO //
-
A.2 C code voor de microcontroller INHOUDSOPGAVE
// P3 .3 (31) UCLK to SPC //// P3 .4 (32) CS to CS ////************************************************//
#include #include #include #include ” l i s 3 0 2 d l . h”
signed char s p i r e ad (char addr ) {signed char data ;P3OUT &= ˜BIT4 ; // Enable s l a v eIFG1 &= ˜URXIFG0; // Clear f l a gTXBUF0 = LIS302DL READ + addr ;while ( ! ( IFG1&URXIFG0) ) ; // Wait f o r TX to f i n i s hIFG1 &= ˜URXIFG0; // Clear f l a g from f i r s t dummy by t eTXBUF0 = 0 ; // Dummy wr i t e so we can read datawhile ( ! ( IFG1&URXIFG0) ) ; // Wait f o r RX to f i n i s hdata = RXBUF0;P3OUT |= BIT4 ; // Disab l e s l a v ereturn data ;
}
void s p i w r i t e (char addr , char va l ) {P3OUT &= ˜BIT4 ; // Enable s l a v eIFG1 &= ˜URXIFG0; // Clear f l a g from f i r s t dummy by t eTXBUF0 = LIS302DL WRITE + addr ;while ( ! ( IFG1&URXIFG0) ) ; // Wait f o r TX to f i n i s hIFG1 &= ˜URXIFG0; // Clear f l a g from f i r s t dummy by t eTXBUF0 = val ;while ( ! ( IFG1&URXIFG0) ) ; // Wait f o r TX to f i n i s hP3OUT |= BIT4 ; // Disab l e s l a v e
}
void s p i s e t up (void ) {P3SEL |= BIT1 + BIT2 + BIT3 ; // Setup P3 fo r SPI modeP3OUT |= BIT4 ; // Setup P3 .4 f o r enab l ing s l a v eP3DIR |= BIT4 + BIT3 + BIT1 ; // P3 .1 ,3 ,4 i s outputU0CTL |= CHAR + SYNC + MM; // 8− b i t Master SPI modeU0TCTL = CKPL + SSEL SMCLK + STC; // Po lar i t y , SMCLK, 3−wireU0BR0 = BIT1 ; // SPICLK=SMCLK/2U0BR1 = 0x00 ;U0MCTL = 0x00 ;
-
A.2 C code voor de microcontroller INHOUDSOPGAVE
ME1 |= USPIE0 ; // SPI module enab ledUCTL0 &= ˜SWRST; // I n i t i a l i z e SPI s t a t e machine
}
Header file voor de SPI interface: spi.h
#ifndef SPI H#define SPI H
signed char s p i r e ad (char addr ) ;
void s p i w r i t e (char addr , char va l ) ;
void s p i s e t up (void ) ;
#endif
C code voor de seriële interface: uart.c
//************************************************//// Handles the uar t i n t e r f a c e and se tup //// //// By Pepi jn Mist iaen ( lanquarden@gmail . com) ////
//// Fo l lowing p ins are used by the uar t i n t e r f a c e : //// P3 .6 (34) TxD to RxD //// P3 .7 (35) RxD to TxD ////************************************************//
#include #include #include
void ua r t wr i t e (char va l ) {while ( ! ( IFG2 & UTXIFG1) ) ; // USART1 TX bu f f e r ready?TXBUF1 = val ; // va l to TXBUF1
}
void u a r t w r i t e i n t ( int va l ) {char l ow va l ;char h i gh va l ;l ow va l = va l & 0xFF ;h i gh va l = ( va l >> 8) & 0xFF ;ua r t wr i t e ( h i gh va l ) ;
-
A.2 C code voor de microcontroller INHOUDSOPGAVE
ua r t wr i t e ( l ow va l ) ;}
void uar t s e tup (void ) {P3SEL |= 0xC0 ; // P3 .6 ,7 = USART1 TXD/RXDME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXDUCTL1 |= CHAR; // 8− b i t charac t e rUTCTL1 |= SSEL0 ; // UCLK = ACLKUBR01 = 0x03 ; // 32k/9600 − 3.41UBR11 = 0x00 ; //UMCTL1 = 0x4A ; // ModulationUCTL1 &= ˜SWRST; // I n i t i a l i z e USART s t a t e machine
}
Header file voor de seriële interface: uart.h
#ifndef UART H#define UART H
void ua r t wr i t e (char va l ) ;
void u a r t w r i t e i n t (