Afstudeeropdracht
Saxion Hogeschool Enschede
Meting van de kindruk tijdens vioolspel
Marc Nijdam Begeleider: ir. ing. E. Bouwmeester
Studierichting elektrotechniek December 2004
Lucas v. Leyden, 1524, gravure, (detail van) “Musicerend paar”
Inhoudsopgave Pagina Hoofdstuk 1
Hoofdstuk 2
Inleiding 1.1 Meting van de kindruk tijdens vioolspel............................... 1.2 Voorwaarden bij het meten.................................................... 1.2.1 Synchronisatie met metronoom........................................ 1.2.2 Muziek/midi omgeving..................................................... 1.2.3 Sequencer.......................................................................... 1.3 Ontwerp................................................................................. 1.4 Systeem..................................................................................
6 6 6 7 7 8 8
2.1 Drukmeting - krachtmeting................................................... 9 2.1.1 Soorten meetsensoren....................................................... 9 2.1.2 PZT-sensor als krachtsensor............................................. 11 2.2 Oscillatoren........................................................................... 11 2.2.1 Harmonische oscillator..................................................... 12 2.2.1.1 Complexe Impedantie van de Sensor.......................... 12 2.2.1.2 Pierce Oscillator.......................................................... 15 2.2.1.3 Overdracht................................................................... 17 2.2.1.4 Berekening van R1, C1 en C2..................................... 19 2.2.1.5 Wijzigingen Pierce en Simulatie................................. 22 2.2.1.6 Metingen bij de resonantiefrequentie.......................... 24 2.2.1.7 Serieresonantie............................................................ 24 2.3 Relaxatie-oscillator................................................................ 25 2.3.1 Capaciteitsverandering ten gevolge van druk.................. 26 2.3.2 Meetcircuit....................................................................... 28
Hoofdstuk 3
Data-acquisitie en –verwerking.......................................................... 3.1 Microcontroller..................................................................... 3.1.1 Gestuurde oscillatie......................................................... 3.1.2.1 Omzetting naar midi................................................... 3.1.2.2 Linearisatie................................................................. 3.1.3 Calibratie......................................................................... 3.1.4 Complete schakeling....................................................... 3.2 PC-Software.........................................................................
Hoofdstuk 4
Mechanische constructie en realisatie................................................ 43 4.1 Specificaties van het systeem............................................... 45 4.1.1 Meetbereik....................................................................... 45 4.1.2 Gevoeligheid.................................................................... 45 4.1.3 Meetfrequentie................................................................. 45 4.1.4 Omgevingsinvloeden....................................................... 45 4.1.5 Massa van het meetapparaat............................................. 45
29 29 30 32 35 37 39 40
Hoofdstuk 5
Meetresultaten..................................................................................... 46 5.1 Inzichten uit de meetresultaten............................................. 48
Hoofdstuk 6
Conclusies en aanbevelingen.............................................................. 49 6.1 Conclusies............................................................................. 49 6.2 Aanbevelingen...................................................................... 49
Appendix
Sourcecode van het stuurprogramma voor de AT89C2051................ Sourcecode van het midifile-conversieprogramma............................ MIDI File standaard........................................................................... Lijst van literatuur en andere bronnen................................................
51 64 75 86
1 Inleiding Door de eeuwen heen heeft zowel de klassieke muziek als het vioolspel een bijzonder grote ontwikkeling doorgemaakt. Vanwege de ontwikkeling in de muziek werden de technische vaardigheden die van de violisten werden gevraagd ook steeds groter. Een belangrijke basis die deze ontwikkeling mogelijk maakte, is de manier waarop het instrument werd vastgehouden. Immers deze bepaalt de stabiliteit van het instrument tijdens het spel, waardoor de musicus niet geremd hoeft te worden in het weergeven van zijn interpretatie. Tegenwoordig tekent zich echter ook een schaduwzijde af aan deze ontwikkeling. Bij sommige violisten ontstaan lichamelijke klachten, vanwege overbelasting van gewrichten en spieren. Om meer inzicht in de oorzaken hiervan te krijgen, hebben we getracht een meetapparaat te ontwikkelen, dat tot doel had bepaalde bewegingen te kunnen meten tijdens het spel. De bewegingen die we onderzoeken, hebben te maken met het moment waarop de viool werd vastgehouden met de kin of de kaak en met welke kracht dat gebeurde. Drie belangrijke aspecten worden daarbij behandeld: • Het type sensor en het bijbehorende algorithme om de kracht te meten. • De software die de data verwerkt. • De mechanische constructie waarin deze sensor voorkomt. Hoewel de meetresultaten die uit dit onderzoek voortkomen niet direct van betekenis zijn voor de technische kant van dit verslag, geven ze wel inzicht in de werking van het apparaat en de eigenschappen waaraan het moet voldoen. Daarom is hieraan hoofdstuk 5 gewijd. Tenslotte worden er conclusies getrokken en aanbevelingen gedaan die uit de ontwikkeling van het apparaat zijn voortgekomen.
5
1.1 Meting van de kindruk tijdens het vioolspel Op de moderne viool zit een kinhouder (afb. 1.1) gemonteerd. Deze kinhouder is een opstaand deel waar een rand op zit. De kaak of kin van de violist valt over deze rand, waardoor de violist het instrument daarmee kan vastklemmen en kan voorkomen dat het weggetrokken wordt door de linkerhand tijdens het spel. Aan de onderkant van het instrument zorgt op zijn beurt het sleutelbeen voor steun.
Afb. 1.1. Kinhouder (van www.viva-sas.com)
Afb. 1.2. Kracht op de viool (uit “6 Lessons w. Menuhin”)
Tijdens het spelen op een viool hoeft deze kindruk niet altijd aanwezig te zijn, omdat de linkerhand het instrument ook kan dragen. Bij sommige bewegingen echter kan de linkerhand niet tegelijkertijd zowel het instrument dragen als een nieuwe stand opzoeken. Op deze momenten is het van groot belang dat het instrument wordt vastgeklemd tussen de kaak en het sleutelbeen (afb. 1.2). Deze spanning kan worden losgelaten zodra de linkerhand de dragende functie van het instrument weer kan overnemen. We zijn erin geïnteresseerd op welke momenten deze overgang plaatsvindt. En hoe groot deze kracht is. Voor het meten van deze kracht volstaat het de kinhouder zo te veranderen, dat er tussen de kinhouder en de viool een krachtsensor gemonteerd kan worden, waarmee de neerwaartse kracht op de kinhouder op een krachtsensor kan worden overgebracht.
1.2 Voorwaarden bij het meten Er bestaan talloze soorten kinhouders. Ze onderscheiden zich in vorm en in hoogte. Elke speler heeft een voorkeur voor een bepaalde vorm. Deze hangt samen met de lichaamsbouw. Deze bouw heeft tevens invloed op de hoogte von de kinhouder. Als deze immers te laag is, moet het hoofd een ongezonde houding aannemen om het instrument te kunnen vasthouden. Aangezien we verschillende proefpersonen wilden laten spelen, was het nodig de speciale kinhouder zo te construeren dat hij in hoogte verstelbaar was, om niet meetwaarden te krijgen die door een krampachtige houding veroorzaakt werden. Daarbij is wat de vorm aangaat een compromis genomen. We vonden het kunnen aanpassen van de hoogte belangrijker dan de vorm.
1.2.1 Synchronisatie met metronoom
Als iemand zonder overbodige spanningen speelt, zijn de momenten waarop verandering van kracht wordt uitgeoefend op de kinhouder, meestal gerelateerd aan bepaalde technische moeilijke passage’s in de muziek. Om te kunnen analyseren op welke plaatsen deze geweest zijn, moeten we de geregistreer6
de data vergelijken met de overeenkomstige plaats in de muziek. Als we de gegevens van meerdere personen ook onderling willen vergelijken is het handig wanneer iedereen in hetzelfde tempo speelt. Dit leidt ertoe dat een computer het tempo dicteert waarin gespeeld wordt.
1.2.2 Muziek/midi omgeving
De meetdata worden uiteindelijk weergegeven onder de gespeelde notenbalk. (figuur 1.3). Achteraf kunnen we dan een analyse maken op welke momenten in de muziek er spieren werden aangespannen.
Figuur 1.3. representatie van meetwaarden
De bovenstaande grafiek hebben we in een aantal stappen verkregen: • In het meetapparaat met de krachtsensor zit een een microcontroller, die de meting uitvoert en de data produceert. • Voor de transmissie van de data van het meetapparaat naar de computer gebruik we een bestaand formaat dat geschikt is voor dit doel: de MIDI-standaard in combinatie met de MIDI File standaard, die tijdcode-informatie toevoegt. Deze standaard voorziet in een seriële datatransmissie, waarvan de baudrate en de datastructuur vastligt. • Op de pc kunnen we met de juiste software deze data opnemen. De software voorziet de data, op het moment dat deze de PC binnenkomen, van een tijdstempel, tijdcode genaamd. • De opgenomen data worden geconverteerd, zodat een spreadsheet deze kan importeren. • Een spreadsheet geeft de data als grafieken weer en toont het notenschrift daarboven.
1.2.3 Sequencer
De software die de MIDI-data opneemt, heet ook wel een sequencer. Zulke programma’s zijn erg handig om meetdata te verzamelen. Voor verdere verwerking is deze software minder geschikt, omdat een sequencer niet de mogelijkheid heeft om data van bijvoorbeeld verschillende spelers eenvoudig onderling te kunnen vergelijken en andersom een spreadsheet niet met data van een sequencer kan omgaan. We kunnen bij de meeste programma’s wel alle data van een sequencer exporteren naar een MIDI-File formaat, welke ook gedocumenteerd (Zie hiervoor de appendix) en gestandaardiseerd1 is. Dit geeft ons de mogelijkheid met een ander programma de data te kunnen analyseren. Speciaal hiervoor hebben we een programma geschreven dat MIDI-files omzet naar een tekstbestand, dat we vervolgens in een spreadsheet kunnen importeren.
7
1.3 Ontwerp Uit de hiervoor genoemde voorwaarden hebben we onze aandacht op een zestal punten gericht: • Een geschikte sensor vinden. • Een speciale kinhouder fabriceren waarin die sensor geplaatst kan worden, zodanig dat we de drukkracht op de houder kunnen meten. • De hardware rondom de microcontroller en de sensor realiseren. • Software voor het debuggen tijdens de testfase. • Software voor de microcontroller waarop de sensor zit aangesloten. • Software die een MIDI-file omzet naar een tekstbestand. Voordat we de speciale kinhouder gemaakt hebben, zijn we eerst gaan kijken welke sensor we konden gaan gebruiken. De afmeting en de vorm daarvan heeft namelijk invloed op het ontwerp van de kinhouder. In hoofdstuk twee wordt er op die sensor dieper ingegaan. Tijdens de testfase hadden we de mogelijkheid de software van de microcontroller te debuggen. Hiervoor hadden we een programma, geschreven in C, dat bytes van de MIDI-interface inlas, en uitvoerde naar het scherm. In de microcontroller hadden we vervolgens een routine die de inhoud van een bepaald register via de seriële poort naar de computer, waarop dit debugprogramma draaide, kon sturen. De software voor het verwerken van de sensordata in de microcontroller hebben we in assembler geschreven en niet in C. De reden hiervoor is dat de gebruikte microcontroller een Atmel AT89C2051, deel van de familie van de MCS®51, niet uitblinkt in snelheid. Om toch nauwkeurig te kunnen meten, was het gebruik van alle timers en een aantal interruptleidingen noodzakelijk. In assembly konden we zo efficiëntere code schrijven. Bijvoorbeeld doordat we direct konden zien hoeveel clockcycli bepaalde instructies zouden duren. Het converteringsprogramma is in C++ geschreven. Met behulp van de fileselector wordt met dit windowsprogramma een MIDI File geselecteerd, waarin zich MIDI controller data bevinden. De MIDI controller data zet het programma om naar een standaard, met komma gescheiden, tekstbestand. Ook de naam van de uitvoerfile wordt met behulp van de standaard windows-fileselector aangegeven. De converteringsroutine heeft een systeem gebaseerd op het zetten van vlaggen voor alle toestanden waarin de gelezen character kan voorkomen. Deze volgt de MIDI File standaard (Ondersteund zowel type 0 als 1)
1.4 Systeem Het uiteindelijke systeem bestaat uit: • De speciale kinhouder met de microcontroller en de sensor. • Een computer, voorzien van een sequencerprogramma waarmee we MIDI-data kunnen opnemen en het converteringsprogramma om deze data importeerbaar te maken in een spreadsheetprogramma.
8
2.1 Drukmeting - krachtmeting Hoofdstuk 2 gaat nader in op de sensor waarvan gebruik wordt gemaakt om de drukkracht te meten. Ook beschrijft het op welke wijze dat is gerealiseerd. Tijdens de zoektocht naar een geschikte sensor, zijn we uiteindelijk uitgekomen op een PZT-sensor die aan een aantal gunstige voorwaarden voldoet zoals: een eenvoudige interface naar een schakeling voor verdere dataverwerking, geschikt voor het meten van een absolute kracht (een soort DC-meting), geringe massa en afmeting. Hiertegenover staan ook een aantal minder gunstige eigenschappen, zoals onder andere de temperatuurafhankelijkheid en het ontbreken van specificaties van de producent. Daarnaast is de programmatuur die de verdere dataverwerking voor zijn rekening neemt ingewikkelder, omdat er vanwege mechanische koppeling stoorsignalen van het instrument worden opgepikt, die de meetwaarden kunnen beïnvloeden. In de literatuur is er veel informatie over PZT te vinden. Dit gaat echter maar heel zelden over het gebruik van PZT als sensor voor het meten van een absolute kracht.
2.1.1 Soorten meetsensoren Op het internet vinden we onder andere op de homepage van Farnell (www.farnell.com) een overzicht van leverbare krachtsensoren, waarvan we er hier een paar opnoemen. Daarnaast volgt er een beschrijving van krachtsensoren die van flexibele folie gemaakt worden. Juist als er in het ontwerp niet veel ruimte voor een sensor beschikbaar is, zou overwogen kunnen worden deze te gebruiken. Honeywell FSL05N2C: (figuur 2.1 maten zijn in mm)
Figuur 2.1 Honeywell Forcesensor with specifications
De bijbehorende beschrijving: “The FS Series Sensors provide precise, reliable force sensing performance in a compact commercial grade package. The sensor ... utilizes a specialized piezoresistive micro-machined silicon sensing element. The low power, unamplified, noncompensated Wheatstone bridge circuit design provides inherently stable mV outputs over the force range. Force sensors operate on the principle that the resistance of silicon implanted piezoresistors will increase when the resistors flex under any applied force. The sensor concentrates force from the application, through the stainless steel plunger, directly to the silicon sensing element. The amount of resistance changes in proportion to the amount of force being applied. This change in circuit resistance results in a corresponding mV output level...”
9
Honeywell FSG15N1A: (figuur 2.2 maten zijn in mm)
Figuur 2.2 Honeywell Forcesensor
Deze krachtsensor heeft een iets andere behuizing, maar is wat betreft het grotere meetbereik (01500g) geheel vergelijkbaar met de eerder genoemde Honeywell FSL05N2C. Omdat de sensor op een plaats gemonteerd gaat worden waar maar heel weinig ruimte is, hebben we naar nog dunnere sensoren gezocht. Zo kwamen we bij de firma Tekscan. Deze maakt sensoren die uit twee flinterdunne folies bestaan, waartussen een speciale geleidende inkt zit. Bijvoorbeeld de FlexiForce A210 (figuur 2.3)
Figuur 2.3 FlexiForce krachtsensor
Deze sensor heeft een dikte van 0.127 mm. Bij toenemende kracht neemt de weerstand af van 20 MΩ naar ongeveer 20 kΩ. De beschrijving van het bedrijf: “With its paper-thin construction, flexibility and force measurement ability, the FlexiForce force sensors can measure force between almost any two surfaces and is durable enough to stand up to most environments. FlexiForce has better force sensing properties, linearity, hysteresis, drift and temperature sensitivity than any other thin-film force sensors. The new and improved FlexiForce A201 force sensor is an ultra-thin, flexible printed circuit. It is 14 mm wide and 203 mm in full length. The active force sensing area is a 9.5 mm diameter circle at the end of the force sensor. The force sensors are constructed of two layers of substrate, such as a polyester film. On each layer, a conductive material (silver) is applied, followed by a layer of pressuresensitive ink. ...The active sensing area is defined by the silver circle on top of the pressure-sensitive ink. Silver extends from the sensing area to the connectors at the other end of the sensor, forming the conductive leads. ....” Het bedrijf heeft drie soorten krachtsensoren, varierend in het maximale meetbereik: (4.4N,111N en 444N) Alle hierboven genoemde sensoren hebben als eigenschap dat de weerstand verandert als er een kracht op wordt uitgeoefend. Naast de kant-en-klare oplossingen van hierboven, bestaan er ook andere methoden om kracht te meten. Meestal gaat dat via een mechanische omzetting van kracht naar verplaatsing. Dit gebeurt bijvoorbeeld bij sommige elektronische weegschalen waarin twee of meer platen zitten die als condensator fungeren. Via de capaciteit van deze condensator, een maat voor de afstand tussen de platen, kan de kracht gemeten worden, terwijl een veer de platen van elkaar houdt. 10
Een andere manier om kracht te meten is door de spanning te meten die een PZT-sensor (figuur 2.4) opwekt als de aangelegde kracht erop verandert2. Deze spanning ontstaat door ionen die een andere plaats innemen in het kristal ten gevolge van een kracht.
�������������������� ���������������� Figuur 2.4 PZT-sensor
Willen we de spanning meten die een PZT-sensor opwekt, dan moet het meetcircuit een erg hoge ingangsimpedantie hebben. We kunnen op deze manier echter niet een onveranderende kracht (statisch) meten, omdat er altijd heel kleine lekstromen zijn. Ook als op deze statische kracht een wisselende kracht gesuperponeerd wordt (dynamisch), is deze meetmethode ongeschikt, omdat over een langere tijd de statische kracht vanwege lekstromen uit het meetsignaal verdwijnt. We moeten dus een andere methode vinden als we met een PZT-sensor statische kracht willen meten.
2.1.2 PZT-sensor als krachtsensor Voor het bepalen van krachtverloop op een PZT-sensor meten we daarom niet de opgewekte spanning, maar de resonantiefrequentie. Deze neemt af bij belasting3. Het ligt dus voor de hand een oscillatorschakeling te nemen waarin de PZT-sensor als frequentiebepalend element wordt opgenomen.
2.2 Oscillatoren Er zijn twee belangrijke klassen van oscillatoren: harmonische oscillatoren (figuur 2.5) en relaxatieoscillatoren (figuur 2.6). Harmonische oscillatoren met een kristal hebben als eigenschap dat er een interne en periodieke uitwisseling van energie plaatsvindt, zoals bijvoorbeeld bij een spoel in serie met een condensator mogelijk is. Bij relaxatie-oscillatoren wordt er steeds omgeschakeld tussen twee a-stabiele toestanden, waarin het tijdbepalende element gevormd wordt door bijvoorbeeld een RC-tijd.
+ +
Figuur 2.5 Principeschema harmonische osicllator (Pierce)
Figuur 2.6 Principeschema relaxatie-oscillator
11
2.2.1 Harmonische oscillator Omdat we de PZT-sensor bij de resonantiefrequentie willen laten oscilleren, moeten we dus een configuratie met een harmonische oscillator bekijken. Belangrijke voorwaarden voor harmonische oscillatie zijn de zogenaamde Barkhausen criteria: In een teruggekoppelde lus waarin een frequentieselecterend en een versterkend element zit, moet de totale fasedraaiing gelijk zijn aan 0 + 2�k (k=0,1....). Verder moet de modulus van de totale versterking gelijk aan 1 zijn voor stabiele oscillatie. In de praktijk zal een frequentieselecterend element meestal als eigenschap hebben dat er wat energie verloren gaat. Om dit tegen te gaan, en de oscillatie in stand te houden, moet de versterker dus wat energie toevoeren. Het verlies van het element wordt uitgedrukt in de kwaliteitsfactor Q en is omgekeerd evenredig met de kwaliteit: een element met een hoge Q zal weinig energie verliezen.
2.2.1.1 Complexe Impedantie van de Sensor Het gedrag van de sensor kunnen we afleiden met behulp van de (complexe) impedantie mits in het gekozen frequentiedomein het netwerk zich lineair gedraagt. Dat betekent dat rond de oscillatiefrequentie de versterking niet of weinig varieert. Aan de hand daarvan kunnen we de oscillator instellen om aan de criteria voor oscillatie te voldoen. Om de impedantie te berekenen moeten we de elektrische grootheden vinden van het vervangingsschema van de sensor. De resonantie wordt bepaald door de mechanische en elctrische eigenschappen van de sensor. We kunnen de mechanische grootheden omzetten naar hun equivalente elektrische grootheden4: Trillende massa naar zelfinductie (L1), elasticiteit van het kristal naar capaciteit (C1), en wrijvingsverliezen naar weerstand (R1). Parallel aan deze drie grootheden bevindt zich nog een condensator, die de parasitaire capaciteit vormt van de aansluitingen en het oppervlak van de elektroden.
RS 2.16kΩ
LS 1.586H
CS 411.7pF
PZT Sensor C0 5.4nF Figuur 2.7 Vervangingsschema PZT-sensor
In het bovenstaande vervangingsschema, figuur 2.7, zien we voor de grondtoon een LCR-keten met parallel daaraan capaciteit C0. Het gedrag veroorzaakt door boventonen op de grondtoon, zouden we in het vervangingsschema kunnen opnemen door parallel aan de LCR-keten, andere LCR-ketens aan te sluiten. Omdat we ons toch alleen maar willen beperken tot frequenties in de buurt van de grondtoon, is het niet nodig het vervangingsschema uit te breiden. De sensor is met een HP network analyzer (HP 8510C) doorgemeten. Na opgave van de configuratie waarin deze onderdelen in het vervangingsschema staan, heeft deze de waarden van Ls, Cs, Rs en C0 berekend: RS=2.16kΩ
LS=1.586H
CS=411.7pF
C0=5.4nF 12
Het apparaat meet de serie- en parallelresonantiefrequentie, waaruit het de waarden in het vervangingsschema kan berekenen. Aanvankelijk lieten we de HP network analyzer over een heel groot frequentiegebied, tot 1 MHz doormeten, om vervolgens het frequentiegebied te kunnen afbakenen, waarbinnen in ieder geval de serie- en parallelresonantiefrequentie van de grondtoon lagen. Na een aantal pogingen lag het meetbereik uiteindelijk tussen 4.8 en 6.8 kHz. Buiten deze frequenties kon er geen vervangingsschema bepaald worden. De totale impedantie ZX volgt uit de impedanties van de samenstellende componenten. Naast RS zijn dat: , met ω de frequentie in rad/s
ZLs(~) = j $ ~ $ LS ZCs(~) =
1 j $ ~ $ CS
ZC0(~) =
1 j $ ~ $ C0
(2.1) (2.2)(2.3)
Uit de voorgaande waarden berekenen we de vervangingsimpedantie ZX van de PZT-sensor, bij een ω in de buurt van een resonantiefrequentie ωr (binnen het afgebakende meetbereik): ~r =
1 LS $ CS
ZX (~) =
~r . 3.9 $ 104 rad s
(2.4)
1
(2.5)
1 1 + ZC0 (~) RS+ ZLS(~) + ZCS(~)
Als we ZX in een grafiek uitzetten tegen ω moeten we, omdat het om een complexe grootheid gaat, twee functies tekenen. Een voor |ZX| en een voor het argument van ZX. We tekenen de grafiek in de buurt van ωr zodat we een duidelijk beeld krijgen hoe de impedantie verandert. absZX(ω)=|ZX(ω)|
argZX(ω)=arg(ZX(ω))
(2.6)(2.7)
13
Impedantiecurve Zx
24
20
22
10
20
0
18
10
16
20
14
30 40 argZ x
absZ x 12 (in kΩ)
10
50
8
60
6
70
4
80
2
90
0
2 10
0
4
4
4
4 10
6 10 x
4
8 10 (in rad/s)
1 10
5
(in ˚)
100
5
1.2 10
Figuur 2.8. Verandering impedantie
Uit grafiek 2.8 blijkt dat |ZX| naar oneindig gaat als het 0 rad/s nadert. Hij wordt pas zichtbaar na 1·104 rad/s. Hier bedraagt zijn waarde 20 kΩ. Het argument loopt van -90° tot 4.1°. Ook kunnen we aflezen dat de impedantie van de sensor twee extremen heeft rond de 4·104 rad/s. Een lokaal minimum en een lokaal maximum. We bekijken deze punten wat nauwkeuriger vanaf 3.8·104 rad/s tot 4.2·104 rad/s, (Figuur 2.9) Impedantiecurve Zx
12
absZ x
(in kΩ)
20
11
10
10
0
9
-10
8
-20
7
-30
6
-40
5
-50
4
-60
3
-70
2
-80
1
-90
0 4 3.7 10
3.8 10
4
4
3.9 10
4
4 10 x
4
4.1 10 (in rad/s)
4
4.2 10
argZ x
(in ˚)
-100 4
4.3 10
Figuur 2.9. Detail verandering impedantie
14
De (absolute) impedantie is minimaal bij ω=3.9·104 rad/s. Deze is: absZX (3.9 $ 104 rad s ) . 1.8kX Dit punt, waar de impedantie minimaal is, noemen we de serie-resonantiefrequentie fs, omdat daar de frequentiebepalende elementen Ls, Cs en Rs in serie staan. De impedantie is maximaal bij: absZX (4.09 $ 104 rad s ) . 11.3kX Deze frequentie van 4.09·104 rad/s (6.50 kHz) noemen we de parallel-resonantiefrequentie fp. We mogen echter dit alleen zo noemen als de verliezen minimaal zijn. Bij de PZT-sensor zijn die verliezen groot. Rs speelt een grote rol. Dit punt noemen we fn: het punt waarbij de admittantie minimaal is (of de impedantie maximaal). Uit de impedantie van dit systeem vinden we ook twee frequenties waar de impedantie zuiver reëel is. Deze liggen bij 3.96·104 rad/s (6.30 kHz) en bij 4.02·104 rad/s (6.39 kHz). Deze frequenties noemen we respectievelijk resonantiefrequentie fr en anti-resonantiefrequentie fa. Tussen fr en fa gedraagt de sensor zich inductief. Daarbuiten capacitief. De kwaliteitsfactor Q van de serietak Ls, Cs en Rs bij: fs=6.2kHz is gedefinieerd als4: Q = 2r $ f S $ LS RS
(2.8)
Als we de bekende waarden invullen krijgen we: Q=28.6 Deze Q waarde is bijzonder laag voor de PZT-sensor. Quartzkristallen, met een vergelijkbaar vervangingsschema, hebben meestal een waarde die een orde 1000 tot 10000 groter is. Een lage Q waarde is voor de oscillatorschakeling ongunstig, omdat er veel energie moet worden toegevoerd om oscillatie op gang te houden. Bovendien gedraagt de sensor zich alleen tussen de frequenties fr en fa inductief. Dit betekent dat eigenlijk alleen daartussen de sensor een duidelijk werkpunt kan vinden. Omdat echter fr en fa tamelijk ver uit elkaar liggen, zal de oscillator niet erg stabiel op een frequentie kunnen werken.
2.2.1.2 Pierce Oscillator Een veelgebruikte oscillatorschakeling voor quartzkristallen is de Pierce oscillator. Een typische voorbeeld wordt hieronder gegeven. De oscillator bestaat uit een inverter en het terugkoppelnetwerk R1C1X1C2. Door de looptijdvertraging in de inverter is het faseverschil tussen het uitgangs- en het ingangssignaal iets meer dan 180°. Het terugkoppelnetwerk hoeft voor oscillatie niet de volledige 180° faseverschil te 15
geven. Als de inverter ook voldoende versterkt, is aan de Barkhausencriteria voldaan en zal de oscillator een harmonisch signaal opwekken5. Vaak wordt in de literatuur niet over de looptijdvertraging gesproken en neemt men aan dat de condensater C1 een fasedraaiing van -90° geeft, en het kristal (de sensor) samen met C2 voor de resterende -90° zorgt. Deze voorstelling is niet correct. Een typische Pierceschakeling (figuur 2.10) met inverter of nand-poort zien we in de volgende figuur: Ri CD4049
Rg 10MΩ
R1 12kΩ
U1A X1 PZT-Sensor C2 10nF
C1 10nF
Figuur 2.10. Pierce oscillator
Deze oscillator bevat niet veel onderdelen. Hij wordt veelvuldig gebruikt als klokgenerator voor onder andere microprocessoren. Een voordeel van deze schakeling is dat de uitgangsamplitude groot is, zodat er direct een andere CMOS-poort op kan worden aangesloten. Bovendien is de ingangsimpedantie hoog. Daar staan echter ook een aantal nadelen tegenover zoals de lage versterking en de looptijdvertraging. Overigens wordt in sommige schakelingen R1 weggelaten, omdat de uitgangsimpedantie van het IC de weerstand kan vormen van de RiC1 integrator. Om de sensor te kunnen laten oscilleren moeten we de juiste waarden vinden voor de drie overige componenten. Voor de dimensionering van C1, C2 en R1 zijn er enkele regels, waaruit blijkt hoe deze waarden samenhangen6. Bij paragraaf 2.2.1.4 gaan we iets dieper in over het verband tussen R1, C1 en C2. Overigens wordt de dimensionering meestal overgelaten aan de fabrikant, omdat de sensor (bij kwartskristallen) maar beperkt belast kan worden. De waarden voor C1, C2 en R1 hebben immers ook invloed op de stroom door de sensor. Omdat de inverter een niet-lineaire versterking heeft, nemen we een Rg op, zodat daarmee een geschikt werkpunt ingesteld kan worden. De grootte van Rg hangt af van het type inverter. Voor CMOS wordt daarvoor geadviseerd een waarde te nemen tussen 22 kΩ en 100 MΩ. We nemen 10 MΩ. Omdat we de sensor bij een lage frequentie laten oscilleren, speelt de looptijdvertraging maar een heel geringe rol. Voor R1 geldt dat als hij te groot is, het signaal teveel verzwakt zal worden. Als hij te klein is, kan het zijn dat de sensor teveel belast wordt. Uit de berekeningen verderop zal bovendien ook blijken, dat R1 grote invloed heeft op de totale fasedraaiing van het �-netwerk. De voedingsspanning bedraagt hier 5 V. Voor C1 en C2 geldt de vuistregel dat de twee capaciteiten parallel geschakeld, groter moeten zijn dan twee keer de parasitaire capaciteit in de sensor. Ze mogen echter ook niet te groot zijn, omdat dan het signaal teveel verzwakt. We proberen voor C1 en C2 een capaciteit van 10nF uit. In de praktijk oscilleert de bovenstaande schakeling uitstekend, echter bij een frequentie van 140kHz. Kennelijk een boventoon of andere trilmodus. In ieder geval veel hoger dan de bij het vervangingsschema behorende frequentie van ongeveer 6.3 kHz. De twee capaciteiten experimenteel vergroten of verkleinen brengt de frequentie niet omlaag. 16
Een mogelijke oorzaak dat de schakeling niet oscilleert op de verwachte frequentie, zou kunnen zijn dat de belasting van de sensor in het netwerk te groot is door de lage uitgangsimpedantie van de inverter. Dit kan een probleem vormen voor de sensor, die namelijk bij een te grote belasting invloed ondervindt van stoorresonanties (activity dips), waardoor de impedantie kan toenemen7. Met weerstand R1 kunnen we de uitgang van de inverter die een lage en niet-lineaire uitgangsimpedantie heeft, verhogen. Hierdoor wordt de sensor minder gedempt. We proberen bovenstaande schakeling opnieuw uit. We nemen voor R1 een instelbare weerstand, zodat we kunnen kijken wat voor gevolg dit heeft. Bij vergroten van de weerstand tot zelfs 100 kΩ krijgen we wel allemaal vreemde oscillaties, maar zeker geen harmonisch signaal in de buurt van de verwachte frequentie.
2.2.1.3 Overdracht Om meer inzicht te krijgen in waarom dit circuit niet wil oscilleren op de verwachte frequentie, is het zinvol de overdracht te berekenen van het netwerk van figuur 2.10. Hierdoor kunnen we controleren op welke wijze aan de Barkhausen criteria kan worden voldaan. We noemen de instelbare weerstand van hierboven R1. Om de overdracht te berekenen maken we gebruik van het volgende netwerk (figuur 2.11): Ingang
R1
C1
Rs
C0 5.4n
PZT Sensor
ZC1
Zx 2.16k
Ls 1.586
Cs 411.7p
ZC2 0
Uitgang
C2
0
Figuur 2.11. Netwerk met sensor
We bekijken hoe groot de overdracht is bij de genomen waarden van C1 en C2 van 10nF en een R1 van 12 kΩ uit de vorige Pierce-schakeling. C1=10nF
C2=10nF
R1=12kΩ
er geldt: ZC1(~) =
1 j $ ~ $ C1
en
ZC2(~) =
1 j $ ~ $ C2
(2.9)(2.10)
17
De totale vervangingsimpedantie van het netwerk onder weerstand R1 is dan: ZV (~) =
1 1 + 1 ZC1(~) ZX (~) + ZC2(~)
(2.11)
Vervolgens berekenen we de overdracht H(ω), die per definitie gelijk is aan de ingangsspanning gedeeld door de uitgangsspanning. H( ~) =
1
1 $ R Z 1 X (~) 1+ ZV (~) 1 + ZC2(~)
(2.12)
In de buurt van de resonantiefrequentie ziet de overdrachtsfunctie (figuur 2.12) er als volgt uit: 0.09
80
C1=10nF C2=10nF R1=12kΩ
0.085 0.08 0.075
85 90 95
0.07
100
0.065
105 110 argH
absH 0.06
115
0.055
120 (in ˚)
0.05 0.045
125
0.04
130
0.035
135
0.03
3.8 10
4
3.9 10
4
4
4 10 (in rad/s)
4
4.1 10
4
4.2 10
140
Figuur 2.12. overdracht sensor in de Pierceschakeling
We zien duidelijk dat bij 10 nF er niet voldoende fasedraaiing is om aan een Barkhausencriterium te voldoen. We vergroten C1 en C2 om meer in de buurt van de 180° te komen. We nemen -enigszins experimenteel- de volgende waarden: C1=0.33μF, C2=68nF, R1=4.7kΩ.
18
Hieruit volgt de volgende overdrachtscurve (figuur 2.13): 0.003
80
C1=330nF C2=68nF R1=4.7kΩ
0.0025
90 100 110
0.002
120 absH
0.0015
130 140
0.001
150
argH (in ˚)
160
0.0005
170 0
4
3.8 10
4
3.9 10
4
4 10 (in rad/s)
4.1 10
4
4.2 10
4
180
Figuur 2.13. overdracht sensor in de Pierceschakeling met andere componenten
Uit de grafiek blijkt dat met de grotere waarden voor C1 en C2, we nu veel meer fasedraaiing kunnen krijgen. Deze is op zijn grootst 177°. De versterking is door de grotere condensatoren wel flink afgenomen. Bij het punt waar de fasedraaiing het grootst is, blijft er ongeveer nog maar 1/1000 deel van het oorspronkelijke signaal over. In de vorige situatie was dat 1/20 deel. Ook met de nieuwe waarden krijgen we de CMOS-inverter niet aan het oscilleren in de buurt van de 6 kHz. De versterking kunnen we echter niet genoeg beïnvloeden. Omdat bovendien het meten aan de schakeling een steeds groter probleem wordt vanwege de belasting van de meetpennen, vervangen we de CMOS-inverter door twee op-amps. We kunnen een op-amp als spanningsvolger/versterker schakelen, waardoor die een veel hogere ingangsimpedantie krijgt. Immers weerstand Rg is niet meer nodig. De andere op-amp moet dan het signaal in ieder geval inverteren en eventueel ook versterken. We laten onze keuze vallen op een TL084. Dit is een veel voorkomende opamp, zonder spannende eigenschappen.
2.2.1.4 Berekening van R1, C1 en C2 We hebben gezien dat C1 en C2 veel invloed hebben op de overdracht van het netwerk. Dit verband is iets eenvoudiger te begrijpen als we de impedantie van de sensor bij de resonantiefrequentie als zuiver reëel beschouwen. We nemen daarvoor het volgende schema (figuur 2.14)
19
�� R1 R2
C1
��� C2
Figuur 2.14. Overdracht met reële R2
De overdracht H(ω) is dan: H( ~) =
1
1 $ 1 + j $ ~ $ R2 $ C2 j $ ~ $ C2 1 + R1$ (j $ ~ $ C1+ ) 1 + j $ ~ $ R2 $ C2
(2.13)
= 1/ [1 + j $ ~ $ R2 $ C2+ j $ ~ $ R1$ C1$ _1 + j $ ~ $ R2 $ C2i + j $ ~ $ R1$ C2] =
1 1 - ~2 $ R1$ R2 $ C1$ C2+ j $ ~ $ (R2 $ C2+ R1$ C1+ R1$ C2 )
De tangens van het argument van H(ω) is dan: tan(arg(H(~)) =
- ~ $ (R2 $ C2+ R1$ C1+ R1$ C2 ) 1 - ~2 $ R1$ R2 $ C1$ C2
Bij de juiste instelling is ω2R1R2C1C2>>1, waardoor we dit mogen vereenvoudigen tot: . R2 $ C2+ R1$ C1+ R1$ C2 ~ $ R1$ R2 $ C1$ C2
(2.14)
Volgens het Barkhausencriterium moet de fasedraaiing 180° zijn. Omdat de teller ongelijk aan nul is, is deze fasedraaiing mogelijk als de noemer van het argument van H(ω) naar oneindig gaat. We zien dat hoe groter C1 en C2 worden des te dichter komt de fasedraaiing in de buurt van de 180°. In de praktijk is deze afleiding voor R1, C1 en C2 meestal niet houdbaar, omdat de versterker in de Pierceoscillator bij zijn werkpunt niet zuiver reëel is. Bovendien kunnen we uit het bovenstaande niet een eenduidige bepaling voor R1, C1 en C2 vinden. Een betere manier om uit het Barkhausencriterium de waarden voor R1, C1 en C2 te bepalen is als we het criterium volgens de definitie gaan toepassen. Daaruit volgt dat de (complexe) versterking A van het versterkend element gelijk moet zijn aan 1/H(ω): (Zie voor H(ω) vergelijking 12 en figuur 2.11.) A=
1 H( ~)
(2.15)
We gaan uit van een bepaalde, door de fabrikant gespecificeerde waarde voor de fasedraaiing van A. Vaak kunnen we uit een grafiek of tabel aflezen hoeveel de fasedraaiing φ bij een bepaalde frequentie ω is. Voor de absolute versterking |A| kunnen we binnen bepaalde grenzen zelf een waarde te kiezen. Er geldt: 1 (1 ZX )(1 + R1 ) , ZV H( ~) = + ZC2
met
1 1 1 ZV = ZC1 + ZX+ ZC2
20
ZX )(1 + R ( 1 + 1 )) = (1 + Z 1 ZC1 ZX+ ZC2 C2
(2.16)
Zodat we kunnen schrijven: A = (1 + jZX c2 )(1 + R1(jc1+ 1
jc2 )) , + jZX c2
met c1=ωC1, c2=ωC2
1 (jc1+ jc2- ZX c1c2 )) = (1 + jZX c2 )(1 + 1 RjZ + X c2
= (1 + jZX c2+ jR1(c1+ c2 ) - ZX R1c1c2 ))
(2.17)
Voor het voldoen aan de Barkhausencriteria moet deze uitdrukking gelijk zijn aan de complexe versterking A=Ar+jAi .(met behulp van Euler |A|ejφ). We vervangen ZX door de complexe vorm ZXr + jZXi. Voor het reële deel van de versterking krijgen we: Ar = 1 - ZXi c2- ZXr R1c1c2
(2.18)
en voor het imaginaire deel: Ai= ZXr c2+ R1c1+ R1c2- ZXi R1c1c2
(2.19)
Ar is bekend dus vinden we voor c2: c2=
1 - Ar ZXi+ ZXr R1c1
(2.20)
c2 ingevuld in vergelijking (19) levert ons op: Ai= c2(ZXr + R1- ZXi R1c1) + R1c1 r (ZXr + R1- ZXi R1c1) + R1c1 = Z 1 -ZAR Xi + Xr 1c1
& (Ai- R1c1)(Z Xi+ ZXr R1c1) = (1 - Ar )(Z Xr + R1- ZXi R1c1) 2
2
& c1 (ZXr R1 ) + c1(Ar ZXi- Ai ZXr )R 1+ (1 - Ar )(Z Xr + R1) - Ai ZXi= 0
(2.21)
In deze kwadratische vergelijking zijn we geïnteresseerd in één oplossing. Voor de discriminant D geldt dan: D = R1 7(Ar ZXi- Ai ZXr )2- 4ZXr ((1 - Ar )(Z Xr + R1) - Ai ZXi )A = 0 2
(2.22)
Voor R1 vinden we: R1=
(Ar ZXi- Ai ZXr )2+ 4Ai ZXr ZXi - ZXr 4(1 - Ar )Z Xr
R1 ingevuld in de kwadratische vergelijking geeft ons de oplossing van c1:
(2.23)
21
c1= Ai ZXr - A2r ZXi 2ZXr R1
(2.24)
De waarden voor C1 en C2 verkrijgen we tenslotte door c1 en c2 te delen door ω.
2.2.1.5 Wijzigingen Pierce en Simulatie
Naar aanleiding van de constateringen uit het vorige deel, hebben we onze schakeling veranderd. We proberen onderstaand schema. Weerstand R8 dient ervoor om de ingang van de op-amp op een gedefinieerd niveau te brengen. De versterking stellen we in met weerstand R6/R7 en R2/R3. Met de in de schakeling gegeven waarden bedraagt deze ongeveer 1000 keer. R1
C1
2.16k
.4117n
L1
R5
1.586
6.8k
C2 5.4n R3
-
V1 C4 47n
R8
4
U1B +
0
OUT -
TL084
12V
0 R7
7
R4 4.7k
V3
12V
100MEG
12V
V+
5
6
11
TL084
R2 4.7k
V-
2
1
V-
OUT
11
4
+
V4
0
12V
V+
U1A
3
10k
V2
0
C3 330n
0
220k
R6 470
Fig. 2.15 Schema Pierce oscillator
We voeren de schakeling (figuur 2.15) in Orcad in en laten er met PSpice AD een ‘tijddomein’-simulatie op los (figuur 2.16). Hieruit blijkt dat de schakeling in de buurt van de berekende frequentie oscilleert: 6.0 kHz. De schakeling start omdat er ruis op het circuit staat. Het valt ook op dat de oscillator tijd nodig heeft om op gang te komen. Dit komt doordat er steeds maar weinig energie toegevoerd kan worden aan het netwerk, dat namelijk een hoge impedantie heeft. Vanwege de niet-lineaire versterking van de op-amps, bij grotere signalen neemt deze af, vindt het circuit een werkpunt waarbij de totale versterking gelijk aan 1 wordt. De amplitude verandert na dit startverschijnsel niet meer.
22
Fig. 2.16 PSpice simulatie startverschijnsel
Van de curve lichten we een deel uit, om inzicht te krijgen in de faseverschuiving die de componenten in het netwerk veroorzaken. We bekijken drie punten in de schakeling: het signaal dat aangeboden wordt op de ingang van de eerste op-amp, pin 3 (In de grafiek is dit signaal vergroot weergegeven), het versterkte signaal dat uit deze op-amp komt, pin 1 en het signaal dat uit de inverterende op-amp komt, pin 7. In de curve valt met name op dat het signaal van pin 1 achter loopt op dat van pin 3. Dit komt ons van pas. Uit de overdracht bleek namelijk dat het �-netwerk niet 180° kon halen. Uit de simulatie blijkt dat bij 6.0 kHz faseverschuiving van de op-amps 9.7 µs is. (omgerekend naar de periode is dit bijna 180°-22°=158°). De faseverschuiving wordt kennelijk veroorzaakt door de grote versterking van 468 keer. Dit blijkt des te meer als we de (absolute) versterking van de twee op-amps verwisselen, zodat de tweede op-amp een heel grote (inverterende) versterking gaat krijgen. In dat geval treedt de faseverschuiving op in de tweede op-amp.
������ ������������������ ����������������������
����� �������������������
����� �������������� �����������������
Fig. 2.17 Faseverschuiving bij de TL084 PSpice Simulatie
In de praktijk funktioneert de schakeling zoals we uit de berekeningen zouden verwachten. De faseverschuiving (figuur 2.17) in de op-amps is echter iets meer dan uit de simulatie: 180°-30°=150°. Om toch, wat betreft de faseverschuiving, aan het Barkhausencriterium te voldoen, zal daardoor de oscillatiefrequentie omlaag gaan naar 5.3 kHz (figuur 2.20. Bij die frequentie komt de faseverschuiving van de overdrachtscurve van het �-netwerk verder van de 180° af te liggen. Een grafiek uit de datasheet (figuur 2.18) van de TL084 waarin de open-lus versterking staat afgebeeld en een PSpice AC-analyse (figuur 2.19) is hiermee ook in overeenstemming: 23
Versterking vs. Frequentie TL084 (PSpice simulatie ) 180
Versterking |A| (in Vuit/Vin)
1000
|A|
900
160 800
φ
Fase φ (in °)
150
140
700 0
Fig. 2.18 Open-lus versterking TL084
170
5*103 Frequentie (in Hz)
10*103
Fig. 2.19. Inverterende versterker, ingesteld op 1000 keer
Gemeten faseverschuiving
16µs Fig. 2.20 Gemeten faseverschuiving: 30° bij 5.3 kHz
2.2.1.6 Metingen bij de resonantiefrequentie Nu we met de sensor in de buurt van de resonantiefrequentie kracht kunnen meten, moeten we controleren of inderdaad de frequentie afneemt bij de belasting, zoals eerder beweerd is. We leggen de sensor op een vlakke ondergrond, meten de frequentieverandering als er kracht op de sensor wordt uitgeoefend. We meten onbelast een frequentie van 5.3 kHz. Belasten we de sensor met een kracht van ongeveer 50mN, loopt de frequentie op naar 5.4 kHz. Als we vervolgens de kracht nog meer laten toenemen, tot 4 N, verandert de frequentie niet. Een nog grotere kracht zorgt ervoor dat de sensor ophoudt met resoneren, omdat hij dan teveel gedempt wordt. Het valt ook op dat tijdens het aanbrengen van een kracht de frequentie verandert met de mate waarmee de kracht verandert. Dit effect is echter van korte duur, omdat de frequentie nadat de kracht niet meer verandert, weer terugloopt naar 5.4 kHz. Blijkbaar verandert de frequentie kortdurig, maar valt direct daarna terug naar de beginwaarde. Omdat bovendien de Q-faktor erg laag is van de sensor, betekent dit dat hij niet erg stabiel op een bepaalde frequentie zal oscilleren. Samen met het voorgaande concluderen we dat deze schakeling ongeschikt is om nauwkeurig de resonantiefrequentie te meten.
2.2.1.7 Serieresonantie Naast de Pierce oscillator, zijn er verschillende andere typen schakelingen bekeken, waaronder een schakeling om de sensor bij serieresonantie te laten oscilleren8. Zie figuur 2.21. Deze schakeling be24
stond uit twee in serie geschakelde inverters, met daarop de sensor aangesloten. X1 U1A
U2A C1
R1
R2
Figuur 2.21. Basisschakeling serieresonantie
De sensor zal, afhankelijk van de totale versterking en de faseverschuiving in de lus, ergens oscilleren tussen twee karakteristieke punten: de frequentie waarbij de impedantie het laagst is en de frequentie waarbij de faseverschuiving 0 is, respectievelijk fs en fr. Zoals eerder genoemd in paragraaf 2.2.1.2 nemen we voor R1 en R2 een waarde tussen 100 kΩ en 22 MΩ. Tegen de verwachting in komt de frequentie van de sensor bij die waarden niet in de buurt van de resonantiefrequentie. Uit de volgende tabel (tabel 2.1) blijkt welk verband er tussen R1 (=R2) en de frequentie bestaat: R1 (in Ω)
f (in Hz)
16.3·103
4.0·103
21.0·103
3.3·103
68.0·10
1.0·103
380·103
760
1.0·10
73
3
6
Tabel 2.1. Frequenties bij verschillende terugkoppelweerstanden. (VDD=6V)
Uit de tabel blijkt dat de basisschakeling bij de gegeven weerstandswaarden en de daarna gemeten resonantiefrequentie niet functioneert als serieresonantieoscillator. De reden dat de oscillator niet aan de verwachtingen voldoet, is dat vanwege de lage Q-factor, de CMOS-poort teveel moet versterken. Wel valt ons op dat de frequentie van de oscillator in deze schakeling bij alle waarden van R1 (en R2) beïnvloed kan worden door het aanbrengen van een kracht. Bij lage weerstandswaarden voor R1 gedraagt de schakeling zich meer als een relaxatie-oscillator. Ongeacht de richting van de krachtuitoefening neemt de frequentie toe. Hiermee kunnen dus statische krachten gemeten worden.
2.3 Relaxatie-oscillator Relaxatie-oscillatoren worden steeds vaker gebruikt bij sensorsystemen, omdat veranderingen van het sensorsignaal doorwerken in een verandering van de periode, die meestal eenvoudig te meten valt9. Bij relaxatie-oscillatoren wordt er steeds omgeschakeld tussen twee (a-stabiele) toestanden, waarvan de periode vooral bepaald wordt door de weerstand R en de sensor, hier opgenomen als condensator C. Daarnaast spelen ook nog eigenschappen van de inverter-IC’s een rol, zoals de spanning waarbij de inverters van logisch niveau wisselen en bij hoge frequenties de vertragingstijd.
25
“C” R INV1
INV2
Figuur 2.22. Relaxatie-oscillator
Het schema van een relaxatie-oscillator vinden we in figuur 2.22. De voedingsspanning UDD van de NAND-poort, een CD4011, bedraagt 6.0 V. We hebben gemeten dat het omschakelpunt Us bij 59% van de voedingsspanning UDD ligt. Via weerstand R wordt de condensator steeds opgeladen en ontladen. Van toestand wisselt hij als de spanning op de ingang van de NAND-poort gelijk wordt aan Us. De spanning die direct na het wisselen op de condensator staat, is dan: • Tijdens het laden: Us-UDD • Tijdens het ontladen: Us+UDD Hieruit kunnen we de vergelijkingen voor de duur van het laden en ontladen afleiden: T1= x $ ln c 2 $ UDD- US m UDD- US
T2= x $ ln c US+ UDD m US
T=T1+T2
(2.25)
Als we de volgende waarden nemen: R=68kΩ
C=5.4nF
UDD=6.0V
US=0.59UDD
τ=RC
Is de periode gelijk aan: T=8.2·104 s
(of f=1.2·103 Hz)
In het schema waar deze oscillator deel van uitmaakt (figuur 3.7), vervangen we overigens de weerstand R door een vaste en een regelbare weerstand in serie, zodat de frequentie niet te hoog kan worden voor de microcontroller.
2.3.1 Capaciteitsverandering ten gevolge van druk We meten het signaal, weergegeven in figuur 2.23, dat op de ingang van de NAND-poort staat, als we de sensor in de schakeling van figuur 2.22 gebruiken. Behalve dat de sensor grote invloed heeft op de oscillatiefrequentie, ondervindt de sensor ook invloed van het oscillatiesignaal zelf. Het signaal tussen de aansluitpunten van de sensor zorgt ervoor dat de sensor steeds afwisselend op en neer beweegt. Als we de sensor niet afdempen, maar vrij laten bewegen, zien we bovenop het signaal nog een soort tweede-orde effect gesuperponeerd. De frequentie hiervan komt ongeveer overeen met de resonantiefrequentie van de sensor. 26
��� �� �
Figuur 2.23. Gemeten golfvorm oscillator, zonder demping
Als we vervolgens de sensor gaan belasten, zie figuur 2.24, verdwijnt door de demping dit effect. ��� �� �
Figuur 2.24. Gemeten golfvorm oscillator, sensor wordt gedemp
Bovendien wordt de frequentie hoger. Deze frequentieverandering is anders dan in de configuratie bij de Pierceoscillator. Bij de relaxatie-oscillator bestaat er namelijk een verband tussen de frequentie en de kracht die op de sensor wordt uitgeoefend. Blijkbaar is de sensor wel degelijk te gebruiken om ook een statische kracht te meten. We vermoeden dat de kracht samenhangt met de capaciteit C0 in het elektrisch vervangingsschema. Als we een kracht uitoefen op de sensor, neemt de capaciteit alsmede de periode (zie formule 25), maximaal af met ongeveer 10%. Zie grafiek 3.1 voor een grafiek waaruit de samenhang zichtbaar is tussen de kracht en de frequentie. Boven een kracht van ongeveer 25N, verandert de capaciteit niet meer. We merken overigens niet dat het kristal door deze kracht samendrukbaar zou zijn, immers ondanks dat de platen ten gevolge van de (druk)kracht dichter bij elkaar zouden moeten komen, neemt de capaciteit toch af.
27
2.3.2 Meetcircuit Het volledige meetcircuit zien we in figuur 2.25. De relaxatie-oscillator wordt gevormd door R1 en R2 in serie en de capaciteit van X2. Via weerstand R3 aan de ingang van U1A kunnen we de sensor in een begintoestand zetten. Transistor Q2 die aan de uitgang van U1B zit vormt de interface met de logica van de microcontroller. De microcontroller heeft een interne pull-up. We kunnen de uitgang van U1B niet direct met de ingang van de microcontroller verbinden, omdat de voedingsspanning van het meetcircuit lager dan 5 V is en de microcontroller 5 V nodig heeft. Met weerstand R2 kunnen we de frequentie bijregelen waarop de sensor oscilleert. X2 Piezo Cry stal Vadj. R5
Q1 BC558C
Vadj.
D1
12k
R3
D1N4148
U1A CD4011A
1
5
3
2
3k3
U1B CD4011A
GND R1
R2
50k
82k
R4 10k
4
6
Q2 BC548B
GND
Figuur 2.25. Meetcircuit
De voedingsspanning van het meetcircuit is instelbaar gemaakt, om de amplitude van het signaal in de relaxatie-oscillator te kunnen regelen. Bij 5 V voedingsspanning is het signaal dat van de sensor afkomstig is erg goed hoorbaar. Dit willen liever niet en kunnen we zachter krijgen door de spanning te verlagen. Bij 3.5 V werkt de sensor nog erg goed, en is het geluid dat de sensor produceert al aanzienlijk zachter. De voedingsspanningen (figuur 2.26) van 5 V en 3.5 V worden door een 5-volts stabilisator (7805) en transistor Q3 (BC547) geregeld. U9 LM78L05A/TO39 1
VOUT
+5v
Q3 BC547A
2
C5 10u
Vadj.
R7 1k
3
C4 10u
VIN GND
Vin
R8 4k7 GND
GND
GND
GND
C6 1uF GND
Figuur 2.26. Spanningsstabilisatie
28
3. Data-acquisitie en –verwerking Om te begrijpen hoe de data-acquisitie plaatsvindt, maken we een iets eenvoudiger voorstelling van de processen die zich hierbij afspelen. Voor de beschrijving maken we gebruik van het schema van figuur 3.7. De data-acquisitie bestaat in principe uit een bepaling van de lengte van het periodieke signaal afkomstig van de relaxatie-oscillator. De microcontroller, een AT89C2051, krijgt dit signaal aangeboden op zijn interrupt-ingang /INT1. Als er op die ingang een transitie plaatsvindt van een hoog naar laag niveau10, wordt een interrupt routine uitgevoerd die de timerwaarden verwerkt. Zo kan de microcontroller bepalen hoe groot de lengte van het periodieke signaal van de sensor is. De microcontroller rekent deze tijd om naar een waarde die de kracht op de sensor voorstelt. Tenslotte zet hij 1 op de 10 keer deze waarde conform de MIDI-standaard als een ‘aftertouch control’ op de seriële uitgang. Hierna kan de cyclus opnieuw beginnen. De reden dat zowel /INT0 als /INT1 zijn aangesloten op dezelfde lijn, is dat we handig gebruik maken van de mogelijkheid via maskering van een van de interrupts /INT0 of /INT1 te bepalen waarheen de interrupt vector zal springen. Afhankelijk van de instelling zal er dan gesprongen worden naar de “calibration” of “measuring”). We kunnen op deze wijze een instructie uitsparen die anders nodig was geweest om te bepalen waarheen gesprongen zou moeten worden. De dataverwerking vindt in de microcontroller steeds plaats gedurende een halve periode van de cyclus. Op dat moment is de timer ingesteld op ongeveer 1.3 ms. In die tijd kan de microcontroller ongeveer 650 instructies van 2 machinecycles afwerken. Tijdens de verwerking worden de volgende opdrachten uitgevoerd: • Tel de de gevonden meetwaarde bij de vorige op. • Ieder tiende keer wordt van de cumulatieve meetwaarde een gemiddelde berekend, gelijk aan de som gedeeld door het aantal meetwaarden. Deze waarde wordt omgezet naar een waarde tussen 0 en 255. Vervolgens wordt deze waarde uit een linearisatietabel omgerekend naar een waarde tussen 0 en 127. Om de transmissie van mididata efficiënter te laten verlopen sturen we deze waarde alleen als er een verandering is opgetreden ten opzichte van de vorige. Zo worden er niet onnodig gegevens overgestuurd.
3.1 Microcontroller Oorspronkelijk hadden we de schakeling opgebouwd en getest met een 8031. De keuze voor deze controller hadden we genomen omdat we beschikten over een uitgebreide ontwikkelomgeving daarvoor. Daarnaast hadden we veel ervaring met de MCS®51 familie. De ontwikkelomgeving bestond uit een eprom-emulator, een PC speciaal ingericht met software (asem51) om de sourcecode te assembleren, een experimenteerprint gebaseerd op de 8031, een monitorprogramma om de software te debuggen en een ‘Mini Flash Programmer’, die al in oktober 1996 in het tijdschrift Elektuur gestaan heeft, om een Atmel AT89C2051 te kunnen programmeren. We hebben verschillende instellingen in de software getest, gebruikmakend van de ontwikkelomgeving. Nadat het systeem naar behoren werkte, konden we de software in de veel kleinere microcontroller van Atmel, de AT89C2051, programmeren. Omdat deze op een aantal externe porten na geheel compatibel was met de 8031, hoefden we niets aan de software te veranderen. Daarnaast had de AT89C2051 2KB aan programmeerbare Flash geheugen aan boord, waardoor het externe geheugen en de latch, zoals die bij de 8031 noodzakelijk waren, konden worden weggelaten. 29
3.1.1 Gestuurde oscillatie
Zonder kracht op de sensor en zonder dat de oscillator aan de ingang belast wordt, genereert de relaxatie-oscillator tijdens het opstarten een frequentie van ongeveer 370 Hz (of periode is 2.7ms). Deze wordt door de microcontroller gemeten door gebruik te maken van een hardware-interrupt en een timer. De hardware-interrupt is zo ingesteld dat hij op een neergaande flank van het signaal reageert. Weliswaar is de flank aan de uitgang van de sensor op het moment dat we willen meten van laag naar hoog, maar omdat deze via een transistor loopt die de interruptingang van de microcontroller naar beneden trekt, krijgen we in de microcontroller een flank van hoog naar laag. Dankzij een hardwareinterrupt kan de microcontroller, afhankelijk van de instructie waar hij op dat moment nog mee bezig zou kunnen zijn, binnen 24 klokcycli reageren. Bij een klokfrequentie van 12 MHz is dit 2 μs. Als gevolg hiervan kan de gemeten frequentie van de sensor met ongeveer +0.28 Hz (2.7ms + 2μs) afwijken. Na de frequentie bepaald te hebben zonder kracht op de sensor, is de microcontroller gecalibreerd. De volgende stap in de software is een speciale (interrupt-)procedure starten die met (een frequentie die iets hoger ligt dan) de gemeten frequentie, de sensor aanstuurt. We kunnen de frequentie beïnvloeden, door voordat de periode afgelopen zou zijn, de sensor steeds terug te zetten in een uitgangspositie. Dit geschiedt via het kort sturen van transistor Q1 die ervoor zorgt dat beide aansluitingen van de sensor op hetzelfde spanningsniveau komen. Door het gering verhogen van de frequentie kunnen we ongewenste flanken voorkomen, die aan het eind van de periode door storingen zich kunnen manifesteren, immers dan ligt de ingangsspanning op de NAND-poort van de sensor in de buurt van het omschakelpunt Us. Storende flanken zijn ongewenst, omdat deze kunnen leiden tot een interrupt die op een verkeerd moment een meetwaarde gaat vastleggen. Een ander voordeel van deze aansturing is dat ervoor gezorgd wordt dat de sensor steeds vanuit een gedefinieerde uitgangspositie zijn ‘periode’ begint, doordat de sensor steeds heel even op een vaste spanning wordt gebracht. De interruptprocedure kent drie fasen, in figuur 3.1 Part I,II en III genaamd. De hierbovengenoemde aansturing van de sensor gebeurt gedurende Part I, waarna de verwerking van de meetgegevens, en het registreren van nieuwe gedurende Part II en III gebeurt. (Zie figuur 3.3 voor details)
Part I
Hi-state
(Microcontroller output port) Lo-state
Part II
Part III
Sensor oscillator circuitry is connected to an open collector. Which means when wvmem (or sensctrl) is hi, it is free to make a transition, depending on applied force.
hi_Tx hivdTx0 Duration: lo_Tx Flag: 1 1 0 wvmem 0 1 0 vldsens Sensor interrupt driven control-timing diagram Fig. 3.1 onderverdeling periode
De PZT-sensor buigt afhankelijk van de aangelegde spanning of naar beneden of naar boven door. (figuur 3.2) De doorbuiging bij Part I en II is in dezelfde richting. Bij Part III is deze in de andere richting. Voor een goede werking maakt het overigens niet welke richting het eerst komt. � � ���
�
��������������
�
Figuur 3.2 Doorbuiging PZT-sensor
30
De aansturing van de sensor bij Part I duurt ongeveer 35μs. Deze tijd is voldoende om storingen te voorkomen en de sensor niet teveel te hinderen bij zijn mechanische beweging. Bij Part II en III neemt de relaxatie-oscillator de ‘sturing’ van de sensor over. De interrupt die door de uitgang van de oscillator op de microcontroller wordt aangeboden, wordt alleen bij Part III toegelaten. Een stroomdiagram van de gehele procedure die de aansturing van de sensor beschrijft, staat in figuur 3.3 293 296
lo_Tx->Timer0 setb TR0
Timer0 runs untill TR0 is cleared. Timer0 counts machine cycles (1/12 Clk) Overflow causes TF0 to become high, which is vectored to 000Bh. 'Zig-zag' means further processing is done through an interrupt vector.
Timer0 IRQ vector points here:
117
Part I
593 wavectrl:
wvmem=1 vldsens=1
wvmem sensctrl
Clear flag Clear output port
633
lo_Tx->Timer0 setb TR0
wvmem=0 vldsens=0 Set flag Set output port
Load Timer0 with 610 counter values for part I.
hi_Tx->Timer0
Load Timer0 with 599 counter values for part II.
Start Timer0
setb TR0
613
test np_flag np_flag=0
616
clr EX1
Do not allow int1 during part I.
624 R3!=0
625
637
reti
wvmem=1 vldsens=0
wvmem sensctrl
608 ti_hins:
np_flag=1
636
Part III
test vldsns wvmem
Part II
631
Stop Timer0
clr TR0
Return from interrupt
626
OP_x+= tmp_TH0 tmp_TL0 R3--, test R3
setb np_flag
reti
598
Start Timer0
If main is still processing 601 data which was captured here, it is better not to interfere. So just exit interrupt
vldsens hivdTx0->Timer0
Load Timer0 with counter values for part III.
setb TR0
Start Timer0
tmp_TH0=0FFh tmp_TL0=0FFh
Preload tmp_Tx0 with the maximum value. If during this cycle the sensor does not produce an interrupt, we will have a value anyway
clr IE0 setb EX1
Software reset for interrupt flag. (Because EX1 is still disabled) Allow external interrupt EX1. So wait for an interrupt from sensor, which is vectored to 0013h.
Add captured sensor data to the 24 bits counter
Track number of captured data. Test if we have enough
Send message to main to 604 indicate processing is needed Return from interrupt
606
Allow sensor to produce valid signal
reti
Return from interrupt
Figuur 3.3 Stroomdiagram sensor stuurprocedure
31
Twee interrupts hebben invloed op het verloop van de procedure. Timer 0 gebruiken we om te bepalen hoe lang Part I, II en III duren. De timer is geconfigureerd als een 16-bits teller die 1/12 van de systeemklok, machinecycles genaamd, telt. Tijdens het calibreren worden er voor het telregister drie verschillende beginwaarden berekend in calc_t0. Deze waarden worden in het stroomdiagram gebruikt in de drie verticale takken. De tijd dat iedere tak in beslag neemt is hiermee vastgelegd. Omdat deze waarden snel oproepbaar moeten zijn, worden ze in het geheugen opgeslagen. Een interrupt door de timer treedt op wanneer alle bits van het telregister van 1 naar 0 verspringen en veroorzaakt een sprong naar de routine wavectrl. Daar wordt het telregister van timer 0 geladen met de beginwaarden voor het volgende deel. Na Part III volgt weer Part I, zodat we daarmee een cyclus hebben. De sensor is verbonden met interrupt /INT1. Deze leidt naar de routine sens_stamp, van waaruit de waarde die timer 0 op dat moment heeft, wordt opgeslagen.
3.1.2.1 Omzetting naar midi
Voor de omzetting van kracht naar een midi-conform signaal, moeten we de gemeten waarden zo converteren dat daar een waarde uitkomt dat geschikt is om via midi te versturen. Voor midi-controllerdata is vastgelegd dat deze een 7-bits getal moeten zijn. (0 tot en met 127). Om een goed beeld van het krachtverloop te krijgen, ligt het voor de hand om de gemeten waarden zodanig om te zetten dat er een lineair verband bestaat tussen de uitgeoefende kracht en de waarde die het in midi voorstelt. Voor deze omzetting worden een aantal stappen doorlopen. We beginnen bij het moment dat er een meting van de sensor gedaan wordt. Als er een interrupt van de sensor optreedt, moeten we zo vlug mogelijk de waarde van het telregister opslaan, omdat de timer doorloopt. Om dit mogelijk te maken wordt na een interrupt als eerste de timer stopgezet om te voorkomen dat het telregister verandert. Vervolgens wordt de routine sens_stamp uitgevoerd die het telregister tijdelijk kopieert naar het 16-bits register tmp_T0, waarna timer 0 weer kan doorlopen en de interruptroutine verlaten kan worden. De verdere dataverwerking van tmp_T0 geschiedt in de interruptroutine wavectrl, tijdens de fase Part II. De keuze om de verwerking op een andere plaats uit te voeren dan bij sens_stamp, is dat we tijdens Part II voldoende tijd hebben om de verwerking van tmp_T0 te doen. Timer 0 kan daar ondertussen tijdens het verwerken namelijk al lopen; immers een interrupt afkomstig van timer 0 hoefden we de eerste 650 instructies niet te verwachten. De verwerking tijdens Part II van tmp_T0 bestaat uit het volgende: We tellen de waarden van tmp_T0 cumulatief op in een 24 bits register (OP_1..OP_3). Nadat we uiteindelijk Part II num_per keer doorlopen hebben, of anders gezegd na num_per perioden hebben we het gewenste aantal metingen gedaan en maken we vanuit wavectrl de flag np_flag actief. Deze vlag deelt aan de hoofdlus van het programma mee dat de meetwaarden klaar zijn voor verdere verwerking. Na het verlaten van de interruptroutine zal in de hoofdlus deze melding worden opgemerkt. In de hoofdlus geschiedt de verdere verwerking in convert. We berekenen een gemiddelde van de meetwaarden. We moeten hiervoor 0xffff (=65535) aftrekken van de meetwaarde. Namelijk als er geen kracht op de sensor wordt uitgeoefend zou deze flank optreden net iets later dan de periode van de timer. Zie figuur 3.4. Bij het ontbreken van een kracht wordt er geen interrupt gegenereerd, omdat de sturing dan alweer aan een volgende periode is begonnen. De sensor krijgt net niet de gelegenheid om ‘uit zichzelf’ van richting te veranderen. Aangezien tmp_T0 door het ontbreken van de interrupt niet overschreven is en de software tmp_T0 geinitialiseerd had met 0xffff, krijgen we door de aftrekking bij het ontbreken van druk een resultaat 0. Naar gelang de interrupt door het uitoefenen van kracht eerder was opgetreden, zou tmp_T0 een waarde lager dan 0xffff hebben gekregen, waardoor het resultaat een (niet-lineair) verband heeft met de uitgeoefende kracht. 32
Vadj
-
Vt
GND -
4
Vadj : VDD
_INT 0 1 0
-
Vt : Toggle voltage
2
(typ. 0.59*Vadj)
Sensor waveform output
0
2 1
CD4011
0
0.001
0.002 Interrupt signal without force applied
-
Interrupt signal with force applied
-
Timer 0 register during Part III:
hivdtmr0 (start)
0xFFFF (end)
Figuur 3.4 Timingsdiagram van de sensor, interrupt
We hebben gemeten dat boven een bepaalde kracht op de sensor er geen verandering meer optreedt in het oscillatiegedrag. De maximale verschuiving van de flank tijdens Part III hebben we laten afhangen van de beginfrequentie bij het calibreren. Hij bedraagt 46% (sens_tm) van de duur van Part III. Het voordeel van deze relatieve waarde is dat we niet gebonden zijn een bepaald werkpunt, mits de controller vantevoren tijdens het calibreren de frequentie gemeten heeft zonder dat de sensor sturing kreeg. Aangezien we voor de maximale kracht een van de waarden 0 tot en met 127 willen krijgen, moeten we in principe de gemeten waarde delen door het maximum en vermenigvuldigen met 127. Rekentechnisch lossen we dit in de microcontroller anders op, omdat we niet met een drijvende komma willen gaan rekenen. Er is bovendien nog een andere reden, namelijk dat we het a-lineaire gedrag eerst met behulp van een tabel willen lineariseren. Hierdoor kunnen we de kracht uitdrukken in een midi-waarde. De grootte van de tabel bepaalt nu wat de maximale waarde van de meetwaarde moet zijn. We gebruiken een tabel van 255 elementen. In paragraaf 3.1.2.1 gaan we hier nader op in. De versturing van de MIDI-data gaat via de seriële poort van de microcontroller. Volgens het midi-protocol moet deze uit twee bytes bestaan: een controlbyte en de bijbehorende waarde. Eerst sturen we in de routine sendmd1 een controlbyte met de instructie: mov SBUF,#midictrl In de routine waittx wachten we totdat deze verstuurd is. De volgende byte die we in de routine sendmd2 versturen, is de waarde die we na de linearisatie van de kracht gekregen hebben. Dit gaat met de volgende instructie: mov SBUF, midival En wederom wachten we totdat deze verstuurd is.
33
Na het versturen van de data initialiseren we een aantal registers, waardoor de microcontroller klaar is om de volgende meting te doen. Zie de lus measure in figuur 3.5
Initialize main:
������������� ������������� ��������������� ����������� ������������� ���������� ������������ �� ���������� ������������������ ���������������
Description of startup procedure, prior to normal operation. Stackpointer needs to be set before the stack is being used (e.g. acall), to prevent program/stack corruption. With the aid of timer 1 Calib measures the period from the relaxation oscillator. The result is processed in calc_t0, which calculates values for a fully interrupt driven process (wavectrl) which controls proper oscillation.
������
Measure loop:
������
����������� � �������������������������� �������������������������� �������������������������� �������������������������
During normal operation an endless loop is being performed. Here presented as a ‘C-style switch case’ instruction. The loop does basically three things: -wait for data -process them -send to midi. cptfull has enough data when the flag np_flag is set. It is set from within wavectrl. subsequently cptfull calculates a mean value from a number of captured periods. convert calculates from the value from the previous step a level of force which lies between 0 (no force) and 127 (maximum force). sendmd1, waittx and sendmd2 take care of transmitting the level of force to the midi port.
�������������������������� ������������������������� �������������������������� �
caseovr puts registers back into an initial state, which permits waiting for new data.
Figuur 3.5 Stroomdiagram van initialisatie en normaal bedrijf
34
3.1.2.2 Linearisatie
We hebben de sensor opgenomen in het circuit met de relaxatie-oscillator, figuur 2.25. De sensor lag op een vlakke horizontale plaat. Op de sensor hebben we verschillende massa’s, met bekende waarden, gelegd en vervolgens de daarbij behorende periode gemeten. Het verband tussen de uitgeoefende kracht en de periode is a-lineair. Grafiek 3.1 toont dit verband.
2.80 2.75 2.70
������� �������
2.65 2.60 2.55
0
5
10
15
20
25
30
������������� Grafiek 3.1 Periode van de relaxatie-oscillator uitgezet tegen de kracht. (bij 18
Door in de software gebruik te maken van een tabel kunnen we op een eenvoudige wijze de gemeten periode omzetten naar een kracht. Om de tabel te maken hebben we een functie gezocht waarmee we de kracht, uitgezet tegen de periode, kunnen benaderen. (Grafiek 3.2) 30
25 Meting Benadering
20
������ ������
15
10
5
0 2.54
2.56
2.58
2.60
2.62
2.64
2.66
2.68
2.7
��������������� Grafiek 3.2 Gemeten en benaderde kracht uitgezet tegen de periode.
35
Gezien de vorm kunnen we een benadering proberen met een logarithmische functie. In het bereik waarmee we te maken hebben, vermenigvuldigen we de periode met 4000, zodat tussen de grootste en de kleinste waarde een verschil van 1 komt. Na aftrekking van 10.2 komt de periode ongeveer tussen 0 en 1 te liggen. Als we hiervan een logarithmische functie nemen, krijgen we een nagenoeg rechte lijn, die we gebruiken om het volgende functievoorschrift te maken: F(T) = *
9.82 $ (- ln(4000 $ T - 10.2) - 0.5894) 0.9813
als T G 0.00269
– 710.18 · T + 1.9537
als T > 0.00269
(3.1) (T in s, F in N)
Voor perioden groter dan 2.69 ms is het verloop van de curve zo steil, dat de logarithmische functie geen goede benadering meer geeft. Daarom hebben we het tweede deel in het functievoorschrift opgenomen, dat dit (korte) lijnstukje beschrijft. Dit deel is in grafiek 3.2 met een stippellijntje weergegeven. Voor de tabel hebben we nog de volgende gegevens nodig: • Kortste periode: 2.561 ms • Langste periode: 2.751 ms • Kleinste waarde in de tabel: 0 • Grootste waarde in de tabel: 127 • Aantal elementen in de tabel: 256 Vervolgens hebben met behulp van een spreadsheet de volgende waarden berekend: (Tabel 3.1) 0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
16
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
32
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
48
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
64
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
80
0
0
0
0
0
0
1
1
1
1
2
2
2
3
3
3
96
3
4
4
4
5
5
5
6
6
6
6
7
7
7
8
8
112
8
9
9
9
10
10
10
11
11
11
12
12
12
13
13
14
128
14
14
15
15
15
16
16
17
17
17
18
18
18
19
19
20
144
20
20
21
21
22
22
23
23
23
24
24
25
25
26
26
27
160
27
28
28
29
29
29
30
30
31
31
32
32
33
34
34
35
176
35
36
36
37
37
38
39
39
40
40
41
42
42
43
43
44
192
45
45
46
47
47
48
49
50
50
51
52
53
53
54
55
56
208
56
57
58
59
60
61
62
63
64
64
65
66
67
68
69
71
224
72
73
74
75
76
77
79
80
81
83
84
85
87
88
90
91
240
93
95
97
98
100
102
104
106
108
111
113
116
118
121
124
127
Tabel 3.1 Linearisatie periode. naar kracht
Ook de temperatuur van de sensor heeft invloed op de capaciteit, en daarmee op de periode. In de volgende grafiek (3.3) hebben we het temperatuurverloop gegeven bij drie verschillende krachten:
36
400 390 380 ���������� �������
2.17 N 4.75 N 11.4 N
370 360 350 340 330 0
10
20
30
40
������������������� Grafiek 3.3 Temperatuurverloop sensor bij verschillende krachten
Boven 26 ˚C vallen de frequenties van de verschillende kracht samen. Voor een goede werking van de sensor is het belangrijk dat temperatuur niet te veel afwijkt van 18 ˚C.
3.1.3 Calibratie
Nadat de microcontroller een aantal registers heeft geïnitialiseerd, wordt er een subroutine calib uitgevoerd die de periode van het uitgangssignaal meet, afkomstig van de relaxatie-oscillator. Het resultaat is een 16-bits waarde. Op dit moment wordt de relaxatie-oscillator nog niet actief gestuurd. Door de periode iets te verkorten, kunnen we tijdens de actieve sturing op een later moment ervoor zorgen dat tijdens de stijgende flank de bewegingsrichting van de sensor gelijk is aan wat hij door de sturing krijgt opgelegd. Zonder die correctie zou de sensor door de relaxatie-oscillator aan het eind van de periode onder bepaalde omstandigheden uit zichzelf van bewegingsrichting kunnen veranderen, en vervolgens door de sturing weer opnieuw gestart worden. We zijn van mening dat dit kort achter elkaar opnieuw starten onwenselijk is, doordat het een gelijkmatige beweging verstoort. De verkorting van de periode is vastgelegd in de constante shift_wv. We hebben deze proefondervindelijk vastgesteld op 25μs bij een periode van 2.7 ms. Bij deze tijd ontstonden er net geen vroegtijdige flanken meer. De periode waarmee de sensor gestuurd wordt is daardoor 0.9% korter. Na aftrekking van shift_wv (in μs!) van de gemeten periode (in machinecycles!) staat het resultaat in de registers prd_h en prd_l. De calibratie wordt vervolgd in de routine calc_t0, vanwaar een verdeling gemaakt wordt van prd(_ h/_l) over de tijd die de drie fasen (zie figuur 3.6) in beslagen nemen tijdens een meetcyclus.
prd_h/prd_l lo_TH0 lo_TL0
hi_TH0 hi_TL0
hivdTH0 hivdTL0 sens_tm
sigpw
Figuur 3.6 Verdeling prd_h/prd_l
37
De verdeling berekent de microcontroller met de volgende formules: lo_tmr0 = 0x(1)0000h -
sigpw $ 10- 6 $ Xtal 12
(sigpw in μs, Xtal in MHz)
hi_tmr0 = 0x(1)0000h - (prd - lo_tmr0) $ (1 -
hivdtmr0 = 0x(1)0000h - (prd - lo_tmr0) $
sens_tm ) 100
sens_tm 100
De reden waarom we 0x(1)0000h geschreven hebben is rekentechnisch. Softwarematig trekken we de getallen van 0 af, maar om de begripsvorming hier duidelijker te maken dat we niet met negatieve getallen werken, zoals ‘signed-integers’, hebben we hier 0x10000h opgeschreven. Van de drie berekende waarden wordt tenslotte nog een constante afgetrokken, zodat we een correctie kunnen maken voor de tijd die er ligt tussen het stoppen van de timer, het schrijven van de nieuwe waarden in de timerregister en het starten van de timer.
38
3.1.4 Complete schakeling
Om de microcontroller te laten werken, hoeven we behalve een 5 V voeding alleen nog een kristal van 12 MHz en een reset-circuit aan te sluiten. De MIDI-connector is via transistor Q4 verbonden met de seriële uitgangspoort RXD. Het uitgangssignaal van de relaxatie-oscillator verbinden we via de twee in serie geschakelde NAND-poorten, weerstand R4 en transistor Q2 zowel aan /INT0 als aan /INT1 (deze hebben een interne pull-up), zodat we in de software via maskering van de interrupts kunnen bepalen waar er naartoe moet worden gesprongen als er een interrupt optreedt. De sturing van de oscillator is via weerstand R5 en transistor Q1 aangesloten op een van de vrije poorten van de controller.
X2 Piezo Cry stal
Vadj.
U1A CD4011A
Q1 BC558C
D1
R3
1
5
3
2
8
4
6
U1C CD4011A
U1D CD4011A 13
10
9
12
3k3
R5 12k
R1
R2
50k
82k
GND
10
GND
GND
VCC
RST/VPP
19 18 17 16 15 14 13 12
P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1/AIN1 P1.0/AIN0
XTAL2 XTAL1 P3.7 P3.5/T1 P3.4/T0 P3.3/INT1 P3.2/INTO P3.1/TXD P3.0/RXD
Q2 BC548B
+5v
+5v U5
11
R4 10k
GND
7
D1N4148
U1B CD4011A
14
Vadj.
C1 1.0uF
20
Reset
1 4 5 11 9 8 7 6 3 2
X1
C2 20pF GND
R6 68k
12.0 MHz C3 20pF
GND
GND
+5v
1
VIN
+5v
VOUT
Vadj. Q3 BC547A
2
C5 10u
R7 1k
R10 220 R9 1k
4
Midi Out 2
5
1 JP1 DIN 5P
Q4 BC557C
3
C4 10u
U9 LM78L05A/TO39 GND
Vin
R11 220
3
AT89C2051
R8 4k7 GND
GND
GND
GND
C6 1uF GND
GND
Fig. 3.7 Totale schema van de krachtsensor aangesloten op de microcontroller
39
3.2 PC-Software Het programma dat de data op de PC opneemt, de sequencer, moet deze data kunnen exporteren als een standaard MIDI File. Ons converteringsprogramma kan zowel type 0 (single multi-channel track) als type 1 (one or more simultaneous tracks) MIDI Files importeren. Het formaat waarnaar we converteren is een textbestand met getallen, gescheiden door een komma en een ‘carriage return’: (hier vanwege de overzichtelijkheid weergegeven in zes kolommen.) 40 mit 384 0,0 3,32 9,56 14,28 19,36 26,44
31,52 41,60 48,52 53,44 58,60 80,56 85,52 92,64
114,68 235,76 240,68 516,64 528,60 539,64 545,68 699,72
710,76 726,88 733,84 738,72 743,68 804,64 809,68 876,64
881,60 888,64 893,60 898,64 903,68 920,72 925,68 1218,72
1223,68 1384,60 1395,64 etc.
In MIDI Files wordt de informatie in pakketten, ‘chunks’ genaamd, ingebed. De pakketten hebben een header met een vaste structuur en een gedeelte dat volgt met een variabele structuur. Omdat er bij de vaste structuur opgegeven wordt hoeveel data er in de daarnavolgende variabele structuur komen, kunnen MIDI Files altijd gelezen worden. Immers, zonder de opbouw van stuurcodes te kennen, kunnen namelijk data overgeslagen worden. In hoeverre de gegevens ook verwerkt kunnen worden hangt uiteraard van het implementatieniveau af van de software. Met verwijzing naar de appendix, waar een uitvoerige beschrijving over de opbouw van MIDI Files wordt gegeven, laten we de basisstructuur van MIDI Files zien. Het conversieprogramma volgt die structuur. Om inzicht in de opbouw van dit programma te krijgen, laten we een aantal details weg, zodat een soort C++ raamwerk van dit programma overblijft: while ( ( c=getc(fp)) != EOF) switch (head) { case MHDR: { if (what2do!=ERR) // process header data if head == TRUE switch (what2do) { case HDR: .. case HBL: .. case FMT: .. case NTB: .. case RES: .. } // escape from switch (what2do) // endif (what2do!=ERR) break; // escape from case MHDR } case MSIG: { if (mfmt==1 && what2do!=ERR) // process time/signature tempo track data in format 1 { switch (what2do) { case SHDR:
40
.. case SHL: .. case STAIL:// need only tempo, if more needed, change case META_DATA .. } // end switch (what2do) } // end if break; // escape from case MSIG } case MTRK: { if (mfmt==1 && what2do!=ERR) // process track data in format 1 { switch (what2do) { case THDR: .. case TRKL: .. case TTAIL:// proces control code AFTER_TOUCH somewhere .. } // end switch (what2do) break; } // escape from case MTRK } } // end switch (head) // end while
In de eerste regel van het bovenstaande C-raamwerk wordt er net zolang een character uit de MIDI File gelezen, totdat er geen character meer volgt. Zonder dat er eerst gedecomprimeerd moet worden, kunnen we de deze data sequentieel lezen. Deze data hebben altijd de volgende structuur en kunnen als ‘chunk’ of pakket meerdere keren achter elkaar voorkomen: •Een identificatiecode van 4 ASCII characters aan het begin van een pakket, gevolgd door •een ‘word’ van 4 bytes die het aantal volgende bytes behorende bij dit pakket aangeeft. •De eigenlijke data. Er bestaan maar twee identieficatiecodes. Dit zijn de characters ‘MThd’ (Master Track header) of ‘MTrk’ (Master Track). Een MIDI File begint altijd met ‘MThd’, waarna de tracks daarna altijd met ‘MTrk’ beginnen: MThd
MTrk