Faculteit Ingenieurswetenschappen
Vakgroep Informatietechnologie
Voorzitter: Prof. Dr. Ir. Paul Lagasse
Academiejaar: 2007-2008
Mobiele ultrasone plaatsbepaling met
centimeterresolutie steunend op looptijdsmetingen.
door
Christopher DERYCKE
Promotoren: Prof. Dr. Ir. Jan VANDEWEGE, Ir. Bart BAEKELANDT
Scriptiebegeleider: Dr. Ir. Johan BAUWELINCK
Scriptie ingediend tot het behalen van de academische graad van
Burgerlijk elektrotechnisch ingenieur
Voorwoord
Na een jaar hard werken, kijk ik zeer tevreden terug op mijn thesisjaar. De omvang van het
behandelde project stelde me van bij het begin voor een enorme uitdaging. Enerzijds het uit-
denken van een systeem en de haalbaarheid ervan controleren, anderzijds het ontwerpen en
bouwen ervan om een prototype te realiseren.
Het belangrijkste resultaat van dit afstudeerwerk is voor mij echter de verworven kennis die ik
heb opgedaan tijdens dit leerrijk en geslaagd jaar. Daarom wil ik van deze gelegenheid gebruik
maken om een woord van dank te richten aan allen die hiertoe hebben bijgedragen.
Mijn eerste woorden van dank gaan uit naar de promotor, Professor Vandewege, en de vak-
groepvoorzitter, Professor Lagasse, voor het ter beschikking stellen van de middelen en de in-
frastructuur. In het bijzonder wens ik mijn promotor, Prof. Dr. Ir. J. Vandewege, te bedanken
voor de raad en de motivatie die hij me gaf. Ook de copromotor, Ir. Bart Baekelandt, en de
begeleider, Dr. Ir. Johan Bauwelinck, verdienen een bijzonder woordje van dank. Zij stonden
me ten allen tijde bij, beantwoordden mijn vele vragen en lazen deze thesistekst grondig na.
Vervolgens wens ik Ing. Jan Gillis te bedanken voor zijn raad en hulp bij de vele praktische
moeilijkheden. Verder dank ik alle personen van het INTEC design team voor hun hulp.
Tot slot wens ik mijn ouders te bedanken voor hun jarenlange steun gedurende mijn studies.
Alsook bedank ik mijn vriendin voor de steun en voor de vele momenten van geduld toen ik
lang op het labo bleef doorwerken.
Christopher Derycke, mei 2008
Toelating tot bruikleen
“De auteur geeft de toelating deze scriptie voor consultatie beschikbaar te stellen en delen van
de scriptie te kopieren voor persoonlijk gebruik.
Elk ander gebruik valt onder de beperkingen van het auteursrecht, in het bijzonder met be-
trekking tot de verplichting de bron uitdrukkelijk te vermelden bij het aanhalen van resultaten
uit deze scriptie.”
Christopher Derycke, mei 2008
Mobiele ultrasone plaatsbepaling met
centimeterresolutie steunend op
looptijdsmetingen.door
Christopher DERYCKE
Scriptie ingediend tot het behalen van de academische graad vanBurgerlijk elektrotechnisch ingenieur
Academiejaar 2007–2008
Promotoren: Prof. Dr. Ir. J. VANDEWEGE, Ir. B. BAEKELANDTScriptiebegeleider: Dr. Ir. J. BAUWELINCK
Faculteit IngenieurswetenschappenUniversiteit Gent
Vakgroep InformatietechnologieVoorzitter: Prof. Dr. Ir. Paul Lagasse
Samenvatting
Deze thesis behandelt het probleem om mobiele ultrasone plaatsbepaling met centimeterresolutiete realiseren. De scriptie bespreekt het ontwerp en de realisatie van een systeem om dit probleemop te lossen. De thesis wordt op dezelfde wijze als het systeem opgebouwd. In Hoofdstuk 2 wordteen simulatiemodel opgesteld. In Hoofdstukken 3 en 4 worden de zenders en de ontvanger onderde loep genomen en wordt uitgelegd hoe deze stap voor stap werden ontworpen. Hoofdstuk 5legt uit hoe de zenders gecombineerd worden met de ontvanger om tot een werkbaar geheel tekomen. Vervolgens wordt in Hoofdstuk 6 besproken hoe de gegevens afkomstig van de ontvangerverwerkt worden. In Hoofdstukken 7 en 8 wordt er dieper op de resultaten van het volledigesysteem ingegaan. Hoofdstuk 9 besluit de scriptie.
Trefwoorden
gps, ultrasoon, transducer, matlab, correlatie, looptijd
Mobile ultrasonic positioning withcentimeter resolution based on travel delay
measurements
Christopher Derycke
Supervisor(s): Prof. J. Vandewege, Ir. B. Baekelandt, Dr. Ir. J. Bauwelinck
Abstract- This paper presents the design of codesand electronics needed for time delay measure-ments. These delay measurements provide thebasis for accurate positioning. Firstly, a modelthat describes the modulation and demodulationof acoustic signals is presented. Secondly, anadequate subset of codes is selected from thewide range of existing and practically applicablecodes to estimate a time delay in a multi-userenvironment. Finally, the transmitter andreceiver are presented.
Keywords- code generation, transducers, correla-
tion, pulse width modulation
I. INTRODUCTION
Worldwide, everyone is familiar with a GPS, buteveryone knows that this system can’t be used in-door, nor can GPS provide accurate positioningwith centimeter resolution.Hence, the idea rose, to design a system based onGPS, but using ultrasonic waves, to allow indoorpositioning with centimeter resolution.
II. PROPAGATION MODEL
A MATLAB model was developed to simulatethe modulation and demodulation of the acousticsignals. When transducers send modulated acousticsignals, this model computes the received signalsthat are picked up by a receiver somewhere in theroom. The model will then demodulate these signalsand determine the time delay between sending andreceiving, using correlation functions.From these delays the position of the receiver canthen be calculated.
III. CODE GENERATION
The transducers used for the transmitters areworking at a frequency of 40kHz. Codes were gen-erated that allow multi-transducer measurements.
This way, distances from the object to differenttransducers can be measured at the same moment.Following code families were compared: Barker,Gold and Kasami. For correct delay estimationsauto- and cross-correlation functions of the selectedcodes are highly important. A narrow autocorre-lation peak is required for precise time measure-ments. Low cross-correlation functions are neededto achieve multi-user performance. From simula-tions one can conclude that the family of Kasamicodes leads to the best performance. Figure 1 showsthe autocorrelation function of a Kasami code oflength 63. This length was chosen to providerobustness against interfering signals.
0 1 2 3 4 5 6 7 8
x 105
−1
−0.5
0
0.5
1
1.5
2
2.5
3
3.5
4x 10
5 Autocorrelation function
Am
plitu
de
Samples
Figure 1: Autocorrelation function
IV. DESIGN
The system is composed of five different com-ponents (three transmitters, a synchroniser and areceiver) which are all using a complex board. Eachboard has its own microcontroller (MSP430) and aninterface between the board and USB. All measureddata is sent to the computer through the USB-interface.
A. Transmitter
Different pulse width modulation (PWM) signalsfor each code are generated using MATLAB andstored in each microcontroller. PWM is a tech-nique where digital signals are filtered to obtainthe desired analog signals. Because the microcon-troller board can only provide 3.3V, an amplifieris installed to provide more voltage. This ampli-fier provides the correct signals to the transducers.Figure 2 illustrates a Kasami code and its spectrum.Figure 3 illustrates the Kasami code and its spec-trum after PWM modulation and low pass filtering.
0 0.005 0.01 0.015 0.02 0.025 0.03 0.035−1.5
−1
−0.5
0
0.5
1
1.5Kasami Code (length = 63)
Time (seconds)
Am
plitu
de
−20 −16 −12 −8 −4 0 4 8 12 16 200
5000
10000
15000Spectrum Kasami Code
Frequency (kHz)
Am
plitu
de
Figure 2: Kasami code and its spectrum
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6
x 10−4
−1.5
−1
−0.5
0
0.5
1
1.5PWM Signal
Time (seconds)
Am
plitu
de
−60 −50 −40 −30 −20 −10 0 10 20 30 40 50 600
200
400
600
800
1000
Spectrum PWM Signal
Frequency (kHz)
Am
plitu
de
Figure 3: PWM Signal and its spectrum
B. Receiver
After reception, analog electronics are used toamplify the received ultrasonic signals. The analogsignals coming from the amplifier are converted todigital signals, using an A/D-converter, present onthe MSP430, with a sampling frequency of 40kHz.The converted signals are stored in the chip’s mem-
ory untill a transfer using the USB-interface is re-quested.
C. Synchroniser
In order to obtain accurate results, the transmit-ters as well as the receiver must be synchronised.For this, a synchronisation protocol was developed.
V. SIGNAL PROCESSING
The codes used were chosen to have a low crosscorrelation and a high autocorrelation.To detect time delay between sending and receivingthe acoustic signal, one calculates the correlation ofthe received signal and the different codes. Detec-tion of a peak in these correlations means that thatcode is received on the transducer. Every trans-mitter has its own specific code, so by calculat-ing the correlation functions, one can determinewhere the received signal comes from. When onecombines the different time delays, the location ofthe receiver, relative to the transmitters, can becalculated. Figure 4 shows the transmitted code,the received signal from one transmitter and itsautocorrelation function.
0 0.005 0.01 0.015 0.02 0.025 0.03 0.035 0.04 0.045 0.05
−101
Transmitted code
Time (sec)
Am
plitu
de
0 0.005 0.01 0.015 0.02 0.025 0.03 0.035 0.04 0.045 0.05−0.05
0
0.05Received signal
Time (sec)
Am
plitu
de
−0.05 −0.04 −0.03 −0.02 −0.01 0 0.01 0.02 0.03 0.04 0.05−200
0200400600
X: 0.002468Y: 520.7
The autocorrelation function
Time (sec)
Am
plitu
de
Delay
Figure 4: Transmitted and received signal + autocor-relationfunction
VI. CONCLUSIONS
A system for position detection processing ultra-sonic signals was realised. It was shown that, whentransmitters and receiver are synchronised, onlythree transmitters are required to do an accuratemeasurement. Experimental results were demon-strated to validate the concept.
INHOUDSOPGAVE i
Inhoudsopgave
Tabel van afkortingen en symbolen v
1 Inleiding 1
1.1 Doel van de thesis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 GPS - Een globaal positioneringssysteem . . . . . . . . . . . . . . . . . . . . . . . 2
1.2.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2.2 Werkingsprincipe van GPS . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Een eigen plaatsbepalingssysteem . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 Matlab Model 7
2.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Principe van plaatsbepaling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2.1 Tijdsmeting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3 Model in Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3.2 Initialisatie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3.3 Main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3.4 Resultaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3.5 Bespreking van de Matlab code . . . . . . . . . . . . . . . . . . . . . . . . 17
2.3.6 Optimalisatie van het model . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.3.7 Besluit van het model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3 De Zenders 20
3.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.2 Transducer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.3 Aansturing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
INHOUDSOPGAVE ii
3.4 Uitbreiding van het model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.4.1 Pulsbreedte modulatie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.4.2 Bespreking van de Matlab code . . . . . . . . . . . . . . . . . . . . . . . . 25
3.5 USB interface tussen het microcontrollerbord en de PC . . . . . . . . . . . . . . 26
3.5.1 Programmeren van de MSP430 . . . . . . . . . . . . . . . . . . . . . . . . 26
3.5.2 Programmeren van het PC gedeelte . . . . . . . . . . . . . . . . . . . . . 26
3.6 Aansturing van de transducer m.b.v. TimerA . . . . . . . . . . . . . . . . . . . . 27
3.6.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.6.2 Programmeren van de MSP430 . . . . . . . . . . . . . . . . . . . . . . . . 29
3.6.3 Metingen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.7 Aansturing van de transducer m.b.v. DMA en SPI . . . . . . . . . . . . . . . . . 30
3.7.1 DMA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.7.2 SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.7.3 USB interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.7.4 Transducer aansturing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.7.5 Metingen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.8 Constructie van de zenders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.8.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.8.2 PCB ontwerp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4 De Ontvanger 44
4.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.2 Transducer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.3 Aansturing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.4 Programmeren van de ontvanger . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.4.1 Uitbreiding van de USB interface . . . . . . . . . . . . . . . . . . . . . . . 45
4.4.2 Programmeren van de chip voor de ontvanger . . . . . . . . . . . . . . . . 45
4.5 Constructie van de ontvanger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.5.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.5.2 PCB ontwerp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5 De Synchronisator 54
5.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
INHOUDSOPGAVE iii
5.1.1 PC werkt als synchronisator . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.1.2 Onderlinge synchronisatie . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.1.3 Een extra component: de synchronisator . . . . . . . . . . . . . . . . . . . 57
5.2 Het protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.2.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.2.2 De synchronisator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.2.3 De zenders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.2.4 De ontvanger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.2.5 Resultaat van een simulatie . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.3 Uitbreiding van het protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.3.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.3.2 Synchronisator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.3.3 De zenders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.3.4 De ontvanger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.4 Constructie van de synchronisator . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.4.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.4.2 PCB ontwerp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6 Verwerking van de gegevens 67
6.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
6.2 Communicatie tussen de PC en de componenten . . . . . . . . . . . . . . . . . . 67
6.3 Verwerking in Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
6.4 Meetresultaat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
7 Meetresultaten 70
7.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
7.2 Meetresultaten in functie van de afstand . . . . . . . . . . . . . . . . . . . . . . . 71
7.2.1 Meetresultaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
7.2.2 Voorbeeld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
7.3 Meetresultaten in functie van de hoek . . . . . . . . . . . . . . . . . . . . . . . . 74
7.3.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
7.3.2 Meetresultaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
7.4 Besluit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
INHOUDSOPGAVE iv
8 Het systeem 76
8.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
8.2 De verschillende componenten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
8.2.1 De synchronisator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
8.2.2 De zenders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
8.2.3 De ontvanger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
8.3 Communicatie tussen de PC en de componenten . . . . . . . . . . . . . . . . . . 81
8.4 Verwerking van de gegevens in Matlab . . . . . . . . . . . . . . . . . . . . . . . . 83
8.5 Positiebepaling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
8.6 Verder onderzoek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
9 Besluit 87
A Code van het Matlab-model 88
B Code van het uitgebreide Matlab-model 91
C USB interface 93
D Oorspronkelijke MSP code voor de zenders 99
E Code voor de zenders 106
F Code voor de ontvanger 112
G Bespreking van de Visual Basic code 116
TABEL VAN AFKORTINGEN EN SYMBOLEN v
Tabel van afkortingen en symbolen
Gebruikte afkortingen
A/D Analoog/Digitaal
ADC Analog-to-digital converter
BPSK Binary Phase Shift Keying
GPS Global Positioning System
PWM Pulse Width Modulation
USB Universal Serial Bus
Gebruikte symbolen
Hz Hertz, eenheid van frequentie
dB Decibel, logaritmische eenheid
kB Kilobyte
Wiskundige eenheden
femto f 10−15 milli m 10−3
pico p 10−12 kilo k 103
nano n 10−9 mega M 106
micro µ 10−6 giga G 109
INLEIDING 1
Hoofdstuk 1
Inleiding
1.1 Doel van de thesis
Het uiteindelijke doel van de thesis is een meetmethode te ontwikkelen die toelaat een plaats-
bepaling te doen met centimeterresolutie. Deze methode kan dan worden geımplementeerd in
een programmeerbare robot zodat deze in staat is zijn positie te bepalen binnen een ruimte. Een
voorbeeld van zo’n robot is de iRobot die te zien is in Figuur 1.1. [1][2]
Wanneer men het over plaatsbepaling heeft, denkt iedereen tegenwoordig spontaan aan het
Amerikaanse GPS. Dit systeem maakt gebruik van hoogfrequente golven maar haalt geen cen-
timeter nauwkeurigheid. De idee rees om het principe van het GPS systeem te gebruiken.
Figuur 1.1: De iRobot
1.2 GPS - Een globaal positioneringssysteem 2
1.2 GPS - Een globaal positioneringssysteem
1.2.1 Inleiding
GPS of Global Positioning System is een door het Amerikaanse ministerie van defensie ontworpen
systeem dat toelaat om je positie te bepalen overal ter wereld. [3]
GPS werkt met een constellatie van minstens 24 satellieten die in 6 vaste banen op 20200 km
hoogte rond de Aarde cirkelen en elk een eigen signaal uitzenden. Een illustratie hiervoor wordt
in Figuur 1.2 gegeven. Het GPS systeem is 24 uur per dag actief, is nagenoeg overal ter wereld
bruikbaar en werkt onder alle weersomstandigheden. Het is een militair systeem dat de overheid
van de Verenigde Staten met beperkende nauwkeurigheid aan iedereen beschikbaar stelt. Verder
werkt het GPS systeem met behulp van passieve ontvangers, het systeem zelf weet niet hoeveel en
welke ontvangers er ingeschakeld zijn. Het enige dat de satellieten doen, is continu hun signalen
verzenden. In een volgende paragraaf wordt kort de werking van dit systeem besproken.
Figuur 1.2: GPS constellatie
1.2 GPS - Een globaal positioneringssysteem 3
1.2.2 Werkingsprincipe van GPS
In dit deel wordt kort uitgelegd op basis van welke principes GPS werkt, zonder hierbij teveel
in detail te gaan aangezien dit systeem in zijn geheel enorm complex is.
GPS vertrekt vanuit het principe dat je de positie van een object kan bepalen wanneer je
de afstand kent van dit object tot drie andere objecten. Wanneer de afstand tot een bepaald
object is gekend, weet men dat men zich bevindt op de rand van een cirkel met middelpunt het
object en straal gelijk aan de afstand tot het object. Dit wordt geıllustreerd in Figuur 1.3.
Figuur 1.3: Afstand tot een object is gekend
Wanneer de afstand tot twee objecten gekend is, weet men dat men zich bevindt op een van de
twee snijpunten tussen de afstandscirkels. (Figuur 1.4)
Figuur 1.4: Afstand tot twee objecten is gekend
Wanneer de afstand tot drie objecten gekend is, dan weet men dat men zich bevindt in het
snijpunt van de drie cirkels. Dit is te zien op Figuur 1.5. Ontvangt de ontvanger bijgevolg
de signalen van drie verschillende satellieten, dan kan deze aan de hand van deze signalen zijn
positie bepalen.
1.2 GPS - Een globaal positioneringssysteem 4
Figuur 1.5: Afstand tot drie objecten is gekend
Verder gebruikt GPS het verband tussen een tijdsmeting en een afstandsmeting. Wanneer een
zender bepaalde gegevens naar een ontvanger verzendt, gaat er een zekere tijd voorbij vooraleer
de ontvanger deze gegevens ontvangt. Deze tijd is afhankelijk van de snelheid waarmee de
gegevens van de zender naar de ontvanger reizen. Het GPS systeem gebruikt elektromagnetische
golven, die zich met de lichtsnelheid voortplanten, waarop gegevens worden gemoduleerd. Uit
het tijdsverschil tussen het tijdstip waarop de zender begint te zenden en het tijdstip waarop
de ontvanger de gegevens ontvangt, kan de afstand tussen zender en ontvanger worden bepaald.
Wiskundig is dit eenvoudig in te zien als volgt: Als de zender begint met zenden op tijdstip
t=0 en de ontvanger ontvangt de (eerste) gegevens na t=T seconden dan is: d = cT met c de
lichtsnelheid in meter per seconde en d de afstand in meter.
Indien het tijdsverschil tussen een object en drie zenders bepaald kan worden en als ook de
posities van de drie zenders gekend zijn, kan de positie van het object berekend worden. Dit is
echter enkel correct wanneer de ontvanger de exacte tijdstippen, waarop de zenders beginnen
met zenden, kent. Indien deze tijdstippen niet gekend zijn, wordt een resultaat bereikt zoals in
Figuur 1.6 is weergegeven. De drie cirkels snijden elkaar niet langer in een punt zodat er niet
langer een punt bepaald wordt maar een gebied (gearceerde deel op de figuur).
Het GPS systeem bestaat uit een constellatie van 24 satellieten en elke satelliet beschikt over een
heel stabiele atoomklok. De tijdstippen waarop de satellieten hun gegevens verzenden, kunnen
dus heel goed worden geregeld. Een GPS ontvanger is echter een goedkoop toestel waarin een
kristaloscillator als klok dienst doet zodat er niet mag worden verondersteld dat de ontvanger
de tijdstippen, waarop de zenders beginnen zenden, kent.
1.3 Een eigen plaatsbepalingssysteem 5
Figuur 1.6: Starttijdstip van zenden is niet gekend
Om dit op te lossen heeft de ontvanger een vierde zender nodig. Nadat de ontvanger op basis
van drie zenders zijn positie heeft berekend, zal hij een afstandsmeting uitvoeren met deze vierde
zender. Het verschil tussen deze twee metingen zal de ontvanger dan toelaten om een correctie
op het resultaat uit te voeren.
1.3 Een eigen plaatsbepalingssysteem
GPS is een wereldomvattend systeem waarbij de zenders op meer dan 20000 kilometer verwijderd
zijn van de ontvangers en waarbij gebruik gemaakt wordt van golven die zich voortplanten aan
de lichtsnelheid. De vertraging tussen de zender en de ontvanger is dus van de orde 10ms.
Vermits GPS ontvangers in allerlei voertuigen en vliegtuigen worden geımplementeerd, kan men
zich geen vertragingstijd van de orde milliseconden veroorloven. Anders zou de positie tussen
het tijdstip van verzenden en het tijdstip waarop het signaal wordt ontvangen immers sterk
kunnen afwijken.
In deze thesis ligt de nadruk niet op plaatsbepaling over een groot gebied maar op nauwkeurige
plaatsbepaling. Het gebied waarover een nauwkeurige plaatsbepaling moet worden uitgevoerd,
kan worden beperkt tot een eenvoudige ruimte zoals een kamer. Als de zenders zich in dezelfde
ruimte als de ontvanger zullen bevinden, kan het GPS systeem onmiddellijk een heel stuk ver-
eenvoudigd worden. Het is immers niet nodig om met hoogfrequente signalen te werken.
Het volstaat om gebruik te maken van akoestische golven met een voortplantingssnelheid van
340 meter per seconde. In een ruimte waar de zender 5 meter van de ontvanger staat, treedt er
een maximale vertraging van5
340≈ 15 milliseconden op.
1.3 Een eigen plaatsbepalingssysteem 6
De attenuatie van akoestische golven [4] kan aan de hand van volgende formules worden bepaald:
C = 4.6151 - 6.8346(T0
T)1.261
h = 10Cpr
tr =T
293.15frO = p(24 + 4.04.104 h
(0.02 + h)(0.391 + h)
)
frN = p t−0.5r (9 + 280 h e(−4.17(t
−1/3r −1)))
α = 8.686f2(1.84.10−11
√trp
+ t−2.5r (0.01275
e−( 2239.1T
)
(frO + f2
frO)
+ 0.1068e−( 3352
T)
(frN + f2
frN)))[dbm−1] (1.1)
Waarbij:
T0 = 273.15 Kelvin
T: Omgevingstemperatuur in Kelvin
p: De relatieve druk =druk
101325r: De relatieve vochtigheid (in %)
tr: De relatieve temperatuur van de lucht (relatief tov 20C)
f: De frequentie van de geluidsgolf
Met T = 25C, p = 101325Pa, r = 58% en f = 40kHz is α gelijk aan 1.33 dB per meter.
Vijf meter afstand tussen zender en ontvanger geeft een verzwakking van 6.65dB, hetgeen een
aanvaardbare attenuatie is.
MATLAB MODEL 7
Hoofdstuk 2
Matlab Model
2.1 Inleiding
Het ontwerpen van een plaatsbepalingssysteem zonder zicht te hebben op de aard van de
ontvangen en de te verzenden signalen, is een moeilijke opgave. Om inzicht te krijgen in de
aard van deze signalen werd in Matlab een theoretisch propagatiemodel opgesteld. Dit model
maakt het mogelijk om simulaties uit te voeren over het te bouwen systeem vooraleer er effectief
aan de bouw wordt begonnen.
2.2 Principe van plaatsbepaling
Wanneer een zender een signaal verzendt, kan dit signaal een tijdstip ∆t1 later worden op-
gevangen door een ontvanger. In het vorige hoofdstuk werd reeds uitgelegd dat er drie zenders
nodig zijn om de positie van een object te kunnen bepalen. Dit op voorwaarde dat de ontvanger
de tijdstippen waarop de zenders beginnen met zenden exact kent.
Verder is het noodzakelijk dat de ontvanger de verschillende zenders kan herkennen. Indien
dit niet het geval is, kan de ontvanger onmogelijk weten hoe ver hij van iedere zender verwijderd
is. Daarom krijgt iedere zender een eigen persoonlijke code toegewezen. Deze code wordt dan
gemoduleerd op een draaggolf en vervolgens door de zender verzonden. Het ontvangen signaal
dient dan te worden gedemoduleerd in de ontvanger. Vermits de drie zenders tegelijk signalen
met dezelfde frequentie verzenden, is het ook wenselijk dat de codes die erop worden gemoduleerd
orthogonaal zijn.
2.3 Model in Matlab 8
2.2.1 Tijdsmeting
Een plaatsbepaling kan aan de hand van drie verschillende tijdsmetingen worden uitgevoerd.
Door de correlatiefuncties van de verzonden codes te gebruiken, kunnen de tijdsvertragingen
worden gemeten. Opeenvolgend wordt de correlatiefunctie tussen het totale ontvangen signaal
en de code van zender1, de code van zender2 en ten slotte deze van zender3, berekend. De piek-
waarden van deze functies geven de vertragingstijden aan tussen de ontvanger en respectievelijk
zender1, zender2 en zender3. Hierbij moet er onmiddellijk worden opgemerkt dat de kruis-
correlatie tussen de verschillende zenders zo klein mogelijk moet zijn en de autocorrelatiefunctie
een zo hoog mogelijke piek moet hebben.
2.3 Model in Matlab
2.3.1 Inleiding
Het Matlab-model begint met het initialiseren van de verschillende globale variabelen zoals
simulatietijd, voortplantingssnelheid en coordinaten van de zenders. Vervolgens worden de
signalen die de zenders genereren opgesteld en daarna wordt het gedrag van de ontvanger ge-
simuleerd.
2.3.2 Initialisatie
Initialisatie.m zorgt dat alle initiele waarden van het systeem correct worden ingesteld.
Variabele Omschrijving Waarde
Tsim De simulatietijd 50ms
fs De samplingfrequentie 5MHz
v De voortplantingssnelheid 340 m/sec
zender x De coordinaten van de verschillende zenders [x,y,z] in m
fm De modulatiefrequentie 2kHz
fc De frequentie van de draaggolf 40kHz
zendcode Het aantal keer dat de zender de code verstuurd 1
Tabel 2.1: Initialisatie waarden
2.3 Model in Matlab 9
2.3.3 Main
De werking van de zenders en van de ontvanger wordt geıllustreerd in de blokdiagrammen van
Figuren 2.1 en 2.2.
Figuur 2.1: Blokdiagram van de zenders
Figuur 2.2: Blokdiagram van de ontvanger
In de volgende paragrafen wordt de werking van het model, zoals in Main.m, duidelijk
gemaakt.
Codes
Opdat de ontvanger de zenders zou kunnen herkennen, is het noodzakelijk dat aan elke zender
een eigen code wordt toegekend. Vermits de tijdsvertragingen aan de hand van de corre-
latiefuncties worden gemeten, moeten de codes een zo hoog mogelijke autocorrelatiepiek en
2.3 Model in Matlab 10
een zo laag mogelijke kruiscorrelatie hebben. Hiervoor werden drie types codes in het model
geımplementeerd: Barker codes, Gold codes en Kasami codes. (zie ook [5] en [6]) In Figuren
2.3 en 2.4 worden respectievelijk de autocorrelatie- en de kruiscorrelatie-functies van deze codes
weergegeven.
Op deze figuren is duidelijk te zien dat alle codes een scherpe autocorrelatiepiek hebben. In
het geval van de Barker codes is de kruiscorrelatie echter niet verwaarloosbaar ten opzichte van
deze piek. Dit is te wijten aan de beperkte lengte van deze codes. Zowel de Gold en Kasami codes
vertonen goede autocorrelatie- en kruiscorrelatie-eigenschappen. Vermits de kruiscorrelatie in
het geval van de Kasami codes het laagst is, werd voor dit type codes gekozen.
Zoals te zien in het blokdiagram wordt deze code nu door een NON-Return to Zero encoder
gestuurd zodat een 0-bit wordt afgebeeld op -1 en een 1-bit wordt afgebeeld op +1.
−6 −4 −2 0 2 4 6−2
0
2
4
6
8Autocorrelatiefuntie Barker (len=7)
−150 −100 −50 0 50 100 150−50
0
50
100
150Autocorrelatiefuntie Gold code 1 (len=63)
−100 −50 0 50 100−20
0
20
40
60
80Autocorrelatiefuntie Kasami code 1 (len=63)
−10 −5 0 5 10−5
0
5
10
15Autocorrelatiefuntie Barker (len=11)
−150 −100 −50 0 50 100 150−50
0
50
100
150Autocorrelatiefuntie Gold code 2 (len=63)
−100 −50 0 50 100−20
0
20
40
60
80Autocorrelatiefuntie Kasami code 2 (len=63)
−15 −10 −5 0 5 10 15−5
0
5
10
15Autocorrelatiefuntie Barker (len=13)
−150 −100 −50 0 50 100 150−50
0
50
100
150Autocorrelatiefuntie Gold code 3 (len=63)
−100 −50 0 50 100−20
0
20
40
60
80Autocorrelatiefuntie Kasami code 3 (len=63)
Figuur 2.3: Autocorrelatiefuncties
2.3 Model in Matlab 11
−10 −5 0 5 10−5
0
5Kruiscorrelatiefunctie Barker code 1 en Barker code 2
−150 −100 −50 0 50 100 150−20
−10
0
10
20
30Kruiscorrelatiefunctie Gold code 1 en Gold code 2
−100 −50 0 50 100−15
−10
−5
0
5
10Kruiscorrelatiefunctie Kasami code 1 en Kasami code 2
−15 −10 −5 0 5 10 15−5
0
5Kruiscorrelatiefunctie Barker code 1 en Barker code 3
−150 −100 −50 0 50 100 150−40
−20
0
20
40Kruiscorrelatiefunctie Gold code 1 en Gold code 3
−100 −50 0 50 100−20
−10
0
10Kruiscorrelatiefunctie Kasami code 1 en Kasami code 3
−15 −10 −5 0 5 10 15−5
0
5
10Kruiscorrelatiefunctie Barker code 2 en Barker code 3
−150 −100 −50 0 50 100 150−20
−10
0
10
20Kruiscorrelatiefunctie Gold code 2 en Gold code 3
−100 −50 0 50 100−15
−10
−5
0
5
10Kruiscorrelatiefunctie Kasami code 2 en Kasami code 3
Figuur 2.4: Kruiscorrelatiefuncties
Modulatie
De zenders moduleren hun code op een draaggolf met frequentie fc volgens het BPSK principe.
Het signaal dat wordt verzonden, is s(t) = d(t).cos(2πfct) waarbij d(t) de waarde +1 en -1 kan
aannemen wanneer de zender aan het zenden is en anders de waarde 0 heeft.
Demodulatie
Het ontvangen signaal o(t) moet nu worden gedemoduleerd in de ontvanger.
o(t) = d1(t).cos(2πfct) + d2(t).cos(2πfct) + d3(t).cos(2πfct) (2.1)
Het ontvangen signaal wordt vermenigvuldigd met een cosinus met dezelfde frequentie als de
draaggolf.
x(t) = o(t).cos(2πfct) (2.2)
Verder is cos(α).cos(α) = 12(1 + cos(2α))
Nu is:
x(t) = (d1(t).cos(2πfct) + d2(t).cos(2πfct) + d3(t).cos(2πfct)).cos(2πfct) (2.3)
x(t) =12(d1(t) + d2(t) + d3(t)) +
12((d1(t) + d2(t) + d3(t))).cos(4πfct) (2.4)
2.3 Model in Matlab 12
Zodat x(t) een DC component en een frequentiecomponent op 2fc bevat. Vervolgens wordt
x(t) door een laagdoorlaatfilter gestuurd om de dubbele frequentie te verwijderen.
y(t) =12(d1(t) + d2(t) + d3(t)) (2.5)
Dit is de helft van de som van de verzonden codes.
Bepaling van de tijdsvertragingen
Uit de vorige paragraaf kan worden besloten dat uit het uiteindelijk signaal een code wordt
overgehouden die bestaat uit de som van de verzonden codes, al dan niet met een zekere tijds-
vertraging. Om nu de tijdsvertraging te bepalen, worden de correlatiefuncties van het ontvangen
signaal en de verzonden codes berekend. De maximale waarden van deze functies leveren de
tijdsvertragingen ten opzichte van de verschillende zenders.
2.3.4 Resultaten
In deze paragraaf wordt een voorbeeld-opstelling uitgewerkt waarbij gecontroleerd wordt of de
ontvanger zijn positie kan bepalen aan de hand van de ontvangen signalen.
De zenders bevinden zich in de posities [0,0,1], [1,0,1] en [3,3,1] en de ontvanger bevindt zich op
positie [4,3,1]. Dit wordt in Figuur 2.5 geıllustreerd.
−0.5 0 0.5 1 1.5 2 2.5 3 3.5 4 4.5−0.5
0
0.5
1
1.5
2
2.5
3
3.5
meter
met
er
Figuur 2.5: De opstelling
2.3 Model in Matlab 13
De codes die worden gebruikt zijn Kasami codes van lengte 63 en worden voorgesteld op Figuur
2.6. Deze codes worden gemoduleerd op een draaggolf met frequentie fc en vervolgens verzonden.
0 0.01 0.02 0.03 0.04 0.05
−1
0
1
Code 1
Tijd (seconden)
Am
plitu
de
0 0.01 0.02 0.03 0.04 0.05
−1
0
1
Code 2
Tijd (seconden)
Am
plitu
de
0 0.01 0.02 0.03 0.04 0.05
−1
0
1
Code 3
Tijd (seconden)
Am
plitu
de
Figuur 2.6: De gebruikte Kasami codes
De ontvanger ontvangt de verzonden signalen met een zekere tijdsvertraging, zie Figuur 2.7.
0 0.01 0.02 0.03 0.04 0.05
−1
0
1
Ontvangen signaal 1
Tijd (seconden)
Am
plitu
de
0 0.01 0.02 0.03 0.04 0.05
−1
0
1
Ontvangen signaal 2
Tijd (seconden)
Am
plitu
de
0 0.01 0.02 0.03 0.04 0.05
−1
0
1
Ontvangen signaal 3
Tijd (seconden)
Am
plitu
de
Figuur 2.7: Ontvangen signalen van de verschillende zenders
2.3 Model in Matlab 14
Het werkelijke signaal dat dan wordt ontvangen, is afgebeeld op Figuur 2.8 en bestaat uit de
som van de verzonden signalen.
0 0.01 0.02 0.03 0.04 0.05
−3
−2
−1
0
1
2
3
Totaal ontvangen signaal
Tijd (seconden)
Am
plitu
de
Figuur 2.8: Werkelijke ontvangen signaal
Dit signaal wordt gedemoduleerd. Het resultaat is afgebeeld op Figuur 2.9.
0 0.01 0.02 0.03 0.04 0.05
−3
−2
−1
0
1
2
3
Ontvangen signaal na demodulatie
Tijd (seconden)
Am
plitu
de
Figuur 2.9: Ontvangen signaal na demodulatie
2.3 Model in Matlab 15
Uiteindelijk worden de correlatiefuncties tussen de originele codes en dit ontvangen signaal
bepaald. (Figuur 2.10)
−0.05 0 0.05−1
0
1x 10
5
X: 0.01471Y: 6.811e+004
Correlatie met code 1
Tijd (sec)
Am
plitu
de
−0.05 0 0.05−1
0
1x 10
5
X: 0.01248Y: 6.284e+004
Correlatie met code 2
Tijd (sec)
Am
plitu
de
−0.05 0 0.05−1
0
1x 10
5
X: 0.002916Y: 5.489e+004
Correlatie met code 3
Tijd (sec)
Am
plitu
de
Figuur 2.10: De correlatiefuncties
Met de maximumwaarden van deze functies wordt de positie van de ontvanger berekend. De
resultaten zijn weergegeven in Tabel 2.2.
Simulatietijd: 50ms
De vertragingen zijn:
Zender 1 tot ontvanger: 0.014707 sec
Zender 2 tot ontvanger: 0.012481 sec
Zender 3 tot ontvanger: 0.0029416 sec
Positie van de ontvanger: [3.99742957, 3.00303713, 0.92702707]
Tabel 2.2: Het resultaat
Dit resultaat komt op ongeveer vijf millimeter na overeen met de werkelijke positie, hetgeen een
aanvaardbare fout is.
Om nu na te gaan hoe het model zich gedraagt voor verschillende posities van de ontvanger,
wordt er gebruik gemaakt van het bestand simuleer.m. Deze code bepaalt, voor een gegeven
aantal posities, de fout van de met het model berekende positie ten opzichte van de werkelijke
positie van de ontvanger. Er wordt nu verondersteld dat de ontvanger zich in een vierkante
2.3 Model in Matlab 16
kamer van 3m bij 3m bevindt en dat er in drie hoekpunten van de kamer een zender wordt
geplaatst.
Variabele Waarde Variabele Waarde
Tsim 0.1 sec zender1 [0,0,1]
fs 300kHz zender2 [3,0,1]
v 340 m/sec zender3 [0,3,1]
fm 2kHz fc 40kHz
zendcode 1
Tabel 2.3: Initialisatie Waarden
Met deze beginwaarden wordt de positie van de ontvanger in de kamer gesimuleerd in stappen
van 0.1 meter. Het resultaat van de simulatie is te zien in Figuur 2.11. De maximale fout is
5.016mm.
01
23
01
230
1
2
3
4
5
6
7
x 10−3
meter
X: 3Y: 3Z: 0.005016
meter
fout
(m
eter
)
Figuur 2.11: Relatieve fout
2.3 Model in Matlab 17
Om na te gaan of er geen uitzonderlijke fouten optreden in bepaalde, niet gesimuleerde,
posities wordt de simulatie nogmaals uitgevoerd. Deze keer echter in een kleiner gebied van
de kamer en meer in detail. Het resultaat van de simulatie tussen 2 en 3 meter, waarbij er in
stappen van 5cm werd verschoven, is te zien op Figuur 2.12.
2
2.5
3
2
2.5
30
1
2
3
4
5
6
7
x 10−3
meter
X: 3Y: 3Z: 0.005016
meter
fout
(m
eter
)
Figuur 2.12: Relatieve fout in een gedetailleerd deel
Ook hier zijn geen verrassingen te merken en blijft de maximale fout beperkt tot 5.016mm.
2.3.5 Bespreking van de Matlab code
In deze paragraaf wordt kort uitgelegd hoe het Matlab-model werd opgebouwd. Meer uitleg
over de code kan gevonden worden in Bijlage A. Zoals in de vorige paragrafen werd aan-
gegeven, begint het model met het laden van enkele initiele variabelen zoals samplingfrequentie
en modulatiefrequentie, die eigen zijn aan het te simuleren systeem. Onmiddellijk hierna worden
de tijdsvertragingen die de codes bij het propageren zullen ondergaan bepaald. Dit gebeurt aan
de hand van een simpele formule:
afstand = snelheid*tijd
tijd =afstand
snelheid
2.3 Model in Matlab 18
Hierbij stelt afstand de afstand voor tussen een zender en de ontvanger (=de robot). Verder
is snelheid hier de snelheid waarmee de golven zich verplaatsen. Vermits er met akoestische
golven, die zich met de snelheid van het geluid verplaatsen, gewerkt wordt, is de snelheid 340
meter per seconde. Na het bepalen van deze tijdsvertragingen worden de noodzakelijke signalen
gegenereerd. Hierbij worden drie types onderscheiden:
• Signalen gegenereerd door de zenders:
De verschillende zenders maken elk hun eigen Kasami code. Deze Kasami code wordt
vervolgens gemoduleerd op een draaggolf met frequentie fc. Dit zijn de signalen die worden
verstuurd.
• Signalen gegenereerd door de ontvanger:
De ontvanger maakt dezelfde Kasami codes als deze van de zenders. Vermits ze zullen
worden gebruikt om het binnenkomend signaal, afkomstig van de zenders, mee te
vergelijken, worden ze de originele signalen genoemd. Op basis van de correlatiefunctie
tussen de originele signalen en het gedemoduleerde ontvangen signaal, zal de ontvanger in
staat zijn een tijdsvertraging te berekenen.
• Signalen die aankomen bij de ontvanger:
Dit zijn in essentie vertraagde versies van de door de zenders verzonden signalen. Op basis
van de tijdsvertragingen die hiervoor werden bepaald, worden de signalen van de zenders
verschoven in de tijd en vervolgens bij elkaar opgeteld. Het is dit resultaat dat door de
ontvanger zal worden ontvangen.
Na het genereren van de signalen wordt de werking van de ontvanger gesimuleerd. Zoals in
vorige paragrafen werd besproken, moet de ontvanger het binnenkomend signaal demoduleren.
De wijze waarop de demodulatie gebeurt, werd in sectie 2.3.3 uitgelegd.
Na demodulatie van het ontvangen signaal bepaalt de ontvanger de correlatiefuncties tussen de
originele signalen en het gedemoduleerde ontvangen signaal. Vervolgens worden de verschillende
tijdsvertragingen bepaald door piekdetectie van deze correlatiefuncties.
Eens deze tijdsvertragingen gekend zijn, wordt volgend stelsel opgelost om de positie van de
ontvanger te berekenen. √(x− x1)2 + (y − y1)2 + (z − z1)2 = v.t1√(x− x2)2 + (y − y2)2 + (z − z2)2 = v.t2√(x− x3)2 + (y − y3)2 + (z − z3)2 = v.t3
2.3 Model in Matlab 19
Waarbij [x,y,z] de coordinaten van de ontvanger voorstellen en [xi,yi,zi] de coordinaten van de
verschillende zenders. De tijdsvertragingen worden voorgesteld door t1, t2 en t3.
2.3.6 Optimalisatie van het model
De vorige paragraaf heeft duidelijk aangetoond dat het model klopt. In deze paragraaf wordt
nagegaan of het mogelijk is om met het model betere resultaten te krijgen. Het huidige model
werkt met een samplingfrequentie van 300kHz. Het is echter zonder probleem haalbaar om te
sampelen met een frequentie van meer dan 10 keer zo hoog. In Figuur 2.13 wordt de invloed op de
resultaten van het model nagegaan wanneer een samplingfrequentie van 5MHz wordt gebruikt.
Hierbij wordt er in een vierkant van 1 meter op 1 meter gesimuleerd waarbij de robot verplaatst
wordt in stappen van 5cm. De maximale fout is nu kleiner dan 4mm en gemiddeld gesproken is
de fout een stuk gedaald. Een hogere samplingfrequentie zal dus tot betere resultaten leiden.
22.5
3
2
2.5
30
1
2
3
4
5
x 10−3
meter
X: 3Y: 2.35Z: 0.003395
meter
fout
(m
eter
)
Figuur 2.13: Relatieve fout in een gedetailleerd deel
2.3.7 Besluit van het model
Het model toont aan dat het doel om een GPS systeem na te bouwen dat werkt met akoestische
golven realiseerbaar is.
DE ZENDERS 20
Hoofdstuk 3
De Zenders
3.1 Inleiding
In dit hoofdstuk wordt uitgelegd hoe de constructie van de zenders tot stand is gekomen.
3.2 Transducer
Uit de vorige hoofdstukken is duidelijk gebleken dat drie zenders volstaan om aan plaatsbepaling
te doen. Dit op voorwaarde dat de zenders gesynchroniseerd zijn. De ontvanger moet, aan de
hand van signalen afkomstig van de zenders, zijn positie kunnen bepalen. De sterkte waarmee
de zenders signalen in bepaalde richtingen sturen, is sterk afhankelijk van de keuze van de
transducer. De voorkeur gaat uit naar akoestische transducers met een brede bundel, zodat
iedere zender de ruimte zo goed mogelijk beslaat. Wanneer de zenders zich in de hoeken van
de kamer bevinden, volstaat een bundel van ongeveer 90. Uiteindelijk werd er gekozen voor
de 400ET080 waarvan de karakteristieken in Tabel 3.1 beschreven zijn. Door de transducer
met een netwerk analyser uit te meten, werd bevestigd dat deze voldoet aan de vooropgestelde
specificaties uit de datasheet.
3.3 Aansturing 21
Naam 400ET080
Centrale frequentie 40.0 ± 3.0kHz
Bandbreedte 1.5kHz
Stralingspatroon
Tabel 3.1: Transducer
3.3 Aansturing
Om de transducer aan te sturen, werd een microcontroller-bord, genaamd Flupke, ter beschikking
gesteld. Deze component werd ontworpen op het labo van INTEC Design en heeft als doel tot
communicatielink tussen de PC en elektronische circuits te dienen. Flupke beschikt over een
USB aansluiting waarmee de component wordt gevoed en waarlangs gegevensuitwisseling met
de PC kan plaatsvinden. Verder is er ook een microcontroller (MSP430 ) aanwezig die via de
COM-poort kan worden geprogrammeerd.
In eerste instantie wordt een systeem ontworpen waarbij de drie zenders perfect
gesynchroniseerd zijn en aangestuurd worden met behulp van de PC. De transducer zal als band-
doorlaatfilter werken, met een centrale frequentie van 40kHz en een bandbreedte van 1.5kHz.
Indien de code die bij 2kHz werkt, rechtstreeks aan de transducer wordt gelegd, zal deze er
volledig worden uitgefilterd. Daarom is een uitbreiding van het model nodig, zodat het mogelijk
wordt om via de MSP430 een digitaal signaal aan de transducer te leggen.
3.4 Uitbreiding van het model
3.4.1 Pulsbreedte modulatie
Om de transducer correct aan te sturen, is het wenselijk om aan de transducer een digitaal signaal
van ongeveer 40kHz, dat met de 2kHz code wordt gemoduleerd, te leggen. In dit deel wordt een
methode besproken die toelaat zo’n 40kHz signaal te maken. Eerst worden de Kasami codes en
3.4 Uitbreiding van het model 22
hun spectrum in Figuur 3.1 van dichtbij bekeken. De energie van de code zit geconcentreerd
tussen 0 en 2kHz.
0 0.005 0.01 0.015 0.02 0.025 0.03 0.035−1.5
−1
−0.5
0
0.5
1
1.5Kasami Code (lengte = 63)
Tijd (seconden)A
mpl
itude
−6000 −4000 −2000 0 2000 4000 60000
0.5
1
1.5
2x 10
4 Spectrum Kasami Code
Frequentie
Am
plitu
de
Figuur 3.1: Kasami Code en zijn Spectrum
Deze code wordt vervolgens op een cosinus van 40kHz gemoduleerd, zodat de energie in het
spectrum van dit gemoduleerd signaal geconcentreerd zit rond 40kHz, zie Figuur 3.2.
0 1 2 3 4 5 6 7
x 10−3
−1.5
−1
−0.5
0
0.5
1
1.5Gemoduleerd signaal
Tijd (seconden)
Am
plitu
de
−50 −40 −30 −20 −10 0 10 20 30 40 500
2000
4000
6000Spectrum Gemoduleerd Signaal
Frequentie (kHz)
Am
plitu
de
Figuur 3.2: Gemoduleerd Signaal en zijn Spectrum
Het is nu de bedoeling dat de transducer wordt aangestuurd met een digitaal signaal. Om
tot een digitaal signaal te komen, wordt Pulse Width Modulation of kortweg PWM gebruikt
(Figuur 3.3). PWM vertrekt van een signaal dat vergeleken wordt met een draaggolf. In het
geval het signaal een grotere waarde heeft dan de draaggolf, komt het PWM-signaal hoog te
staan. Wanneer het signaal kleiner is dan de draaggolf, staat het PWM-signaal laag. Het
spectrum van het PWM-signaal heeft pieken bij de draaggolf- en bij de signaalfrequentie.
3.4 Uitbreiding van het model 23
Figuur 3.3: Pulse Width Modulation
Het bijzondere aan PWM codering is dat, wanneer het PWM-signaal door een laagdoorlaat-
filter gestuurd wordt, het oorspronkelijk signaal er terug uit komt. In Figuur 3.4 wordt het
resultaat, na PWM codering met een draaggolf van 320kHz, getoond.
0 0.5 1 1.5 2 2.5 3 3.5
x 10−4
−1
0
1
Draaggolf
Tijd (seconden)
0 0.5 1 1.5 2 2.5 3 3.5
x 10−4
−1
0
1
Gemoduleerd signaal
Tijd (seconden)
0 0.5 1 1.5 2 2.5 3 3.5
x 10−4
−1
0
1
PWM−signaal
Tijd (seconden)
−500 −450 −400 −350 −300 −250 −200 −150 −100 −50 0 50 100 150 200 250 300 350 400 450 5000
2000
4000
X: 4.024e+004Y: 2407
Spectrum van het PWM−signaal
Frequentie (kHz)
Figuur 3.4: De draaggolf, het gemoduleerde signaal, het PWM-signaal en zijn spectrum
3.4 Uitbreiding van het model 24
Op Figuur 3.4 is duidelijk te zien dat het PWM-signaal een energiepiek bij 40kHz heeft.
Om te controleren of de code uit het PWM signaal gehaald kan worden, wordt de transducer
als een banddoorlaatfilter, met een centrale frequentie van 40kHz en een bandbreedte van 1.5kHz,
gesimuleerd. Daarna wordt dit uitgangssignaal op dezelfde wijze als in het oorspronkelijk
propagatiemodel gedemoduleerd. In Figuur 3.5 is een Kasami code te zien, samen met de
eerste milliseconde van het gevormde PWM-signaal. Dit PWM-signaal wordt vervolgens aan het
banddoorlaatfilter gelegd en de uitgang wordt gedemoduleerd zoals in sectie 2.3.3. Ter illustratie
wordt het resultaat vervolgens gequantiseerd, waarbij positieve waarden gelijk worden gesteld
aan 1 en negatieve waarden aan -1. Dat de code correct wordt gereconstrueerd, is onmiddellijk
te zien.
Figuur 3.5: Demodulatie van het PWM signaal
Dit PWM signaal wordt nu bemonsterd en zijn samplewaarden worden rechtstreeks in de
MSP430 geprogrammeerd om de transducers aan te sturen. De totale tijd om 1 code te verzenden
bedraagt63fm
=632e3
= 31.5ms. Indien er gesampeld wordt aan 1MHz dan zijn er 31.5e-3*fs =
31500 samples nodig per code. Als een MSP de 3 zenders wil aansturen, moet deze bijna 100.000
samples opslaan voor de codes. Dit is praktisch onmogelijk omdat het RAM-geheugen van de
chip beperkt is tot 5kB. [7] Het is gelukkig niet noodzakelijk om te sampelen aan een dergelijk
hoge frequentie. Indien de samplingfrequentie verlaagd wordt tot 120kHz zien de signalen eruit
zoals weergegeven in Figuur 3.6. Ook hier wordt de code nog voldoende gereconstrueerd. Bij
een samplingfrequentie van 120kHz zijn er 31.5e-3*fs = 3780 samples nodig per code, hetgeen
3.4 Uitbreiding van het model 25
een realistischer aantal is om in het geheugen van de microcontroller op te slaan.
Figuur 3.6: Demodulatie van het PWM signaal bij een samplingfrequentie van 120kHz
3.4.2 Bespreking van de Matlab code
In deze paragraaf wordt kort de werking van de Matlab code besproken die voor de resultaten uit
de vorige paragraaf heeft gezorgd. Meer uitleg over de code kan worden gevonden in Bijlage B.
Deze code begint op dezelfde manier als de code in het oorspronkelijke Matlab-model. Er wordt
nu echter niet meer verondersteld dat de zender de transducer zomaar met een signaal van 2kHz
kan moduleren. Om dit te simuleren wordt de Kasami code gemoduleerd op een cosinus van
40kHz en wordt er een zaagtandsignaal gegenereerd. Vervolgens wordt Pulse Width Modulation
toegepast waarbij de zaagtand vergeleken wordt met het gemoduleerde signaal. PWM werd reeds
besproken in sectie 3.4.1. Deze methode zorgt voor een digitaal signaal met in zijn spectrum
een piek bij een frequentie van 40kHz. Dit signaal kan wel aan de transducer worden aangelegd
en zal er wel in slagen om de transducer correct te moduleren.
Er moet nu enkel nog gecontroleerd worden of het signaal dat via de transducer wordt ver-
zonden correct gedemoduleerd kan worden. Hiervoor wordt eerst de transducer gesimuleerd als
een banddoorlaatfilter met een centrale frequentie van 40kHz en een bandbreedte van 1.5kHz. De
uitgang van dit filter stelt dan het signaal voor dat wordt verzonden door de zender. Vervolgens
wordt dit signaal gedemoduleerd zoals reeds in het vorige hoofdstuk werd besproken.
3.5 USB interface tussen het microcontrollerbord en de PC 26
3.5 USB interface tussen het microcontrollerbord en de PC
Het is voldoende om het digitale PWM-signaal op te slaan in het geheugen van de microchip.
Deze chip moet vervolgens, op bepaalde tijdstippen, de samples van dit signaal naar buiten
brengen. Vermits het microcontrollerbord voorzien is van een USB connectie, lijkt het logisch
om er in de eerste stap voor te zorgen dat er via de PC commandos verstuurd kunnen worden
naar de chip. In een tweede stap moet er dan voor gezorgd worden dat de MSP de codes, op de
specifieke tijdstippen, aan de correcte uitgangspinnen naar buiten brengt.
Om commandos via de USB verbinding van de PC naar het bordje te sturen, is er zowel
een deel code voor de PC als een deel code voor de MSP430 nodig. Voor het PC gedeelte
werd gebruik gemaakt van Visual Basic 6.0 als programmeeromgeving. Om de MSP430 te
programmeren werd het programma Code Composer Essentials 2.0 gebruikt. Dit programma
ondersteunt zowel de C programmeertaal als ASM. Vermits C een hogere niveau taal is en
bijgevolg eenvoudiger te begrijpen, werd C als programmeertaal gekozen.
3.5.1 Programmeren van de MSP430
Het microcontrollerbord bevat een FT2232 IC [8] die met de MSP430 verbonden is en het
mogelijk maakt om een USB connectie op te zetten tussen het bord en de PC. Voor deze IC’s
werd het JTAG protocol [9] ontworpen.
De C code voor de verbinding tussen het microcontrollerbord en de PC werd reeds geschreven
door ing. J. Gillis en is te vinden in Bijlage C.
3.5.2 Programmeren van het PC gedeelte
De Visual Basic code maakt gebruik van de functies die aanwezig zijn in het bestand
FTD2XX.DLL. Hierin worden de functies om het JTAG protocol te gebruiken gedeclareerd. [10]
In Tabel 3.2 wordt een lijst van de meest gebruikte functies weergegeven. Een afbeelding van
de uiteindelijke interface is te vinden in Hoofdstuk 8.
3.6 Aansturing van de transducer m.b.v. TimerA 27
Funtie Uitleg
FT ListDevices Geeft informatie over de apparaten die zijn aangesloten
FT Open Zorgt dat er een verbinding wordt gemaakt met het apparaat
FT Write Schrijft gegevens naar het apparaat
FT Read Leest gegevens van het apparaat
FT Close Sluit de verbinding met het apparaat
Tabel 3.2: De meest gebruikte functies
3.6 Aansturing van de transducer m.b.v. TimerA
3.6.1 Inleiding
Het microcontrollerbord is te zien op Figuur 3.7 en een schematische voorstelling van de boven-
zijde is weergegeven in Figuur 3.8. Op Figuur 3.8 is verder aangegeven waar de MSP430 zich
bevindt en welke poorten (P3.5, P3.6 en P3.7) er gebruikt zullen worden om de drie zenders aan
te sturen. In de chip worden de drie PWM-signalen voor de verschillende zenders opgeslagen
met een samplingfrequentie van 127kHz, hetgeen resulteert in 4000 bits of 500 bytes per code. In
normale omstandigheden doet de MSP niks en werkt hij in zijn laag vermogen mode waarbij de
CPU is uitgeschakeld. Wanneer de MSP via de USB kabel het commando “z” ontvangt, wordt
de timer van de MSP zodanig ingesteld dat deze zal werken bij een frequentie van 127kHz.
Er zal met andere woorden iedere1
127e3= 7.8µs een interrupt signaal worden gegenereerd
die aanleiding zal geven tot het aanroepen van een functie. Deze functie zal er dan op haar
beurt voor zorgen dat de volgende bits aan de correcte poorten worden aangelegd. De exacte
frequentie wordt afgeleid van een 6MHz kwartskristal dat op het microcontrollerbord aanwezig
is en bedraagt6MHz
47= 127.659kHz.
3.6 Aansturing van de transducer m.b.v. TimerA 28
Figuur 3.7: Het microcontrollerbord
Figuur 3.8: Schematische voorstelling van de bovenzijde van het microcontrollerbord
3.6 Aansturing van de transducer m.b.v. TimerA 29
3.6.2 Programmeren van de MSP430
Oorspronkelijk was het de bedoeling de zenders aan te sturen door gebruik te maken van TimerA.
Door de timer, na een vast aantal klokcycli, een interrupt te laten genereren, wordt het mogelijk
om uit de timer een frequentie af te leiden. De code die hiervoor wordt gebruikt, is gegeven in
Bijlage D.
De tijd die de MSP nodig heeft om de interrupt routine af te werken, is echter veel groter dan
de tijd tussen de verschillende interrupts. Hierdoor is het niet mogelijk om op deze manier een
correcte frequentie af te leiden. In volgende paragraaf wordt het resultaat getoond.
3.6.3 Metingen
In dit deel wordt nagegaan of de MSP correct reageert op een PC commando en of de PWM-
signalen, aan de gewenste frequentie, op de correcte pinuitgangen verschijnen. Om dit te meten,
werden de uitgangspinnen van het microcontrollerbord aangesloten op een logic analyser. In
Figuur 3.9 is het resultaat weergegeven. Signaal D4 toggelt telkens de interrupt routine wordt
uitgevoerd en laat dus toe om de frequentie te controleren. Indien alles correct werkt, moet D4
een blokgolf met een frequentie van 127kHz zijn.
Figuur 3.9: Uitgang van de verschillende pinnen
Op Figuur 3.9 is onmiddellijk te zien dat de code aan een te lage frequentie wordt uit-
gezonden. TimerA, in combinatie met zijn interrupt routine, volstaat dus niet om de zenders
aan te sturen. Bijgevolg werd er op zoek gegaan naar een betere methode die minder tijd zou
kosten.
3.7 Aansturing van de transducer m.b.v. DMA en SPI 30
3.7 Aansturing van de transducer m.b.v. DMA en SPI
Vorige paragraaf toonde aan dat het niet mogelijk is de drie zenders samen aan te sturen met
behulp van een enkel microcontrollerbord door gebruik te maken van TimerA. Daarom worden
er in deze sectie een aantal verbeteringen besproken die wel toelaten de zenders voldoende snel
aan te sturen.
3.7.1 DMA
DMA is een module die aanwezig is op de microcontroller (MSP430 ). Een blokdiagram van deze
module wordt weergegeven in Figuur 3.10. De DMA maakt het mogelijk om, zonder tussenkomst
van de CPU, bytes of woorden van de ene geheugenlocatie naar de andere te kopieren. Zoals in
het blokdiagram te zien is, zijn er drie identieke DMA modules aanwezig in de microcontroller.
In Tabel 3.3 worden de belangrijkste registers van de module kort besproken.
Register Uitleg
DMA0TSELx Dit register bepaalt wat de DMA module triggert
DMA0SA Bevat het bronadres, van waar de DMA gegevens moet halen
DMA0DA Bevat het doeladres, naar waar de DMA de gegevens moet schrijven
DMA0SZ Bevat de grootte van de te kopieren geheugenruimte
Tabel 3.3: De belangrijkste registers
Met behulp van DMA is het dus mogelijk om op het juiste moment de codes te kopieren
naar de uitgangspinnen. Er moet echter onmiddellijk worden opgemerkt dat er geen individuele
bits gekopieerd kunnen worden. Dit is een belangrijk nadeel vermits dit een grotere geheugen-
capaciteit vergt. Dit wordt hieronder duidelijker gemaakt.
De zenders moeten volgende codes uitsturen:
Zender 1: C1,1C1,2C1,3...
Zender 2: C2,1C2,2C2,3...
Zender 3: C3,1C3,2C3,3...
Waarbij Ci,j de j-de bit van de i-de zender voorstelt.
Vermits een zender serieel moet worden aangestuurd, vereist iedere zender een pin waarop
achtereenvolgens de verschillende codebits moeten komen te staan. Bijgevolg moet de DMA
3.7 Aansturing van de transducer m.b.v. DMA en SPI 31
module, per operatie, telkens drie bits naar de drie uitgangspinnen kopieren. Daar deze module
enkel bytes of woorden kan kopieren, moeten de codes in het geheugen worden opgeslagen onder
volgende vorm:
C1,1C2,1C3,100000 om de eerste bit te versturen
C1,2C2,2C3,200000 om de tweede bit te versturen
C1,3C2,3C3,300000 om de derde bit te versturen
...
Er worden nu maar drie bits (drie zenders) per byte nuttig gebruikt, hetgeen een enorme
verspilling van geheugen is. Omdat elke code zo’n 4.000 bits nodig heeft, komt dit neer op
een verlies van 4.000*3*5 = 60.000 bits aan geheugenruimte. Vandaar dat een combinatie met
SPI misschien de oplossing kan bieden.
3.7 Aansturing van de transducer m.b.v. DMA en SPI 32
Figuur 3.10: Blokdiagram van de DMA Module
3.7 Aansturing van de transducer m.b.v. DMA en SPI 33
3.7.2 SPI
SPI is een andere module die op de MSP aanwezig is. De SPI module kan een parallele in-
gang omzetten in een seriele uitgang met een zekere frequentie. Daarnaast werkt deze module
onafhankelijk van de CPU, hetgeen automatisch voor snelheidswinst zal zorgen. Een blok-
diagram van de module wordt weergegeven in Figuur 3.11.
Door de DMA module een byte te laten kopieren naar de ingang van de SPI module wordt het
mogelijk om DMA te combineren met SPI. De SPI module zal er op zijn beurt voor zorgen dat de
uitgangspin achtereenvolgens de individuele bits zal uitsturen waaruit deze byte bestaat. Vermits
de MSP echter maar twee SPI modules bevat, is het niet mogelijk om de drie zenders vanuit
een microcontrollerbord aan te sturen. De drie zenders hebben bijgevolg minstens twee bordjes
nodig. Het is dan ook logischer om iedere zender op een afzonderlijk bordje te programmeren.
Op deze manier blijft de programmering, op hun persoonlijke code na, voor elke zender dezelfde
en komt er extra geheugenruimte vrij.
3.7 Aansturing van de transducer m.b.v. DMA en SPI 34
Figuur 3.11: Blokdiagram van de SPI Module
3.7 Aansturing van de transducer m.b.v. DMA en SPI 35
3.7.3 USB interface
Omdat het nogal omslachtig is om voor iedere zender een afzonderlijke USB connectie op te
zetten, wordt er nog een extra microcontrollerbord toegevoegd dat dienst doet als synchronisator.
Het is dit bord dat commandos van de PC zal ontvangen en vervolgens een aantal pinnen hoog
of laag zal brengen om te communiceren met de verschillende zenders. Op deze manier kan
de huidige PC-code behouden blijven en moet er enkel een synchronisatieprotocol ontwikkeld
worden. Dit hoofdstuk beperkt zich tot de constructie van de zenders en gaat niet dieper in op
het synchronisatieprotocol. In Hoofdstuk 5 wordt deze synchronisator wel in detail besproken.
Hier wordt verondersteld dat de zenders beginnen met zenden wanneer ze het zend-commando
ontvangen.
3.7.4 Transducer aansturing
Inleiding
Een afbeelding van het microcontrollerbord is te zien op Figuur 3.7 en een schematische voor-
stelling van de bovenzijde is weergegeven in Figuur 3.12. Op Figuur 3.12 is verder aangegeven
waar de MSP430 zich bevindt en welke poorten (P3.0 - P3.7, P5.1) er gebruikt zullen worden. In
de chip wordt het PWM-signaal voor de corresponderende zender, met een samplingfrequentie
van 240kHz, opgeslagen. Aan de hand van deze samplingfrequentie wordt het aantal bits die
de MSP moet opslaan bepaald. De Kasami codes zijn 63 bits lang en worden verzonden aan
2kHz. Het versturen van de volledige code neemt dus 31.5 milliseconden in beslag. Sampelen van
31.5ms aan een frequentie van 240kHz geeft 7560 samples of 945 bytes. Deze hogere frequentie is
mogelijk omdat de MSP nu maar de code van een zender moet bevatten in plaats van de codes
van de drie zenders.
3.7 Aansturing van de transducer m.b.v. DMA en SPI 36
Figuur 3.12: Schematische voorstelling van de bovenzijde van het microcontrollerbord
Programmeren van de MSP430
In Figuur 3.13 wordt de werking van de code voor een zender geıllustreerd. De programmacode
is te vinden in Bijlage E. Wanneer de zender de opdracht krijgt om te zenden, worden de DMA
en de SPI module ingeschakeld en geconfigureerd. De DMA module wordt getriggerd op een
lege SPI buffer (UTXBuf). Wanneer dit het geval is, kopieert de DMA de volgende code-byte
naar deze buffer. Als het schuifregister van de SPI module leeg is, verplaatst de module de
inhoud van zijn buffer naar zijn schuifregister. Dit triggert de DMA om de volgende byte te
kopieren naar UTXBuf. De klokinstellingen van de SPI zorgen er verder voor dat de bits aan
de correcte frequentie, vanuit het schuifregister, aan pin 5.1 worden gelegd. Telkens wanneer de
DMA getriggerd wordt, verhoogt hij zijn teller. Wanneer de teller de codegrootte bereikt, wordt
een interrupt gegenereerd die aangeeft dat alles is verzonden. Vervolgens worden de DMA en
de SPI module terug uitgeschakeld.
3.7 Aansturing van de transducer m.b.v. DMA en SPI 37
Figuur 3.13: Werking van de zender
3.7.5 Metingen
In dit deel wordt nagegaan of de MSP correct reageert op een PC commando en of het PWM-
signaal op een correcte wijze op pin 5.1 verschijnt. Om dit te meten, wordt het microcontroller-
bord op een oscilloscoop aangesloten. In Figuur 3.14 wordt een detail van het resultaat dat
op de scoop verschijnt weergegeven. Het duidelijk dat de zender zijn bits wel aan de correcte
frequentie van 240kHz verstuurt.
3.8 Constructie van de zenders 38
Figuur 3.14: Uitgang van de zender
3.8 Constructie van de zenders
3.8.1 Inleiding
De MSP430 brengt een PWM-signaal naar buiten via pin 5.1 van het microcontrollerbord.
Hierbij zorgt een codebit met waarde 1 dat de corresponderende uitgangspin op een spanning
van 3.3V komt te staan. Een bitwaarde van 0 zorgt dan logischerwijze voor een spanning van
0V.
Deze bits zullen het 40kHz signaal van de transducer moduleren. Verder moet het signaal dat
de zender verstuurt voldoende sterk zijn om aan de ontvanger nog voldoende detecteerbaar te
zijn. Om dit te realiseren wordt de uitgangspin eerst versterkt vooraleer deze aan de transducer
wordt aangelegd. De versterker maakt gebruik van twee identieke buffers (CD4049UBCM [11])
van Fairchild Semiconductor en is te zien op Figuur 3.15. In Figuur 3.16 wordt getoond hoe de
verschillende pinnen van de buffers verbonden worden om het circuit uit Figuur 3.15 te realiseren.
Deze buffers hebben als groot voordeel dat de uitgangsspanning van de invertoren afhankelijk
is van de aangelegde voedingsspanning. Hierdoor kan de uitgangsspanning in trappen worden
verhoogd door meerdere buffers, die op een verschillende voedingsspanning werken, te gebruiken.
Tabel 3.4 geeft een aantal karakteristieken weer van deze buffer.
3.8 Constructie van de zenders 39
Voedingsspanning (V) Ingangsspanning (V) Uitgangsspanning (V)
5V 0V 4.5V
5V 3.3V 0.5V
5V 4.5V 0.5V
10V 0V 9V
10V 0.5V 9V
10V 4.5V 1V
Tabel 3.4: Elektrische karakteristieken van de CD4049UBCM
Figuur 3.15: Versterking van het PWM signaal
Figuur 3.16: Uitvoering van de versterking van het PWM signaal
3.8 Constructie van de zenders 40
3.8.2 PCB ontwerp
Met behulp van het programma Eagle werd een layout voor de zenders ontworpen.
Het resulterend elektrisch schema is te zien op Figuur 3.17. Figuur 3.18 toont een vereenvoudigde
voorstelling van dit circuit waarop enkel de belangrijkste bouwblokken zijn aangeduid. De twee
headers dienen om de zender op het microcontrollerbord te kunnen plaatsen. Verder worden de
pinnen, die nodig zijn voor de synchronisatie (zie Hoofdstuk 5), naar een afzonderlijke header,
de connector, gebracht. De batterij die gebruikt wordt, is een 9 Volt batterij en dient om een
van de buffers te voeden. Daarnaast wordt de 9 Volt ook als ingangsspanning aan de regulator,
ADP3335 [12], gelegd. Deze zet de 9 Volt om in 5 Volt waarmee dan enerzijds de tweede buffer
en anderzijds het microcontrollerbord gevoed kan worden. In Figuur 3.19 wordt de layout van
het zender bordje weergegeven. Figuren 3.20 en 3.21 tonen top en bottom laag.
3.8 Constructie van de zenders 41
Figuur 3.17: Elektrisch schema van de zender
3.8 Constructie van de zenders 42
Figuur 3.18: Vereenvoudigd schema van de zenders
Figuur 3.19: Layout van de zenders
3.8 Constructie van de zenders 43
Figuur 3.20: De top-laag van de zenders
Figuur 3.21: De bottom-laag van de zenders
DE ONTVANGER 44
Hoofdstuk 4
De Ontvanger
4.1 Inleiding
In dit hoofdstuk wordt uitgelegd hoe de bouw van de ontvanger tot stand is gekomen.
4.2 Transducer
Idealiter zou de transducer volledig omnidirectioneel moeten zijn, waarbij het signaal vanuit alle
richtingen even goed wordt ontvangen. Helaas bestaan zo’n transducers niet en werd hetzelfde
type transducer als bij de zenders gekozen, de 400ER080. In een uitbreiding op deze thesis zou
men eventueel gebruik kunnen maken van een transducer rooster om op deze manier vanuit alle
richtingen goed te kunnen ontvangen.
4.3 Aansturing
Om de transducer aan te sturen, werd er net zoals bij de zenders een component, Flupke, ter
beschikking gesteld. Verder wordt er nog steeds perfecte synchronisatie tussen de zenders en de
ontvanger verondersteld. De tijd die er moet worden gesampeld om alle gegevens te ontvangen is
niet gekend, maar men kan wel een bovengrens bepalen. De zenders versturen codes van 63 bits
aan 2kHz, hetgeen 31.5ms duurt. Daarnaast mag er verondersteld worden dat de ontvanger zich
niet verder dan 5 meter van de zenders bevindt. Het signaal zal na een vertraging van5
340=
14.7ms worden ontvangen (snelheid van het geluid = 340 m/s). De totale tijd dat de ontvanger
moet meten, kan dus begrensd worden door 31.5+14.7 = 46.2ms. Sampelt de ontvanger nu 0.05
seconden aan een frequentie van 200kHz dan worden er 10.000 samples genomen. Omwille van
4.4 Programmeren van de ontvanger 45
de beperkte geheugenruimte van de MSP moet deze samplefrequentie drastisch verlaagd worden
om 50ms te kunnen meten.
4.4 Programmeren van de ontvanger
4.4.1 Uitbreiding van de USB interface
Om commandos via de USB verbinding van de PC naar het bordje te sturen, moet er zowel
een deel code voor de PC als een deel code voor de MSP430 geschreven worden. Voor het PC
gedeelte werd opnieuw gebruik gemaakt van Visual Basic 6.0 als programmeeromgeving. Om
de MSP430 te programmeren werd ook hetzelfde programma, Code Composer Essentials 2.0,
gebruikt. Het opzetten van een USB verbinding kan, door gebruik te maken van het JTAG
protocol (zie Hoofdstuk 3), op dezelfde manier gebeuren als bij de zenders. Bijgevolg kan de
code die te vinden is in Bijlage C opnieuw worden gebruikt om de MSP van de ontvanger te
programmeren.
De uitbreiding bestaat er nu in om de PC toe te laten, naast een eerste USB verbinding met
de zenders, een tweede USB verbinding op te starten die de PC met de ontvanger verbindt. In
Hoofdstuk 8 wordt de resulterende interface afgebeeld.
4.4.2 Programmeren van de chip voor de ontvanger
Algemene beschouwingen
Om de MSP nu te gaan programmeren, moet er rekening worden gehouden met het feit dat het
ontvangen signaal niet digitaal is. In tegenstelling tot bij de zenders mag dus niet zomaar gelijk
welke pin gesampeld worden als hoog (=1) of laag (=0), maar moet er eerst een analoog naar
digitaal omzetting gebeuren. Op de MSP430 bevindt zich een 12 bit ADC (ADC12 ) die een
analoog sample kan omzetten in 12 bits. Het is deze analoog naar digitaal omzetter die gebruikt
zal worden om het ontvangen analoog signaal om te zetten in een digitaal signaal, waarmee dan
verder gewerkt kan worden.
Tevens moet er ook rekening gehouden worden met een aantal beperkingen. De ADC zal
worden aangestuurd door een klok (TimerA). Een afgeleide klok zal aangeven wanneer het
programma naar de interrupt routine van de ADC moet springen. De interrupt moet volledig af-
gewerkt zijn vooraleer de volgende interrupt mag optreden. Is de Interrupt latency, de tijd tussen
4.4 Programmeren van de ontvanger 46
het ontstaan van een interrupt en de afhandeling ervan, immers te hoog dan zal er niet langer
gesampeld worden aan een vaste frequentie. Dit vormt een eerste beperking op de maximale
klokfrequentie. Verder zorgt de beschikbare geheugenruimte voor een tweede beperking op de
frequentie. Wordt er gedurende 0.05 seconden aan 6MHz (de maximale klokfrequentie) ge-
sampeld, dan zijn er 300.000 samples nodig. Vermits de ADC ieder sample in 12 bits omzet,
moet de MSP 3.600.000 bits of 450.000 bytes kunnen opslaan om 0.05 seconden te meten. Dit
is veel meer dan het geheugen van de MSP430 kan bevatten.
Het is met andere woorden nodig om een afweging te maken tussen de maximale klokfrequentie
en de gewenste sampleresolutie.
Een oplossing voor de eerste beperking bestaat erin om, net zoals bij de zenders, gebruik
te maken van de DMA module. Wanneer de DMA getriggerd wordt door TimerA, wordt de
ADC uitgang rechtstreeks gekopieerd naar het geheugen. Vermits de DMA een module is die
onafhankelijk van de CPU kan werken, gaat er op deze manier geen kostbare tijd verloren in de
interrupt routines. Dit maakt het mogelijk om een hogere samplefrequentie te bereiken.
De energie, van de Kasami codes die worden gebruikt, zit geconcentreerd tussen 0 en 2kHz.
De codes worden BPSK gemoduleerd op een draaggolf van 40kHz. Na PWM codering worden de
samples aan een transducer, met centrale frequentie van 40kHz, gelegd. De verzonden signalen
hebben in hun spectrum een piek bij 40kHz. De verzonden codes liggen in een band van 38kHz
tot 42kHz. Dit is te zien op Figuur 4.1.
−60 −50 −40 −30 −20 −10 0 10 20 30 40 50 600
5000
10000
15000Spectrum Kasami code
Frequentie (kHz)
Am
plitu
de
−60 −50 −40 −30 −20 −10 0 10 20 30 40 50 600
1000
2000
3000
4000Spectrum PWM Signaal
Frequentie (kHz)
Am
plitu
de
Figuur 4.1: Spectrum van de Kasami code en van het PWM signaal
4.4 Programmeren van de ontvanger 47
Het Nyquist criterium zegt dat een signaal met bandbreedte B gesampeld moet worden
aan een frequentie groter dan of gelijk aan 2 keer de bandbreedte van dat signaal om aliasing
te vermijden. Het criterium zegt niets over de plaats waar het signaal zich in het spectrum
moet bevinden.[13] De verzonden code bevindt zich in een band rond 40kHz en heeft er een
bandbreedte van 4kHz. Om de codes correct te ontvangen, volstaat het voor de ontvanger om
te sampelen aan een frequentie boven de 8kHz. Dit betekent echter niet dat de resultaten ook
altijd even nauwkeurig zullen zijn. Sampelen aan 8kHz betekent immers dat er maar om de1
8e3= 125µs een sample wordt genomen. Gedurende de dode tijd, waarin de gegevens van de
zenders naar de ontvanger propageren, wordt er dan ook maar om de 125µs gesampeld. In
125µs legt een geluidsgolf 125*10−6*340 = 0.0425m of 4.25cm af. Wanneer de ontvanger een
sample zou nemen net voor het signaal aankomt, kunnen er fouten tot bijna 4.25cm optreden.
Een hogere samplefrequentie zal bijgevolg ook tot een hogere nauwkeurigheid leiden. Het doel
van deze scriptie is om een nauwkeurigheid van een centimeter te halen. Een geluidsgolf legt
deze afstand in0.01340
≈ 30µs af. Een samplefrequentie van 30kHz zal voor een nauwkeurigheid
van 1cm zorgen.
Het beschikbare RAM geheugen dat overblijft voor het opslaan van de ontvangen samples
bedraagt zo’n 3kB. Er moet gedurende 50ms worden gemeten en ieder sample afkomstig van
de ADC resulteert in 12 bits. De maximale samplefrequentie bedraagt dan3000 ∗ 80.05 ∗ 12
= 40kHz.
Sampelen aan 40kHz zal tot een nauwkeurigheid van34040e3
= 0.0085m of 8.5mm leiden.
Bespreking van de MSP430 code
In deze paragraaf wordt de werking van de programmeercode voor de ontvanger besproken. Dit
wordt geıllustreerd in Figuur 4.2. De code zelf is gegeven in Bijlage F. Wanneer de ontvanger de
opdracht van de computer krijgt om met het sampelen te beginnen, zal deze TimerA configureren
en starten. Vervolgens wordt de DMA module zodanig geconfigureerd dat deze getriggerd wordt
telkens TimerA een zekere waarde bereikt. Op deze manier wordt de DMA getriggerd aan een
bepaalde, vaste frequentie. De DMA wordt verder zo ingesteld dat hij bij iedere trigger de
gegevens op de ingang (in dit geval de ADC12 poort) rechtstreeks kopieert naar het geheugen
van de MSP430. Gedurende deze bewerking hoeft de CPU niet tussen te komen, hetgeen een
significante tijdswinst oplevert. Wanneer de DMA voldoende lang gesampeld heeft, zal deze
de Timer en zichzelf uitschakelen. De sample resultaten blijven ondertussen bewaard in het
geheugen van de MSP tot de PC een nieuwe opdracht tot “ontvangen” geeft. De MSP kan
4.5 Constructie van de ontvanger 48
ook de opdracht krijgen om zijn gegevens door te sturen naar de PC. In dat geval verstuurt de
controller de bewaarde resultaten via de USB connectie naar de PC.
Figuur 4.2: De werking van de ontvanger
4.5 Constructie van de ontvanger
4.5.1 Inleiding
Het is de bedoeling dat de transducer van de ontvanger een analoog signaal opvangt. Dat signaal
moet dan aangelegd worden aan de ingang van de ADC module. In de inleiding werd reeds
vermeld dat geluidsgolven een zekere verzwakking ondervinden naarmate ze verder propageren.
Wanneer zender en ontvanger zich op 5 meter van elkaar bevinden, is er een verzwakking van
6.65 dB. De ADC die wordt gebruikt, zet een analoog signaal om in 12 bits. Dit wil zeggen
dat deze analoog naar digitaal converter een bereik heeft van 72dB, hetgeen ruim voldoende
is om de gegevens nog goed te kunnen ontvangen. Om het bereik van de ADC zo optimaal
mogelijk te gebruiken, is het aangewezen om het ontvangen signaal eerst te versterken vooraleer
het aan de ingang van de ADC te leggen. De omzetting van het analoge signaal in de ADC
4.5 Constructie van de ontvanger 49
module gebeurt aan de hand van een referentiespanning van 2.5 Volt (=VR+) die intern in de
MSP wordt gegenereerd en een referentiespanning van 0 Volt (=VR−). Een ingangssignaal van
2.5 Volt zal resulteren in een bitstring van 111111111111, terwijl een ingang van 0 Volt voor
000000000000 zal zorgen.
In Figuur 4.3 wordt het schema van het versterkercircuit getoond. Een simulatie ervan is te
vinden in Figuur 4.4. De ingangsspanning wordt met een factorR5
R4=
100kΩ1.8kΩ
= 55 versterkt.
Verder zorgt C4 ervoor dat de versterking beperkt blijft tot frequenties rond de 40kHz. Als
opamp wordt de TLV2771ID [14] van Texas Instruments gebruikt. De weerstanden R1 en R2
zorgen ervoor dat het DC punt op een vaste spanning komt te staan die gelijk is aan de helft
van de maximale referentie spanning van de ADC module, namelijk 1.25 Volt.
5 V
R 25 k
R 11 5 k
R 31 0 0 k
R 4 R 5
1 . 8 k 1 0 0 k
C 1. 2 2 µ F
C 2. 2 2 µ F
T L V 2 7 7 1
C 45 . 6 n F
A D C 1 2T r a n s d u c e r
Figuur 4.3: Versterkercircuit voor de ontvanger
4.5 Constructie van de ontvanger 50
Figuur 4.4: Simulatie van het versterkercircuit
4.5.2 PCB ontwerp
Met behulp van het programma Eagle werd een layout voor de ontvanger ontworpen. Het
resulterend elektrisch schema is te zien op Figuur 4.5. Net zoals bij de zenders zijn er twee
headers aanwezig waarmee het ontvangerbordje op het microcontrollerbord geklikt kan worden.
Ook de header die als connector tussen de ontvanger en de synchronisator (zie Hoofdstuk 5) zal
werken, is hier aanwezig. Verder kan er gekozen worden om met een batterij van 9 Volt te werken.
Via de regulator wordt van de 9 Volt een spanning van 5 Volt afgeleid die vervolgens gebruikt
kan worden om zowel de opamp als het microcontrollerbord te voeden. Vermits de ontvanger
verbonden blijft met de PC, is het ook mogelijk om het microcontrollerbord te voeden via de
USB kabel. Deze 3.3 Volt spanning kan dan ook worden gebruikt om de opamp te voeden. In
dat geval zal het DC punt van 1.25 Volt zakken naar3.34
= 0.825 Volt.
4.5 Constructie van de ontvanger 51
Figuur 4.5: Elektrisch schema van de ontvanger
4.5 Constructie van de ontvanger 52
Figuur 4.6: Layout van de ontvanger
4.5 Constructie van de ontvanger 53
Figuur 4.7: De top-laag van de ontvanger
Figuur 4.8: De bottom-laag van de ontvanger
DE SYNCHRONISATOR 54
Hoofdstuk 5
De Synchronisator
5.1 Inleiding
Correcte plaatsbepaling kan enkel gebeuren wanneer zenders en ontvanger goed met elkaar
gesynchroniseerd zijn. In eerste instantie wordt deze synchronisatie bereikt door kabels te
gebruiken. Er bestaan een groot aantal mogelijkheden om de componenten met behulp van
kabels te synchroniseren. In de volgende paragrafen worden er enkele van besproken.
5.1.1 PC werkt als synchronisator
In dit geval zijn de drie zenders en de ontvanger aan het wachten op een commando. Wanneer de
PC het commando zenden verstuurt, zullen de componenten beginnen met zenden of ontvangen.
Dit wordt geıllustreerd in Figuur 5.1. Hieraan zijn echter een aantal nadelen verbonden. Een
eerste nadeel is dat de PC over vier verschillende USB uitgangen moet beschikken. Een tweede
nadeel is de toevoeging van een onbekende extra vertraging. Wanneer de gebruiker via de PC het
commando zenden wil versturen, zal het programma dit commando vier keer moeten versturen,
maar telkens naar een andere component. Dit resulteert in een zekere vertraging tussen het
versturen van het commando naar de eerste component en het versturen van het commando
naar de vierde component. Deze vertraging is onbekend en is afhankelijk van de PC waarop het
programma draait. Bijgevolg is het onmogelijk om voor deze vertraging te compenseren.
5.1 Inleiding 55
Figuur 5.1: PC verstuurt commandos naar alle componenten
5.1 Inleiding 56
5.1.2 Onderlinge synchronisatie
Het principe van onderlinge synchronisatie wordt weergegeven in Figuur 5.2. Net zoals in vorige
paragraaf verstuurt de PC zijn commando naar alle componenten. Daarna gaan de componenten,
vooraleer ze beginnen met het uitvoeren van hun opdracht, onderlinge boodschappen sturen om
zichzelf te synchroniseren. Naast de vier USB uitgangen zijn er ook minstens zes kabels nodig
om de verschillende componenten met elkaar te verbinden. Alhoewel de onbekende vertraging
uit de vorige paragraaf nu kan worden weggewerkt, schiet dit systeem te kort uit praktische
overwegingen.
Figuur 5.2: Onderlinge synchronisatie
5.1 Inleiding 57
5.1.3 Een extra component: de synchronisator
In dit geval verstuurt de PC niet langer commandos naar de verschillende componenten maar
is de PC maar verbonden met een component, de synchronisator. Deze component wordt dan
gebouwd door een vijfde microcontrollerbord te gebruiken en de MSP zodanig te programmeren
dat er een synchronisatieprotocol wordt uitgevoerd bij het ontvangen van het PC commando
zenden. Dit wordt geıllustreerd in Figuur 5.3. Niet alleen is er hier geen sprake van een on-
bekende tijdsvertraging, ook praktisch gezien is dit systeem eenvoudig. Iedere zender heeft
immers maar een kabel nodig waarmee hij met de synchronisator moet worden verbonden.
Figuur 5.3: PC verstuurt commandos naar de synchronisator
5.2 Het protocol 58
5.2 Het protocol
5.2.1 Inleiding
In dit deel wordt het protocol dat werd uitgewerkt om de verschillende componenten te syn-
chroniseren besproken.
5.2.2 De synchronisator
Figuur 5.4: Toestandsdiagram van
de synchronisator
Deze component kan worden beschouwd als de master.
De werking is gebaseerd op het toestandsdiagram weer-
gegeven in Figuur 5.4. Bij het opstarten bevindt hij
zich in de toestand luisteren.
Wanneer de synchronisator het commando om met het
meten te beginnen ontvangt, brengt hij P4.0 hoog en
komt hij in de toestand wachten 1 terecht waar hij
wacht tot alle componenten waarmee hij verbonden
is een antwoord geven. (P3.4-P3.7) Na dit antwoord
brengt hij P4.0 terug laag en komt hij in de toestand
bezig terecht. In deze toestand controleert hij pin-
uitgangen van de andere componenten (P3.0-P3.3) om
te weten wanneer de componenten hun taak hebben
afgewerkt. Als dat gebeurt brengt hij P4.1 hoog en
belandt de synchronisator in de toestand wachten 2.
Vervolgens observeert hij pinuitgangen opnieuw P3.0
tot P3.3 tot deze laag worden, waarop hij P4.1 terug
laag brengt en opnieuw naar de toestand luisteren
springt.
5.2 Het protocol 59
5.2.3 De zenders
De zenders moeten nu zodanig worden aangepast dat deze zullen kijken naar de nieuwe com-
ponent in plaats van te wachten op een PC commando. Daartoe wordt het codegedeelte op de
MSP, dat betrekking had op de USB communicatie, vervangen door een nieuw stuk code.
Figuur 5.5: Toestandsdiagram van de zenders
Het toestandsdiagram van een zender is
weergegeven in Figuur 5.5. De werking van dit
toestandsdiagram verloopt analoog aan dat
van de synchronisator. Bij het opstarten van
de component bevindt deze zich in de toe-
stand luisteren. Wanneer de synchronisator
P4.0 hoog maakt, springt de zender naar toe-
stand wachten 1, waarbij hij P3.7 hoog maakt.
In deze toestand blijft de zender wachten tot
hij ziet dat de synchronisator P4.0 omlaag
brengt. Dit is het teken dat alle componenten
klaar zijn om te zenden of te ontvangen en
op het moment dat de zenders dit opmerken
brengen ze P3.7 laag en starten ze met zenden.
Wanneer een zender klaar is met zenden,
brengt hij P3.3 hoog en verblijft hij in toe-
stand wachten 2. Hier wacht de zender tot
de synchronisator P4.1 hoog brengt en op dat
moment brengt de zender P3.3 terug omlaag
en komt de zender in zijn oorspronkelijke toe-
stand luisteren terecht.
Er moet wel worden opgemerkt dat, alhoewel de zenders in Figuur 5.5 allen op dezelfde
manier werden opgebouwd en dezelfde pinuitgang hoog of laag zullen zetten, ze met een
verschillende pin van de synchronisator moeten worden verbonden. De zenders zouden immers
ook kunnen worden gebouwd zoals in Figuur 5.6 is weergegeven. In dat geval correspondeert de
uitgangspin die een bepaalde zender gaat wijzigen wel met de ingangspin van de synchronisator.
Maar het is veel praktischer wanneer de programma’s voor de verschillende zenders, op hun
5.2 Het protocol 60
specifieke code na, volkomen analoog zijn. Vandaar ook dat er werd gekozen om met vaste
uitgangspinnen te werken.
Figuur 5.6: Toestandsdiagrammen van de zenders met verschillende pinuitgangen
5.2 Het protocol 61
5.2.4 De ontvanger
Ook de ontvanger moet zodanig worden aangepast dat deze zal kijken naar de nieuwe component
in plaats van te wachten op een PC commando. De ontvanger heeft echter een extra taak die
de zenders niet hebben, namelijk de ontvangen samples doorsturen naar de PC, zodat de PC de
plaatsbepaling kan uitvoeren. Het is dus niet nodig om het volledige USB gedeelte te vervangen,
maar enkel het stuk dat betrekking heeft tot het starten met ontvangen moet worden aangepast.
Voor het sturen van de samples naar de computer wordt er nog steeds verondersteld dat de
ontvanger via een USB kabel verbonden is met de PC. In principe zou de ontvanger ook zodanig
kunnen geprogrammeerd worden dat hij zijn gegevens verstuurt naar de synchronisator en dat
deze de gegevens op zijn beurt doorstuurt naar de PC. Het enige voordeel hiervan zou zijn dat
er maar een enkele USB verbinding noodzakelijk is. Dit voordeel weegt echter niet op tegen de
moeilijkheden die erbij komen om zo’n extra communicatie toe te voegen.
Figuur 5.7: Toestandsdiagram van de
ontvanger
Het toestandsdiagram van de ontvanger is
weergegeven in Figuur 5.7. De werking van dit
toestandsdiagram verloopt volkomen analoog
aan dat van de zenders. Bij het opstarten van
de component bevindt deze zich in de toestand
luisteren. Wanneer de synchronisator P4.0
hoog maakt, springt de ontvanger naar toe-
stand wachten 1, waarbij P3.4 hoog wordt. In
deze toestand blijft de ontvanger wachten tot
alle componenten klaar zijn om te zenden of
te ontvangen (P4.0 laag). Dan brengt hij P3.4
laag en start hij met ontvangen. Wanneer de
ontvanger hiermee klaar is, brengt hij P3.0
hoog en verblijft hij in toestand wachten 2
tot de synchronisator P4.1 hoog brengt. Hier-
op brengt de ontvanger P3.0 terug omlaag en
komt hij terug in zijn oorspronkelijke toestand
luisteren terecht.
5.3 Uitbreiding van het protocol 62
5.2.5 Resultaat van een simulatie
In Figuur 5.8 wordt het resultaat weergegeven waarbij de synchronisator werkt met 1 zender.
Het is de synchronisator die het zenden initieert. Vervolgens wacht de synchronisator tot de
zender laat weten dat hij klaar is met zenden.
Figuur 5.8: Simulatie van het protocol met 1 zender
5.3 Uitbreiding van het protocol
5.3.1 Inleiding
In bepaalde gevallen kan het noodzakelijk zijn dat de zenders, in plaats van eenmalig per
commando, continu hun codes verzenden. Om deze reden werd een uitbreiding voorgesteld
waarbij de PC een commando kan geven om met het zenden te starten en te stoppen. Terwijl
de zenders hun codes uitsturen, mag hun synchronisatie niet uit het oog worden verloren.
5.4 Constructie van de synchronisator 63
5.3.2 Synchronisator
Om met het zenden te starten, moet er niets gewijzigd worden aan het basisprotocol. Na het
zenden zorgt de synchronisator opnieuw voor synchronisatie tussen de verschillende zenders.
Daarnaast laat hij de ontvanger ook telkens weten wanneer het zenden opnieuw begint. Verder
moet enkel nog de mogelijkheid toegevoegd worden om met zenden te stoppen.
5.3.3 De zenders
De zenders beginnen op dezelfde manier te zenden zoals in de vorige sectie reeds werd besproken.
Wanneer hun codes werden verzonden, zullen ze echter niet terugkeren naar hun begintoestand
maar zullen ze zich aan de hand van de synchronisator opnieuw synchroniseren en vervolgens
hun codes opnieuw verzenden. Het is pas wanneer de synchronisator het commando tot stoppen
geeft dat de zenders naar hun begintoestand zullen terugkeren.
5.3.4 De ontvanger
Alhoewel de zenders ditmaal continu hun codes verzenden, is het niet de bedoeling dat de
ontvanger blijft sampelen. De geheugenruimte, aanwezig op de microcontroller, is hiervoor
immers veel te klein. Bijgevolg zouden oudere samples, die nog niet naar de PC werden
verzonden, overgeschreven kunnen worden door recentere samples, hetgeen automatisch tot
verkeerde resultaten zou leiden. Om dit probleem op te lossen, wacht de ontvanger expliciet tot-
dat deze de opdracht tot ontvangen krijgt. Daarna wacht de ontvanger tot de zenders opnieuw
beginnen met het zenden van hun code. Dit kan omdat de synchronisator het “opnieuw zenden”
aan de ontvanger kenbaar maakt. Vanaf dan zal de ontvanger gedurende een bepaalde tijd gaan
sampelen.
5.4 Constructie van de synchronisator
5.4.1 Inleiding
Vermits het synchronisatie protocol voor de verschillende zenders en voor de ontvanger telkens
andere, vaak niet bij elkaar gelegen pinnen van het microcontrollerbord gebruikt, wordt er
een extra stuk hardware toegevoegd. Dit stuk zal de pinnen, die gebruikt worden door de
verschillende componenten, zodanig gaan ordenen dat de synchronisator en de componenten
toch met 1 enkele kabel kunnen worden verbonden.
5.4 Constructie van de synchronisator 64
5.4.2 PCB ontwerp
Net zoals bij de zenders en de ontvanger werd een layout voor de synchronisator met behulp
van het programma Eagle ontworpen. Dit bordje heeft enkel tot doel de pinnen die bij de
synchronisatie gebruikt worden zodanig te ordenen dat de verschillende componenten door een
enkele kabel kunnen worden verbonden. Figuur 5.9 laat het elektrisch schema zien. In Figuur
5.10 wordt de layout getoond en figuren 5.11 en 5.12 tonen respectievelijk de top en de bottom
laag.
Figuur 5.9: Elektrisch schema van de synchronisator
5.4 Constructie van de synchronisator 65
Figuur 5.10: Layout van de synchronisator
Figuur 5.11: De top-laag van de synchronisator
5.4 Constructie van de synchronisator 66
Figuur 5.12: De bottom-laag van de synchronisator
VERWERKING VAN DE GEGEVENS 67
Hoofdstuk 6
Verwerking van de gegevens
6.1 Inleiding
De ontvanger zal via zijn analoog naar digitaal convertor samples nemen van het ontvangen
signaal. Deze analoge samples worden omgezet in digitale samples van 12 bits. Per sample slaat
de ontvanger dus 12 bits op in zijn geheugen. Het zijn deze 12 bit samples die vervolgens door
de ontvanger naar de PC worden verzonden en waarmee de verwerking dient te gebeuren.
6.2 Communicatie tussen de PC en de componenten
In een vorig hoofdstuk werd er reeds vermeld dat de gegevens worden ingeladen in de PC wanneer
het juiste commando naar de MSP wordt verzonden. Op dat moment verstuurt de ontvanger
alle genomen samples naar het Visual Basic programma dat op de PC draait. Hierbij mag het
feit dat de MSP enkel bytes en geen bits kan verzenden niet uit het oog worden verloren. Vermits
ieder sample 12 bits groot is, moeten er dus minstens twee bytes per sample worden verzonden.
Dit betekent dat het programma niet 12 maar 16 bits ontvangt per sample. Bijgevolg moet de
ontvangen bitstring eerst nog verwerkt worden. De bitstring van een ontvangen sample zal er
als volgt uitzien: [b12, b11, ..., b0, 0, 0, 0]. Hierbij is b12 het meest significante bit van het sample
en b0 het minst significante bit.
Dit wil dus zeggen dat, per 16 bits, telkens de eerste 12 bits moeten worden behouden en de 4
laatste bits genegeerd mogen worden. Na deze eerste manipulatie wordt de ontvangen bitstring
opgeslagen in een tekstbestand en gebeurt de verdere verwerking in Matlab.
6.3 Verwerking in Matlab 68
6.3 Verwerking in Matlab
Per sample worden er 12 bits opgeslagen. Deze 12 bits zijn het resultaat van de omzetting van
de analoog naar digitaal converter op de MSP. De omzetting van het analoge ontvangen signaal
naar een digitaal sample gebeurde met onderstaande formule:
NADC = 4095Vin − VR−VR+ − VR−
(6.1)
NADC : De digitale uitgang
Vin : De analoge ingang
VR− : Referentie spanning
VR+ : Referentie spanning
In Hoofdstuk 4 werd de keuze voor de waarde van VR− en van VR+ reeds gegeven. Uit deze
formule kan Vin nu ook in functie van het digitale sample worden bepaald:
Vin =1
4095NADC(VR+ − VR−) + VR− (6.2)
In Matlab wordt de ontvangen bitstring omgezet in een lijst van analoge samples Vin. Dit zijn
de samples van een versterkte versie van het analoge ingangssignaal. Om de verwerking op
een gebruiksvriendelijke manier te kunnen doen, werd in Matlab een interface geschreven. (Zie
Hoofdstuk 8)
6.4 Meetresultaat
Om te controleren of de verwerking correct gebeurt, wordt een meetopstelling met een en-
kele zender gebouwd. De afstand tussen zender en ontvanger bedraagt 60 centimeter. De
zender wordt, met behulp van de synchronisator, gesynchroniseerd met de ontvanger. Zoals in
Hoofdstuk 1 werd vermeld, volstaat een enkele zender om een afstandsmeting uit te voeren. De
verzonden code en het ontvangen signaal worden in Figuur 6.1 weergegeven en de correlatie-
functie is te zien in Figuur 6.2. Deze correlatiefunctie heeft een piek bij 1.7814 milliseconden,
bijgevolg is de afstand tussen zender en ontvanger gelijk aan 340 ∗ 1.7814 ∗ 10−3 = 60.57cm.
6.4 Meetresultaat 69
0 0.01 0.02 0.03 0.04 0.05−1.5
−1
−0.5
0
0.5
1
1.5De verzonden code
Tijd (sec)
Am
plitu
de
0 0.01 0.02 0.03 0.04 0.05−0.1
−0.05
0
0.05
0.1Het ontvangen signaal
Tijd (sec)
Am
plitu
de
Figuur 6.1: Verzonden code + ontvangen signaal
−0.05 0 0.05
−500
0
500
1000
1500
2000
2500
3000X: 0.001781Y: 3290
De correlatiefunctie
Tijd (sec)
Am
plitu
de
Figuur 6.2: De correlatiefunctie
MEETRESULTATEN 70
Hoofdstuk 7
Meetresultaten
7.1 Inleiding
In dit hoofdstuk wordt nagegaan wat de betrouwbaarheid is van de afstandsmetingen en welke
nauwkeurigheid er wordt gehaald. Dit wordt gedaan aan de hand van een aantal opeen-
volgende afstandsmetingen waarbij een enkele zender wordt gebruikt. De meetopstelling wordt
geıllustreerd in Figuur 7.1. Eerst worden er een aantal metingen in functie van de afstand
gedaan. Vervolgens wordt de invloed van de hoek tussen zender en ontvanger bestudeerd.
7.2 Meetresultaten in functie van de afstand 71
Figuur 7.1: De meetopstelling
7.2 Meetresultaten in functie van de afstand
7.2.1 Meetresultaten
De zender wordt achtereenvolgens op verschillende afstanden van de ontvanger geplaatst. Op
iedere positie voert de ontvanger een vijftal metingen uit vooraleer de zender wordt verplaatst.
Na deze metingen wordt de gemiddelde afstand en de gemiddelde fout bepaald. De meet-
resultaten zijn te vinden in Tabel 7.1. Uit deze resultaten volgt dat de gemiddelde fout over
vijf metingen stijgt naarmate de afstand tussen de zender en de ontvanger toeneemt. Bij
afstanden groter dan 4 meter wordt het verzonden signaal nog nauwelijks gedetecteerd. Een
van de mogelijke oorzaken kan de bandbreedte van de codes zijn. De energie van de codes is
geconcentreerd tussen 0 en 2kHz. Na BPSK modulatie en PWM codering liggen de codes in een
band tussen 38kHz en 42kHz (bandbreedte in de basisband = 4kHz). De beperkte bandbreedte
van de transducers kan ervoor zorgen dat de golfvormen teveel vervormd worden.
7.2 Meetresultaten in functie van de afstand 72
Afstand Meting (meter) Gemiddelde
(meter) 1 2 3 4 5 (meter)
0.4Resultaat 0.418 0.3697 0.4187 0.4245 0.4464 0.41546
| Fout | 0.018 0.0303 0.0187 0.0245 0.0464 0.02758
0.6Resultaat 0.6057 0.6071 0.5938 0.5379 0.6378 0.59646
| Fout | 0.0057 0.1319 0.0062 0.0621 0.0378 0.02378
0.8Resultaat 0.8233 0.8221 0.7947 0.8388 0.8534 0.82646
| Fout | 0.0233 0.0221 0.0053 0.0388 0.0534 0.02858
1Resultaat 0.8233 0.8221 0.7947 0.8388 0.8534 1.0139
| Fout | 0.0233 0.0221 0.0053 0.0388 0.0534 0.02182
2Resultaat 2.0186 1.9732 2.0951 2.0147 1.9072 2.00176
| Fout | 0.0186 0.0268 0.0951 0.0147 0.0928 0,0496
2.4Resultaat 2,3588 2.4912 2.4336 2.455 2.3685 2.42142
| Fout | 0,0412 0.0912 0.0336 0.055 0.0315 0.0505
3Resultaat 2.9752 3.0421 3.0818 3.0793 3.0426 3.0442
| Fout | 0.0248 0.0421 0.0818 0.0793 0.0426 0.05412
3.6Resultaat 3.5022 3.6213 3.682 3.5592 3.7049 3.61392
| Fout | 0.0978 0.0213 0.082 0.0408 0.1049 0.06936
4.2Resultaat 5.7715 6.3748 4.0547 5.083 4.8236 5.22152
| Fout | 1.5715 2.1748 0.1453 0.883 0.6236 1.07964
Tabel 7.1: Meetresultaten
7.2 Meetresultaten in functie van de afstand 73
7.2.2 Voorbeeld
Figuur 7.2 illustreert het verzonden en ontvangen signaal wanneer zender en ontvanger zich op
een afstand van 3.3 meter van elkaar bevinden. De autocorrelatiefunctie heeft een maximum bij
9.6 milliseconden, hetgeen overeenkomt met een afstand van 3.27 meter.
0 0.02 0.04 0.06−1.5
−1
−0.5
0
0.5
1
1.5De verzonden code
Tijd (sec)
Am
plitu
de
−0.05 0 0.05
−60
−40
−20
0
20
40
60
80
100
120
140X: 0.009594Y: 138.2
De autocorrelatiefunctie
Tijd (sec)
Am
plitu
de
0 0.02 0.04 0.06−0.01
−0.005
0
0.005
0.01Het ontvangen signaal
Tijd (sec)
Am
plitu
de
Figuur 7.2: Verzonden en ontvangen signaal bij een afstand van 3.3 meter en hun auto-
correlatiefunctie
7.3 Meetresultaten in functie van de hoek 74
7.3 Meetresultaten in functie van de hoek
7.3.1 Inleiding
In dit deel wordt nagegaan wat de invloed is van de hoek tussen zender en ontvanger op
de afstandsbepaling. Hiervoor wordt de zender op een afstand van 60 centimeter van de
ontvanger geplaatst. Vervolgens wordt de zender verschoven volgens een cirkel met middelpunt
de ontvanger en een straal van 60 centimeter. Figuur 7.3 illustreert deze opstelling.
−0.5 0 0.5 1
−0.6
−0.4
−0.2
0
0.2
0.4
0.6
x (meter)
y (m
eter
)
α
Figuur 7.3: Meetopstelling waarbij de zender verschoven wordt volgens een cirkel met straal
0.6 meter
7.3.2 Meetresultaten
De resultaten van deze meting worden weergegeven in Figuur 7.4. Het is duidelijk dat de fout
beperkt blijft voor hoeken tussen -60 en 60 graden. Dit strookt met het feit dat de bundelbreedte
van de gekozen transducers 120 graden bedraagt. (Zie Hoofdstuk 3)
Bij hoeken groter dan 70 zijn de resultaten niet langer betrouwbaar.
7.4 Besluit 75
−80 −60 −40 −20 0 20 40 60 80
0
1
2
3
4
De fout in functie van de hoek
Fou
t (m
eter
)
Hoek (graden)
−80 −60 −40 −20 0 20 40 60 800
0.05
0.1
Detailweergave van de fout in functie van de hoek
Fou
t (m
eter
)
Hoek (graden)
Figuur 7.4: De fout in functie van de hoek
7.4 Besluit
Voor afstanden tot 4 meter, waarbij de hoek tussen de ontvanger en de zender beperkt blijft
tot 60, kan dit systeem een afstandbepaling uitvoeren waar de fout beperkt blijft tot enkele
centimeters. Er dient wel opgemerkt te worden dat de transducers goed gealigneerd en naar
elkaar gericht moeten zijn. Misalignatie kan er immers voor zorgen dat de stralingsbundel van
de zender buiten de bundelbreedte van de ontvanger valt. En dit zal tot grote fouten leiden.
HET SYSTEEM 76
Hoofdstuk 8
Het systeem
8.1 Inleiding
In de vorige hoofdstukken werd de opbouw van de verschillende deelaspecten van dit project
besproken. In dit hoofdstuk worden al deze onderdelen samengenomen tot een werkend systeem.
8.2 De verschillende componenten
In eerste instantie worden de componenten in de ruimte geplaatst. De synchronisator en de
ontvanger worden via een USB kabel met de PC verbonden. Verder worden de zenders en de
ontvanger ook verbonden met de synchronisator. Figuur 8.1 toont een bovenaanzicht van de
meetopstelling terwijl Figuur 8.2 een vooraanzicht vanuit het standpunt van de ontvanger laat
zien.
8.2 De verschillende componenten 77
Figuur 8.1: Bovenaanzicht van de meetopstelling
8.2 De verschillende componenten 78
Figuur 8.2: Vooraanzicht van de meetopstelling
8.2.1 De synchronisator
De positie van de synchronisator speelt geen rol. Zijn functie is het synchroniseren van de
zenders en van de ontvanger. Figuur 8.3 toont de synchronisator in detail.
Figuur 8.3: De synchronisator
8.2 De verschillende componenten 79
8.2.2 De zenders
De drie zenders worden op verschillende posities in de ruimte geplaatst. In deze test worden de
zenders op de omtrek van een cirkel met straal 60 centimeter geplaatst. Het middelpunt van
deze cirkel stelt de oorsprong van het referentieassenstelsel voor. (Zie Figuur 8.1) De posities
van de verschillende zenders worden in Tabel 8.1 gegeven. Figuur 8.4 toont een van de zenders
in detail.
Zender Coordinaten (meter)
Zender 1 [ 0.5196, 0.3 ]
Zender 2 [ 0.6, 0 ]
Zender 3 [ 0.5196, -0.3 ]
Tabel 8.1: De posities van de zenders
Figuur 8.4: De zender
8.2 De verschillende componenten 80
8.2.3 De ontvanger
De ontvanger wordt in Figuur 8.5 weergegeven. De ontvanger bevindt zich in het middelpunt
van de cirkel waarop de zenders zich bevinden.
Figuur 8.5: De ontvanger
8.3 Communicatie tussen de PC en de componenten 81
8.3 Communicatie tussen de PC en de componenten
Het is duidelijk dat het de PC is die opdrachten zal geven aan de componenten. Om de op-
drachten op een eenvoudige manier te kunnen geven, was een programma noodzakelijk. Aan dit
programma werden een aantal eisen gesteld.
Het programma moet:
• de verschillende componenten kunnen detecteren
• een verbinding kunnen opzetten tussen de computer en de component
• in staat zijn om eenvoudige instructies aan de componenten te geven
• gegevens kunnen lezen uit de ontvanger
• de ontvangen data kunnen opslaan voor verdere verwerking
• eenvoudig zijn om te gebruiken
Figuur 8.6 toont het uiteindelijke programma na het ontvangen van de gegevens. De meeste
knoppen die de gebruiker kan aanklikken zorgen voor de communicatie tussen de PC en de
verschillende componenten. In Tabel 8.2 wordt kort wat uitleg gegeven bij de andere knoppen.
De code zelf wordt meer in detail uitgelegd in Bijlage G.
Knop Uitleg
Wis Maakt het tekstvak met de ontvangen bits leeg
Opslaan Schrijft de ontvangen bits naar een bestand
Verwerk Verwerkt de bits, uit iedere 16 bits zijn er maar 12 informatiebits
? Controleert of de component wel degelijk goed werd geprogrammeerd
Tabel 8.2: De overige knoppen
8.3 Communicatie tussen de PC en de componenten 82
Figuur 8.6: Visual Basic interface na het ontvangen van de gegevens
8.4 Verwerking van de gegevens in Matlab 83
8.4 Verwerking van de gegevens in Matlab
Om de verwerking van de gegevens op een eenvoudige en gebruiksvriendelijke manier te kunnen
doen, werd in Matlab een interface geschreven. De gebruiker kan op eenvoudige wijze de positie
van de zenders instellen, vervolgens het ontvangen signaal inladen en uiteindelijk, met behulp
van de correlatiefuncties (zie Hoofdstuk 2), de afstanden tussen de zenders en de ontvanger
bepalen. Figuur 8.7 illustreert het resultaat na het inlezen van de ontvangen gegevens en de
verwerking. De afstanden en de vertragingstijden van de drie zenders tot de ontvanger worden
gegeven in Tabel 8.3.
Zender Vertragingstijd Afstand
Zender 1 0.001686 seconden 0.57324 meter
Zender 2 0.0018405 seconden 0.62577 meter
Zender 3 0.001707 seconden 0.58038 meter
Tabel 8.3: Het resultaat
8.4 Verwerking van de gegevens in Matlab 84
Figuur 8.7: Matlab interface na de verwerking
8.5 Positiebepaling 85
8.5 Positiebepaling
De positie van de ontvanger werd reeds in vorige paragraaf geıllustreerd. Figuur 8.8 toont het
gebied waar de ontvanger zich in moet bevinden in detail.
−0.6 −0.4 −0.2 0 0.2 0.4 0.6 0.8 1
−0.6
−0.4
−0.2
0
0.2
0.4
0.6
x (meter)
y (m
eter
)
Afstand totzender 1
Afstand totzender 2
Afstand totzender 3Zender 1Zender 2Zender 3
Gebied waar deontvanger zichmoet bevinden
Figuur 8.8: Positiebepaling
8.6 Verder onderzoek 86
8.6 Verder onderzoek
In deze sectie worden enkele toekomstige uitbreidingen voor het systeem onder de loep genomen.
• In het huidige systeem wordt gebruik gemaakt van drie zenders, waardoor het meetgebied
beperkt blijft. Om het meetgebied te vergroten, kan men meer zenders gebruiken. De
ontvanger heeft immers maar nood aan drie afstandsmetingen om zijn positie te kunnen
bepalen. Wanneer een van de zenders te ver van de ontvanger verwijderd is, kan de extra
zender de ontvanger misschien wel bereiken.
• Ook is de ontvanger op dit moment voorzien van een enkele transducer. Om het systeem
omnidirectioneler te maken kan de ontvanger gebruik maken van een transducer-rooster.
• Momenteel gebeurt de synchronisatie tussen zenders en ontvanger m.b.v. een afzonderlijke
synchronisator waarmee alle componenten via kabels verbonden zijn. In een normale
gebruiksomgeving worden kabels echter als hinderlijk ervaren. Een manier om toch zonder
kabels te synchroniseren is bijvoorbeeld de synchronisator op vaste tijdstippen elektro-
magnetische pulsen te laten uitsturen. Deze pulsen planten zich voort met de lichtsnelheid,
zodat de tijdsvertraging tussen de synchronisator en de verschillende componenten ver-
waarloosbaar is. De zenders verzenden hun codes en de ontvanger begint met sampelen
op het moment dat een puls wordt ontvangen.
• De gebruikte codes hebben een bandbreedte van 2kHz. Na BSPK modulatie en PWM
codering wordt de bandbreedte, in de basisband rond 40kHz, 4kHz. De transducers
hebben echter een beperkte bandbreedte waardoor de verzonden signalen vervormd kunnen
worden. Door de bandbreedte van de codes te beperken tot 1kHz blijft de bandbreedte,
in de basisband rond 40kHz, beperkt tot 2kHz. De resulterende golfvorm zal bijgevolg
minder vervormd zijn. Een kleinere bandbreedte resulteert ook in minder ruis en doordat
het uitgezonden vermogen hetzelfde blijft, een betere signaal-tot-ruis verhouding. Een
nadeel van deze methode is dat het versturen van de codes nu trager zal gebeuren. Hier-
door moet er gedurende een langere tijd worden gesampeld, wat aanleiding geeft tot een
grotere geheugenvereiste.
• Men kan ook transducers kiezen met grotere bandbreedte, waardoor de signalen minder
vervormd zullen zijn. Dit zal dan weer leiden tot meer ruis waardoor de signaal-tot-ruis
verhouding kan dalen.
BESLUIT 87
Hoofdstuk 9
Besluit
Het doel van deze thesis was een concept uit te denken waardoor plaatsbepaling met centimeter-
resolutie binnen een ruimte mogelijk zou worden. Naast het uitdenken van het concept heb ik
tevens een werkend prototype van het systeem ontwikkeld, uitgevoerd en uitgetest. Het volledig
concept en systeem is gebaseerd op akoestische golven. Met behulp van eenvoudige en courante
apparatuur, drie zenders en een ontvanger kan de plaatsbepaling met grote nauwkeurigheid
berekend worden. Voor afstandsmetingen tot 3.6 meter blijft de gemiddelde fout beperkt tot 7
centimeter.
Het belangrijkste van deze thesis is voor mij echter de kennis en de ervaring die ik heb opgedaan.
Dankzij de omvang van dit project ben ik met allerlei facetten van systeemontwerp in aanraking
gekomen. Zowel digitale als analoge elektronica kwamen ruim aan bod. Ook verdere signaal-
verwerking om aan plaatsbepaling te doen, vormde een belangrijk deelaspect. Daarnaast leerde
ik werken met gespecialiseerde software voor simulatie, lay-out, programmeren en debuggen. Een
ander belangrijk leerpunt is de praktijkervaring die ik heb opgedaan door de vele moeilijkheden,
die bij het praktische werk komen kijken, te overwinnen.
Kort samengevat kan ik, gewapend met een pak nieuwe kennis en vaardigheden, terugblikken
op een boeiend en geslaagd thesisjaar.
CODE VAN HET MATLAB-MODEL 88
Bijlage A
Code van het Matlab-model
main.m
%3D-coordinaten:
%robot: [x,y,z]
%geefres = 0 als er niks moet worden getoond (bij het simuleren)
function [posx,posy,posz] = main(robot,geefres)
Initialisatie
...
Dit stuk beschrijft de functie aanroep, deze heeft 2 argumenten namelijk “robot”, wat een 3
dimensionale vector is die de positie van de robot in de kamer bevat, en “geefres” die beslist of
het resultaat al dan niet getoond moet worden.
afstanden(1) = bepaal_afstand(zender1,robot);
afstanden(2) = bepaal_afstand(zender2,robot);
afstanden(3) = bepaal_afstand(zender3,robot);
...
vertragingen(1) = afstanden(1)/v;
vertragingen(2) = afstanden(2)/v;
vertragingen(3) = afstanden(3)/v;
...
Hier wordt de afstand tussen de robot en de verschillende zenders bepaald. Vervolgens worden
CODE VAN HET MATLAB-MODEL 89
ook de vertragingen die zullen optreden, tussen het moment waarop de zender begint te versturen
en het moment waarop de ontvanger deze gegevens begint te ontvangen, berekend.
signaal_orig1 = maak_signaal(Ts,Tsim,0,code1,Tm,zend_code);
signaal_orig2 = maak_signaal(Ts,Tsim,0,code2,Tm,zend_code);
signaal_orig3 = maak_signaal(Ts,Tsim,0,code3,Tm,zend_code);
...
signaal1 = maak_signaal(Ts,Tsim,vertragingen(1),code1,Tm,zend_code);
signaal2 = maak_signaal(Ts,Tsim,vertragingen(2),code2,Tm,zend_code);
signaal3 = maak_signaal(Ts,Tsim,vertragingen(3),code3,Tm,zend_code);
...
gemoduleerd_signaal1 = signaal1.*cos(2*pi*fc*t);
gemoduleerd_signaal2 = signaal2.*cos(2*pi*fc*t);
gemoduleerd_signaal3 = signaal3.*cos(2*pi*fc*t);
...
gemoduleerd_ontvangen_signaal = gemoduleerd_signaal1 + gemoduleerd_signaal2
+ gemoduleerd_signaal3;
...
Hier worden de signalen gesimuleerd. Eerst worden de codes gemaakt die de drie zenders
zullen versturen. Vervolgens wordt de correcte vertraging toegevoegd, waardoor het tweede
type signalen ideale voorstellingen vormen van de ontvangen codes aan de ontvanger. Het derde
type signalen zijn dan de gemoduleerde signalen. De variabele gemoduleerd ontvangen signaal
stelt dan het signaal voor dat de ontvanger ontvangt nadat de drie zenders hun code hebben
verstuurd.
%Demodulatie van het ontvangen signaal
x1 = gemoduleerd_ontvangen_signaal.*cos(2*pi*fc*t);
[b,a] = butter(5,fc*2/fs);
x1 = filtfilt(b,a,x1);
y = x1*2;
...
In dit stuk code is te zien hoe het ontvangen signaal wordt gedemoduleerd.
CODE VAN HET MATLAB-MODEL 90
ontvangen_signaal = y;
Ronts1 = xcorr(ontvangen_signaal,signaal_orig1);
Ronts2 = xcorr(ontvangen_signaal,signaal_orig2);
Ronts3 = xcorr(ontvangen_signaal,signaal_orig3);
[C1,I1] = max(Ronts1);
[C2,I2] = max(Ronts2);
[C3,I3] = max(Ronts3);
delay1 = (I1-ceil(size(Ronts1,2)/2))*Ts;
delay2 = (I2-ceil(size(Ronts2,2)/2))*Ts;
delay3 = (I3-ceil(size(Ronts3,2)/2))*Ts;
%Oplossen van het stelsel om de plaats te bepalen
r1 = v*delay1;
r2 = v*delay2;
r3 = v*delay3;
...
[oplx,oply,oplz] = solve(vgl1(1,:),vgl2(1,:),vgl3(1,:),’x’,’y’,’z’);
...
return;
Dit laatste stuk bepaalt de correlatiefuncties tussen het gedemoduleerde ontvangen signaal en
de originele codes. Uit de maximale waarden van deze functies worden dan de vertragingen
ten opzichte van de verschillende zenders bepaald. En met deze vertragingen wordt het stelsel
opgelost.
CODE VAN HET UITGEBREIDE MATLAB-MODEL 91
Bijlage B
Code van het uitgebreide
Matlab-model
%fs = Samplefrequentie
%fm = Frequentie gemoduleerd signaal
%fd = Draaggolffrequentie
%T = Tijd
function [pwmsign] = pwm(fs,fm,fd,T);
fc = 40e3;
tijdsas = 0:1/fs:T-1/fs;
signaal_code = signalen(1,fs,fm,T);
signaal = signaal_code.*cos(2*pi*fc*tijdsas);
draaggolf = signalen(4,fs,fd,T);
...
In dit stuk code werd de functie-aanroep gedefinieerd. Vervolgens wordt het code signaal ge-
maakt dat daarna gemoduleerd wordt op een cosinus. Als laatste wordt ook de draaggolf (hier
een zaagtand) gesimuleerd.
msig = moduleer(draaggolf,signaal);
...
Deze regel roept de PWM codering op waarbij het gemoduleerde signaal vergeleken wordt met
de draaggolf.
CODE VAN HET UITGEBREIDE MATLAB-MODEL 92
%Stuur het PWM signaal door een banddoorlaatfilter
%Banddoorlaatfilter = Transducer
% Centrale frequentie = 40 kHz
% BW = 1.5 kHz
Wp = [40e3-750 40e3+750]/(fs/2);
Ws = [40e3-800 40e3+800]/(fs/2);
Rp = 3; Rs = 6;
[n,Wp] = cheb1ord(Wp,Ws,Rp,Rs);
[b,a] = cheby1(n,Rp,Wp);
z = filtfilt(b,a,msig);
Dit stuk Matlab code simuleert de transducer van de zender als banddoorlaatfilter met een
centrale frequentie van 40kHz. Vervolgens wordt het signaal aan dit filter gelegd, hetgeen in het
verzonden signaal zal resulteren.
%Stuur het ontvangen signaaal door een banddoorlaatfilter
%Banddoorlaatfilter = Transducer van de ontvanger
% Centrale frequentie = 40 kHz
% BW = 2 kHz
Wp = [40e3-1e3 40e3+1e3]/(fs/2);
Ws = [40e3-1.5e3 40e3+1.5e3]/(fs/2);
Rp = 3; Rs = 6;
[n,Wp] = cheb1ord(Wp,Ws,Rp,Rs);
[b,a] = cheby1(n,Rp,Wp);
ontv = filtfilt(b,a,z);
signaal_ontvangen = ontv.*cos(2*pi*fc*tijdsas);
Wp = fc/(fs/2);
Ws = (fc+fc/4)/(fs/2);
[n,Wn] = cheb1ord(Wp,Ws,2,50);
[b,a] = cheby1(n,2,Wn);
ontvsign = 2*filtfilt(b,a,signaal_ontvangen);
In dit laatste deel wordt de transducer van de ontvanger gesimuleerd als een banddoorlaatfilter
met een centrale frequentie van 40kHz en een bandbreedte van 2kHz. Daarna wordt dit signaal
gedemoduleerd zoals in het oorspronkelijke model.
USB INTERFACE 93
Bijlage C
USB interface
FT2232.h
//**********************************************************
// FT2232.h
//
// J. Gillis
// Intec design
// september 2006
// Built with CCE for MSP430 Version: 2.00
//**********************************************************
#ifndef FT2232L_H_
#define FT2232L_H_
#define nRXF 0x01
#define nTXE 0x02
#define nRD 0x04
#define WR 0x08
extern unsigned char Received[1024];
extern unsigned char Write[1024];
extern int n_bytes;
extern int Flag_ignore;
USB INTERFACE 94
//function prototypes
int read_245(void);
int write_245(int);
void init_ftdimsp(void);
void write_buf(const char*);
int read_ans(void);
#endif /*FT2232L_H_*/
FT2232.c
//****************************************************************************
// FT2232L.c
//
// FT2232L FTDI
//
// Description; DUAL USB UART/FIFO IC
//
// MSP430F1611 <=>FT2232L | 245 FIFO interface
// -------------------------
// | P1.<0..7><=>D0...D7 |
// | P2.0 < nRXF | When high no data in FIFO
// | P2.1 < nTXE | When high do not write to FIFO
// | P2.2 >nRD | Fetches next byte from FIFO on the RD# rising edge
// | P2.3 >WR | Write data on the falling edge into FIFO
// | P2.4 <=>SI/WU | (Not used for now)
//
// J. Gillis
// Intec design
// september 2006
// Built with CCE for MSP430 Version: 2.00
//****************************************************************************
USB INTERFACE 95
#include <msp430x16x.h>
#include <string.h>
#include "ft2232l.h"
// function prototypes
int read_245(void);
int write_245(int);
void init_ftdimsp(void);
void write_buf(const char*);
int read_ans(void);
int read_245()
// Returns the characted if successful, else -1
int return_val=-1;
if (!(P2IN&nRXF)) // nRXF low ?
P1DIR=0x00; // Make sure that the MSP data pins are inputs
P2OUT&=~nRD; // strobe nRD low
_NOP();
return_val=P1IN; // grab the data off P1
return (return_val);
int write_245(int send_data)
// Returns 0 if successful, else -1
while ((P2IN&nTXE)); // TXE low ?
P2OUT|=WR; // strobe WR high
P1DIR=0xFF; // make data bus output (P1)
P1OUT=(unsigned char) send_data;
P2OUT&=~WR; // strobe WR low
_NOP();
USB INTERFACE 96
P1DIR=0x00; // make data bus input (P1)
return (0);
void write_buf(const char * text)
int i=0;
int size = strlen(text);
for (i = 0; i < size; ++i)
write_245(text[i]);
void init_ftdimsp()
int i;
P1DIR = 0x00; // FIFO Data lines (MSP INPUTS)
P5DIR |= 0x01; // Reset PIN
P2OUT = 0x04; // WR low, nRD high
P2DIR = 0x1C; // FIFO Control Signals
// P2.4 (MSP OUTPUT) SI/WUA Send/Immediate Wakeup - Not Used for now
// P2.3 (MSP OUTPUT) WR Write Data on the falling edge into FIFO
// P2.2 (MSP OUTPUT) nRD Fetches Next Byte from FIFO on the nRD rising edge
// P2.1 (MSP INPUT) nTXE When High do not write to the FIFO
// P2.0 (MSP INPUT) nRXF When High, no data in FIFO
P2IE |= 0x01; // P2.0 enable interrupt
P2IES |= 0x01; // P2.1 interrupt falling edge
P5OUT &= 0xFE;
for (i = 0; i < 1000; ++i) _NOP();
P5OUT |= 0x01;
USB INTERFACE 97
interrupts.h
#ifndef INTERRUPTS_H_
#define INTERRUPTS_H_
#pragma vector = PORT2_VECTOR
__interrupt void port2_isr(void);
#endif /*INTERRUPTS_H_*/
interrupts.c
//**********************************************************************
// interrupts.c
//
// Description;
//
// J. Gillis
// Intec design
// September 2006
// Built with CCE for MSP430 Version: 2.00
//**********************************************************************
#include <msp430x16x.h>
#include "FT2232L.h"
int n_bytes=0;
int Flag_ignore=0;
int RX_245=0;
char MST_Data = 0x00, SLV_Data = 0xFF;
__interrupt void Port_2(void);
PORT2_ISR(Port_2)
__interrupt void Port_2(void)
USB INTERFACE 98
P5OUT ^= BIT7; // Toggle P5.7 using exclusive-OR
RX_245 = read_245();
if ( Flag_ignore == 0 )
Flag_ignore = 1;
Received[0] = RX_245;
n_bytes = 1;
else if ((Flag_ignore == 1) && ((int)n_bytes < Received[0]))
Received[n_bytes]=RX_245;
n_bytes++;
else
Received[n_bytes]=RX_245;
n_bytes++;
LPM0_EXIT;
Flag_ignore = 0;
P2IFG &= ~0x01; // Clear interrupt
P2OUT|=nRD; // strobe nRD high
OORSPRONKELIJKE MSP CODE VOOR DE ZENDERS 99
Bijlage D
Oorspronkelijke MSP code voor de
zenders
Bij het opstarten van de zender worden de codes in het geheugen geladen en wordt de klok
waarmee de zender gegevens zal verzenden gedefinieerd. Vervolgens wordt er gewacht tot de PC
een commando verzendt. Wanneer dit gebeurt, wordt er een interrupt gegenereerd waardoor
de code, die in een vorige paragraaf kort werd besproken en die ook in bijlage C gegeven is,
wordt uitgevoerd. Hierdoor krijgt de variabele “Received” een zekere waarde. Na het ontvangen
van een zend-commando start de zender zijn timer. De timer werkt aan een frequentie van
6MHz en wordt afgeleid uit een kwartskristal. Bij iedere klokcyclus verhoogt de timer zijn teller
met 1. Wanneer de timer de waarde CCR0 bereikt, genereert deze een interrupt waardoor het
programma naar zijn interrupt routine springt en wordt de teller opnieuw op 0 geplaatst.
Hieronder worden de belangrijkste stukken code van de MSP weergegeven.
OORSPRONKELIJKE MSP CODE VOOR DE ZENDERS 100
main.c
#include <msp430x16x.h>
#include "ft2232l.h"
#include "codes.h"
unsigned char code1[503];
unsigned char code2[503];
unsigned char code3[503];
...
void main(void)
...
//Laden van de codes in het geheugen
init_codes();
TACTL = TACLR; //Resetten van de klok
CCTL0 = CCIE; //Interrupt van de klok aanleggen
CCR0 = 0; //De klok moet nog afliggen
//Volgende regel definieerd de klok:
TACTL = TASSEL_2 + MC_1 + ID_0;
//TASSEL_2: TimerA werkt aan de SMCLK frequentie
//MC_1: UP mode = Tellen tot CCR0 en dan een interrupt genereren
//ID_0: SMCLK frequentie wordt gedeeld door 1
...
while(1)
_BIS_SR(LPM0_bits + GIE); //Hier wordt er gewacht op een interrupt
switch((int)Received[1])
//Er werd een commando ontvangen
case ’s’: if (bezig)
//Stoppen met zenden
cont_zenden = 0;
Received[1] = 0;
bezig = 0;
OORSPRONKELIJKE MSP CODE VOOR DE ZENDERS 101
CCR0 = 0; //De klok afleggen
break;
case ’c’: if (! bezig)
//Continu zenden
Received[1] = 0;
cont_zenden = 1;
bezig = 1;
//Het PWM signaal aan ongeveer 127kHz sampelen
//6MHz/47 = 127.659kHz
CCR0 = 47-1;
break;
case ’z’: if (! bezig)
//Eenmalig zenden
Received[1] = 0;
cont_zenden = 0;
bezig = 1;
//Het PWM signaal aan ongeveer 127kHz sampelen
//6MHz/47 = 127.659kHz
CCR0 = 47-1;
break;
default: ...
...
Dit vormt dus de basis van de MSP code. Het programma start met het laden van de codes in
het geheugen. Vervolgens wordt de timer ingesteld maar nog niet aangelegd. Hierna wacht het
programma op een commando vooraleer verder te lopen. Indien het commando “z” of “c” werd
ontvangen, zal de timer worden aangelegd en wacht de MSP opnieuw op een volgende interrupt.
OORSPRONKELIJKE MSP CODE VOOR DE ZENDERS 102
De volgende interrupt kan dan zowel afkomstig zijn van de timer als van het USB gedeelte.
Indien de timer verantwoordelijk was voor de interrupt zal er naar de interrupt routine van de
timer gesprongen worden. Deze is hieronder gegeven.
interrupts.h
#ifndef INTERRUPTS_H_
#define INTERRUPTS_H_
...
#pragma vector = TIMERA0_VECTOR
__interrupt void timerA0_isr(void);
...
#endif /*INTERRUPTS_H_*/
interrupts.c
#include <msp430x16x.h>
#include "FT2232L.h"
#include "codes.h"
...
__interrupt void timerA0_isr(void);
TIMERA0_ISR(timerA0_isr)
__interrupt void timerA0_isr(void)
if (! bezig)
return;
zend_codes();
LPM0_EXIT;
...
Wanneer de MSP in de interrupt van de timer terecht komt, controleert deze eerst of hij wel echt
aan het zenden is. Is bezig immers gelijk aan nul dan kan de interrupt gewoon worden verlaten.
In het andere geval wordt er gesprongen naar een functie zend codes() die ervoor zal zorgen dat
de juiste bits aan de correcte pinnen zullen worden aangelegd. Na het uitvoeren van deze functie
OORSPRONKELIJKE MSP CODE VOOR DE ZENDERS 103
springt het programma terug naar de code waar hij oorspronkelijk mee bezig was. De functie
zend codes(), alsook de initialisatiefunctie van de verschillende codes, wordt hieronder gegeven.
codes.h
#ifndef CODES_H_
#define CODES_H_
extern unsigned char code1[503];
extern unsigned char code2[503];
extern unsigned char code3[503];
//function prototypes
void init_codes(void);
void zend_codes(void);
void init_code1(void);
void init_code2(void);
void init_code3(void);
#endif /*CODES_H_*/
codes.c
#include <msp430x16x.h>
#include <string.h>
#include "codes.h"
...
void init_codes()
init_code1();
init_code2();
init_code3();
void zend_codes()
//Zender 1
zend_code += (code1[byteteller] << bitteller) & 0x80;
OORSPRONKELIJKE MSP CODE VOOR DE ZENDERS 104
//Zender 2
zend_code += ((code2[byteteller] << bitteller) >> 1) & 0x40;
//Zender 3
zend_code += ((code3[byteteller] << bitteller) >> 2) & 0x20;
if (byteteller == 1)
zend_code += 0x10;
P3OUT = zend_code; //De codes worden buiten gebracht aan poort 3
bitteller++;
if (bitteller > 7)
bitteller = 0;
byteteller++;
if (byteteller > 502)
byteteller = 0;
if (byteteller == 502 && bitteller == 7)
byteteller = 0;
bitteller = 0;
if (! cont_zenden)
bezig = 0;
CCR0 = 0; //De klok afleggen
void init_code1()
code1[1] = 0x2C; //00101100;
code1[2] = 0x93; //10010011;
...
code1[501] = 0x34; //00110100;
code1[502] = 0x55; //01010101;
OORSPRONKELIJKE MSP CODE VOOR DE ZENDERS 105
void init_code2()
...
code2[94] = 0x4D; //01001101;
code2[95] = 0xB2; //10110010;
...
code2[501] = 0xD9; //11011001;
code2[502] = 0x74; //01110100;
void init_code3()
code3[1] = 0xBA; //10111010;
code3[2] = 0x6D; //01101101;
...
code3[501] = 0x34; //00110100;
code3[502] = 0x55; //01010101;
Bij het initialiseren worden de codes geladen in de variabelen code1, code2 en code3. Bij het
uitvoeren van zend codes() wordt telkens de eerstvolgende bit uit de verschillende codes genomen
en samengevoegd in een variabele zend code. Deze variabele wordt uiteindelijk naar de uitgang
van poort 3 gebracht waardoor de verschillende codes elk op een verschillende pin naar buiten
gebracht worden. Zo verschijnt de bit van code 1 aan pin 3.7, deze van code 2 aan pin 3.6 en
deze van code 3 aan pin 3.5. Wanneer de volledige codes werden verzonden, zal de timer worden
uitgeschakeld indien de zender de opdracht had gekregen om de code eenmaal te versturen.
CODE VOOR DE ZENDERS 106
Bijlage E
Code voor de zenders
main.c
#include <msp430x16x.h>
#include "ft2232l.h"
#include "codes.h"
#include "dma.h"
#include "spi.h"
unsigned char codes[946];
unsigned int bezig = 0;
int laatste = 0;
void main(void)
volatile unsigned int i;
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
...
init_ftdimsp(); //USB functies laden
init_codes(); //Codes laden
//P5.1 is de uitgang van de zender
P5SEL |= 0x0E; // P5.1,2,3 SPI option select
...
CODE VOOR DE ZENDERS 107
while(1)
_BIS_SR(GIE); //Intterupt aanleggen
switch((int)Received[1])
...
case ’z’: if (! bezig)
Received[1] = 0;
bezig = 0xFF;
init_DMA();
init_spi();
break;
default: ...
if (laatste == 0xFF)
ME2 &= ~USPIE1; //Disable Transmitter
laatste = 0;
DMA0CTL &= ~DMAEN;
bezig = 0;
codes.h
#ifndef CODES_H_
#define CODES_H_
extern unsigned char codes[946];
// function prototypes
void init_codes(void);
#endif /*CODES_H_*/
CODE VOOR DE ZENDERS 108
codes.c
#include <msp430x16x.h>
#include "codes.h"
void init_codes()
codes[0] = 0x38; //00111000;
codes[1] = 0x61; //01100001;
...
codes[944] = 0xF1; //11110001;
codes[945] = 0x00; //00000000;
interrupts.h
#ifndef INTERRUPTS_H_
#define INTERRUPTS_H_
#pragma vector = PORT1_VECTOR /* lowest priority */
__interrupt void port1_isr(void);
#pragma vector = PORT2_VECTOR
__interrupt void port2_isr(void);
#pragma vector = DACDMA_VECTOR
__interrupt void dacdma_isr(void);
...
#endif /*INTERRUPTS_H_*/
CODE VOOR DE ZENDERS 109
interrupts.c
#include <msp430x16x.h>
#include "FT2232L.h"
#include "codes.h"
...
__interrupt void Port_2(void);
PORT2_ISR(Port_2)
__interrupt void Port_2(void)
...
RX_245 = read_245();
if ( Flag_ignore == 0 )
Flag_ignore = 1;
Received[0] = RX_245;
n_bytes = 1;
else if ((Flag_ignore == 1) && ((int)n_bytes < Received[0]))
Received[n_bytes]=RX_245;
n_bytes++;
else
Received[n_bytes]=RX_245;
n_bytes++;
Flag_ignore = 0;
P2IFG &= ~0x01; // Clear interrupt
P2OUT|=nRD; // strobe nRD high
...
__interrupt void dacdma_isr(void);
DACDMA_ISR(dacdma_isr)
__interrupt void dacdma_isr(void)
laatste = 0xFF;
CODE VOOR DE ZENDERS 110
DMA0CTL &= ~DMAIFG;
...
dma.h
#ifndef DMA_H_
#define DMA_H_
void init_DMA(void);
#endif /*DMA_H_*/
dma.c
#include <msp430x16x.h>
#include "dma.h"
#include "codes.h"
void init_DMA()
//DMA0TSEL_10: DMA0 wordt getriggerd op UTXIFG1
//DMA0 zal gegevens naar de uit-buffer sturen
DMA0CTL &= ~DMAEN;
DMACTL0 = DMA0TSEL_10;
// TX Init
DMA0SA = (unsigned int)codes; // Src address
DMA0DA = (int)&U1TXBUF; // Dst address = de uitgangsbuffer
DMA0SZ = 946; // Size in bytes
DMA0CTL = DMADT_4 + DMASBDB + DMASRCINCR_3 + DMAEN + DMAIE;
spi.h
#ifndef SPI_H_
#define SPI_H_
void init_spi(void);
#endif /*SPI_H_*/
CODE VOOR DE ZENDERS 111
spi.c
#include <msp430x16x.h>
#include "spi.h"
void init_spi()
U1CTL = CHAR + SYNC + MM + SWRST; // 8-bit, SPI, Master
U1TCTL = CKPL + SSEL1 + STC; // Polarity, SMCLK, 3-wire
U1BR0 = 20;
U1BR1 = 0x00;
U1MCTL = 0x00;
ME2 |= USPIE1; // Module enable
U1CTL &= ~SWRST; // SPI enable
CODE VOOR DE ONTVANGER 112
Bijlage F
Code voor de ontvanger
main.c
#include <msp430x16x.h>
...
unsigned int results[2000];
...
void main(void)
WDTCTL = WDTPW + WDTHOLD;
...
init_ftdimsp(); // initialize ftdi
init_ADC();
...
for (i = 0; i < 2000; ++i)
results[i] = 0;
P6SEL |= 0x01; // Enable A/D channel A0
...
while(1)
_BIS_SR(GIE);
switch((int)Received[1])
CODE VOOR DE ONTVANGER 113
...
case ’d’: if (! bezig)
...
stuur_naar_PC();
...
break;
case ’z’: if (! bezig)
...
ADC12CTL0 |= ENC;
init_Timer();
init_DMA();
TACTL = TASSEL_2 + MC_1 + ID_0 + TACLR;
break;
default: ...
codes.h
#ifndef CODES_H_
#define CODES_H_
void stuur_naar_PC(void);
void init_ADC(void);
void init_Timer(void);
void init_DMA(void);
#endif /*CODES_H_*/
CODE VOOR DE ONTVANGER 114
codes.c
#include <msp430x16x.h>
#include <string.h>
#include "codes.h"
extern unsigned int results[2000];
extern int nummer;
void stuur_naar_PC()
int i=0;
for (i = nummer*100; i < (nummer+1)*100; ++i)
write_245(results[i] >> 4); //De eerste 8 bits
write_245(results[i] << 4); //De laatste 4 bits + 0000
_NOP();
void init_ADC()
ADC12CTL1 = SHS_1 + SHP + CONSEQ_2; // TA trig., rpt conv.
ADC12MCTL0 = SREF_1 + INCH_0; // Channel A0 = INCH_0
ADC12CTL0 = SHT0_1 + REF2_5V + REFON + ADC12ON; // Config ADC12
void init_Timer()
TACCR0 = 150 - 1;
TACCR1 = 100 - 1;
TACCTL1 = OUTMOD_3;
void init_DMA()
DMA0SA = (int)&ADC12MEM0; // Src address = ADC12 module
DMA0DA = (int)&results; // Dst address = RAM memory
DMA0SZ = 2000; // Size in words
DMACTL0 = DMA0TSEL_6; // ADC12IFGx triggers DMA0
DMA0CTL = DMADSTINCR_3 + DMASWDW + DMAIE + DMAEN; // Config
CODE VOOR DE ONTVANGER 115
interrupts.h
#ifndef INTERRUPTS_H_
#define INTERRUPTS_H_
...
#pragma vector = DACDMA_VECTOR
__interrupt void dacdma_isr(void);
...
#endif /*INTERRUPTS_H_*/
interrupts.c
...
__interrupt void dacdma_isr(void);
DACDMA_ISR(dacdma_isr)
__interrupt void dacdma_isr(void)
DMA0CTL &= ~DMAIFG;
DMA0CTL &= ~DMAEN;
TACCR0 = 0;
TACCR1 = 0;
TACTL = 0;
ADC12CTL1 &= ~CONSEQ_2; // Stop conversion immediately
ADC12CTL0 &= ~ENC; // Disable ADC12 conversion
ADC12CTL0 = 0; // Switch off ADC12 & ref voltage
init_ADC();
...
...
BESPREKING VAN DE VISUAL BASIC CODE 116
Bijlage G
Bespreking van de Visual Basic code
Zoek de USB apparaten
Wanneer op de knop “Zoek de USB apparaten” wordt geklikt, voert het programma onderstaande
code uit. Hier zullen alle FT2232 apparaten gedetecteerd worden, tesamen met een paar van
hun karakteristieken zoals hun serie nummer.
Private Sub cmdChkDevices_Click()
...
LoggerList.Clear
flFailed = True
If FT_GetNumDevices(lngNumDevices, vbNullString,_
FT_LIST_BY_NUMBER_ONLY) <> FT_OK Then
LoggerList.AddItem ("FT_GetNumDevices failed")
Exit Sub
Else
LoggerList.AddItem ("Number of Devices: " & lngNumDevices)
End If
For i = 0 To lngNumDevices - 1
If FT_ListDevices(i, strDescription, _
FT_LIST_BY_INDEX Or FT_OPEN_BY_DESCRIPTION) <> FT_OK Then
LoggerList.AddItem ("ListDevices failed")
Exit Sub
Else
BESPREKING VAN DE VISUAL BASIC CODE 117
LoggerList.AddItem ("Device Description:")
LoggerList.AddItem strDescription
End If
If FT_ListDevices(i, strSerialNumber,_
FT_LIST_BY_INDEX Or FT_OPEN_BY_SERIAL_NUMBER) <> FT_OK Then
LoggerList.AddItem ("ListDevices failed")
Exit Sub
Else
LoggerList.AddItem ("Serial Number:")
LoggerList.AddItem strSerialNumber
End If
Next i
End Sub
Open Ontvanger / Synchronisator
Hier wordt getoond hoe de verbinding met de ontvanger of de synchronisator wordt gemaakt.
Daarnaast worden er een aantal eigenschappen ingesteld zoals de tijd tot een time-out en de
baudrate.
Private Sub cmdOpxxx_Click()
’ Open the device
If FT_OpenEx(LoggerList.Text, FT_OPEN_BY_SERIAL_NUMBER,_
lngHandle_xxx) <> FT_OK Then
lstLogs.AddItem "Open Failed"
Exit Sub
Else
lstLogs.AddItem "Open device OK"
End If
’ Set baud rate to 115200
ftStatus = FT_SetBaudRate(lngHandle_xxx, 115200)
If ftStatus <> FT_OK Then
lstLogs.AddItem "SetBaudRate Failed"
GoTo CloseHandle
BESPREKING VAN DE VISUAL BASIC CODE 118
End If
’ 8 data bits, 1 stop bit, no parity
If FT_SetDataCharacteristics(lngHandle_xxx, FT_BITS_8,_
FT_STOP_BITS_1, FT_PARITY_NONE) <> FT_OK Then
lstLogs.AddItem "SetDataCharacteristics Failed"
GoTo CloseHandle
End If
’ no flow control
If FT_SetFlowControl(lngHandle_xxx, FT_FLOW_NONE, 0, 0) <> FT_OK Then
lstLogs.AddItem "SetFlowControl Failed"
GoTo CloseHandle
End If
’ 15 second read timeout
If FT_SetTimeouts(lngHandle_xxx, 15000, 0) <> FT_OK Then
lstLogs.AddItem "SetFlowControl Failed"
GoTo CloseHandle
End If
If FT_SetChars(lngHandle_xxx, 126, 1, 0, 0) <> FT_OK Then
lstLogs.AddItem "SetFlowControl Failed"
GoTo CloseHandle
End If
...
klok_xxx.Enabled = True
...
Exit Sub
CloseHandle:
’ close the device
If FT_Close(lngHandle_xxx) <> FT_OK Then
BESPREKING VAN DE VISUAL BASIC CODE 119
lstLogs.AddItem "Close Failed in Open"
End If
If flFailed = True Then
lstLogs.AddItem "Open Failed"
End If
klok_xxx.Enabled = False
End Sub
BESPREKING VAN DE VISUAL BASIC CODE 120
Verzenden
De code die hieronder is weergegeven, illustreert wat er gebeurt wanneer de gebruiker op “Ver-
zenden + Ontvangen” klikt en hoe er wordt weggeschreven naar de USB uitgang.
Private Sub cmdVerzend_Click()
schrijven_zender "z"
schrijven_ontvanger "z"
End Sub
Public Function schrijven_xxx(commando As String)
Dim lengte As Integer
lengte = Len(commando)
strWriteBuffer_xxx = Chr(lengte) & commando
lngBytesWritten = 0
If FT_Write(lngHandle_xxx, strWriteBuffer_xxx,_
lengte + 1, lngBytesWritten) <> FT_OK Then
lstLogs.AddItem "Write xxx Failed"
GoTo CloseHandle
Else
lstLogs.AddItem "Write xxx OK"
End If
Exit Function
CloseHandle:
’close the device
If FT_Close(lngHandle_xxx) <> FT_OK Then
lstLogs.AddItem "Close Failed in Schrijven"
End If
klok_xxx.Enabled = False
End Function
BESPREKING VAN DE VISUAL BASIC CODE 121
Ontvangen
Dit stuk code wordt uitgevoerd zolang de betreffende klok aanligt. Na iedere klokcyclus wordt
gecontroleerd of er gegevens klaar staan om te worden ontvangen. Wanneer dit het geval is
begint de ontvanger of de zender met het ontvangen van de gegevens.
Private Sub klok_xxx_Timer()
klok_xxx.Enabled = False
flTimedout_xxx = False
flFatalError_xxx = False
lngRxBytes_xxx = 0
If FT_GetQueueStatus(lngHandle_xxx, lngRxBytes_xxx) <> FT_OK Then
GoTo CloseHandle
End If
If lngRxBytes_xxx = 0 Then
’Niets te lezen
klok_xxx.Enabled = True
tmrControle_xxx.Enabled = True
Exit Sub
Else
...
End If
...
lngTotalBytesRead_xxx = 0
strReadBuffer_xxx = ""
strLoggerBuffer_xxx = ""
strLoggerBufferBits_xxx = ""
Dim result_xxx As String
Do
lngBytesRead_xxx = 0
ftStatus_xxx = FT_Read(lngHandle_xxx, strReadBuffer_xxx,_
lngRxBytes_xxx, lngBytesRead_xxx)
If (ftStatus_xxx = FT_OK) Or (ftStatus_xxx = FT_IO_ERROR) Then
BESPREKING VAN DE VISUAL BASIC CODE 122
If lngBytesRead_xxx > 0 Then
strLoggerBuffer_xxx = strLoggerBuffer_xxx + _
Left(strReadBuffer_xxx, lngBytesRead_xxx)
For i = 1 To Len(Left(strReadBuffer_xxx, lngBytesRead_xxx))
result_xxx = result_xxx + char2bin(Mid(Left(_
strReadBuffer_xxx,lngBytesRead_xxx),i,1))
Next i
strLoggerBufferBits_xxx = strLoggerBufferBits_xxx & result_xxx
lngTotalBytesRead_xxx = lngTotalBytesRead_xxx + lngBytesRead_xxx
...
Else
flTimedout_xxx = True
End If
Else
flFatalError_xxx = True
End If
Loop Until (lngTotalBytesRead_xxx = lngRxBytes_xxx) _
Or (flTimedout_xxx = True) Or (flFatalError_xxx = True)
If (flTimedout_xxx = False) And (flFatalError_xxx = False) Then
flFailed_xxx = False
ElseIf flTimedout_xxx = True Then
lstLogs.AddItem "FT_Read timeout ftStatus=" & ftStatus_xxx
Else
lstLogs.AddItem "FT_Read error ftStatus=" & ftStatus_xxx
End If
klok_xxx.Enabled = True
...
Exit Sub
CloseHandle:
’ close the device
BESPREKING VAN DE VISUAL BASIC CODE 123
If FT_Close(lngHandle_xxx) <> FT_OK Then
lstLogs.AddItem "Close Failed (klok_xxx)"
End If
If flFailed_xxx = True Then
lstLogs.AddItem "Read Failed (klok_xxx)"
End If
End Sub
Sluit Ontvanger / Synchronisator
Dit stuk code toont hoe de verbinding met de ontvanger of de synchronisator verbroken wordt.
Private Sub cmdClxxx_Click()
...
klok_xxx.Enabled = False
If FT_Close(lngHandle_xxx) <> FT_OK Then
lstLogs.AddItem "Close xxx Failed"
Else
lstLogs.AddItem "Close xxx OK"
End If
End Sub
BIBLIOGRAFIE 124
Bibliografie
[1] iRobot Create Programmable Robot http://www.irobot.com
[2] iRobot Create http://www.irobot.com/sp.cfm?pageid=305
[3] U.S. Government website “Global Positioning System” http://www.gps.gov
[4] Attenuation of sound waves in air http://www.sengpielaudio.com/calculator-air.htm
[5] F. Bossuyt en S. Vancoillie (2006). “Digitale generatie en verwerking van ultrasoonsignalen
voor vroegtijdtijdige ambulante detectie van borstkanker.”
Afstudeerwerk, Faculteit toegepaste wetenschappen INTEC.
[6] P. Poelaert (2006). “Codering en analoge verwerking van ultrasoonsignalen voor vroegtijdige
ambulante detectie van borstkanker.” Afstudeerwerk, Faculteit toegepaste wetenschappen
INTEC.
[7] MSP430F1610 - Datasheet
http://focus.ti.com/docs/prod/folders/print/msp430f1610.html
[8] FT2232D - Dual USB UART/FIFO IC
http://www.ftdichip.com/Products/FT2232C.htm
[9] JTAG Protocol http://www.jtag.com
[10] FTDI Knowledgebase http://www.ftdichip.com/Support/Knowledgebase/
[11] Fairchild Semiconductor “CD4049UBCM - Hex Inverting Buffer.”
http://www.farnell.com/datasheets/67078.pdf
[12] Analog Devices “ADP3335ARMZ-5-R7 - Voltage Regulator.”
http://www.analog.com/UploadedFiles/Data Sheets/ADP3335.pdf
BIBLIOGRAFIE 125
[13] What the Nyquist Criterion Means to Your Sampled Data System Design
http://www.analog.com/en/content/0,2886,760%255F%255F91249,00.html
[14] Texas Instruments “TLV2771ID - High Speed OpAmp.”
http://www.ti.com/lit/gpn/tlv2771