67
Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk Universitet, Teknisk Fakultet Side 1 af 67

Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk Universitet, Teknisk Fakultet

Side 1 af 67

Page 2: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk Universitet, Teknisk Fakultet

Side 2 af 67

Indholdsfortegnelse 1 Læsevejledning ...................................................................................................................... 4

2 Indledning................................................................................................................................ 5

3 Projektbeskrivelse ............................................................................................................... 6

3.1 Problemanalyse ........................................................................................................................................................... 6 3.1.1 Kommunikationsprotokol ........................................................................................................................................................ 6

3.2 Problemformulering .................................................................................................................................................. 7

3.3 Projektafgrænsning .................................................................................................................................................... 7

4 Indledende undersøgelser og teoretiske studier ...................................................... 8

4.1 Introduktion og præsentation af løsningsforslag til projektet ................................................................ 8 4.1.1 Design af sensorer ....................................................................................................................................................................... 8 4.1.2 Håndtering af sensordata på microcontroller ................................................................................................................ 8 4.1.3 Kommunikation ml. microcontroller og PC-terminalprogram................................................................................ 9

4.2 Præsentation af egenskaberne hos strain gages ............................................................................................ 9

4.3 Fototransistoren som lyssensor ........................................................................................................................ 10

4.4 Forklaring af ATMega32-print ........................................................................................................................... 11

4.5 Bestemmelse af bilens acceleration i sving samt deformation af strain gages .............................. 11 4.5.1 Bilens maksimale hastighed i sving .................................................................................................................................. 11 4.5.2 Bilens maksimale centripetalkraft og -acceleration i sving ................................................................................... 13 4.5.3 Deformation af vægtstang og strain gages i sving ...................................................................................................... 13 4.5.4 Tophastighed, acceleration og deformation i ydersving ......................................................................................... 15 4.5.5 Delkonklusion: hastighed, acceleration og deformation ......................................................................................... 15

4.6 Forklaring af elektromotoren ............................................................................................................................. 16

5 Dimensionering af sensorkredsløb .............................................................................. 18

5.1 Registrering af sving v.h.a. strain gages i Wheatstones halvbro .......................................................... 18 5.1.1 Beregning af brospænding ................................................................................................................................................... 19

5.2 Dimensionering af forstærkning af brospænding ...................................................................................... 20 5.2.1 Forklaring af instrumenteringsforstærkeren AD623 ............................................................................................... 20 5.2.2 Beregning af forstærkningsmodstand, RG ...................................................................................................................... 21

5.3 Støjdæmpning v.h.a. passive lavpasfiltre ....................................................................................................... 21

5.4 Dimensionering af komparator .......................................................................................................................... 22

5.5 Registrering af motoromdrejninger v.h.a. fototransistor ........................................................................ 23

5.6 Registrering af målstreg v.h.a. fototransistor ............................................................................................... 23

5.7 Brug af kondensator som nødspændingskilde ............................................................................................ 24

6 Simulering, test og måling af racerbilens sensorer ................................................. 26

6.1 Simulering af sving i laboratorium ................................................................................................................... 26

Page 3: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk Universitet, Teknisk Fakultet

Side 3 af 67

6.2 Undersøgelse af strain gagens sensitivitet .................................................................................................... 27

6.3 Undersøgelse af friktionskoefficient mellem bil og bane ........................................................................ 28

6.4 Undersøgelse af racerbilens tophastighed .................................................................................................... 29 6.4.1 Måling af tophastighed på lige strækninger.................................................................................................................. 29

6.5 Undersøgelse af racerbilens gearing og motoromdrejningstælleren ................................................ 30

7 Udvikling af software og AVR interface ....................................................................... 31

7.1 PWM: styring af elektromotoren ....................................................................................................................... 31

7.2 Anvendte programmeringsteknikker i Assembler .................................................................................... 33 7.2.1 Opsætning og udførelse af kommunikation .................................................................................................................. 33 7.2.2 Opsætning af Bluetooth-modul .......................................................................................................................................... 34 7.2.3 Opsætning af Timere og interrupts .................................................................................................................................. 34 7.2.4 Lagring af data i microcontrollerens hukommelse .................................................................................................... 36 7.2.5 Princippet bag accelerationsregulering .......................................................................................................................... 37

7.3 Gennemgang af Assembler-kode til microcontroller ................................................................................ 38 7.3.1 Initialisering af microcontroller ......................................................................................................................................... 38 7.3.2 Flowchart for manuel og stopmode.................................................................................................................................. 38 7.3.3 Flowchart for interrupts ........................................................................................................................................................ 38 7.3.4 Digitalisering af banen og lagring af sensorinput ....................................................................................................... 39 7.3.5 Automode ..................................................................................................................................................................................... 40

7.4 Kommunikation mellem racerbil og PC-program ...................................................................................... 40

7.5 Gennemgang af C++-kode (Bluetooth terminalprogram) ....................................................................... 41 7.5.1 Programmør-definerede funktioner ................................................................................................................................ 41 7.5.2 Flowchart med forklaring ..................................................................................................................................................... 42

7.6 Eksempel på en C++-funktion ............................................................................................................................. 45

8 Diskussion ............................................................................................................................. 47

8.1 Generel diskussion .................................................................................................................................................. 47 8.1.1 Samarbejde med undergrupperne .................................................................................................................................... 47 8.1.2 Tidsplan......................................................................................................................................................................................... 47

8.2 Diskussion af sensorkredsløbet ......................................................................................................................... 47 8.2.1 Connectors på boardet sparer tid ...................................................................................................................................... 47 8.2.2 Kondensatoren blev inkluderet til sidst ......................................................................................................................... 47 8.2.3 Tyngdepunktet er for højt ..................................................................................................................................................... 47 8.2.4 AD623s ustabilitet .................................................................................................................................................................... 48 8.2.5 Problemer med lodninger ..................................................................................................................................................... 48 8.2.6 Problemer med elektromotoren ........................................................................................................................................ 48 8.2.7 Usikkerhed i forbindelse med beregninger på strain gages .................................................................................. 48

8.3 Diskussion af programmering ............................................................................................................................ 48 8.3.1 Problemer med Assembler til microcontroller ........................................................................................................... 48 8.3.2 Problemer med C++ til terminalprogram ...................................................................................................................... 48

Page 4: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk Universitet, Teknisk Fakultet

Side 4 af 67

9 Perspektivering ................................................................................................................... 49

9.1 Implementering af elektromagnet til styrket downforce i sving ......................................................... 49

9.2 Aktiv bremsning før sving .................................................................................................................................... 49

9.3 Differentieret måling af sving ............................................................................................................................. 49

9.4 Lys- og lydsignaler ved begivenheder ............................................................................................................. 49

9.5 Udnyttelse af baneoplysninger til visuel præsentation i terminalprogram .................................... 50

9.6 Mulighed for simultan styring af flere biler .................................................................................................. 50

9.7 Mulighed for registrering af hældninger på banen .................................................................................... 50

10 Konklusion ............................................................................................................................ 51

10.1 Konklusion på sensorer og hardware ............................................................................................................. 51

10.2 Konklusion på udvikling af terminalprogram i C++ .................................................................................. 51

10.3 Konklusion på udvikling af program til styring af bilen i Assembler ................................................. 51

11 Litteraturliste ....................................................................................................................... 52

11.1 Anvendte kilder ........................................................................................................................................................ 52

11.2 Anvendte hjemmesider ......................................................................................................................................... 52

11.3 Anvendte datablade ................................................................................................................................................ 53

12 Figurliste ................................................................................................................................ 53

13 Bilag ......................................................................................................................................... 55

13.1 Tidsplan ....................................................................................................................................................................... 55

13.2 Diagram for sensorkredsløb ................................................................................................................................ 56

13.3 Brugte kommandoer i AVR og deres funktioner ......................................................................................... 57

13.4 Billeder af bilen ......................................................................................................................................................... 58

13.5 Samlet Assembler-kode ......................................................................................................................................... 59

13.6 Samlet C++-kode ...................................................................................................................................................... 64

1 Læsevejledning Rapporten er inddelt i kapitler, afsnit og underafsnit. Forkortelser, symboler m.m. forklares første gang de optræder. Kildehenvisninger og kommentarer angives med fodnoter, der er repræsenteret med et hævet

skrift, fx ’1’. Kildehenvisninger angives med en kildenummerering samt evt. sidetal, og henviser til

kildelisten kapitel 11. Figurer, tabeller og diagrammer er nummeret efter kapitler. F.eks. er ”Figur 1.1” den første

figur i det første kapitel. Formler er nummereret som (k.f), hvor ”k” er kapitlet og ”f” er dens formelnummer i kapitlet.

Page 5: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 2. Indledning Syddansk Universitet, Teknisk Fakultet

Side 5 af 67

2 Indledning Når Formel1-kørere konkurrerer om at gennemføre en bane hurtigst muligt, er alle detaljer, køreteknisk såvel som mekanisk og elektronisk, højt prioriteret. Formel1-bilens udformning dikterer dens opførsel under kraftig påvirkning af luftmodstand, motorens, gearenes og mekaniske lejers ydeevne afgør ultimativt bilens tophastighed mens superkraftige, varmeresistente bremsekalibre sørger for en hurtig nedbremsning ind i sving. Ved høje hastigheder forårsager selv minimale fejltrin betragtelige tidsgab, hvilket i sidste ende kan betyde sejr eller fiasko. I mange andre henseender er det lige så afgørende for udfaldet, at både timing og effektiv udnyttelse af omgivelserne er taget i væsentlig betragtning. Og i modsætning til Formel1-eksemplet er der ikke nødvendigvis altid en chauffør til at kontrollere udstyret. Opgaven i dette semesterprojekt er at ombygge en almindelig fjernstyret miniracerbil til, på intelligent vis, at gennemføre en bane hurtigst muligt. Dette skal foregå v.h.a. en microcontroller-baseret styring, og der skal yderligere foregå en kommunikation mellem racerbilen og en PC v.h.a. et terminalprogram udviklet i C++. Interfacet mellem PC og racerbil skal programmeres i Assembler på en AVR mikroprocessor. I bilens konstruktion skal indgå mindst en strain gage. Kravene til projektet er nærmere forklaret i kapitel 3 (side 6). Rapporten er forfattet af fem studerende ved SDU, Teknisk Fakultet fra Elektroteknik og Fysik & Teknologi, 2. semester. Projektet omfatter fagligheder fra semestrets undervisning: digitalteknik, elektronik, programmering, datakonvertering, statistik og mekanik. Bemærk, at rapporten afspejler gruppens faglige kompetencer på 2. semester, hvorfor målgruppen for rapporten er tekniske studerende og ingeniører med tilsvarende faglige niveau. Gruppen har i løbet af projektet arbejdet i undergrupper, der har beskæftiget sig med tre generelle emner:

1) design og dimensionering af sensorer og kredsløb til montering i racerbilen 2) udvikling af terminalprogram i C++ til kommunikation med racerbilen via Bluetooth 3) udvikling af softwareinterface mellem terminalprogram og racerbil i Assembler

Gruppens tidsplan og dokumentation for arbejdsprocessen kan findes i bilag (afsnit 13.1) og på den medfølgende CD. God fornøjelse!

________________________________ ________________________________ ________________________________ Simon Holst Traberg-Larsen Martin Brøchner Andersen Ronni Lambertsen

________________________________ ________________________________ Daniel Grønning Rasmus Asmussen Lyck

Page 6: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 3. Projektbeskrivelse Syddansk Universitet, Teknisk Fakultet

Side 6 af 67

3 Projektbeskrivelse I det følgende kapitel gennemgås projektoplægget, de opstillede (mindste)krav og der udformes en projektafgræsning, der omfatter relevante problemformuleringer og fokusområder. 3.1 Problemanalyse I henhold til det udleverede projektoplæg skal følgende (mindste)krav opfyldes. Disse danner projektets rammer: Hver gruppe får udleveret en miniracerbil. Denne bil skal benyttes til projektet. Der skal anvendes en ATMega32 microcontroller i forbindelse med projektet. Af testhensyn skal kommunikationsprotokollen ml. bil og PC overholdes. Se afsnit 3.1.1.

o Det er dog tilladt at lave tilføjelser til protokollen. Det udleverede Bluetooth-modul skal benyttes Der skal gøres et reelt forsøg på at gennemføre en bane på den bedste tid – det er ikke nok at

lave et projekt, hvor bilen kører banen rundt i samme hastighed. Der skal udvikles et C++ program, som kan bruges til kommunikation mellem en PC og bilen. Der skal anvendes en strain gage i projektet.

Af obligatorisk udstyr skal nævnes: En Scalextric-bane 1 stk. SCX Hummer H3 ATMega32 RN-42 Bluetooth-modul fra Roving Networks Strain gage

3.1.1 Kommunikationsprotokol Telegramformatet, der skal være gældende for microcontrolleren, er vist med nedenstående eksempel:

TYPE COMMAND DATA [7:0] hvor hvert felt repræsenterer 1 byte. Protokollen er binært baseret. Baud rate (kommunikationshastighed) = 9600 baud (bps), 1 start bit, 1 stop bit. Nedenfor er standardprotokollen illustreret: TYPE-feltet: Binær værdi TYPE Bemærkning 0x55 SET Aktiverer en værdi i bilen. Bilen skal ikke svare på SET-telegrammer. 0xAA GET Henter en værdi fra bilen. 0xBB REPLY Et REPLY-telegram angivet et svar på et GET-telegram. COMMAND-feltet: Binær værdi COMMAND Parameter Bemærkning 0x10 Start 0 – 100 % Hastighed i procent ift. max-spænding på

baneskinnerne. 0x11 Stop -- Stop bilen 0x12 Automode -- Sæt bilen i automode. Bruges til konkurrencen.

Page 7: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 3. Projektbeskrivelse Syddansk Universitet, Teknisk Fakultet

Side 7 af 67

3.2 Problemformulering Som tidligere nævnt er det logisk at inddele projektet i tre emner: 1) design af sensorer og hardware, 2) udvikling af terminalprogram i C++ og 3) udvikling af program til styring af bilen i Assembler. Af samme grund skelnes der i rapporten mellem disse tre emner, og de vil blive forsøgt behandlet så selvstændigt som muligt. Dette betyder imidlertid ikke, at emnerne fraholdes fra at interagere med hinanden, da dette er en forudsætning for et velfungerende samspil mellem hardware og software. I overensstemmelse med disse emner samt projektets rammer ønskes følgende spørgsmål belyst: Teoretiske studier af fysiske virkninger på racerbilen Hvilke kræfter virker på racerbilen mens den kører rundt på banen? Hvor stor er bilens centripetalacceleration i sving? Hvad er bilens teoretiske tophastighed i sving?

Dimensionering af hardware Hvordan skal strain gage-implementeringen konstrueres? Hvad skal dimensioneres, hvis strain gage skal benyttes som accelerometer? Hvordan registreres bilens hastighed og passering af målstregen? Hvor skal hastigheds- og målstregssensor placeres på bilen?

Test, undersøgelse og afprøvning af hardware Hvor følsomme er de monterede strain gages? Hvilken forsøgsopstilling skal benyttes til måling af:

- bilens registrering af sving (acceleration)? - bilens hastighed?

Udvikling af terminalprogram i C++ og program til microcontroller Hvordan foregår kommunikationen mellem terminalprogrammet og microcontrolleren i bilen? Hvordan dimensioneres en hhv. statisk (manuel) og dynamisk (automatisk) PWM? Hvordan lagres data indfanget af bilens hardware/sensorer? Hvilke programmeringsteknikker skal tages i brug for at sikre, at læsning af data fra

sensorerne ikke forstyrrer microcontrollerens almindelige drift (interrupts, PWM m.m.) Hvordan konverteres fysiske måledata til digitale signaler? Hvordan undgår man, at bilen laver hjulspind og -blokade? Hvordan måles hastighed og banetid med input fra div. sensorer?

Kommunikation ml. terminalprogram og microcontroller Hvordan defineres kommunikationsprotokollen mellem C++ og Assembler grænsefladen?

3.3 Projektafgrænsning Af hensyn til tidsrammen for projektet arbejdes der kun med de indtil nu nævnte emner og problemstillinger. Øvrige emner og supplerende studier, som er forblevet på idéplan, er omtalt i kapitel 9. Alle undersøgelser og målinger på hardware og microcontrolleren er udført eller simuleret hhv. i laboratorier og med software.

Page 8: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 4. Indledende undersøgelser og teoretiske studier Syddansk Universitet, Teknisk Fakultet

Side 8 af 67

4 Indledende undersøgelser og teoretiske studier Dette kapitel belyser og dokumenterer relevante, teoretiske aspekter vedrørende projektets løsningsforslag. Betydningsfulde beregninger er også inkluderet i dette kapitel. 4.1 Introduktion og præsentation af løsningsforslag til projektet Dette afsnit introducerer projektgruppens beslutninger m.h.t. design og konstruktion af sensorer og kredsløb samt deres kommunikation med microcontrolleren og terminalprogrammet på PC. 4.1.1 Design af sensorer Racerbilen skal, som omtalt i afsnit 3.1, være i stand til at gennemføre en bane på egen hånd. Dette indebærer, at racerbilen skal have konkrete, fysiske opmålinger af den specifikke bane. Disse opmålinger involverer: Kendskab til placering og varighed af sving på banen Kendskab til placering af banens startlinje/målstreg Kendskab til bilens øjeblikkelige placering på banen samt den tilsvarende tid brugt på at nå

denne placering (dermed også bilens hastighed). Registrering af sving skal ske v.h.a. de påbudte strain gages, som er forklaret i afsnit 4.2. Der forventes at benyttes to stk. strain gages, der skal monteres på samme vægtstang, dog oppositionelt, se principtegning Figur 4.1. For billeder af bilen se i øvrigt afsnit 13.4 i Bilag.

Registrering af målstreg skal ske v.h.a. en fototransistor, som er forklaret i afsnit 4.3. Denne monteres på bilens undervogn pegende nedad mod vejen. Der benyttes også en fototransistor til registrering af bilens motoromdrejninger, som kan konverteres til tilbagelagt strækning. Kombineret med en timer i microcontrolleren kan denne information desuden bruges til at beregne bilens hastighed. 4.1.2 Håndtering af sensordata på microcontroller De analoge signaler fra sensorkredsløbet skal konverteres og behandles af en microcontroller. Der er udleveret en AVR ATMega32 til dette projekt. Programmeringen skal foregå i lavniveausproget Assembler. Microcontrolleren skal tage sig af timere til beregning af bilens hastighed, banetider m.m., den skal reagere ved eksterne interrupts forårsaget af motorens omdrejninger, den skal indsamle oplysninger fra de monterede strain gages, den skal regulere bilens elektromotor baseret på sensorernes informationer og alt dette skal videresende til et brugervenligt terminalprogram på en PC.

Figur 4.1: Priptegning af placering af bilens sensorer

Page 9: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 4. Indledende undersøgelser og teoretiske studier Syddansk Universitet, Teknisk Fakultet

Side 9 af 67

Figur 4.2: Eksempler på strain gages. Den anvendte strain gage er markeret. Kilde 9

4.1.3 Kommunikation ml. microcontroller og PC-terminalprogram Racerbilen skal have mindst tre operationer: en manuel mode (manuel indstilling af hastighed), en stop mode (bilen standser) og en automode (bilen regulerer selv hastigheden afhængig af dens placering på banen). Disse funktioner skal kunne aktiveres v.h.a. et PC-terminalprogram, der skal kodes i højniveausproget C++. Derudover kan terminalprogrammet udbygges med diverse ønskede funktionaliteter. 4.2 Præsentation af egenskaberne hos strain gages En strain gage (også benævnt strain gauge) er en elektronisk komponent, der er i stand til at måle belastning eller forlængelse/sammenpresning. Den består typisk af et isolerende, fleksibelt kabinet, der fastholder en tynd metallisk folie. Folien, der er lagt i et stribet mønster, fungerer som en elektrisk resistans. Fastmonteres en strain gage på et legemes overflade vil en deformation af legemet også medføre en deformation af strain gagen, og vil, afhængigt af deformationens retning, enten forøge eller reducere foliens tværsnitsareal og længde. Elektrisk resistans i en ledning er bestemt af ledningens længde, tværsnitsareal og resistivitet på følgende måde1:

𝑅 = 𝜌 ∙ �𝑙𝐴� (4.1)

hvor 𝜌 er resistivitet (en materialeafhængig konstant), 𝑙 er længde og 𝐴 er tværsnitsareal. En forlængelse af strain gagen betyder, at længden, 𝑙, forøges, mens tværsnitsarealet, 𝐴, formindskes. Dermed medfører en fysisk kraftpåvirkning en større resistans som medfører et større spændingsfald hen over strain gagen. I forbindelse med brug af strain gages er det væsentligt at bemærke følgende definition2: Δ𝑅

𝑅0= 𝐺𝐹 ∙ 𝜖 (4.2)

hvor Δ𝑅 er strain gagens absolutte forandring i resistans, 𝑅0 er strain gagens resistans mens ubelastet, 𝐺𝐹 er en ”gage”-faktor, der for den anvendte strain gage er 23 og 𝜖 er materialets relative deformation4: 𝜖 =

Δ𝑙𝑙0

(4.3)

hvor Δ𝑙 er materialets absolutte deformation (forlængelse eller sammenpresning) og 𝑙0 er materialets oprindelige længde.

1 Kilde 15 2 Kilde datablad for strain gages 3 Kilde 16: Strain gage datablad 4 Kilde 6 – Side C8

Figur 4.3: Illustration af en strain gages virkemåde.

Kilde 9

Page 10: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 4. Indledende undersøgelser og teoretiske studier Syddansk Universitet, Teknisk Fakultet

Side 10 af 67

4.3 Fototransistoren som lyssensor Racerbilen skal til et hvilket som helst tidspunkt kunne måle dens øjeblikkelige fart, og den skal registrere målstregen hver gang denne passeres. Uden kendskab til den tilbagelagte strækning haves ingen kendskab til bilens hastighed, og dermed kan microcontrolleren ikke genskabe eller digitalt virtualisere banen. Netop det, at microcontolleren har de nødvendige informationer om banen muliggør nøjagtig registrering af sving og dermed nøjagtig hastighedskontrol. Ligeledes er det vigtigt at vide, hvornår bilen passerer målstregen for at beregne den samlede tid brugt på at gennemføre banen. Til at udføre disse realtidsmålinger benyttes to fototransistorer (varenavn: Vishay CNY70); én registrerer motorens omdrejninger, som er direkte proportional med hjulenes omdrejninger (med en proportionalitetsfaktor p.g.a. gearing, se mere i afsnit 6.5), og en anden er monteret på bilens undervogn og peger ned på banen. Den anvendte fototransistor kaldes mere nøjagtigt for en reflekterende optisk sensor med transistor-output. Inde i komponenthuset er en infrarød LED (Light-Emitting Diode) og en infrarød-lysfølsom BJT (Bipolar Junction Transistor). Når LEDen tilsluttes en forsyningsspænding udsender den infrarødt lys. Infrarødt lys opfører sig nøjagtig magen til synligt lys m.h.t. bølgevirkninger, brydning, refleksion osv., og vil derfor reflekteres fra eventuelle overflader (CNY70 har en rækkevidde på op til ca. 5mm). Det reflekterede lys rammer den fotofølsomme transistor via et optisk fiberkabel. Når lyset, som består af fotoner, rammer transistoren vil det excitere elektroner i materialet og efterlade frie elektroner og tilsvarende frie elektronhuller. Disse vil som følge af elektrisk diffusion søge mod en ligevægtstilstand ladningsmæssigt og forårsager dermed en fotostrøm, der er summen af både elektronhullernes strøm og de frie elektroners strøm. Resultatet er altså, at to forskellige overfladematerialer med forskellige absorbtionsgrader5 reflekterer uens mængder lys og forårsager dermed forskellige fotostrømme i transistoren. Ideelt set burde en helt sort overflade med absorbtionsgrad 1 optage alt transmitteret lys og altså ikke forårsage en fotostrøm i transistoren. Samtidigt burde en helt hvid overflade med absorbtionsgrad 0 reflektere alt transmitteret lys og dermed forårsage den størst mulige fotostrøm i transistoren. Disse egenskaber ved materialer kombineret med CNY70eren kan give anledning til at anvende en komparator, som sammenligner signalet fra fototransistoren med en konstant reference. Læs mere om dette i afsnit 5.4.

5 En faktor, der angiver, hvor stor en del af det sendte lys absorberes i materialet. Den angives ofte i procent (0%-100%)

Figur 4.4: En CNY70 fototransistor

Kilde: datablad CNY70

Figur 4.5: CNY70 diagram Kilde: datablad CNY70

Figur 4.6: CNY70 princip

Page 11: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 4. Indledende undersøgelser og teoretiske studier Syddansk Universitet, Teknisk Fakultet

Side 11 af 67

Figur 4.9: Eksempel på sving-vej-sving konfiguration

4.4 Forklaring af ATMega32-print På Figur 4.7 ses et bilede af det udleverede ATMega32-print. Til printet skal der tilsluttes en 15V spændingskilde. Umiddelbart efter forsynings-indgangen er en ensretter, hvis funktion er, at sørge for, at uanset, hvad den får ind af spænding, vil der altid være positiv forsyning det samme sted. Dvs., at uanset hvilken vej bilen vender på banen, fås altid de samme 15V og stel. De lange, grå connectors, der sidder på siderne af boardet har forbindelse til forskellige ben på microcontrolleren. Dette gør det let at tilslutte div. sensorer, som bruges til at opsamle data. Der findes også et Bluetooth-modul på printet, hvilket gør det muligt at kommunikere med microcontrolleren. Da microcontrollerens indbyggede krystal er på 8MHz, er der installeret en ekstern 16MHz krystal på printet. Det medvirker at sandsynligheden for, at data mistes eller overses under opsamling mindskes. Til styring af hastigheden på motoren i bilen bruges PWM (læs afsnit 7.1) i forbindelse med en MOSFET, som tænder og slukker for motoren. 4.5 Bestemmelse af bilens acceleration i sving samt deformation af strain gages For at kunne dimensionere både hardware og software optimalt, er det hensigtsmæssigt at kende bilens fysiske opførsel på banen. Det er primært sving, der er af beregningsmæssig interesse, da der her er risiko for, at bilen falder af banen. I dette afsnit opstilles teoretiske estimater på bilens tophastighed i sving samt de kræfter der virker på bilen imens. 4.5.1 Bilens maksimale hastighed i sving Det er oplyst i projektoplægget, at bilen, på dens tur rundt på banen, kun vil møde rene højre og venstre sving, og at disse altid er veldefinerede til sektioner a’ 45°, 90° og 135°. Desuden er der altid mindst 35cm mellem to forskelligartede sving. Ved opmåling af et 90° sving findes inderbanens længde, s, til 40cm (se Figur 4.9). Dermed kan radius til banens sving bestemmes: 𝑂 = 2𝑟𝜋 (4.4) hvor O er cirklens omkreds og r er cirklens radius. Dvs.: 𝑂 = 4 ∙ 40𝑐𝑚 = 160𝑐𝑚 = 2𝑟𝜋 (4.5)

⇓ 𝑟 =

160𝑐𝑚2𝜋

= 25,465𝑐𝑚 (4.6)

Figur 4.7: ATMega32-print

Figur 4.8: Ensretteren på ATMega32-print

Page 12: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 4. Indledende undersøgelser og teoretiske studier Syddansk Universitet, Teknisk Fakultet

Side 12 af 67

Figur 4.10: Frit-legeme-diagram for bil i sving

For legemer, der bevæger sig rotationelt el. angulært gælder Newtons grundlæggende bevægelseslove, blot hvor cirkelbevægelsens radius er medregnet. På Figur 4.10 er opstillet et frit-legeme-diagram for bilen i et sving. Der er tre kræfter, der påvirker bilen: tyngdekraften (𝐹𝑔 = 𝑚𝑔), normalkraften (𝐹𝑁����⃗ = −𝐹𝑔���⃗ ) og en friktionskraft mellem bilens dæk og underlaget (𝑓𝜇 = 𝐹𝑁 ∙ 𝜇), der alene er årsagen til bilens samlede centripetalkraft (”kraft søgende mod centrum”). De vertikale kræfter afbalancerer hinanden, eftersom bilen naturligvis hverken penetrerer jorden eller søger mod himmels. Dermed er centripetalkraften den eneste retningsbestemmende påvirkning på bilen. Friktionskraften er givet ved6 𝑓𝜇 = 𝐹𝑁 ∙ 𝜇 (4.7) hvor 𝜇 er friktionskoefficienten. Se afsnit 6.3, hvor friktionskoefficienten mellem bil og bane beregnes. For angulær bevægelse gælder følgende sammenhæng (udledt fra Newtons 2. lov):7

𝐹𝑐𝑒𝑛𝑡𝑟𝑖𝑝𝑒𝑡𝑎𝑙 =𝑚𝑣2

𝑟 (4.8)

hvor m er legemets masse, v dets hastighed og r cirkelstykkets radius. Da centripetalkraften (ligning 4.8) udelukkende repræsenteres af friktionskraften (ligning 4.7) kan følgende ligning opstilles: 𝑓𝜇 = 𝐹𝑐𝑒𝑛𝑡𝑟𝑖𝑝𝑒𝑡𝑎𝑙 (4.9) Dvs.:

𝐹𝑁 ∙ 𝜇 =𝑚𝑣2

𝑟

(4.10)

Normalkraften, 𝐹𝑁, kan omskrives:

𝑚𝑔𝜇 =𝑚𝑣2

𝑟 (4.11)

𝑣 = �𝜇𝑔𝑟 (4.12) Dvs. bilens maksimale hastighed i svinget afhænger af friktionskoefficienten, tyngdeaccelerationen og cirkelstykkets radius. Hvis en normal bil overskrider denne hastighed vil den understyre, men da det ikke er en mulighed for denne type bil (grundet dens styrepind) vil den simpelthen falde af vanen. Bemærk, at bilens masse ikke påvirker hastigheden i svinget. I afsnit 6.3 bliver friktionskoefficienten bestemt til ca. 𝜇 ≈ 0,99 og radius er fundet til 𝑟 ≈ 25,5𝑐𝑚. Dermed er bilens maksimale hastighed i svinget:

6 Kilde 3 – side 119 7 Kilde 3 – side 124

Page 13: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 4. Indledende undersøgelser og teoretiske studier Syddansk Universitet, Teknisk Fakultet

Side 13 af 67

Figur 4.11: Placering af strain gages på bil. Dimensioner: ℎ × 𝑏 × 𝑑 = 50𝑚𝑚 ×5𝑚𝑚 × 0,7𝑚𝑚

𝑣 = �0,99 ∙ 9,82

𝑚𝑠2∙ 0,255𝑚 = 1,58

𝑚𝑠

(4.13)

Dette svarer til 36,73 % af bilens tophastighed ved lige strækninger på 4,3𝑚

𝑠 (se afsnit 6.4.1).

4.5.2 Bilens maksimale centripetalkraft og -acceleration i sving Med udgangspunkt i ligning 4.8 kan bilens maksimale centripetalkraft i sving beregnes:

𝐹𝑐𝑒𝑛𝑡𝑟𝑖𝑝𝑒𝑡𝑎𝑙 =𝑚𝑣2

𝑟=

0,175𝑘𝑔 ∙ �1,58𝑚𝑠 �2

0,255𝑚= 1,712𝑁

(4.14)

Den maksimale centripetalacceleration kan også bestemmes:

𝑎𝑐𝑒𝑛𝑡𝑟𝑖𝑝𝑒𝑡𝑎𝑙 =𝑣2

𝑟=�1,58𝑚𝑠 �

2

0,255 𝑚= 9,78

𝑚𝑠2

(4.15)

9,78 𝑚

𝑠2 svarer til 99,6 % af tyngdeaccelerationen eller 0,996g8. Hele konstruktionen oplever denne

centripetalacceleration, mens en bevægelig masse vil opleve en centrifugalkraft af samme størrelse – dette vil blive udnyttet til at detektere sving. 4.5.3 Deformation af vægtstang og strain gages i sving Strain gages, som omtalt i afsnit 4.1, bruges ofte til måling af såkaldt ’strain’ eller belastning af et legeme. En legemes belastning kan også siges at være en acceleration eller kraft, der trækker i eller skubber på legemets overflade. Det betyder altså, at strain gages kan måle kraft. Ifølge Newtons 1. lov, kan et legeme ikke bevæge sig, hvis det ikke er blevet udsat for en acceleration eller en kraft.

Eftersom beregninger i afsnit 4.5.2 viste, at racerbilen påvirkes af en centripetalkraft på ca. 𝐹𝑐𝑒𝑛𝑡𝑟𝑖𝑝𝑒𝑡𝑎𝑙 ≈ 1,7 i sving, må dette nødvendigvis føre til belastninger i bilens konstruktion (om end meget små). Denne centripetalkraft vil, afhængig af dens retning (højre- eller venstresving) forlænge den ene strain gage og sammenpresse den anden. Ved herefter at beregne deformationen af strain gagen kan dens resistansændring bestemmes og slutteligt kan der dimensioneres et kredsløb, der kan måle disse resistansændringer (se afsnit 5.1 om Wheatstones bro). Der monteres to strain gages i racerbilen (se Figur 4.11) i stedet for blot én, for at modvirke miljøfaktorer såsom temperatur. For at

8 g er en ikke-SI-enhed for tyngdeacceleration, dvs. 1𝑔 = 9,82 𝑚

𝑠2

Page 14: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 4. Indledende undersøgelser og teoretiske studier Syddansk Universitet, Teknisk Fakultet

Side 14 af 67

beregne den maksimale deformation af de monterede strain gages benyttes centripetalaccelerationen fundet i afsnit 4.5.2 (9,78 𝑚

𝑠2). Ifølge Newtons 2. lov er kraftpåvirkningen på et legeme proportional

med dets acceleration, mens dets masse er proportionalitetskonstanten9: 𝐹𝑠𝑡𝑟𝑎𝑖𝑛 𝑔𝑎𝑔𝑒 = 𝑚𝑆𝐺 ∙ 𝑎𝑐𝑒𝑛𝑡𝑟𝑖𝑝𝑒𝑡𝑎𝑙 (4.16) Legemet er i dette tilfælde vægtstangen af aluminium, de to strain gages samt en vægt af jern monteret for enden af vægtstangen (se evt. billeder af bilen i afsnit 13.4). Hele strain gage-konstruktionen er målt til at veje 𝑚𝑆𝐺 = 20𝑔. Derfor er kraften: 𝐹𝑠𝑡𝑟𝑎𝑖𝑛 𝑔𝑎𝑔𝑒 = 0,02𝑘𝑔 ∙ 9,78

𝑚𝑠2≅ 0,195𝑁 (4.17)

Dette medfører en materialespænding i vægtstangen forårsaget af et moment. Spændingen, der opstår som følge af momentet, kan bestemmes v.h.a.10 𝜎𝑚𝑜𝑚𝑒𝑛𝑡 =

𝑀𝑏

𝑊𝑥 (4.18)

hvor 𝑀𝑏 er momentet, der opstår efter ”kraft gange arm”-princippet, 𝑀𝑏 = 𝐹 ∙ ℎ, og 𝑊𝑥 er det aksiale modstandsmoment11, som i dette tilfælde kan bestemmes v.h.a.12,13:

𝑊𝑥 =𝑏 ∙ ℎ2

6 (4.19)

Dermed kan momentspændingen bestemmes: 𝜎𝑚𝑜𝑚𝑒𝑛𝑡 =

0,195𝑁 ∙ 50𝑚𝑚5𝑚𝑚 ∙ 0,7𝑚𝑚2

6

= 2,3951𝑁

𝑚𝑚2 (4.20)

For at finde den relative forlængelse benyttes Hookes lov14: 𝜖 =

𝜎𝑚𝑜𝑚𝑒𝑛𝑡

𝐸 (4.21)

hvor 𝜖 er den enhedsløse, relative deformation af materialet og E er elasticitetskoefficienten15. For aluminium er denne koefficient 𝐸𝑎𝑙𝑢 = 70000 𝑁

𝑚𝑚2.16 Derfor fås:

9 Kilde 3 – side 91 10 Kilde 6 – side C31 11 Kilde 6 – side C31 12 Kilde 6 – side C18, tabel C5 13 Bemærk: de angivne dimensioner (𝑏 × ℎ) gælder for materialets profil – altså det, som svarer til legemets bredde og dybde. 14 Kilde 6 – side C9 15 Elasticitetskoefficienten angiver, hvor elastisk et materiale er (hvor villigt det er til at give efter belastninger). 16 Kilde 6 – side C22

Page 15: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 4. Indledende undersøgelser og teoretiske studier Syddansk Universitet, Teknisk Fakultet

Side 15 af 67

𝜖 =

2,3951 𝑁𝑚𝑚2

70000 𝑁𝑚𝑚2

= 3,42 ∙ 10−5 (4.22)

Da den relative deformation også indgår i nedenstående ligning, kan den absolutte forlængelse af vægtstangen bestemmes: 𝜖 =

Δ𝑙𝑙0

(4.23)

Δ𝑙 = 𝜖 ∙ 𝑙0 = 3,42 ∙ 10−5 ∙ 50𝑚𝑚 = 1,71 ∙ 10−3𝑚𝑚 (4.24) For de to monterede strain gages, som hver er 3mm (se datablad) bliver det til Δ𝑙𝑆𝐺 = 3,42 ∙ 10−5 ∙ 3𝑚𝑚 = 1,03 ∙ 10−4𝑚𝑚 (4.25) Altså en forlængelse på ca. 0,1𝜇𝑚. 4.5.4 Tophastighed, acceleration og deformation i ydersving Alle beregninger i afsnit 4.4.1 til 4.4.3 er udført med udgangspunkt i, at bilen kører i inderbanen i et sving. Da der både vil forekomme højre- og venstresving vil bilen altså på et tidspunkt opleve at svinge i ydrebanen. Der kan køres hurtigere i et sving i ydrebanen, da svingets radius er større. En større radius medfører et blødere sving, hvilket medfører en lavere centripetalacceleration ved samme hastighed. Da beregninger på et ydersving er identiske til dem for et indersving, vil fremgangsmåden ikke blive gennemgået igen. Resultaterne er opskrevet nedenfor. Bilens maksimale hastighed i ydersving er:

𝑣𝑦𝑑𝑒𝑟 = �𝜇𝑔𝑟 = �0,99 ∙ 9,82𝑚𝑠2∙ 0,325𝑚 = 1,77

𝑚𝑠

(4.26)

Bilens centripetalacceleration ved 1,58𝑚

𝑠 i ydersving er:

𝑎𝑐𝑒𝑛𝑡𝑟𝑖𝑝𝑒𝑡𝑎𝑙 =𝑣2

𝑟=�1,58𝑚𝑠 �

2

0,325𝑚= 7,68

𝑚𝑠2

(4.27)

Denne acceleration er af interesse, da opmålingen af banen sker ved 1,58𝑚

𝑠 (se afsnit 7.2.5 og 7.2.6).

Deformationen af de monterede strain gages er maksimalt: Δ𝑙𝑆𝐺 = 𝜖𝑦𝑑𝑒𝑟 ∙ 𝑙0 = 3,40 ∙ 10−5 ∙ 3𝑚𝑚 = 8,06 ∙ 10−5𝑚𝑚 (4.28) 4.5.5 Delkonklusion: hastighed, acceleration og deformation I afsnit 4.5 er der ved teoretiske overvejelser og beregninger blevet estimeret et sæt af fysiske størrelser, der er afgørende for racerbilens opførsel på banen. Først og fremmest er bilens tophastighed i sving estimeret til ca. 1,58 𝑚

𝑠, hvilket svarer til omtrent 37 % af bilens tophastighed.

Endvidere er bilens centripetalacceleration i sving blevet bestemt til 9,78 𝑚𝑠2

.

Page 16: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 4. Indledende undersøgelser og teoretiske studier Syddansk Universitet, Teknisk Fakultet

Side 16 af 67

50 100 150 200 250 300 350

0.2

0.4

0.6

0.8

1.0

Vinkel i.f.t. referencepunkt Figur 4.12: Grafisk illustration: afstand til ref.-

punkt som funktion af vinkel.

Afstand til referencepunkt

Bilen skal gerne undgå at falde af banen, når den drejer ind i sving, og derfor er det nødvendigt for microcontrolleren at vide, hvornår svingene kommer. Til det benyttes to stk. strain gages, som registrerer højre- og venstresving v.h.a. centripetalkraften på bilen. Ved beregning viser det sig, at de to strain gages maksimalt vil deformere med 1,03 ∙ 10−4𝑚𝑚. Den såkaldte relative deformation er desuden fundet til 𝜖 = 3,42 ∙ 10−5 (enhedsløs). Denne viden skal senere anvendes i dimensionering af et kredsløb (se afsnit 5.1.1). Tilsvarende beregninger er udført for et ydersving, og det kan konkluderes, at centripetalkraften, og dermed deformationen af strain gages, er mindre i ydersving ved opmålingshastigheden på 1,58𝑚

𝑠.

Dette er imidlertid ikke et problem, da de monterede strain gages er rigeligt følsomme (se afsnit 6.2). 4.6 Forklaring af elektromotoren En elektrisk motor er i sin simpleste forstand en magnet, hvorigennem der går en akse. Omkring magneten er der minimum ét ferromagnetisk referencepunkt. Magneten vil altid søge mod dette punkt, og det vil skabe et kraftmoment. Kraftmomentet, eller drejningen, stopper dog, når magneten og referencepunktet er ligestillet (dvs. placeret overfor hinanden med mindst mulig afstand). Hvis man erstatter det ferromagnetiske punkt med en passiv magnet med den negative pol vendt mod den roterende ”kernemagnet”, vil man være i stand til at styre rotationen endnu bedre. Hvis man ændrer polariteten af kernemagneten så den negative pol vender ind mod den negative pol på den omkringliggende magnet, vil de to magnetfelter frastøde hinanden – derfor bruger man en elektromagnet som kernemagnet, og dermed har man basis for en motor. Den største træk-evne opnås, når elektromagneten er 90 grader fra referencemagneterne, da der her vil være den største ændring i afstand til referencen pr. vinkel. Det betyder også, at kraftmomentet nærmer sig nul to gange pr. magnetomgang, og da motoren er afhængig af en bevægelsesmængde til at fortsætte rotationen, omvendes polerne, og kraftmomentet fortsætter. Denne teknik medfører dog en meget ujævn rotation og forårsager et slid på motoren samt det, som motoren driver. For at undgå uregelmæssig motorgang og slitage isættes flere elektromagneter, oftest 3 eller flere, i motoren. Alle elektromagneterne ændrer polaritet med samme frekvens, dog faseforskudt. Dette vil give en meget mere jævn drift, og samtidig sikre at motoren kører den rigtige vej til at starte med (kræver minimum 3 elektromagneter). På Figur 4.14 ses omdrejningsmomentet for tre elektromagneter i samme motor som funktion af vinklen i forhold til ”start” (lad start være den negative referencemagnet). Den blå kurve starter ud for denne

50 100 150 200 250 300 350

0.2

0.4

0.6

0.8

1.0Kraftmoment

Vinkel i.f.t. referencepunkt Figur 4.13: Grafisk illustration: En magnets

kraftmoment som funktion af vinklen.

50 100 150 200 250 300 350

0.2

0.4

0.6

0.8

1.0

Vinkel i.f.t. referencepunkt

Kraftmoment

Figur 4.14: Grafisk illustration: Kraftmoment i en trefaset elektromotor.

Page 17: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 4. Indledende undersøgelser og teoretiske studier Syddansk Universitet, Teknisk Fakultet

Side 17 af 67

0 50 100 150 200 250 300 350

0.2

0.4

0.6

0.8

1.0

Vinkel i.f.t. referencepunkt

Summeret kraftmoment (gennemsnit)

Figur 4.15: Grafisk illustration: summeret kraftmoment og RMS

reference, den røde er positivt ladet, og på vej mod den negative reference, mens den grønne er negativt ladet og på vej væk – der er altså stadig to elektromagneter, der trækker, selvom den tredje er nyttesløs i dette øjeblik. 30 grader senere er motoren på sit stærkeste, da alle tre elektromagneter trækker her. På Figur 4.15 er vist sammenligning med en enkelt elektromagnet imod en med tre elektromagneter – de har begge samme gennemsnitlige effekt (forudsat at den enlige elektromagnet er 3 gange så kraftig som hver af dem i den anden motor), nemlig 2

𝜋, som er indikeret med

den vandrette streg. Det ses tydeligt, at den trefasede motor leverer en meget mere konstant kraft, hvilket er hensigtsmæssigt. En elektromagnet er simpelt forklaret en spole med en jernkerne. Det vil sige, der sidder tre spoler i motoren, der gør det muligt, at bruge PWM til styring af motorens effekt. Strøm gennem en ledning vil altid skabe et svagt magnetfelt omkring ledningen med uret i forhold til strømmens retning (fra + til -). Hvis man lægger flere ledninger ved siden af hinanden og giver dem den samme strøm, vil feltet naturligvis blive stærkere. Hvis man vikler ledningen om noget, får man parallelle ledninger, der leder den samme strøm, og skaber et fokuseret magnetfelt i midten af viklingen. Hvis man i dette magnetfelt placerer jern eller andet stærkt magnetisk materiale vil dette magnetfelt blive forstærket og resultere i en positiv og negativ ende af metallet. Til at huske hvilken ende, der bliver positiv, bruges højrehåndsreglen. Den siger, at hvis man lægger højre hånd om spolen med fingrene i ”strømmens positive retning17” (fra – til +), vil elektromagneten være positivt ladet i den ende, hvor tommelfingeren er. Tilsvarende for en ledning, hvis man lægger højre hånd med tommelfingeren i strømmens retning (fra + til -) vil det magnetiske felt følge de resterende fingre.18 Spolerne i elektromagneterne agerer som integratorled for PWM-signalet. Dvs., at motoren reelt modtager et DC-gennemsnit baseret på PWM duty cycle. Gennemsnittet sker fordi strømmen igennem spolerne ikke kan ændres momentant.

17 Denne regel lader til at være så gammel, at man ikke vidste, at elektricitet er en strøm af elektroner, som er negativt ladet. Så ”strømmens positive retning” er altså det modsatte af strømmens retning. 18 Kilde 1 – Side 699

Page 18: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 5. Dimensionering af sensorkredsløb Syddansk Universitet, Teknisk Fakultet

Side 18 af 67

Figur 5.2: En Wheatstone kvartbro Kilde 11

Figur 5.1: OrCAD PSpice diagram for sensorkredsløb. Fuldside-version kan findes i bilag side 56.

1

2

3

4

5 Dimensionering af sensorkredsløb Nedenfor fremgår en fuld diagramtegning for sensorkredsløbet i racerbilen. Til sensorerne er brugt i alt 10 operationsforstærkere fordelt i 4 ottebens-ICer. Der bruges to instrumenteringsforstærkere af typen AD623 (med hver tre differentialforstærkere) og to dualkomparatorer af typen LM358 (selvsagt med to forstærkere i hver). I det følgende kapitel gennemgås kredsløbets bestanddele, som groft kan inddeles i: En kreds, der tæller motoromdrejninger (kasse #1) En kreds, der registrerer målstregen (kasse #2) En kreds, der registrerer højresving (kasse #3) En kreds, der registrerer venstresving (kasse #4)

5.1 Registrering af sving v.h.a. strain gages i Wheatstones halvbro En Wheatstone-bro er et elektrisk kredsløb, som benyttes til at måle ukendte modstandsværdier (se Figur 5.2). Den grund-læggende egenskab ved broen er, at hvis forholdet mellem 𝑅2 og 𝑅1 (𝑅2/𝑅1) er lig med forholdet mellem 𝑅𝑥 (den ukendte modstand) og 𝑅3, er brospændingen, altså spændingsforskellen mellem punkt B og D, lig med 0. Hvis 𝑅𝑥 skulle blive større bliver potentialet i punkt B større hvilket udløser en negativ spændingsforskel, 𝑉𝐷𝐵, Skulle 𝑅𝑥 derimod blive mindre ville potentialet i punkt B tilsvarende blive mindre og en positiv spændingsforskel, 𝑉𝐷𝐵, vil opstå. Der findes flere varianter af broen og de fleste er navngivet efter antal af ukendte modstande i kredsløbet, f.eks. ”fuldbro” (4 ukendte modstande), ”halvbro” (2 ukendte) og ”kvartbro” (1 ukendt).19 I sensorkredsløbet benyttes en halvbro med to forskellige referencer (D på Figur 5.2).

19 Kilde 12 – Side 5

Page 19: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 5. Dimensionering af sensorkredsløb Syddansk Universitet, Teknisk Fakultet

Side 19 af 67

5.1.1 Beregning af brospænding Med udgangspunkt i halvbroen på Figur 5.3 bliver der i dette afsnit udledt et matematisk udtryk for brospændingen, 𝑉𝐵𝐴. På diagramtegningen for hele sensorkredsløbet (afsnit 0) er punkterne A og B er forbundet til to instrumenteringsforstærkere af typen AD623. Brospændingen kan ses som differensen mellem to spændingsdelere:

𝑉𝐵𝐴 = 𝑉𝑠 �𝑅4

𝑅3 + 𝑅4−

𝑅2𝑅1 + 𝑅2

� (5.1)

De to strain gages, 𝑅3 og 𝑅4, er naturligvis ikke konstante værdier og kan derfor omskrives via nedenstående ligningsrække (se afsnit 4.2): 𝑅3 = 𝑅0 + Δ𝑅0 = 𝑅0 �1 +

Δ𝑅0𝑅0

� = 𝑅0(1 + 𝑥) = 𝑅0(1 + 2𝜖) (5.2)

hvor 𝑅0 er strain gagens nominelle resistans og 2𝜖 er dens relative deformation ved maksimal belastning ganget med en gage faktor hentet fra databladet (se Datablad for HBM 120Ω strain gages). Der gælder næsten samme omskrivning for 𝑅4, men det skal bemærkes, at denne strain gage er placeret oppositionelt i.f.t. 𝑅3. Bliver 𝑅3 større formindskes altså 𝑅4: 𝑅4 = 𝑅0 − Δ𝑅0 = 𝑅0 �1 −

𝛥𝑅0𝑅0

� = 𝑅0(1 − 𝑥) = 𝑅0(1− 2𝜖) (5.3)

Med disse omskrivninger, og eftersom 𝑅1 og 𝑅2 er ens, kan ligning 5.1 omskrives til:

𝑉𝐵𝐴 = 𝑉𝑠 �𝑅0(1− 2𝜖)

𝑅0(1 + 2𝜖) + 𝑅0(1− 2𝜖) −12�

(5.4)

𝑉𝐵𝐴 = 𝑉𝑠 �𝑅0(1− 2𝜖)

2𝑅0−

12�

(5.5)

𝑉𝐵𝐴 = 𝑉𝑠𝜖 (5.6) I afsnit 4.5.3 findes den relative deformation, 𝜖, til 3,42 ∙ 10−5 [enhedsløs] og forsyningsspændingen, 𝑉𝑠, er 5V. Dermed kan brospændingen findes til: 𝑉𝐵𝐴 = 5𝑉 ∙ 3,42 ∙ 10−5 = 0,000171𝑉 = 1,71 ∙ 10−4𝑉 (5.7) Der fås altså en maksimal brospænding på ca. 0,17𝑚𝑉.

Figur 5.3: Halvbro til måling af strain

Page 20: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 5. Dimensionering af sensorkredsløb Syddansk Universitet, Teknisk Fakultet

Side 20 af 67

5.2 Dimensionering af forstærkning af brospænding Instrumenteringsforstærkeren, AD623, anvendes til registrering af racerbilens sving. Der benyttes to instrumenteringsforstærkere, én til hhv. højre- og venstresving. Grunden hertil er, at der bør skelnes mellem de to slags sving eftersom deres radius og længde er forskellige i de to banespor. For at maksimere hastigheden i begge slags sving er der gjort dette tiltag. Begge instrumenteringsforstærkere modtager det samme signal fra de to strain gages, den ene på det inverterende, den anden på det ikke-inverterende. Hver forstærker har sin egen reference, som kan justeres med hvert sit potentiometer. Forstærkernes udgangssignaler går begge til den samme LM358 dualkomparator, som giver et digitalt output. De to fototransistorer sender deres signaler direkte til den anden LM358, som sammenligner signalerne med et fast potentiale, der er blevet bestemt v.h.a. laboratorietest. 5.2.1 Forklaring af instrumenteringsforstærkeren AD623 AD623 er en instrumenteringsforstærker, hvilket er en særdeles præcis differentialforstærker. En differentialforstærker forstærker forskellen mellem to spændingspotentialer med en faktor, som er bestemt af eksempelvis negativ feedback. Hvis den inverterende indgang (V-) får 5 V og den ikke-inverterende (V+) får 5,1 V, vil det være forskellen på 0,1, der bliver forstærket. Det er altså ligegyldigt, hvor store de to potentialer er. Instrumenteringsforstærkeren vinder primært overfor differentialforstærkeren når præcision og stabilitet tages i betragtning, hvilket gør den yderst anvendelig sammen med strain gages, som opererer med meget små potentialer (se afsnit 4.5.3 og afsnit 5.1.1) AD623 indeholder tre differentialforstærkere (se Figur 5.5). De to til venstre på diagrammet er buffere, der øger præcision og troværdighed. Generelt er den kendetegnet ved at have lavt DC-offset, høj støjimmunitet, meget høj open-loop forstærkning, meget høj CMRR20 og meget høj indgangsimpedans. Den er også nemmere at konfigurere end en almindelig operationsforstærker, man skal bl.a. ikke bruge negativ feedback for at bestemme forstærkningen; den bestemmes med en modstand mellem ben 1 og 8 (se Figur 5.4) ud fra formlen: 𝐴 = �1 +

100 000 𝛺𝑅𝐺

� (5.8)

RG er den modstand, kredsløbsdesigneren indsætter mellem ben 1 og 8. Det vil altså sige, at 11 ganges forstærkning opnås med en RG på 10kΩ, og jo mindre RG er, jo større er forstærkningen. Forstærkningen skal vælges med flere parametre i betragtning: Spænding skal være stor nok til at kunne kompareres Forstærkningen må ikke være så stor, at støj fra omgivelser

får forstærkeren til at opføre sig som en komparator21 En underdimensioneret forstærkning vil give mindre udsving og dermed forringe kompareringskvaliteten, mens en over-

20 Common-Mode Rejection Ratio 21 En almindelig operationsforstærker kan konfigureres til en komparator ved tilpas høj forstærkning, men fordelen ved en dedikeret komparator er dens slew rate – dvs., hvor hurtig den er til at skifte spændingsniveau.

Figur 5.4: Diagramtegning for

AD623 Kilde AD623 datablad

Figur 5.5: Skematisk opbygning af instrumenteringsforstærker

Kilde AD623 datablad

Page 21: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 5. Dimensionering af sensorkredsløb Syddansk Universitet, Teknisk Fakultet

Side 21 af 67

dimensioneret forstærkning risikerer at forstærke støj fra omgivelserne så meget, at instrumenteringsforstærkeren begynder at operere i de to mætningsområder, hvilket overflødiggør komparatoren. 5.2.2 Beregning af forstærkningsmodstand, RG I afsnit 5.1.1 beregnes den maksimale brospænding til ca. 0,17𝑚𝑉. Denne ønskes forstærket til en spænding i størrelsesordnen 10𝑚𝑉 − 100𝑚𝑉. Der vælges for lethedens skyld 𝑣𝑜 = 17𝑚𝑉. Dermed er den ønskede forstærkning: 𝐴 =

17𝑚𝑉0,17𝑚𝑉

= 100 (5.9)

Herefter anvendes ligning 5.8 – det noteres, at ”1+” leddet i ligningen besværliggør dimensioneringen, hvis man ønsker at anvende afrundede heltal. Derfor accepteres en forstærkning på 101 istedet. Altså kan forstærkningsmodstanden, 𝑅𝐺 , findes: 101 = �1 +

100000𝛺𝑅𝐺

� (5.10)

𝑅𝐺 =

100000Ω101 − 1

= 1000Ω = 1𝑘Ω (5.11)

Der skal altså vælges en modstand på 1𝑘Ω for at opnå den ønskede forstærkning. 5.3 Støjdæmpning v.h.a. passive lavpasfiltre En differentialforstærker eller instrumenteringsforstærker22 forstærker ukritisk alt, hvad der ligger på dens indgange. Forstærkeren skelner altså ikke mellem et faktisk signal og støj fra omgivelserne, hvilket kan give komplikationer i forbindelse med kompareringerne. Strain gage-signalet på komparatorens ene indgang sammenlignes nemlig med en konstant spændingsreference, og de to potentialer er af hensyn til følsomheden meget tætte. Dermed opstår der en risiko for, at støjkilder vil blive opfanget og forstærket så strain gage-signalet på komparatoren vil variere over og under referencen, og i en sådan tilstand vil microcontrolleren opfatte uønsket støj som sving. Mange sving endda, potentielt set sving til både højre og venstre 100 eller flere gange i sekundet. Derfor implementeres der to lavpasfiltre i kredsløbet. På Figur 5.6 er vist et diagram for et førsteordens lavpasfilter23. Førsteordens lavpasfiltre har den egenskab, at signaler med højere frekvens end en given knækfrekvens dæmpes med 20dB per dekade.24 Den mest udtalte støjkilde i racerbilens miljø er elektromotoren. Heldigvis er der et ligefremt forhold mellem effekt og frekvens på motoren, og den vil aldrig

22 En instrumenteringsforstærker er sammensat af tre differentialforstærkere. 23 Et andenordens lavpasfilter dæmper med ca. 40dB pr. dekade imod 20dB i et førsteordens. Denne egenskab er ikke vurderet nødvendig i projektet. 24 Eks.: knækfrekvens = 10Hz, 100Hz dæmpes 20dB, 1000Hz dæmpes 40dB, 10000Hz dæmpes 60dB osv.

Figur 5.6: Diagram for førsteordens lavpasfilter. En modstand og kondensator i serie. Det filtrerede signal måles over kondensatoren

Page 22: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 5. Dimensionering af sensorkredsløb Syddansk Universitet, Teknisk Fakultet

Side 22 af 67

rotere langsommere end 83Hz (se afsnit 6.4). Ved denne frekvens vil lavpasfilteret dæmpe ca. 12dB af det oprindelige støjsignal. Andre fremtrædende støjkilder er microcontrolleren (ATMega32), Bluetooth-kommunikations-modulet og støj fra lyskilder/strømnettet. De opererer med hhv. 16 MHz (clockfrekvens, firkantsignal), 9,6kHz og 50Hz svarende til hhv. 118dB-, 53dB- og 8dB-dæmpning (kan omregnes til hhv. en milliontedel, en hundreddel og en tiendedel af det oprindelige signal). Med filteret implementeret, ses ingen forstyrrelser fra omgivelserne, og sensoren reagerer øjeblikkeligt på påvirkninger. For at dimensionere lavpasfilteret sådan at signaler fra strain gages passerer mens støj fra omgivelser absorberes er det nødvendigt at beregne den frekvens, hvorved strain gages-impulserne vil opstå. Ved måling er bilens topfart fundet til 𝑣𝑚𝑎𝑥 = 4,3𝑚

𝑠 (dette er uden nødspændingskondensator, strain

gages, supportprint, fototransistorer og karosseri påsat). Det kortest mulige sving er et 45° sving i indersporet, som svarer til 20 cm. Dermed kan man beregne den minimale bredde af en puls: 𝑡𝑃𝑈𝐿𝑆 =

𝑇2

=0,2 𝑚

4,3𝑚𝑠≈ 0,047𝑠 (5.12)

hvor 𝑇 er periodetiden for et sving. Herefter kan den maksimale frekvens bestemmes: 𝑓𝑃𝑈𝐿𝑆 =

1𝑇

=1

2𝑡𝑃𝑈𝐿𝑆=

10,093𝑠

= 10,75𝐻𝑧 (5.13)

Disse beregninger forudsætter naturligvis, at bilen kører med tophastighed gennem en bane bestående af skiftevis højre og venstresving. For at imødekomme eventuelle usikkerheder, fejlkilder og komponenttolerancer ganges frekvensen i ligning 5.13 med 2. Således dimensioneres lavpasfilteret med en knækfrekvensen på ca. 20Hz. Der gælder følgende sammenhæng for et lavpasfilter: 𝑓0 =

12𝜋𝑅𝐶

(5.14)

hvor 𝑓0 er knækfrekvensen, 𝑅 er modstanden og 𝐶 er kapaciteten. For at opnå en knækfrekvens på ca. 20Hz vælges 𝑅 = 8𝑘Ω og 𝐶 = 1𝜇𝐹. Dette giver: 𝑓0 =

12𝜋 ∙ 8 ∙ 103Ω ∙ 10−6𝐹

= 19,89𝐻𝑧 (5.15)

5.4 Dimensionering af komparator En komparator (se Figur 5.7) er en forstærker med en meget stor forstærkning, i teorien uendelig, men i praksis bare stor (for LM358 er gain 100 dB, hvilket svarer til 100.000 ganges forstærkning). Da komparatoren i dette projekt vil blive forsynet med 5V på positiv forsyning og stel på negativ forsyning, vil der være et aktivt område på 5

100 000𝑉25,26. Alt over dette vil blive til et digitalt 1, og alt

under dette er digitalt 0.

25 Kilde: datablad for LM358. 26 Dvs. det område, hvor komparatoren forstærker indgangssignalet lineært, ligesom en almindelig operationsforstærker. Dette område skal helst være så småt som muligt i en komparator.

Page 23: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 5. Dimensionering af sensorkredsløb Syddansk Universitet, Teknisk Fakultet

Side 23 af 67

Figur 5.8: Princip bag registrering af motoromdrejninger

Figur 5.7: Diagram for LM358. Kilde: LM358 datablad.

Instrumenteringsforstærkerne giver et signal, der varierer med mere end 0,01 V, altså mere end rigeligt til at springe over dette aktive område, og fotocellerne varierer med op imod en hel volt. Det betyder, at den eneste grund til at komparatoren skulle opholde sig i sit aktive område er dens slew rate på 0,6 𝑉/𝜇𝑠. For fotocellerne er der brugt den samme reference på begge delforstærkere, og potentialet i denne er 1,85 V, da dette er mellem ”høj” og ”lav” for begge fotoceller. For strain gages skabes referencen ved en spændingsdeling med to lige store modstande (5kΩ), hvilket resulterer i 2,5 V. Dette er valgt for at give nok rum til at inputtet kan være større og mindre, men alt mellem 1 og 4 V kan bruges, det handler bare om justering af potentiometrene. Dette betyder naturligvis, at disse skal indstilles sådan at instrumenteringsforstærkernes referencer er hhv. under 2,48 V og over 2,52 V, hvilket er grunden til opsætning med potentiometre (se Figur 5.1). 5.5 Registrering af motoromdrejninger v.h.a. fototransistor Det er tidligere blevet nævnt, hvor vigtig realtids hastighedsmålinger er for bilens gennemførelse af banen (se afsnit 4.3). Til at udføre denne måling er der placeret en fototransistor (CNY70) ca. 2mm over elektromotoren. Når motoren påtrykkes en spænding, vil tre spoler skabe et kraftmoment (se afsnit 4.6), hvilket får motorens aksel til at rotere. Når motoren drejer rundt vil fototransistoren skiftevis belyse overfladen af en spole (kobber, forholdsvist lav absorbtionsgrad – især med infrarød belysning) og overfladen af aluminium (denne overflade er blevet formørket v.h.a. en sprittusch og har derfor en forholdsvist høj absorbtionsgrad). Disse egenskaber kan udnyttes til at skabe to logiske niveauer: ét for kobber og ét for aluminium v.h.a. en LM358 dualkomparator (se afsnit 5.4). På Figur 5.8 ses princippet bag registreringen. Når spolen vender opad, reflekterer den en stor del af det transmitterede infrarøde lys, som tænder for fototransistoren. Ved at lade dette signal fra fototransistoren føres til en komparator, som konstant sammenligner med en fast referencespænding, fås logisk høj. Når spolen drejer væk og den mørke aluminiumoverflade i stedet fremtræder, reflekteres en væsentligt mindre del af det transmitterede lys, hvorfor fototransistoren næsten slukker og komparatoren giver logisk lav. Det fremkomne firkantsignal kan nu sendes til microcontrolleren, som konverterer pulserne fra motoren til en læsbar hastighed v.h.a. bl.a. gearingsberegninger (se afsnit 6.5). Dermed kendes bilens hastighed til et hvert tidspunkt. 5.6 Registrering af målstreg v.h.a. fototransistor Ligesom med registrering af motoromdrejninger, som er forklaret i afsnit 5.5, anvendes en CNY70 fototransistor til at registrere racerbilens passering af målstregen. Denne måling benyttes til bestemmelse af bilens omgangstid. Princippet bag fototransistoren er forklaret i detaljer i både afsnit 4.3 og 5.5. Der er imidlertid visse konstruktionsmæssige krav til implementeringen Figur 5.9: Placering af fototransistor på bilens undervogn.

Page 24: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 5. Dimensionering af sensorkredsløb Syddansk Universitet, Teknisk Fakultet

Side 24 af 67

af fototransistoren: Fototransistoren må maksimalt have en afstand fra den givne overflade (her: racerbanen) på

5mm. Ved større afstande er funktionaliteten ikke garanteret (læs datablad for CNY70). Fototransistoren må ikke placeres så tæt på banen, at der opstår fysisk kontakt herimellem,

når bilen svinger og dermed hælder mod enten højre eller venstre (hhv. venstre- og højresving)

Eftersom der på midten af banen (ca. 1cm – 2cm) er en aluminiumsskinne, som forsyner racerbilen, kan fototransistoren ikke måle hér. Det er hensigtsmæssigt, at placere fototransistoren så langt væk fra midten som muligt.

5.7 Brug af kondensator som nødspændingskilde Når racerbilen kører på banen, er der en risiko for, at forsyningsspændingen et kort øjeblik forsvinder eller reduceres. Dette kan f.eks. skyldes kortvarig manglende kontakt mellem bil og bane eller et område på aluminiumsskinnerne, der ikke er ledende (f.eks. p.g.a. støv, snavs eller lignende). Disse spontane spændingstab er af ødelæggende karakter for racerbilens gennemførelse af banen, da selv en meget kort afbrydelse betyder, at kommunikationen mellem PC og Bluetooth-modulet mistes og at microcontrolleren for et øjeblik ikke er tændt. Når begge situationer indtræder, er det altså nødvendigt, at have en sikkerhedsforanstaltning, der overtager. Til dette benyttes en kondensator. En kondensator har den egenskab, at den kan opretholde en ladning i en begrænset tid. Fra Bluetooth-modulets datablad fremgår det, at modulet maksimalt kan tolerere spændingsfald på 0,3V. Dette er i modsætning til microcontrollerens væsentligt større tolerance på næsten 2,5V. Da Bluetooth-modulets 3,3V afhænger af microcontrollerens forsyning på 5V kan det beregnes, hvor stort et spændingstab, kondensatoren skal forsøge at modvirke: 𝑉𝐴𝑇𝑀𝑒𝑔𝑎

𝑉𝐵𝑙𝑢𝑒𝑡𝑜𝑜𝑡ℎ=

5𝑉3,3𝑉

= 1, 51���� (5.16)

Dvs.: Δ𝑉𝐴𝑇𝑀𝑒𝑔𝑎 = 1, 51���� ∙ 0,3𝑉 = 0, 45����𝑉 (5.17) Dvs., at 5V-forsyningen ikke må falde mere end 0,45V, hvis Bluetooth-kommunikationen skal opretholdes. Det kendes fra kondensatorens I/V-karakteristik, at: 𝐼 = 𝐶 ∙

𝑑𝑉𝑑𝑡

(5.18)

hvor 𝐼 er strømmen, der oplader kondensatoren, 𝐶 er dens kapacitet, 𝑑𝑉 er spændingsændringen og 𝑑𝑡 er varigheden. Ved måling ses det, at hele kredsløbet (ATMega og sensorhardware inkl.) maksimalt forbruger 130mA (alt derover skyldes motorens effektafsættelse). Dermed mangler kun varigheden for at kunne bestemme kondensatorens størrelse. Det antages, at forsyningsafbrydelsen maksimalt strækker sig en afstand på 1cm (muligvis meget mindre!), og da bilens mindste hastighed (dvs. tophastighed i sving) er fundet i afsnit 4.5.1 til ca. 1,58𝑚

𝑠, kan varigheden af afbrydelsen bestemmes:

𝑣 =

Δ𝑠Δ𝑡

(5.19)

Page 25: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 5. Dimensionering af sensorkredsløb Syddansk Universitet, Teknisk Fakultet

Side 25 af 67

⇓ Δ𝑡 =

Δ𝑠𝑣

(5.20)

hvor 𝑣 er bilens hastighed, Δ𝑠 er den tilbagelagte strækning og Δ𝑡 er tiden brugt på at tilbagelægge strækningen. Altså er den maksimale varighed: Δ𝑡𝑀𝐴𝑋 =

0,01 𝑚

1,58𝑚𝑠= 0,00633𝑠 = 6,33 ∙ 10−3𝑠 (5.21)

Dermed kan kondensatoren dimensioneres: 0,13𝐴 = 𝐶 ∙

0,45𝑉6,33 ∙ 10−3𝑠

(5.22)

𝐶 =0,13𝐴 ∙ 6,33 ∙ 10−3𝑠

0,45𝑉= 0,001828𝐹 = 1828𝜇𝐹 (5.23)

Da de to nærmeste kondensatorer, som lagerføres, er 1500𝜇𝐹 og 2200𝜇𝐹 vælges naturligvis den største af disse. Der placeres altså en nødspændingskondensator på 2200𝜇𝐹 i parallelforbindelse med 5V-forsyningsspænding, som vist på Figur 5.1.

Page 26: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 6. Simulering, test og måling af racerbilens sensorer Syddansk Universitet, Teknisk Fakultet

Side 26 af 67

6 Simulering, test og måling af racerbilens sensorer I de følgende afsnit testes og undersøges racerbilens sensorer v.h.a. en række forsøgsopstillinger. Der gennemgås bl.a. finjustering og kalibrering af strain gages, optimering af racerbilens konstruktion m.h.t. tyngdepunkt, vægt m.m. og placeringen af fototransistorer. 6.1 Simulering af sving i laboratorium På Figur 6.1 fremgår resultatet af en simulering af sving. Den gule graf angiver strain gage-signalet fra én af de to AD623 instrumenteringsforstærkere (dvs. det forstærkede strain gage-signal). Den grønne graf viser en konstant referencespænding på komparatoren. Blå og rød graf repræsenterer hhv. venstre- og højresving. Så længe strain gage-konstruktionen er ubelastet (gul = grøn) er der ingen udsving, der antyder sving. Når strain gage-konstruktionen belastes i den ene retning, venstre f.eks., stiger spændingen (gul > grøn) og der gives logisk høj for venstre sving. Belastes strain gage-konstruktionen derimod i modsat retning falder spændingen (gul < grøn) og der måles logisk høj for højre. Et tilsvarende forsøg kan foretages, hvor gul i stedet måler på højresvings-forstærkeren. Dette vil betyde, at en højere spænding udløser et højresving (rød) og en lavere spænding udløser et venstresving (blå). Bemærk, at denne simulering blot illustrerer svingsensorens virkemåde. Når racerbilen i virkeligheden drejer ind i sving, viser det sig, at udsvingene fra forstærkerne (gul) er væsentligt mindre. Dette har imidlertid ingen betydning for resultatet: som det ses på figur Figur 6.1, er sensoren rigelig følsom til at registrere selv meget små belastninger. Se i øvrigt afsnit 6.2 om dette emne. Den grønne graf angiver som tidligere nævnt referencespændingen på komparatoren. Med dette menes der en komparator i standardkonfiguration (læs om den anvendte komparator i afsnit 5.4). Et eksempel på en komparator i ikke-standard-konfiguration er en såkaldt Schmitt trigger (se Figur 6.3). En Schmitt trigger er kendetegnet ved at benytte positiv feedback. Fordelen ved dette er, at der opnås en ’skiftezone’, eller ’treshold’, omgivet af to spændingsniveauer. Man kalder også teknikken

Figur 6.1: Simulering af sving v.h.a. oscilloskop. Gul: Strain gage-signal fra instrumenteringsforstærker

Grøn: Konstant referencespænding på komparator Blå: Logisk niveau for venstresving Rød: Logisk niveau for højresving

Figur 6.3: U: analogt signal, A: alm. komparator, B: Schmitt trigger

Kilde 13

Figur 6.2: Simulering af fejlkomparering: bemærk utroværdige impulser.

Page 27: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 6. Simulering, test og måling af racerbilens sensorer Syddansk Universitet, Teknisk Fakultet

Side 27 af 67

for en hysteresekomparering27. Resultatet er, at det analoge signal skal krydse ét spændingsniveau for at komparatoren reagerer med høj udgang og krydse et andet for at komparatoren reagerer med lav udgang. Hysteresekomparering sikrer, at støj i det analoge signal (f.eks. fra omkringværende AC-signaler) ikke skaber utroværdige kompareringer.28 På Figur 6.2 er fejlfænomenet illustreret ved simulering. I denne forsøgsopstilling udsættes vægtstangen med strain gages for en belastning netop så stor, at signalet varierer mellem at være mindre og større end referencen. Som det ses opstår en masse pulser, som – hvis ikke undgået - vil ødelægge måling af banen. I praksis er der indsat to førsteordens lavpasfiltre (læs afsnit 5.3) på instrumenteringsforstærkernes indgange, hvorfor der ikke behøves Schmitt triggerens støjimmunitet. Det er desuden blevet vurderet, at racerbilen bevæger sig så hurtigt rundt i sving, at vægtstangen ikke på noget tidspunkt vil ’hænge’ og udløse uønskede kompareringer som set på Figur 6.2. 6.2 Undersøgelse af strain gagens sensitivitet V.h.a. to monterede potentiometre i parallelforbindelse (hhv. R10 og R11 på Figur 5.1) på begge 10Ω, er det muligt at justere referencespændingerne på instrumenteringsforstærkerne (hhv. U5 og U6 på Figur 5.1). Referencespændingerne afgør, hvornår spændingsforskellen mellem instrumenterings-forstærkerens inverterende og ikke-inverterende er positiv eller negativ. Hvis positiv søger instrumenterings-forstærkeren mod positiv mætning (5V), hvis negativ mod negativ mætning (0V). Kalibreringen foretages i forhold til to kravspecifikationer: Strain gage-konstruktionen skal være følsom nok til at reagere på accelerationer mindre end

den mindste centripetalacceleration fundet i afsnit 4.5.4 (7,68 𝑚𝑠2

). Strain gage-konstruktionen skal være tolerant overfor rystelser og ujævnheder i/på banen.

Forsøgsopstillingen er vist skematisk på figur Figur 6.4. Racerbilen stilles på et stykke vandret bane og der fastgøres prober fra et oscilloskop til strain gage-konstruktionens udgang. I vandret position skal strain gage-signalet (SG-signalet) være lavt (0V). Herefter udnyttes det, at tyngdeaccelerationen er 9,82 𝑚

𝑠2. Siden bilen højst vil opleve

en acceleration på 9,78 𝑚𝑠2

(se afsnit 4.5.2) skal SG-signalet gå højt (5V) ved en given vinkel på banen. Eksempelvis vil bilen ved en tiltning på 45° opleve en ortogonal acceleration på (i.f.t. strain gages):

𝑎45° = 𝑔 ∙ sin(45°) = 9,82𝑚𝑠2∙ sin �

𝜋4� ≈ 7,72

𝑚𝑠2

Bilens underlag tiltes nu, indtil oscilloskopet viser, at SG-signalet går højt. Når dette sker noteres højden fra jorden til bilens øverste hjul. Det viser sig, at denne katete er 8cm. Ved at anvende en simpel definitionen af sinus fås: sin(𝑣) =

8𝑐𝑚15,5𝑐𝑚

(6.1)

27 Hysterese, af det græske hysteresis ’det at komme senere’: at et apparat reagerer forskelligt på en voksende og aftagende ydre påvirkning. Kilde 14. 28 Ulempen ved en Schmitt trigger er til gengæld, at den kræver flere komponenter og mere plads. Sensitiviteten kompromitteres også, da det analoge signal skal passere en større barriere (højere spændingsniveau).

Figur 6.4: Test af sensitivitet af strain gages

Page 28: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 6. Simulering, test og måling af racerbilens sensorer Syddansk Universitet, Teknisk Fakultet

Side 28 af 67

𝑣 = sin−1 �8𝑐𝑚

15,5𝑐𝑚� = 31,1° (6.2)

Denne vinkel forårsager en ortogonal acceleration på: 𝑎31,1° = 𝑔 ∙ sin(31,1°) = 9,82

𝑚𝑠2∙ sin(0,54) ≈ 5,07

𝑚𝑠2

(6.3) Ved denne kalibrering er strain gages følsomhed høj nok til at registrere bilens sving og samtidigt også tolerant overfor uønskede rystelser m.m. Samme kalibrering foretages for sving i modsat retning. 6.3 Undersøgelse af friktionskoefficient mellem bil og bane Eftersom samtlige beregninger på strain-gage-konstruktionen afhænger af den acceleration, som virker på bilen, er det nødvendigt at beregne denne nøjagtigt. Som vist i afsnit 4.5.1 afhænger racerbilens tophastighed i sving af tre fysiske størrelser: friktionskoefficienten ml. bil og bane, tyngdeaccelerationen og svingets radius. De to sidstnævnte er kendte størrelser og i dette afsnit beregnes friktionskoefficienten. På Figur 6.5 er forsøgsopstillingen skitseret. Bilens to hjulaksler tages ud og genindsættes således, at de modarbejder hinanden, dvs. at bilen ikke kan rulle. Det skal bemærkes, at der på bilens undervogn fra fabrikken er fastgjort en magnet, hvilket bidrager betragteligt til en downforce på bilen. Bilens underlag tiltes herefter og vinklen mellem underlag og vandret måles, når bilen begynder at glide nedad. Denne vinkel blev målt til 𝑣 = 85°. På frit-legeme-diagrammet på Figur 6.5 ses hvilke kræfter, der virker på bilen: en tyngdekraft med to komposanter (𝐹𝑑𝑜𝑤𝑛𝑓𝑜𝑟𝑐𝑒 og 𝐹𝑎𝑐𝑐) og en friktionskraft mellem hjul og underlag. Friktionskraften er givet ved: 𝑓𝜇 = 𝐹𝑁 ∙ 𝜇 = 𝑚𝑔𝜇 (6.4) hvor m er legemets masse, g er tyngdeaccelerationen og 𝜇 er friktionskoefficienten. Tilsvarende kan der opstilles et udtryk for den modsatrettede kraft, 𝐹𝑎𝑐𝑐. Downforce-kraften påvirker ikke bilens acceleration op- eller nedad banen, derfor må 𝐹𝑎𝑐𝑐 nødvendigvis være ene om, at modvirke friktionskraften. 𝐹𝑎𝑐𝑐 findes ved at betragte kraftsystemet som en vinkelret trekant, se Figur 6.6. Hypotenusen, 𝑚𝑔, og vinklen 90° − 𝑣 kendes Dermed kan der opstilles et udtryk for 𝐹𝑎𝑐𝑐: 𝐹𝑎𝑐𝑐 = 𝑚𝑔 ∙ cos(90° − 85°) = 𝑚𝑔 ∙ cos �

𝜋36� (6.5)

I det øjeblik, hvor bilen begynder at glide, er 𝐹𝑎𝑐𝑐, blevet større end den modsatrettede friktionskraft. Dermed kan følgende ligning opstilles:

Figur 6.5: Måling af friktionskoefficient

Figur 6.6: Kraftsystem opstillet som vinkelret trekant

Page 29: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 6. Simulering, test og måling af racerbilens sensorer Syddansk Universitet, Teknisk Fakultet

Side 29 af 67

𝑓𝜇 ≅ 𝐹𝑎𝑐𝑐 (6.6) 𝑚𝑔𝜇 ≅ 𝑚𝑔 ∙ cos�

𝜋36� (6.7)

Dette kan også skrives: 𝜇 ≅ cos�

𝜋36� = 0,991 (6.8)

I afsnit 4.5.1 bruges den fundne friktionskoefficient til at beregne bilens teoretiske tophastighed i sving. 6.4 Undersøgelse af racerbilens tophastighed Kendskab til bilens tophastighed på både lige strækninger og i sving er en nødvendighed i projektet, da PWM-signalet, som regulerer motorens forsyningsspænding, er baseret på et procentvist forhold mellem den ønskede hastighed og bilens tophastighed (se afsnit 7.1). Dvs., at bilens hastighed angives med en procentværdi, hvilket forudsætter kendskab til tophastigheden. Generelt kan det skrives: %𝑎𝑘𝑡𝑢𝑒𝑙 =

𝑣𝑎𝑘𝑡𝑢𝑒𝑙𝑣𝑚𝑎𝑥

∙ 100 % (6.9)

Eller 𝑣𝑎𝑘𝑡𝑢𝑒𝑙 =

%𝑎𝑘𝑡𝑢𝑒𝑙

100 %∙ 𝑣𝑚𝑎𝑥 (6.10)

hvor 𝑣𝑚𝑎𝑥 er tophastigheden på lige strækninger. En måling af tophastigheden i sving skal verificere beregningen i afsnit 4.5.1. Det er beregnet, at motoren ved laveste hastighed (30 %), vil rotere med 83Hz. 6.4.1 Måling af tophastighed på lige strækninger Forsøgsopstillingen til denne måling inkluderer et videokamera, en længdeskala (f.eks. lineal), et tilpas langt banestykke (er fundet ved måling) og den køreklare racerbil (se Figur 6.7). Videooptagelsen startes, hvorefter bilen sættes til at accelerere med størst muligt forsyningsspænding på motoren – dvs., der benyttes en PWM duty cycle på 100 %. Når bilen når enden af banestykket vurderes den at have opnået tophastighed. V.h.a. linealen og en tidsmåling kan gennemsnitshastigheden mellem to punkter bestemmes, f.eks. mellem 90cm og 100cm: 𝑣𝑎𝑣𝑔 =

Δ𝑠Δ𝑡

(6.11)

hvor Δ𝑠 er den tilbagelagte strækning og Δ𝑡 er tiden brugt på at tilbagelægge strækningen. Denne slags måling kan gøres mere nøjagtig ved at lade intervallerne Δ𝑠 og Δ𝑡 gå imod 0: 𝑣ø𝑗𝑒𝑏𝑙𝑖𝑘𝑘𝑒𝑙𝑖𝑔 = lim

Δ𝑡→0

Δ𝑠Δ𝑡

=𝑑𝑠𝑑𝑡

(6.12)

Figur 6.7: Måling af tophastighed v.h.a. Logger Pro.

Page 30: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 6. Simulering, test og måling af racerbilens sensorer Syddansk Universitet, Teknisk Fakultet

Side 30 af 67

Til disse beregninger bruges et dataanalyseprogram (Logger Pro 3.x). Tophastigheden på lige strækninger måles til 𝑣𝑚𝑎𝑥 = 4,3𝑚

𝑠.

6.5 Undersøgelse af racerbilens gearing og motoromdrejningstælleren Der er fra producentens side indsat tandhjul af forskellige størrelser, der i sidste ende gør, at hjulenes hastighed er betydeligt lavere end motorens. Gearingen i denne bil er skabt ved to par af tandhjul pr. akse, hvilket vil sige, at der er et mellemstykke, som hverken hænger fast på hjulene eller motoren. Da tandhjulene passer ind i hinanden må de have samme bredde, og dermed kan deres omkreds måles i tænder i stedet for en standard SI enhed – det, der betyder noget, er forholdet mellem omkredsene - ikke den absolutte størrelse af nogen af dem. Eksempelvis vil et tandhjul med 10 tænder sat sammen med et tandhjul med 20 tænder resultere i en omdrejningshastighed på det halve af det originale: 𝑟𝑝𝑚𝑜𝑢𝑡 =

𝑡𝑖𝑛𝑡𝑜𝑢𝑡

∙ 𝑟𝑝𝑚𝑖𝑛 →1020

∙ 𝑟𝑝𝑚𝑖𝑛 =12𝑟𝑝𝑚𝑖𝑛 (6.13)

tin drejer med hastigheden rpmin og tout drejer med rpmout. Den første transmission består af tandhjulene t1,1=10 (blå på Figur 6.8) og t1,2=14 (rød), og det giver en gearing på: 𝐺1 =

𝑡1,1

𝑡1,2=

1014

=57

= 0,71 (6.14)

Dvs., at mellemstykket (bestående af tandhjulene t1,2 og t2,1 (grøn)) drejer 0,71 omgang pr. motoromdrejning. Den anden transmission består af t2,1=9 og t2,2=27 (grå), hvilket resulterer i: 𝐺2 =

𝑡2,1

𝑡2,2=

927

=13

= 0, 33���� (6.15)

Altså drejer hjulene 0,33 omgange pr. omgang for mellemstykket. Ved at gange disse to tal sammen fås forholdet mellem hjulomdrejning og motoromdrejning, 𝐺: 𝐺𝑡𝑜𝑡𝑎𝑙 = 𝐺1 ∙ 𝐺2 =

57∙

13

=5

21= 0,24 (6.16)

Det kræver altså godt 4 omdrejninger for motoren at dreje hjulene en omgang. Hjulenes omkreds er målt til 8,6cm. Det betyder, at bilen bevæger sig 2,04 cm pr. motoromdrejning. Til at måle disse motoromdrejninger benyttes en fototransistor, læs afsnit 5.5. Eftersom motoren er en trefaset DC motor, vil fototransistoren registrere tre pulser pr. motoromgang. Dermed fås en hastighed på 6,83mm pr. puls eller 146,529 pulser pr. meter. Hvis bilens højeste målte hastighed er 4,3 m/s, vil dette svare til en pulsfrekvens på 630 Hz, hvilket både fototransistoren, komparatoren og selve processoren kan håndtere.

29 Der er en hvis usikkerhed forbundet med disse fysiske målinger: ved måling fås 144 pulser pr. meter.

Figur 6.8: Farveredigeret billede af gearet. Blå=𝑡1,1, Rød=𝑡1,2, Grøn=𝑡2,1,

Grå=𝑡2,2

Page 31: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 7. Udvikling af software og AVR interface Syddansk Universitet, Teknisk Fakultet

Side 31 af 67

7 Udvikling af software og AVR interface I de følgende afsnit behandles problemstillingerne vedrørende interface mellem hardware (dvs. sensorer og motor) og microcontroller og interfacet mellem microcontrolleren og terminalprogrammet på en PC. 7.1 PWM: styring af elektromotoren PWM er forkortelsen for Pulse Width Modulation (pulsbreddemodulation) og er en teknik, der bruges til regulering af elektriske enheder, f.eks. elmotorer. Idéen er, at man digitalt kan kontrollere pulsbredden i et givet firkantsignal og dermed f.eks. styre hastigheden på en transistor, et relæ eller i dette tilfælde en motor. På det udleverede ATMega32-print er én af microcontrollerens ben forbundet til en MOSFET30 (se Figur 7.1). Når PWM-signalet fra microcontrolleren er aktivt, vil MOSFETen tænde og slukke med et interval, der afhænger af PWM-signalets duty cycle31. Da motoren fungerer som et elektronisk integrationsled (se afsnit 4.6), vil PWM-signalets gennemsnit afgøre motorens forsyningsspænding. Således medfører en PWM duty cycle på 50 % altså, at motoren forsynes med 50 % af forsyningsspændingen (hér 15V). Duty cyclen er direkte konfigurerbar v.h.a. digitale kommandoer på micro-controlleren. Således kan motorens forsynings-spænding, og dermed dens rotationshastighed, styres digitalt. I dette projekt er der brugt den form for PWM, der hedder ”Non-inverted Fast PWM”. Til at styre denne PWM er Timer2 blevet valgt (se afsnit 7.2.3). Dette er grundet opbygningen af det udleverede print. Port D7 eller OC2 (output benet for Timer2 signalet) er nemlig på forhånd blevet navngivet som PWM_Motor. PWM-signalet kan igangsættes af en timer, som kontinuerligt tæller fra 0 til 255. Hver gang timeren når topværdien (255) begynder den forfra fra 0. Der indlæses herefter en værdi i et register, som microcontrolleren konstant bruger til at sammen-ligne timerens værdi med (et tal mellem 0 og 255). Så længe referencen ikke er nået af timeren er PWM-signalet sat til logisk høj. Når timeren når til den angivne sammenligningsværdi (reference), sættes PWM-signalet til logisk lav indtil timeren starter forfra fra 0. Resultatet af denne teknik er altså et firkantsignal med en pulsbredde, der afhænger af én referenceværdi i timeren. Eksempelvis vil referenceværdien 255 give en PWM duty cycle på 100 %, siden timerens værdi aldrig bliver større end

30 Metal-Oxide-Semiconductor Field-Effect Transistor 31 Duty cycle angiver, hvor stor en procentdel af perioden af et signal er logisk højt. F.eks. svarer 50 % duty cycle til et PWM-signal med logisk høj i 𝑇/2 og logisk lav i 𝑇/2 (𝑇 = periode).

Figur 7.1: Uddrag fra ATMega32 datablad. PWM-signal tænder/slukker MOSFET

Figur 7.2: Illustration af PWM v.h.a. Timer-sammenligning.

Page 32: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 7. Udvikling af software og AVR interface Syddansk Universitet, Teknisk Fakultet

Side 32 af 67

denne værdi. Tilsvarende vil en referenceværdi på 0 resultere i en duty cycle på ca. 0 %32, og motoren vil altså være slukket. I programmeringssproget Assembler (se mere i afsnit 7.2) kan PWM opsættes på følgende måde:

1. Læs den værdi ind i TCCR2 registeret, som indikerer hvilket mode der skal bruges og hvor stor prescaleren33 skal være. Initialiseringen af TCCR2 starter også timeren. Se evt. Figur 7.3

2. Udregn værdien for hvor mange procent duty cycle der ønskes efter følgende formel:

%𝐷𝑈𝑇𝑌 𝐶𝑌𝐶𝐿𝐸 =𝑂𝐶𝑅2 + 1

256∙ 100 % (7.1)

3. Læs den ind i OCR2 registeret.

I dette projekt er der som nævnt tidligere brugt Non-inverted Fast PWM og en prescaler på 128. Ved brug af Figur 7.3 kan det ses at man derfor skal læse binær værdi 0b01101101 ind i TCCR2 registeret. Den største hastighed bilen kan køre rundt i et sving med er fundet til ca. 36 % af dens tophastighed (se afsnit 4.5.1). Af hensyn til ukendte faktorer, usikkerhed i beregninger m.m. holdes en sikkerhedsmargin til den fundne tophastighed. Derfor sættes PWM duty cycle til 30 % som standardhastigheden i sving. For at finde denne hastigheds korresponderende Timer-sammenligningsreference benyttes ligning 7.1: 30 % =

𝑂𝐶𝑅2 + 1256

∙ 100 % (7.2)

𝑂𝐶𝑅2 =

30 % ∙ 256100 %

− 1 = 75,8 ≈ 76 (7.3)

32 J.f. ligning 7.1: duty cycle kan aldrig blive 0, da der står ”+1” i tælleren 33 Prescale angiver hvor stor en brøkdel af microcontrollerens clockfrekvens timeren skal operere med.

Figur 7.3: Illustration fra Kilde 2 - Side 323. Viser opsætning af PWM.

Page 33: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 7. Udvikling af software og AVR interface Syddansk Universitet, Teknisk Fakultet

Side 33 af 67

Det ses, at der skal indlæses 76 i OCR2-registeret for at opnå en PWM på 30 % duty cycle. 7.2 Anvendte programmeringsteknikker i Assembler Der skal foregå en interaktion mellem terminalprogrammet på PC og hardwaren på bilen. De fysiske påvirkninger, som sensorerne udsættes for, skal fortolkes og oversættes til et digitalt sprog, hvorefter en PC kan behandle det opsamlede data. Denne datafortolkning, konvertering og kommunikation sker på ATMega32 microcontrolleren, som er kort forklaret i afsnit 4.4. ATMega32 microcontrolleren er i dette projekt programmeret i sproget Assembler, som befinder sig et abstraktionsniveau over maskinkoden. Assembler er dog væsentligt mindre abstrakt end højniveausprog som f.eks. C++. I de følgende afsnit redegøres der for microcontrollerens vigtigste funktioner i dette projekts kontekst. Microcontrolleren er i stand til enten at sætte en manuel hastighed eller automatisk at regulere hastigheden afhængigt af, hvor på banen bilen befinder sig. Mikroprocessoren opsættes med en 16MHz ekstern krystal og til hukommelsen bruges intern flash. 7.2.1 Opsætning og udførelse af kommunikation Til kommunikation til og fra mikroprocessoren bruges microcontrollerens USART34. Der benyttes en asynkron kommunikation. Ved asynkron kommunikation er der ikke en fælles timer imellem sender og modtager af objekter, hvorfor der i stedet opsættes to separate timere: én på microcontrolleren og én på Bluetooth-modulet. Der ønskes en baud rate på 9600 bps35. Det kan ikke lade sig gøre at sætte mikroprocessoren til præcis den værdi, men den kan tilnærmes v.h.a. følgende formel: 𝐵𝑎𝑢𝑑 𝑟𝑎𝑡𝑒 =

𝑓𝐶𝐿𝐾16 ∙ (𝑈𝐵𝐵𝑅 + 1)

(7.4)

hvor UBBR er et register, der bruges til at styre baud rate. Den ønskede baud rate på 9600 bps indsættes: 9600𝑏𝑝𝑠 =

16𝑀𝐻𝑧16 ∙ (𝑈𝐵𝐵𝑅 + 1)

(7.5)

𝑈𝐵𝐵𝑅 =16 ∙ 106𝐻𝑧

16 ∙ 9600𝑏𝑝𝑠− 1 = 103,167 ≈ 103 (7.6)

Det giver en fejl på 0,16 % per bit. For at imødekomme denne usikkerhed, nulstilles kommunikationen på microcontrolleren hver gang, der ikke er ind- elle udgående kommunikation. Således når den summerede fejl aldrig, at ødelægge kommunika-tionen. Kommunikationsarkitekturen er simpelt illustreret på Figur 7.4. 34 Universal Synchronous/Asynchronous Reciever/Transmitter 35 Bits per Second

Figur 7.4: Kommunikationsarkitektur

Page 34: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 7. Udvikling af software og AVR interface Syddansk Universitet, Teknisk Fakultet

Side 34 af 67

Selve informationspakken, som kommunikeres mellem microcontroller og Bluetooth-modul, består af 8 bit. Hele kommunikationsprotokollen udgøres dog af 10 bit, da der skal indgå både et start- og stop-bit. Start-bittet er altid lavt mens stop-bittet altid er højt. På Figur 7.5 illustreres dette princip: der sendes karakteren "A" (binært 01000001 i ASCII) fra microcontroller til Bluetooth-modul. Først sendes start-bittet, som er LSB36, for at indikere, at der modtages information. Derefter sendes binær-værdien for ”A”, og der afsluttes med et stop-bit for at indikere, at informationen er modtaget. 7.2.2 Opsætning af Bluetooth-modul Når Bluetooth-modulet tændes første gang, er den pr. standard konfigureret med en baud rate på 115.200 bps. Denne skal først nedjusteres til 9600 bps så den sender og modtager bits med samme hastighed som microcontrolleren. Dette kan gøres ved at oprette forbindelse til Bluetooth-modulet fra et eksternt terminalprogram og indstille baud rate til det ønskede – i dette tilfælde 9600 bps. 7.2.3 Opsætning af Timere og interrupts I projektet benyttes to af microcontrollerens timere, og tre af microcontrollerens interrupts. Nedenfor ses en tabeloversigt over de brugte timere og interrupts:

Timer Funktion Timer0 Timer0 bruges til at tælle den tid, det tager at

køre en omgang på banen og den hastighed bilen kører med.

Timer0 overflow interrupt Timer0 overflower hvert fjerde millisekund og udløser et interrupt.

Timer2 Bruges til at styre PWM. Ekstern interrupt 0 (målstregsregistrering) Laver et interrupt hver gang bilen passerer

målstregen. Ekstern interrupt 1 (motoromdrejninger) Laver et interrupt hver gang motoren har kørt en

tredjedel motoromdrejning. Timer0 Timer0 bruges til at tælle den tid, det tager at køre en omgang på banen, og til at måle bilens hastighed. Den interruptes hver gang der går fire millisekunder (ved timerens overflow).

𝑇𝑖𝑑 = (28 − 𝑇𝐶𝑁𝑇) ∙ 𝑝𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟

𝐹=

(28 − 6) ∙ 25616.000.000𝐻𝑧

= 0,004 𝑠 = 4 𝑚𝑠 (7.7)

TCNT registret er den værdi, som timeren tælles op fra. En prescaler er en skalering af clockfrekvensen, f.eks. 1/8, 1/64 𝑒𝑙𝑙𝑒𝑟 i dette tilfælde 1/256. Hver gang der er et interrupt vil et register, som repræsenterer bilens hastighed, blive forøget med én. Et register som repræsenterer banetiden, vil også blive forøget med én. Hvis banetiden har ramt 255, vil denne værdi blive sendt til PC'en, og banetiden vil blive nulstillet. Efter interruptet genstartes timeren samme opsætning som før. Timeren er sat i normal-, non-inverted mode med en prescaler på 256. For at gøre dette indsættes 0b00000100 ind i timerens kontrolregister. 36 Least Significant Bit (Mindst betydende bit)

Figur 7.5: Intern kommunikationsprotokol

Page 35: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 7. Udvikling af software og AVR interface Syddansk Universitet, Teknisk Fakultet

Side 35 af 67

Timer2 Timer2 bruges til at styre PWM. Den sættes i Fast PWM mode, som omtalt i afsnit 7.1. Det kan indstilles ved programmering, hvor lang tid microcontrolleren skal bruge på at udføre timerens optælling. V.h.a. nedenstående ligning kan timerens periodetid udregnes (for en 8bits PWM):

𝑇𝑖𝑑 = (28 − 𝑇𝐶𝑁𝑇) ∙ 𝑝𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟

𝐹=

(28 − 0) ∙ 12816.000.000𝐻𝑧

= 2,046 𝑚𝑠 ≈ 2 𝑚𝑠 Ekstern interrupt 0 Hver gang målstregen registreres, vil ekstern interrupt0 aktiveres. Interruptrutinen tæller en baneomgang og den resterende banetid bliver sendt til PC'en. Hukommelses-pointeren37 vil blive nulstillet. Ekstern interrupt 1 Når motoren har drejet en tredjedel omgang, vil ekstern interrupt1 blive aktiveret. Først tjekkes om bilen har nået målstregen. Er dette ikke tilfældet, har interruptet ingen funktion. Når motoren har kørt 20 omdrejninger, sendes tiden for brugt på disse omdrejninger til PC'en. Hvis målstregen er blevet registreret, men bilen stadig ikke har gennemført banen, vil ekstern interrupt1 gemme information om banen til hukommelsen, såsom registrering af sving og tilbagelagt strækning. Hvis der er blevet kørt en omgang på banen, vil den gemte information blive hentet fra hukommelsen, og bilens hastighed reguleres af PWM fra microcontrolleren. Et eksempel på, hvordan timer 0 sættes op til at tælle til 4 millisekunder fremgår på Figur 7.6:

Der er valgt at tælle til 4 millisekunder, da det varer omkring 3,1 millisekunder at sende et signal til PC'en med en baud rate på 9600 bps. (se afsnit 7.5). Dette vil aldrig kompromittere kommunikationen, da kommunikationen og interrupts forløbet synkront.

På Figur 7.7 ses opsætningen af interrupt vektortabellen. Denne er placeret så tidligt som muligt i programkoden. Der skal opsættes statusregistre for de omtalte interrupts, for at aktivere disse. Derudover skal global interrupt flaget sættes i SREG (status register). Når et interrupt aktiveres, deaktiveres global interrupt flaget - dvs. andre interrupts, der forekommer i løbet af udførelsen af en 37 Pointeren ’peger’ på en specifik adresse i hukommelsen.

Figur 7.6: Eksempel på opsætning af timer0

Figur 7.7: Interrupt vektortabellen

Page 36: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 7. Udvikling af software og AVR interface Syddansk Universitet, Teknisk Fakultet

Side 36 af 67

interruptrutine, blokeres. Når der vendes tilbage fra et interrupt, vil global interrupt flaget automatisk blive sat igen. De to eksterne interrupts er sat til kun at blive aktiveret hver gang microcontrolleren registrerer at målstregen passeres eller motoren har drejet en tredjedel omgang. Sensoren fra målstregssensoren er sat til INT0-benet og motoromdrejningssensoren er sat til INT1-benet. De brugte Interrupts er på Figur 7.7 listet efter, hvilken prioritet de har. Bemærk at der ikke er noget interrupt der refererer til "Reset", men at programmet vil hoppe tilbage i "Reset" efter de andre interrupts er udført. Prioritetsrækkefølgen er ikke programmerbar men indbygget af producenten. 7.2.4 Lagring af data i microcontrollerens hukommelse For at microcontrolleren har mulighed for at ”huske” eller genskabe banen efter at have gennemført den, må sensorernes oplysninger nødvendig lagres et sted. Til dette benyttes microcontrollerens indbyggede hukommelse. Bilen vil ikke lave nogle opmålinger indtil den første gang passerer startlinjen. Herefter vil den begynde at gemme alle sensordata til hukommelsen. Hver gang motoren har foretaget en tredjedel omgang, aktiveres interrupt fra motorsensoren. Hver gang dette interrupt afvikles læser microcontrolleren strain gages tilstand (logisk høj eller lav) og denne information gemmes til hukommelsen. For at være sikker på, at informationen lagres det korrekte sted i den rigtige rækkefølge benyttes en pointer som forøges med en for hvert interrupt. Efter en hel bane er gennemført stilles hukommelses-pointeren til hukommelsens startværdi. På Figur 7.8 branches38 der i første omgang til gem-funktionen. Der gemmes information afhængigt af om bilen drejer til højre, venstre eller der ingen udsving er på strain gages (se afsnit 4.1). Efter én hel omgang på banen, branches der til laes-funktionen. Her vil information fra hukommelsen om sving blive hentet 20 motoromdrejninger længere fremme på banen. Dette gøres for at have tid til at decelerere inden sving. Efter bilen er kørt ind i svinget, bliver den ved med at læse information fra hukommelsen fra bilens nøjagtige position på banen indtil svinget er slut. Efter svinget slutter, vil bilen lave en kontrolleret acceleration op til 70 % PWM. Når et nyt sving registreres 20 motoromdrejninger længere fremme i hukommelsen vil bilen igen gradvist decelerere. Se Figur 7.9.

38 Branch = spring el. hop i programkoden

Figur 7.8: Lagringsfunktionen i microcontrolleren

Page 37: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 7. Udvikling af software og AVR interface Syddansk Universitet, Teknisk Fakultet

Side 37 af 67

Værdien 0x0F på register 23 vil resultere i en hastighed på 30 % PWM (venstre sving). Værdien 0xFF vil give en hastighed på 35 % PWM (højre sving).

7.2.5 Princippet bag accelerationsregulering Hver gang bilen skal accelerere eller decelerere kaldes en timer til at regulere accelerationen eller decelerationen – dette gøres for at undgå hjulspind eller -blokade, hvilket er fatalt for microcontrollerens visualisering af banen. Når der ændres hastighed i automode vil Timer2s OCR register (Output Compare Register sammenligner timerens værdi med en fast værdi) kun ændre sig én værdi af gangen med en kontrolleret forsinkelse imellem hver ændring. Disse forsinkelser el. loops er vist på Figur 7.10. Til beregning af timeren, som bruges til denne accelerationsregulering, tages hver instruktions tidsforbrug i be-tragtning (regnes i clock cycles):

Kommando39 CLK-cycles ldi 1 brne 1 el. 2 dec 1 ret 4

Herefter kan forsinkelsen beregnes:

𝑡 = (3 ∙ 255 + 2) ∙ 3 + (3 ∙ 2 + 2) + 4 + 4

16𝑀𝐻𝑧= 144,813 µ𝑠 ≈ 145 µ𝑠 (7.8)

39 Se afsnit 13.3 i Bilag for en forklaring af kommandoerne.

Figur 7.9: Indlæsningsfunktionen: hentning af oplysninger om sving på banen

Figur 7.10; Brug af loops til gradvis acceleration og deceleration.

Page 38: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 7. Udvikling af software og AVR interface Syddansk Universitet, Teknisk Fakultet

Side 38 af 67

(3 ∙ 255 + 2) ∙ 3 er den tid det tager at køre gennem det indre loop 3 gange. (3 ∙ 2 + 2) er den tid det tager at køre gennem det ydre loop. 4 er for ldi kommandoerne, 4 er for ret kommandoen og 16 MHz er processorens clockfrekvens. Denne accelerationsregulering er kun implementeret i bilen automode. Ændres PWM-værdien i manuel mode, vil bilen accelerere eller decelerere med det samme, hvilket giver mulighed for hjulspind og en dårlig opmåling af banen. 7.3 Gennemgang af Assembler-kode til microcontroller I dette afsnit gennemgås metoder, funktioner og programopbygning programmeret i Assembler til microcontrolleren. 7.3.1 Initialisering af microcontroller Programmet initialiseres ved at opsætte diverse interrupts, porte, USART samt registre og pointers til hukommelsen. Derefter venter programmet på at modtage et signal for at starte. Det næste signal, der modtages skal indikere, om der skal anvendes manuel mode, automode, eller om motor-styringen (PMW) skal stoppe. Automode hopper ikke op til "wait on signal to start", da den forventer at få det signal for at bryde automode-loopet. Stop mode og manuel mode kører ikke i loop. 7.3.2 Flowchart for manuel og stopmode På Figur 7.12 illustreres manuel mode og stopmode. Hvis der vælges manuel mode skal der indtastes en værdi mellem 0 og 100, som angiver procent duty cycle til PWM-signalet. Den modtagede værdi multipliceres med 2,55 ved at flytte tallet over i tre registre. Det ene register multipliceres med 2, det andet register divideres med 2 og det tredje divideres med 20. Herefter adderes de tre registerværdier og sættes ud på OCR2-registret. Bilen vil dermed køre med den PMW indtil der modtages en ny kommando fra computeren. Denne metode har en usikkerhed på cirka 0,75 % p.g.a. diverse afrundningsfaktorer. Stopmode stopper PWM helt. 7.3.3 Flowchart for interrupts På Figur 7.13 ses et flowchart for interruptrutinen for timer0 overflow samt håndteringen af input fra målstregssensoren. Når Timer0 interrupt aktiveres forøges et register til at tælle banetiden og et register til at lave en hastighedsmåling. Derefter startes timeren igen. Hvis registeret til at tælle banetid har nået sin grænse på 0xFF, sendes denne værdi til PC'en. Hver gang der er kørt en omgang på banen bliver ekstern interrupt 0 aktiveret. Den nulstiller hukommelses-

Figur 7.11: Initialisering af microcontroller

Figur 7.12: Manuelmode og stop

Page 39: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 7. Udvikling af software og AVR interface Syddansk Universitet, Teknisk Fakultet

Side 39 af 67

pointeren og sender den resterende tid til computeren. Første gang bilen passerer målstregen vil timer 0 blive aktiveret. 7.3.4 Digitalisering af banen og lagring af sensorinput På Figur 7.14 ses et flowchart for motoromdrejningssensorens interrupt. Der sker et interrupt for hver tredjedel motoromdrejning. Når der er talt 20 omdrejninger sendes tiden for motor-omdrejningerne til computeren. Har bilen endnu ikke passeret målstregen aktiveres interrupt ikke. Når bilen er i gang med at køre første omgang på banen, vil der blive gemt information om, hvor svingene befinder sig til hukommelsen. Har bilen kørt mere end én omgang på banen, vil der blive hentet information fra hukommelsen om svingenes position på banen, og PWM vil blive indstillet med udgangspunkt i denne information.

Figur 7.13: Interruptrutine for timer0 og målstregssensor.

Figur 7.14: Interrupts fra motoromdrejnignssensor

Page 40: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 7. Udvikling af software og AVR interface Syddansk Universitet, Teknisk Fakultet

Side 40 af 67

7.3.5 Automode På Figur 7.15 ses en illustration af bilens automode. Sættes bilen til at køre automode, vil hastigheden blive sat til 30 % PWM indtil bilen er færdig med at opmåle banen. Derefter vil bilen selv finde ud af, hvornår den skal accelerere og decelerere ved at bruge den information som hentes fra hukommelsen. Automoden kører i en løkke, og tjekker jævnligt om der er kommet et signal fra PC'en. Kommer der et signal hopper den tilbage til initialiseringen af microcontrolleren. Se Figur 7.11. 7.4 Kommunikation mellem racerbil og PC-

program Idet man i projektet arbejder med to forskellige individuelle processorer, vil det være nødvendigt at aftale en fælles protokol for, hvordan man ønsker kommunikation mellem systemerne skal foregå. Hvis ikke systemerne følger den samme kommunikations-protokol er det meget usandsynligt, at de vil forstå hinanden. Specielt i dette tilfælde, hvor det ene system er programmeret i Assembler-kode og det andet i C++. Begge programmerings-sprog har deres egne præferencer for hvordan kommunikation skal foregå optimalt for dem selv. Dette projekt er blevet pålagt at strukturere alle sendte data i pakker af tre bytes. Disse tre bytes refereres til som type-byte, kommando-byte og data-byte. Type-byten vil umiddelbart fungere mest som en kontrol-byte i dette projekt. Det er på intet tidspunkt nødvendigt at udbede sig opdateret data fra bilen, så der vil kun være én korrekt type-byte i hver retning. Hvis ikke typen matcher denne type-byte ved modtagelsen i et af systemerne, vil dataen være korrupt. Højst sandsynligt fordi datakommunikationen blev modtaget forkert. Protokollen mellem bilen og PC’en er som følger: Type Kommando Data Til bilen 0x55 (Set) 0x10 (Start) Tal mellem 0x00-0x64 0x55 (Set) 0x11 (Stop) 0x00 0x55 (Set) 0x12 (Auto) 0xFF Fra bilen 0xBB (Reply) 0x01 (Bane ikke fuldført) 0xFF 0xBB (Reply) 0x02 (Bane fuldført) 0x00-0xFF 0xBB (Reply) 0x03 (Hastighed) 0x00-0xFF Alle værdier er angivet som hex-tal. Dette skyldes, at i C++ er disse nemme at have i en char-variabel og fylder kun én byte hver. Når værdien modtages eller sendes fra bilen vil de blive aflæst eller skrevet som binære tal. Dette har dog ingen indflydelse på kommunikationen så længe tallene konverteres rigtigt, hvilket char-variablen hjælper med i C++.

Figur 7.15: Illustration af automode

Page 41: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 7. Udvikling af software og AVR interface Syddansk Universitet, Teknisk Fakultet

Side 41 af 67

Flere af datapakkerne indeholder en unyttig byte. Når man kommunikerer et Stop- eller Auto-signal til bilen vil man ikke have brug for data-byten, idet kommandobyten allerede identificerer hvilken kommando, der er modtaget. Således sendes ikke nogen brugerdefinerede indstillinger. Den er dog sat alligevel, så den kan bruges som en ekstra kontrol-byte. I den første kommando fra bilen ser man det samme problem. I dette tilfælde er det dog brugbart. Bilen er sat til at tælle med en timer hele tiden mens den kører rundt på banen. Hver gang timeren i microcontrolleren overflower inden målstregen, vil bilen sende timerens værdi (0xFF) til PC’en før timeren nulstilles og tæller igen. I C++ er det nemmere at håndtere store værdier, så hver gang timeren nulstilles, vil C++ have gemt den samlede værdi i en variabel. Denne kommando vil blive sendt fra bilen omkring en gang i sekundet, idet timeren optælles hvert fjerde millisekund. Dette vil fortsætte indtil banen fuldføres og kommando 0x02 sendes. Her vil C++ modtage den resterende timer-værdi og vil, ved at vide, hvor hurtigt timeren tæller op som en konstant, kunne beregne bilens omgangstid i sekunder. Det er også muligt at vise banetiden undervejs på banen, men det vil være i intervaller svarende til en fuld optælling på bilens timer. Det er timerens opsætning, der afgør sendeinterval – jo langsommere timer, jo længere interval. Den tredje og sidste kommando vil informere C++-programmet om bilens hastighed. Værdien, der bliver sendt, er den værdi på en timer, som det tager motoren at dreje 20 omgange. Timeren tælles én op hvert fjerde millisekund og kan maksimalt tælle til 255. Idet C++-programmet kender som en fast værdi hvor langt på banen en omdrejning på motoren svarer til, vil det være muligt at beregne hastigheden på bilen med udgangspunkt i den givne timer-værdi. 7.5 Gennemgang af C++-kode (Bluetooth terminalprogram) C++-programmet, der i projektet fungerer som en terminal på computeren (med forbindelse til printet på bilen), er opbygget af en række programmør-definerede funktioner, der hver især udfylder en specifik opgave. 7.5.1 Programmør-definerede funktioner Alle de programmør-definerede definitioner er som følger:

Navn: Input: Output: Kan kalde: main() - Bool menuChosen(), menu(),

dataRecieve(), readBuffer()

menuChosen() Character - menu(), storeBuffer() menu() - - - dataRecieve() - - readBuffer() storeBuffer() - - - readBuffer() - - dataRecieve() På tabellen ovenfor kan det ses at main()-funktionen ikke har behov for at kunne kalde alle de andre funktioner. Denne programmeringsstil er nyttig, idet eventuel fejlfinding er nemmere, når man har funktionerne isoleret fra hinanden. Derudover er det nemmere at skabe et overblik over et program, når alle opgaver er delt pænt op i individuelle ”bokse”.

Page 42: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 7. Udvikling af software og AVR interface Syddansk Universitet, Teknisk Fakultet

Side 42 af 67

main() Programmet starter i denne funktion. main()-funktionens primære opgave er at køre et loop, der – alt efter prioritering – kalder andre dele af programmet. main()-funktionen er den eneste med et officielt output, idet man ved at returnere en false-værdi kan advare brugeren om at programmet stødte på en fejl. menuChosen() menuChosen()-funktionens fornemste opgave er at finde ud af, hvilket punkt på menuen, brugeren ønsker fuldført og herefter gøre det. menu() menu()-funktionen er den mest simple af dem alle. Funktionens eneste opgave er at udskrive menuen og en opdateret statistik på det visuelle output – skærmen. Funktionen kaldes flere steder fra, hvilket betyder, at det er mere pladsbesparende at udføre opgaven i en funktion, i stedet for at have hele indholdet stående hver gang funktionen kaldes. dataRecieve() dataRecieve()-funktionen er blandt de vigtigste, idet den har til opgave at modtage og behandle al indkommende kommunikation. Denne funktion er voldsomt afhængig af hvilken kommunikationsprotokol er anvendt til at sende data frem og tilbage. Se afsnit 7.4. storeBuffer() Denne funktion har til opgave at gemme den datakommunikation, der er senest modtaget, i en buffer til senere behandling. readBuffer() Denne funktion læser indholdet af bufferen og kalder dataRecieve() til at behandle det. 7.5.2 Flowchart med forklaring Mange programmer er nemmere at beskrive i følgeskab med et flowchart. Allerførst kaldes alle de nødvendige biblioteker. Uden disse biblioteker, vil mange af de anvendte kommandoer i programmet ikke fungere. F.eks. skal ”iostream” inkluderes for at muliggøre komman-doerne cin, til at håndtere input, og cout, til at håndtere output – begge af hvilke er anvendt i programmet. Herefter kaldes alle de programmør-definerede funktioner, man vil bruge senere i programmet. En komplet liste kan findes i

Figur 7.16: Overordnet flowchart for terminalprogrammet, med forkus på initialiseringen

Page 43: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 7. Udvikling af software og AVR interface Syddansk Universitet, Teknisk Fakultet

Side 43 af 67

afsnit 7.5.1. Hvis ikke disse kaldes nu, kan de ikke henvises til senere. Den sidste del af den initialiserende opsætning, er kaldet af de globale variabler. Globale variabler kan læses og ændres af alle funktioner i programmet. Idet de fleste variabler er globale, slipper man for en hel masse input og output i de forskellige funktioner, når variablerne skal ændres i main()-funktionen. Næste punkt i programmet er, at identificere hvilken COM-port, der anvendes til Bluetooth-kommunikationen med printet i bilen. Programmet vil printe en tekst på skærmen, der anmoder brugeren om at fortælle, hvilken COM-port der er anvendt. Herefter vil programmet først teste om inputtet overhovedet kan passe i en integer40, hvorefter den pågældende port vil blive testet. Hvis ikke brugeren har indtastet en integer, eller hvis porten ikke er korrekt, vil programmet informere om dette og give brugeren en ny chance for at indtaste den rigtige port. Hvis nummeret på den rigtige COM-port indtastes, vil programmet kalde menu() for at udskrive menuen. Herefter går selve hoveddelen af programmet i gang. Hoveddelen af programmet består af en simpel løkke, der stiller tre spørgsmål:

1. Er bufferen fyldt? Hvis bufferen er fyldt, vil det betyde at der er modtaget en datakommunikation tidligere, som endnu ikke er blevet behandlet. Dette spørgsmål er altså højeste prioritet og bliver behandlet først. readBuffer() vil blive kaldt for at behandle indholdet i bufferen.

2. Er der på nuværende tidspunkt en datakommunikation undervejs?

Hvis der er en indkommende datakommunikation, tager denne altså næsthøjest prioritet og vil derfor blive behandlet hurtigst muligt, når bufferen er tom.

3. Er der et input fra brugeren?

Til allersidst vil programmet undersøge om brugeren har indtastet noget. Alle inputs fra brugeren bliver gemt i en ”stream”, som er en slags kø, så programmet vil ikke miste en kommando fra brugeren, hvis det er optaget af en anden opgave, mens kommandoen bliver sendt. Hvis ikke der er et input fra brugeren vil programmet gå i en løkke tilbage til første spørgsmål. Programmet vil fortsætte på denne måde indtil det afsluttes.

40 Integer: engelsk for heltal; bruges som definition på datatype i C++.

Figur 7.17: Overordnet flowchart, der fokuserer på to af de tre hovedspørgsmål i programmet.

Page 44: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 7. Udvikling af software og AVR interface Syddansk Universitet, Teknisk Fakultet

Side 44 af 67

På Figur 7.16 kan man følge, hvordan de to første af de tre stillede spørgsmål bliver behandlet. Hvis det allerede er blevet bekræftet, at bufferen er fyldt, kan det godt virke formålsløst at tjekke bufferen igen, når readBuffer() bliver kaldt. Det skyldes dog, at readBuffer() anvender en mere præcis metode til at aflæse bufferen, hvilket er nødvendigt for at kunne sætte bufferen som tom uden at risikere en mistet datakommunikation. readBuffer() skal altså altid køres én gang mere end nødvendigt for herved at kunne bekræfte at bufferen er tom. Hvis bufferen stadig er fyldt, vil funktionen konstruere en løkke indeni en løkke, der vil aflæse bufferens værdier sætvis og behandle dem ved at kalde dataRecieve. Fra det øjeblik dataRecieve() bliver kaldt, bliver dataen i bufferen behandlet på samme måde som når dataen modtages direkte. Det første, der sker, er at datakommunikationen, som programmet har modtaget, bliver verificeret som en godkendt type. Hvis ikke typen godkendes, vil programmet enten ikke genkende kommandoen overhovedet, eller den vil være blevet aflæst forkert – muligvis på grund af en forkert baud rate (læs afsnit 7.4). Hvis typen ikke er godkendt, vil programmet skrive at en fejl opstod med aflæsning af typen og tjekke bufferen for en ny kommunikation med readBuffer(). Hvis typen derimod er godkendt, vil programmet forsøge at identificere kommandoen. Programmet er programmeret til at godkende tre kommandoer, men i princippet kan man programmere mange flere alt efter behov. Hvis kommandoen er 1 – binært 00000001 – vil programmet addere indholdet i data-byten til en global variabel ”laptime”. Hvis kommandoen er 2 – binært 00000010 – vil programmet addere indholdet i data-byten som før, og sætte den globale variabel ”finallaptime” til samme værdi som ”laptime”. På den måde kan man med ”laptime” vise tiden mens bilen kører og med ”finallaptime” tiden for en hel baneomgang. Hvis kommandoen er 3 – binært 00000011 – vil programmet med udgangspunkt i indholdet i data-byten, der angiver hvor lang tid det tog for motoren at dreje fem omgange, være i stand til at beregne hastigheden, idet programmet allerede har nogle ”hardcodede”41 konstanter indprogrammeret (se kapitel 4 og kapitel 6). Hvis ikke kommandoen er kendt vil programmet blot fortsætte til readBuffer(). Uanset hvilken af de tre kommandoer, der blev modtaget og behandlet, vil programmet fortsætte til readBuffer(). Derved vil readBuffer() blive kørt igen indtil bufferen er tom. 41 Hardcodede konstanter er i dette tilfælde fysiske mål på bilen, som programmet anvender til beregninger. Idet konstanterne er hardcoded, vil man være nødt til at redigere i programmets kode, hvis man vil anvende nye konstanter. Man har derfor kun korrekte beregninger på en bil der ligner den, som er anvendt i projektet.

Figur 7.18: Flowchart, der illustrerer behandlingen af input fra brugeren.

Page 45: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 7. Udvikling af software og AVR interface Syddansk Universitet, Teknisk Fakultet

Side 45 af 67

Flowchartet på Figur 7.17 forklarer hvordan programmet vil håndtere input fra brugeren. Først og fremmest vil programmet sætte kommunikationstypen, idet typen er den samme for alle muligheder. Ved at sætte typen først, sparer man nogle linjer kode senere. Næste skridt er at finde ud af hvilket input brugeren gav. Hvis brugeren taster ”1” vil programmet sætte kommando-byten og spørge efter en værdi mellem 0-100. Inputtet er bygget med en løkke, så man kan blive ved med at taste indtil man har givet et gyldigt svar. Programmet vil herefter sætte den indtastede værdi, som data-byte og sende kommunikationen til printet på bilen. Hvis man taster ”2” eller ”3” vil programmet straks sætte kommando-byte og data-byte for henholdsvis stop og automode. Herefter kan kommunikationen sendes. Hvis man taster ”4”, vil skærmen blot slettes og menuen vil blive printet igen med en opdateret statistik. Når metoderne for de 4 menupunkter er fuldført, eller hvis brugeren taster noget helt andet, vil programmet returnere til løkken med de 3 hovedspørgsmål. 7.6 Eksempel på en C++-funktion En af de indbyggede funktioner i terminalen er at gemme data i en buffer, når programmet ikke er i stand til umiddelbart at behandle dataen med det samme. Denne funktion i programmet består faktisk af flere funktioner. Der gemmes til bufferen, når man ikke er på hovedmenuen længere. Det eneste tilfælde, hvor dette sker, er når man vil sætte hastigheden manuelt. På Figur 7.18 ses løkken, der vil køre imens programmet venter på et gyldigt input fra brugeren. Det første løkken tjekker er, om der er udefrakommende data på vej. Der sendes data mange gange i sekundet så brugeren skal være meget hurtig, for ikke at gøre bufferen nødvendig. Når storeBuffer() køres, vil variablen aktivBuffer først blive sat til Boolsk (logisk) sand (true). Dette betyder, at programmet senere vil vide at der er data i bufferen. Det indkommende data bliver herefter læst og placeret i bufferen. Der bliver sendt 3 bytes pr. datakommunikation. Der er derfor konstrueret 3 vektorer på forhånd, hvor de 3 bytes bliver placeret bagerst. De 3 vektorer er passende navngivet efter den byte de indeholder; type, command og data.

Figur 7.19: Der gemmes til buffer når brugeren er inde og indstille hastigheden

Figur 7.20: Bufferen tjekkes for elementer

Page 46: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 7. Udvikling af software og AVR interface Syddansk Universitet, Teknisk Fakultet

Side 46 af 67

Figur 7.21: Bufferen læses fra en ende af

Vektorer er meget simple at forlænge, så der er ikke noget reelt maksimum for hvor meget bufferen kan indeholde, så længe man har nok RAM på computeren. Når bufferen skal læses igen sker det lige så snart hastigheden er sat korrekt og programmet returnerer til de 3 hovedspørgsmål (se afsnit 7.5). Her vil programmet se, at aktivBuffer er sat til sand (true) og køre readBuffer() for at behandle den gemte data. Først vil programmet konstruere en for-løkke på længde med bufferen, der læser én datapakke af gangen og kalder dataRecieve() for at behandle den. Når hele bufferen er indlæst og behandlet vil aktivBuffer blive sat til falsk (false) igen, og vektorerne vil blive tømt. Idet programmet hopper tilbage til while-løkken i Figur 7.19 vil skærmen blive slettet og opdateret med en frisk statistik og menu, så de nye data kan ses i statistikken.

Figur 7.22: Den indkomne datapakke gemmes i bufferen.

Page 47: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 8. Diskussion Syddansk Universitet, Teknisk Fakultet

Side 47 af 67

8 Diskussion I et projekt som dette vil der altid være små problemer og unøjagtigheder, som der skal tages højde for. Nogle er måske så små, at de kan anses for værende ligegyldige, men det vil alligevel være en god idé at tage det med. 8.1 Generel diskussion I det følgende afsnit diskuteres projektet som helhed og projektgruppens interne arbejdsroller. 8.1.1 Samarbejde med undergrupperne På grund af projektets natur har det fra starten været oplagt at inddele femmandsgruppen i tre undergrupper; én, der fokuserer på den analoge/fysiske del (svarende til fagene ELE, MEK og lidt DKO), én, der fokuserer på programmering af microcontrolleren (svarende til faget DIG) og endelig en underguppe, der arbejder med C++-programmering (svarende til faget PRG, og her havde der måske været mulighed for at inddrage statistik). Uheldigvis har dette ført til at gruppen har arbejdet forholdsvist separeret, hvor dem, der arbejdede med den analoge del har siddet i et laboratorium, og programmørerne har siddet i grupperummet, og gruppen har dermed haft problemer med kommunikation – et eksempel er, at Assembler-programmørerne brugte en hel dag på at arbejde med A/D-konvertering, som skulle bruges i forbindelse med svingsensorerne (strain gages), før de fik at vide at sensor-boardet sender et boolsk signal. En måde, man kunne have løst dette på kunne være at have et dagligt møde, gerne om morgenen, hvor man opdateres på, hvad resten af gruppen har lavet siden sidste møde. 8.1.2 Tidsplan Den første tidsplan skred helt, men det var også forventet, og der var givet rigelig tid til sidst så deadline stadig kunne nås. Et større problem var, at dimensionering og konstruering af sensorkredsløbet tog alt for lang tid – der har været mange problemer med dette. Det betyder, at dem, der har arbejdet med Assembler-programmering har haft forholdsvist kort tid til at teste deres program. De har selvfølgelig kunne teste med de udleverede ATMega-board og en oscillator og et oscilloskop, men det skal testes i den virkelige verden, hvis det skal komme til at virke. 8.2 Diskussion af sensorkredsløbet I det følgende afsnit diskuteres de faglige aspekter af sensorkredsløbet. 8.2.1 Connectors på boardet sparer tid Da der er meget begrænset plads i den udleverede racerbil, har det ikke været muligt at montere connectors, altså porte, hvori en ledning kan monteres og skrues fast – disse er typisk 1cm høje, og der er kun 5mm til rådighed i vores konstruktion. Derfor har det været nødvendigt at lodde ledningerne fast på sensorboardet, hvilket er et problem, når man på- og afmontere hyppigt. F.eks., hvis en forstærker eller motoren er gået i stykker. 8.2.2 Kondensatoren blev inkluderet til sidst Kondensatoren var en ”last minute” tilføjelse, derfor sidder den en smule akavet. Men på trods af dette kan karosseriet stadig komme på, og den holder tyngdepunktet relativt lavt. Det kunne have været bedre med flere mindre kondensatorer til at give en nogenlunde central fordeling af vægten. 8.2.3 Tyngdepunktet er for højt Ideen med at have alle komponenterne på sensor-boardet til at vende nedad var, at holde tyngdepunktet lavt. Det ender dog med at boardet må monteres ret højt, for at gøre plads til bilens støddæmpere, og ATMega-boardet er nu placeret så højt, at der knap er plads under taget.

Page 48: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 8. Diskussion Syddansk Universitet, Teknisk Fakultet

Side 48 af 67

8.2.4 AD623s ustabilitet Instrumenteringsforstærkere har (åbenbart) en tendens til at gå i stykker uden varsel, og uden særligt tydelige tegn – det viste sig en dag ved, at den ene af dem forstærkede så meget, at den var en egentlig komparator, mens den anden steg eller faldt langsomt, uden vægtstangen blev påvirket på nogen måde. Efter en halv dags fejlsøgning blev de udskiftet, og nu virker de perfekt – hver gang. 8.2.5 Problemer med lodninger Der har været en tendens til, at der kommer for meget tin på lodningerne – det resulterer naturligvis i en mindre modstand, hvilket er godt, men det betyder også at der er risiko for kortslutninger – hvilket også har kostet en CNY70 (fototransistor). 8.2.6 Problemer med elektromotoren Den motor, der fulgte med legetøjsbilen, har ikke været af den bedste kvalitet, så der har været flere gange, hvor motormodstanden pludseligt falder, og det samme gør hastigheden – altså den bliver varm uden at yde noget produktivt. Grunden til dette er, at det er en børstet motor, hvilket vil sige, der er statiske elektroder, der rører ved det, der drejer. Ud over friktion, vil dette også resultere i at kulstøv ophober sig inde i motoren, og skaber kortslutninger. En børsteløs motor havde været mere effektiv og ikke have haft dette slid, men det var ikke tilladt at skifte motoren. 8.2.7 Usikkerhed i forbindelse med beregninger på strain gages I afsnit 4.5.3 beregnes den maksimale deformation af de monterede strain gages. Denne værdi er beregnet med udgangspunkt i en estimeret tophastighed, som afhænger af friktionskoefficienten. Den fundne friktionskoefficient på ca. 0,99 er fundet ved at medregne magnetens downforce. Bilens reelle friktionskoefficient (ml. hjul og bane) er senere fundet til ca. 0,51, mens magnetens kraft varierer meget afhængig af dens afstand til banen. Den brugte metode tager ikke hensyn til disse parametre 8.3 Diskussion af programmering I det følgende afsnit diskuteres de faglige aspekter af programmering til terminalprogram og microcontroller. 8.3.1 Problemer med Assembler til microcontroller I Assembler-koden er der risiko for, at der skal forekomme fejl. Når microcontrolleren får tilsendt data fra sensorkredsløbet og computeren, kan det ske at programkoden allerede er i gang med at afvikle en interruptrutine. Dette vil resultere i at det indgående signal vil blive ignoreret, hvilket kan medføre tab af data fra opmåling af banen. Sandsynligheden for dette er dog meget lav, idet der kun er tre forskellige interrupts og deres varighed er relativ kort. Hvis microcontrolleren er i gang med at modtage et signal fra computeren mens den afbrydes af et interrupt, vil dette signal ikke blive læst færdigt. Dette problem kunne have været forhindret ved at bruge et interrupt, når der modtages information fra computeren. Hvis microcontrolleren ikke reagerer på signalet fra computeren, kan det være blevet afbrudt, og signalet skal sendes igen. Microcontrolleren er ikke i stand til at modtage og sende data på samme tid. 8.3.2 Problemer med C++ til terminalprogram Skabelonen for kommunikation mellem terminalprogram og microcontroller er blevet programmeret af gruppens programmeringsunderviser, Palle Hermansen. Derfor er gruppens indsigt i netop denne funktions interne mekanismer begrænset. Derimod er der fuld forståelse for anvendelsen af funktionen.

Page 49: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 9. Perspektivering Syddansk Universitet, Teknisk Fakultet

Side 49 af 67

9 Perspektivering Undervejs i projektet er der opstået idéer og forslag til forbedringer af racerbilens konstruktion eller af programmeringen, som ikke er medtaget i projektet. Dette skyldes enten, at idéerne tidmæssigt er for problematiske eller omfattende, taget projektets begrænsede tidsramme i betragtning, eller at der er fysiske krav, som umuliggør dem. Emner og idéer, som opstod undervejs i projektet, men som ikke er medtaget, er opstillet på punktform herunder: Implementering af en elektromagnet, som kan aktiveres/deaktiveres i sving/lige strækninger Aktiv bremsning: omvend motorens forsyning inden sving, så der kan køres hurtigere i

længere tid. Differentieret måling af sving. Lysdioder eller lyd til signalering af begivenheder. Visuel præsentation af banen og forbedret statistik. Mulighed for simultan styring af flere biler. Mulighed for registrering af hældninger på banen

9.1 Implementering af elektromagnet til styrket downforce i sving Implementeringen af en elektromagnet, som kunne styres af microcontrolleren v.h.a. samme teknik som PWM til motoren, kunne forstærke racerbilens downforce i sving. Dermed ville det være muligt, at køre med højere hastigheder uden samtidigt at falde af banen. Elektromagneten kunne intelligent aktiveres/deaktiveres, idet microcontrolleren i bilen i forvejen har kendskab til placeringen af svingene på banen takket være de monterede strain gages. Denne idé er dog ikke blevet udført p.g.a. tidsmæssige begrænsninger. 9.2 Aktiv bremsning før sving Hvis man kunne vende forsyningsspændingen på motoren, sådan at hjulene roterer i modsat retning i.f.t. bevægelsesretningen, kunne der opnås endnu større bremseevne end normalt, hvilket naturligvis giver anledning til at bremse senere end normalt. Denne teknik ville vinde mere tid på lige strækninger uden at bilen ville have større risiko for at falde af banen i sving. Idéen med aktiv bremsning er dog umulig at gennemføre i dette projekt, da PWM-udgangen til motoren er sat i parallelforbindelse med en Schottky ensretter (B220A på Figur 9.1). Det betyder, at strømmen kun kan løbe i én retning, hvilket dikterer hjulenes retning. For at anvende aktiv bremsning skulle ATMega32-printet være konstrueret anderledes. 9.3 Differentieret måling af sving I dette projekt reagerer microcontrolleren på to logiske niveauer fra de monterede strain gages: når der måles høj (5V) er bilen i et sving, mens lav (0V) betyder kørsel på lige strækninger. Man kunne designe sensorkredsløbet således, at svingsensorernes tilstand ikke repræsenteres digitalt, men i stedet analogt. V.h.a. en A/D-konvertering vil microcontrolleren ikke blot vide, hvornår svingene forekommer, men også hvor lange og skarpe de er. 9.4 Lys- og lydsignaler ved begivenheder For brugervenlighedens skyld, havde det været hensigtsmæssigt at montere enten lysdioder eller små højtalere på bilen, som kunne signalere forskellige informationer til brugeren. F.eks.:

Figur 9.1: Diagramtegning for PWM-udgang fra microcontroller til

elektromotor

Page 50: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 9. Perspektivering Syddansk Universitet, Teknisk Fakultet

Side 50 af 67

Der er modtaget en kommunikationspakke (f.eks. med en blinkende diode) Der er valgt automode, stop mode eller manuel mode (diode el. lyd) Banen er gennemført (f.eks. lyd) Lap time (banetid) er målt til rekordtid (f.eks. lyd).

Disse forbedringer er ikke blevet konstrueret af hensyn til tidsrammen for projektet. 9.5 Udnyttelse af baneoplysninger til visuel præsentation i terminalprogram Microcontrolleren i bilen lagrer konstant informationer om bilens kørsel på banen. Kun en brøkdel af disse informationer videregives til terminalprogrammet på PC. Hvis terminalprogrammet fik adgang til flere informationer, f.eks. placering af sving, kunne der eksperimenteres i at udvikle et mere grafisk program. Alle oplysninger er til stede for at kunne tegne banen digitalt, og dermed få et overblik over microcontrollerens opfattelse af banen. Hvis der ikke havde været et krav om at bruge strain gages, kunne samme funktion opnås v.h.a. et gyroskop eller et accelerometer. Derudover kunne der udføres mere kompliceret statistik, som kunne bruges til styring af bilens hastighed. 9.6 Mulighed for simultan styring af flere biler Man kunne udbygge terminalprogrammet, sådan at styring af flere biler simultant var en mulighed. Dette er ikke en forudsætning i projektet, men det ville f.eks. være af videnskabelig interesse at sammenligne statistik og opførsel mellem to biler på banen samtidigt – f.eks. biler kørende med hver sin type konstruktion. 9.7 Mulighed for registrering af hældninger på banen Ligesom sving er en udfordring for bilens gennemførsel af banen, vil hældninger på banen, f.eks. bakker, nedsætte bilens ydeevne. Dette kan kompenseres for ved f.eks. at benytte endnu en strain gage-konstruktion, der måler acceleration på bilens lange led. Man kunne også foretage beregninger på bakkens hældning ved at sammenligne microcontrollerens PWM-signal med bilens faktiske hastighed. Hvis hastigheden er mindre end den burde være for en given PWM duty cycle, må bilen nødvendigvis befinde sig på en bakke.

Page 51: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 10. Konklusion Syddansk Universitet, Teknisk Fakultet

Side 51 af 67

10 Konklusion I dette kapitel konkluderes på projektets forskellige faser, emner og problemstillinger. Projektet har været inddelt i tre emner, hvorfor disse også vil blive konkluderet særskilt. 10.1 Konklusion på sensorer og hardware Efter at have analyseret, hvilke kræfter, der påvirker racerbilen under dens kørsel, er det blevet dimensioneret og konstrueret et virkende sensorkredsløb med to strain gages. Disse er kalibreret til at detektere både højre- og venstresving. Sensorkredsløbet indeholder udover de to strain gages to fototransistorer, som er i stand til at registrere hhv. passering af målstregen og elektromotorens omdrejninger. Samtlige signaler fra sensorkredsløbet sendes som logiske niveauer (høj/lav) til microcontrolleren til videre behandling. Ved beregning er racerbilens maksimale hastighed i sving desuden fundet til ca. 1,58𝑚/𝑠 (indersving), hvilket er nødvendigt i udviklingen af program til microcontrolleren. Måling af bilens hastighed sker ved detektering af motoromdrejninger i kombination med en tidstagning i microcontrolleren. Følsomheden på de monterede strain gages er ved kalibrering indstillet til at registrere accelerationer større end 5 𝑚

𝑠2. Denne sensitivitet viser sig at være tilstrækkelig, da bilen i sving vil opleve

accelerationer i størrelsesordnen 7 𝑚𝑠2− 10 𝑚

𝑠2 . Sensorernes funktionalitet er blevet undersøgt i

laboratorium. 10.2 Konklusion på udvikling af terminalprogram i C++ Der er med succes blevet etableret en kommunikationsprotokol mellem terminalprogrammet i C++ og microcontrolleren. Brugerfladen giver mulighed for visning af bilens statistik såsom hastighed, banetid og nuværende tid. Bilens tre tilstande, manuel mode, stopmode og automode, er valgbare i terminalprogrammets menu med simple indtastninger. For at minimere risikoen for at miste data fra microcontrolleren, er der implementeret en buffer, som administrerer al indgående kommunikation. 10.3 Konklusion på udvikling af program til styring af bilen i Assembler PWM er den grundlæggende idé bag styring af bilens motor, og det er lykkedes at udvikle en metode til styring af PWM. Afhængig af bilens status (manuel eller automode) sættes PWM-signalet til motoren enten til en brugervalgt værdi (ml. 0 % og 100 %) eller til 30 % i sving og 70 % på lige strækninger. De fysiske målinger fra bilen ankommer til microcontrolleren som logiske spændingsniveauer (0V eller 5V). Disse signaler udløser aktiverer særlige interrupts med tilhørende interruptrutiner, som foretager råbehandling af data, laver tidsmålinger og kommunikerer med terminalprogrammet. Oplysninger fra sensorerne bliver lagret og derefter læst korrekt i microcontrollerens indbyggede hukommelse. Læsningen af sensordata bruges til styring af PWM, sådan at bilen ikke falder af banen i sving og samtidigt gennemfører banen hurtigst muligt. Hastighedsmåling på bilen sker ved beregning af tilbagelagt strækning (motoromdrejningssensor) og en tidstagning v.h.a. af microcontrollerens indbyggede timer-funktion. For at undgå hjulspind og -blokade hhv. forøges og reduceres PWM-signalet (og dermed motorens omdrejningshastighed) gradvist - dette v.h.a. en timer.

Page 52: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 11. Litteraturliste Syddansk Universitet, Teknisk Fakultet

Side 52 af 67

11 Litteraturliste Herunder fremgår alle anvendte kilder, hjemmesider og datablade. 11.1 Anvendte kilder

1. Electrical Engineering – Second Edition Steven E. Schwarz & William G. Oldham ISBN 978-0-19-510585-8 Forlag: Oxford

2. The AVR Microcontroller and Embedded Systems Muhammed Ali Mazidi & Sarmad Naimi & Sepehr Naimi ISBN 978-0-13-800331-9 Forlag: Prentice Hall

3. Principles of Physics – Ninth Edition David Halloday & Robert Resnick & Jearl Walker ISBN 978-0-470-56158-4 Forlag: Wiley

4. Engineering Problem Solving with C++ - Third Edition Delores M. Etter & Jeanine A. Ingber ISBN 978-0-273-76405-2 Forlag: Pearson

5. Statik: kompendium til brug ved undervisning i E MEK 1 Mogens Carlsen August 1998

6. Styrkelære: kompendium til brug ved undervisning i E MEK 1 Mogens Carlsen Januar 1999

7. Deformationslære: kompendium til brug ved undervisning i E MEK 1 Mogens Carlsen September 1998

11.2 Anvendte hjemmesider

8. Teori vedr. strain gages: http://en.wikipedia.org/wiki/Strain_gauge 9. Teori vedr. fototransistor: http://en.wikipedia.org/wiki/Photodiode 10. Teori vedr. Wheatstone-bro http://en.wikipedia.org/wiki/Wheatstone_bridge 11. Kompendium af Karl Hoffmann (HBM): http://www.hbm.com.pl/pdf/w1569.pdf 12. Teori vedr. Schmitt trigger http://en.wikipedia.org/wiki/Schmitt_trigger 13. Teori vedr. hysterese http://goo.gl/Vf6TP v. www.denstoredanske.dk 14. Teori vedr. resistivitet http://goo.gl/fiWSJ v. hyperphysics.phy-astr.gsu.edu

Page 53: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 12. Figurliste Syddansk Universitet, Teknisk Fakultet

Side 53 af 67

11.3 Anvendte datablade 1. Instrumenteringsforstærker: AD623AN 2. Dualkomparator: LM358N 3. Microcontroller: ATMega32A 4. 120Ω strain gages: 1-LY13-3/120 (HBM) 5. Fototransistor: CNY70 6. 10Ω trimmepotentiometre: 3006P-1-100 (Bourns)

12 Figurliste Herunder fremgår alle figurer i rapporten inklusive de korresponderende sidetal. Figur 4.1: Priptegning af placering af bilens sensorer ................................................................................................... 8 Figur 4.2: Eksempler på strain gages. Den anvendte strain gage er markeret. Kilde 9 ................................... 9 Figur 4.3: Illustration af en strain gages virkemåde. ...................................................................................................... 9 Figur 4.4: En CNY70 fototransistor .................................................................................................................................... 10 Figur 4.5: CNY70 diagram ...................................................................................................................................................... 10 Figur 4.6: CNY70 princip ......................................................................................................................................................... 10 Figur 4.7: ATMega32-print .................................................................................................................................................... 11 Figur 4.8: Ensretteren på ATMega32-print ..................................................................................................................... 11 Figur 4.9: Eksempel på sving-vej-sving konfiguration ............................................................................................... 11 Figur 4.10: Frit-legeme-diagram for bil i sving ............................................................................................................. 12 Figur 4.11: Placering af strain gages på bil. Dimensioner: ℎ × 𝑏 × 𝑑 = 50𝑚𝑚 × 5𝑚𝑚 × 0,7𝑚𝑚 .......... 13 Figur 4.12: Grafisk illustration: afstand til ref.-punkt som funktion af vinkel.................................................. 16 Figur 4.13: Grafisk illustration: En magnets kraftmoment som funktion af vinklen. .................................... 16 Figur 4.14: Grafisk illustration: Kraftmoment i en trefaset elektromotor. ........................................................ 16 Figur 4.15: Grafisk illustration: summeret kraftmoment og RMS ......................................................................... 17 Figur 5.1: OrCAD PSpice diagram for sensorkredsløb. Fuldside-version kan findes i bilag side 55. ...... 18 Figur 5.2: En Wheatstone kvartbro .................................................................................................................................... 18 Figur 5.3: Halvbro til måling af strain ............................................................................................................................... 19 Figur 5.4: Diagramtegning for AD623 Kilde AD623 datablad ................................................................................. 20 Figur 5.5: Skematisk opbygning af instrumenteringsforstærker Kilde AD623 datablad ............................ 20 Figur 5.6: Diagram for førsteordens lavpasfilter. En modstand og kondensator i serie. Det filtrerede signal måles over kondensatoren ......................................................................................................................................... 21 Figur 5.7: Diagram for LM358. Kilde: LM358 datablad. ............................................................................................. 23 Figur 5.8: Princip bag registrering af motoromdrejninger....................................................................................... 23 Figur 5.9: Placering af fototransistor på bilens undervogn. ..................................................................................... 23 Figur 6.1: Simulering af sving v.h.a. oscilloskop............................................................................................................ 26 Figur 6.2: Simulering af fejlkomparering: bemærk utroværdige impulser. ...................................................... 26 Figur 6.3: U: analogt signal, A: alm. komparator, B: Schmitt trigger Kilde 13 .................................................. 26 Figur 6.4: Test af sensitivitet af strain gages .................................................................................................................. 27 Figur 6.5: Måling af friktionskoefficient ........................................................................................................................... 28 Figur 6.6: Kraftsystem opstillet som vinkelret trekant .............................................................................................. 28 Figur 6.7: Måling af tophastighed v.h.a. Logger Pro. ................................................................................................... 29 Figur 6.8: Farveredigeret billede af gearet. Blå=𝑡1,1, Rød=𝑡1,2, Grøn=𝑡2,1, Grå=𝑡2,2 .................................. 30 Figur 7.1: Uddrag fra ATMega32 datablad. PWM-signal tænder/slukker MOSFET ....................................... 31 Figur 7.2: Illustration af PWM v.h.a. Timer-sammenligning. ................................................................................... 31 Figur 7.3: Illustration fra Kilde 2 - Side 323. Viser opsætning af PWM. .............................................................. 32 Figur 7.4: Kommunikationsarkitektur .............................................................................................................................. 33 Figur 7.5: Intern kommunikationsprotokol .................................................................................................................... 34 Figur 7.6: Eksempel på opsætning af timer0 .................................................................................................................. 35 Figur 7.7: Interrupt vektortabellen .................................................................................................................................... 35

Page 54: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 12. Figurliste Syddansk Universitet, Teknisk Fakultet

Side 54 af 67

Figur 7.8: Lagringsfunktionen i microcontrolleren ..................................................................................................... 36 Figur 7.9: Indlæsningsfunktionen: hentning af oplysninger om sving på banen ............................................ 37 Figur 7.10; Brug af loops til gradvis acceleration og deceleration. ....................................................................... 37 Figur 7.11: Initialisering af microcontroller ................................................................................................................... 38 Figur 7.12: Manuelmode og stop ......................................................................................................................................... 38 Figur 7.13: Interruptrutine for timer0 og målstregssensor. .................................................................................... 39 Figur 7.14: Interrupts fra motoromdrejnignssensor .................................................................................................. 39 Figur 7.15: Illustration af automode .................................................................................................................................. 40 Figur 7.16: Overordnet flowchart for terminalprogrammet, med forkus på initialiseringen ................... 42 Figur 7.17: Overordnet flowchart, der fokuserer på to af de tre hovedspørgsmål i programmet. .......... 43 Figur 7.18: Flowchart, der illustrerer behandlingen af input fra brugeren. ..................................................... 44 Figur 7.19: Der gemmes til buffer når brugeren er inde og indstille hastigheden ......................................... 45 Figur 7.20: Bufferen tjekkes for elementer ..................................................................................................................... 45 Figur 7.22: Bufferen læses fra en ende af ........................................................................................................................ 46 Figur 7.21: Den indkomne datapakke gemmes i bufferen. ....................................................................................... 46 Figur 9.1: Diagramtegning for PWM-udgang fra microcontroller til elektromotor ....................................... 49 Figur 13.1: Overblik af sensorkredsløb. F.v.: 2200uF kondensator, CNY70 fototransistor, LM358 komparator, 2 stk. AD623 instrumenteringsforstærkere, 2 stk. potmetre, LM358 ......................... 58 Figur 13.2: Sensorkredsløb set fra siden ......................................................................................................................... 58 Figur 13.3: Racerbilens chassis m. motor og monterede strain gages. ............................................................... 58 Figur 13.4: Nærbillede af elektromotoren, som delvist er farvet sort. ................................................................ 58 Figur 13.6: Montering af ATMega32-print ...................................................................................................................... 58 Figur 13.5: Montering af sensorkredsløb på racerbil ................................................................................................. 58 Figur 13.7: Racerbilen set fra siden ................................................................................................................................... 58 Figur 13.8: Nærbillede af strain gage konstruktion .................................................................................................... 58

Page 55: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 13. Bilag Syddansk Universitet, Teknisk Fakultet

Side 55 af 67

13 Bilag 13.1 Tidsplan

Page 56: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 13. Bilag Syddansk Universitet, Teknisk Fakultet

Side 56 af 67

13.2 Diagram for sensorkredsløb

Page 57: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 13. Bilag Syddansk Universitet, Teknisk Fakultet

Side 57 af 67

13.3 Brugte kommandoer i AVR og deres funktioner Nedenfor fremgår en tabeloversigt over de brugte kommandoer i AVR samt deres funktioner.

Kommando Funktion LDI (Load Immediate) Loader en 8-bit konstant ind i et register. RJMP (Relative Jump) Hopper til en adresse(Label). OUT Gemmer data fra register i I/O space. CBI (Clear bit in I/O register) Fjerner et bit i et valgt I/O space. SBI (Set bit in I/O register) Sætter et bit i et valgt I/O space. SBIS (Skip if bit in I/O register is set) Hopper over næste kommando hvis bestemt I/O-

bit er sat. SBIC (Skip if bit in I/O register is cleared)

Hopper over næste kommando hvis bestemt I/O-bit ikke er sat.

CPI (Compare with immediate) Sammenligner et register med en konstant. CP (Compare) Sammenligner to registre BREQ (Branch if Equal) Hopper til mærkat hvis CP(I) siger registeret =

konstanten. Call Kalder en funktion vha et mærkat. Ret (Return) Skrives sidst i en kaldt funktion for at komme

tilbage. BRSH (Branch if same or higher) Hopper til mærkat hvis CP(I) siger registeret =>

konstanten. BRLO (Branch of lower) Hopper til mærkat hvis CP(I) siger registeret <

Konstanten. BRNE (Brnahc if not equal) Hopper til mærkat hvis CP(I) siger register ≠

konstanten. LD(LDD) (Loading indirect from data space to register using index Z)

Henter data fra data space til et register.

IN Henter data fra I/O space til register. INC (Increment) Ligger +1 til et register. DEC (Decrement) Trækker +1 fra et register. ANDI (Logical AND with Immediate) Laver logisk AND på et register og en konstant. ST (Store) Gemmer i data space fra register BRCS (Branch if Carry is set) Hopper til mærket hvis Carry flaget er sat. RETI (Return from interrupt) Skrives sidst i en interrupt rutine for at komme

tilbage

Page 58: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 13. Bilag Syddansk Universitet, Teknisk Fakultet

Side 58 af 67

13.4 Billeder af bilen I dette afsnit vises billeder af det producerede sensorkredsløb samt dets montering på racerbilen.

Figur 13.1: Overblik af sensorkredsløb. F.v.: 2200uF kondensator, CNY70 fototransistor, LM358

komparator, 2 stk. AD623 instrumenteringsforstærkere, 2 stk. potmetre, LM358

Figur 13.2: Sensorkredsløb set fra siden

Figur 13.3: Racerbilens chassis m. motor og monterede strain gages.

Figur 13.4: Nærbillede af elektromotoren, som delvist er farvet sort.

Figur 13.6: Montering af sensorkredsløb på racerbil Figur 13.5: Montering af ATMega32-print

Figur 13.8: Nærbillede af strain gage konstruktion Figur 13.7: Racerbilen set fra siden

Page 59: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 13. Bilag Syddansk Universitet, Teknisk Fakultet

Side 59 af 67

13.5 Samlet Assembler-kode .include "m32adef.inc" ;The ATMEGA32A Microcontroller .org 0x0000 ;programmet starter her rjmp Reset .org 0x0002 ;ekstern interrupt 0 (INT0) rjmp bane ;til omgangstæller .org 0x0004 ;ekstern interrupt 1 (INT1) rjmp omdrejning ;til omdrejningstæller .org 0x0016 ;interrupt for timer 0 rjmp timer0 ;interruptes hvert 4 millisekund Reset: //stack setup ldi R16,HIGH(RAMEND) ;stack pointer høj opsætning out SPH,R16 ldi R16,LOW(RAMEND) ;stack pointer lav opsætning out SPL,R16 //Port setup cbi DDRD,4 ;strain gauge (venstre sving) cbi DDRD,5 ;strain gauge (højre sving) cbi DDRD,3 ;omdrejningstæller (INT1) cbi DDRD,2 ;omgangstæller (INT0) sbi DDRD,7 ;til PWM styring (OC2) cbi DDRD,0 ;til signaler fra computeren (RXEN) sbi DDRD,1 ;til signaler til computeren (TXEN) //Memory setup ldi ZH,0x01 ;set high ldi ZL,0x00 ;set low ldi R21,0x00 ;bruges til at tælle omgange ldi R23,0x0F ;så den læser første memory som 70% PMW ldi R24,0x00 ;bruges til at tælle tiden for 20 omdrejninger på hjulet ldi R25,60 ;bruges til at tælle 20 omdrejninger på hjulet for at sende til computer. ldi R26,0x00 ;bruges til at tælle tiden for banen (incrementeres hvert fjerde millisekund). ldi R28,0x00 ;bruges til at læse fra hukommelsen //Uart setup ldi R16,0x00 ;setting to register UCSRA out UCSRA,R16 ldi R16,(1<<RXEN)|(1<<TXEN) ;setting to register UCSRB out UCSRB,R16 ldi R16,(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0) ;setting to register UCSRC out UCSRC,R16 //UBBR setup ldi R16,0x00 ;setting til UBRR out UBRRH,R16 ;Baud rate 9600, 16 MHz ldi R16,103 ;0.16% error out UBRRL,R16 //timer setup ldi R16,0x01 out TIMSK,R16 ;aktiver timer 0 overflow interrupt ldi R16,0x00 out TCNT2,R16 //ekstern interrupt setup ldi R16,0x0F out MCUCR,R16 ;hver gang PINS går høj laves der et interrupt ldi R16,0xC0 out GICR,R16 ;aktiver eksterne interrupt, 0 og 1 sei ;set global interrupt //start program start: ;vent på startsignal. gør intet hvis ikke 0x55 modtages sbis UCSRA,RXC rjmp start ;læs signal fra computeren in R16,UDR cpi R16,0x55 breq start2 rjmp start start2: sbis UCSRA,RXC rjmp start2 in R16,UDR

Page 60: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 13. Bilag Syddansk Universitet, Teknisk Fakultet

Side 60 af 67

cpi R16,0x10 ;signalet skal have binær værdi 0x10 for manuel styring breq manuel cpi R16,0x11 ;signalet skal have binær værdi 0x11 for stop breq stop cpi R16,0x12 breq automode ;signalet skal have binær værdi 0x12 for automode rjmp start automode: sbis UCSRA,RXC rjmp automode in R16,UDR cpi R16,0xFF brne start ldi R16,0b01101101 ;Setting til timeren (prescaler 128, fast PWN, noninverted). out TCCR2,R16 ;Starter PMW call automode2 rjmp start2 stop: sbis UCSRA,RXC rjmp stop in R16,UDR cpi R16,0x00 brne start ldi R16,0b01101000 ;Stop PMW out TCCR2,R16 ;sæt TCCR2 register (Timer/counter control register) sbis UCSRA,RXC rjmp stop rjmp start2 manuel: sbis UCSRA,RXC rjmp manuel in R16,UDR ;Starter PMW mov R17,R16 ;kopier R16 til R17 mov R18,R16 ;kopier R16 til R18 lsl R17 ;roter til venstre, og indsæt 0 (gang med 2) lsr R18 ;roter til højre og indsæt 0 (gang med 0.5) //divider 8 bit tallet med 20 (for at gange med 0.05) ldi R19,20 ldi R20,0x00 divider: inc R20 ;incrementer tæller sub R16,R19 brcc divider ;branch hvis carry er clear. dec R20 ;den tæller en gang for meget cpi R16,0xF6 ;checker om rest er under eller over -10 brlo adder inc R20 adder: //læg tallene sammen add R20,R17 add R20,R18 ldi R16,0b01101101 ;Setting til timeren (prescaler 128, fast PWN, noninverted). out TCCR2,R16 ;Starter PMW out OCR2,R20 rjmp start //Start automatisk program automode2: cpi R21,0x02 brsh automode3 ;hvis der ikke er kørt en omgang, sæt PMW til 30% ldi R17,76 out OCR2,R17 ret automode3: cpi R23,0xFF ;højre sving brsh set30 cpi R23,0x0F ;venstre sving brsh set35 brlo set70 set30: ldi R18,76 ;for 30% PMW

Page 61: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 13. Bilag Syddansk Universitet, Teknisk Fakultet

Side 61 af 67

in R19,OCR2 ;den værdi der er i OCR PMW registret cp R18,R19 brsh lav1 brlo hoej1 hoej1: cp R18,R19 breq return dec R19 out OCR2,R19 call timerauto rjmp hoej1 lav1: cp R18,R19 breq return inc R19 out OCR2,R19 call timerauto rjmp lav1 set35: ldi R18,89 ;for 35% PMW in R19,OCR2 ;den værdi der er i OCR PMW registret cp R18,R19 brsh lav2 brlo hoej2 hoej2: cp R18,R19 breq return dec R19 out OCR2,R19 call timerauto rjmp hoej2 lav2: cp R18,R19 breq return inc R19 out OCR2,R19 call timerauto rjmp lav2 set70: ldi R18,178 ;for 70% PMW in R19,OCR2 ;den værdi der er i OCR PMW registret cp R18,R19 brsh lav3 brlo hoej3 hoej3: cp R18,R19 breq return dec R19 out OCR2,R19 call timerauto rjmp hoej3 lav3: cp R18,R19 breq return inc R19 out OCR2,R19 call timerauto rjmp lav3 return: sbis UCSRA,RXC rjmp automode in R16,UDR cpi R16,0x55 breq return2 rjmp automode return2: ret timerauto: ldi R17,0x03

Page 62: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 13. Bilag Syddansk Universitet, Teknisk Fakultet

Side 62 af 67

timer01: ;ydre loop ldi R16,0xFF timer02: ;indre loop dec R16 brne timer02 ;gentag 256 gange dec R17 brne timer01 ;gentag 3 gange ret //interrupts starter her omdrejning: cpi R21,0x00 breq tilbage ;hvis bilen endnu ikke har krydset målstregen, gør intet dec R25 brne send ;hopper til omdrejning2 efter branch rjmp omdrejning2 tilbage: reti send: sbis UCSRA,UDRE ;check om UDR er tom rjmp send ldi R22,0xBB out UDR,R22 ;send 0xBB til UDR send2: sbis UCSRA,UDRE rjmp send2 ldi R22,0x03 out UDR,R22 send3: sbis UCSRA,UDRE rjmp send3 out UDR,R24 ldi R24,0x00 ;nulstil tiden for omdrejninger ldi R25,60 ;nulstl så den igen tæller ned for 20 omdrejninger omdrejning2: cpi R21,0x02 ;compare omgangstæller for at finde ud af om information skal gemmes eller læses. brsh laes brlo gem gem: sbic PIND,5 ;PIND,5 til strain gauge (højre sving) rjmp gem1 sbic PIND,4 ;PIND,4 til strain gauge (venstre sving) rjmp gem2 ldi R22,0x00 st Z+,R22 reti gem1: ldi R22,0xFF st Z+,R22 ;gem og inkrementer pointer reti gem2: ldi R22,0x0F st Z+,R22 reti laes: cpi R28,0x00 ;R28 sætter bilen til 30% PMW når et sving registeres brne laes3 cpi R23,0x0F ;hvis 20 motoromdrejninger er kørt, og signalet stadig er højt brsh laes4 ;branch til laes4 ldd R23,Z+60 ;læs information 20 omdrejninger fremme hvis strækningen er lige. cpi R23,0x0F ;kør 20 motoromdrejninger når der registreres sving fremme brsh laes2 inc ZL brcs incrementer ;branch hvis carry er sat reti laes2: ldi R28,60 ;sæt PMW til 30% under 20 motoromdrejninger, hvis sving registreret. laes3: dec R28 ldi R23,0x0F ;for 30% PWM inc ZL

Page 63: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 13. Bilag Syddansk Universitet, Teknisk Fakultet

Side 63 af 67

brcs incrementer reti laes4: ld R23,Z+ reti incrementer: inc ZH reti bane: cpi R21,0x00 breq starttimer rjmp baneto starttimer: ldi R22,0x05 ;timer 0 tæller til 4 millisekunder før overflow out TCCR0,R22 ;timer 0, normal mode, prescaler 64 ldi R22,0x06 out TCNT0,R22 ;start timer 0 fra 0x06 baneto: inc R21 ldi R22,0x00 ldi R29,60 ventbane: st Z+,R22 dec R29 ;gem 60 værdier på 0x00 i de næste memory spaces og få maksimal hastighed før målstregen. brne ventbane ldi ZH,0x01 ;stil pointer til startværdi ldi ZL,0x00 ventUDR1: sbis UCSRA,UDRE rjmp ventUDR1 ldi R22,0xBB out UDR,R22 ventUDR2: sbis UCSRA,UDRE rjmp ventUDR2 ldi R22,0x02 out UDR,R22 ventUDR3: sbis UCSRA,UDRE rjmp ventUDR3 out UDR,R26 ldi R26,0x00 ;nulstil Register til at tælle banetid reti timer0: inc R24 ;incrementer R24 hver gang der går 4 millisekunder. inc R26 ;incrementer R26 hver gang der går 4 millisekunder. ldi R22,0x06 out TCNT0,R22 cpi R26,0xFF breq sendbanetid reti sendbanetid: sbis UCSRA,UDRE ;vent til UDR er tom rjmp sendbanetid ldi R22,0xBB ;til at sende til computeren out UDR,R22 sendbanetid2: sbis UCSRA,UDRE ;vent til UDR er tom rjmp sendbanetid2 ldi R22,0x01 out UDR,R22 sendbanetid3: sbis UCSRA,UDRE ;vent til UDR er tom rjmp sendbanetid3 out UDR,R26 ldi R26,0x00 ;nulstil register til at sætte banetid reti

Page 64: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 13. Bilag Syddansk Universitet, Teknisk Fakultet

Side 64 af 67

13.6 Samlet C++-kode //Kommandocentral //The proper external libraries is included #include <limits> #include <iostream> #include "serial.h" #include <conio.h> #include <vector> using namespace std; //Programmer defined function void clearScreen(); void menu(); void menuChosen(char choice); void dataRecieve(); void storeBuffer(); void readBuffer(); //Programmer defined global objects CSerial Port; // An object of the CSerial type is called, to enable communication through a comport. //Programmer defined global variables char kch[3]={' '}; char Read[10]; bool aktivBuffer = false; vector<char> type; vector<char> command; vector<char> data; // A few variables are needed in order to handle the statistics from the car. int laptime = 0; //Laptime int finallaptime; int bestlap = 0; //Best laptime recorded int lapcount = 0; //Amount of laps done int speed = 0; //A measure of speed from an internal timer in the car. bool main() { start: int num; //This integer will contain the address of the COMport bool valid = false; //This bool is a tool used in the next method. while (!valid) { valid = true; //Assume the cin will be an integer.

cout << "What COM-port is your bluetooth connected to? \nPlease specify with a number and press enter." << endl;

cin >> num; //The input is saved in an integer if(cin.fail()) //cin.fail() checks to see if the value in the cin //stream is the correct type, if not it returns true, //false otherwise. {

cin.clear(); //This deletes the part of the stream, which was read. cin.ignore(); //This skips the left over stream data that ahs not been read yet.

cout << "Please enter an Integer only." << endl << endl; valid = false; //The cin was not an integer so try again. } } system("CLS"); if (Port.Open(num,9600)==0) //The COM-port requested earlier is verified { cout<<"\nWrong Port!\n\n\n"; goto start; } else cout << "\nCOM-Port " << num << " verified.\n\n\n";

Page 65: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 13. Bilag Syddansk Universitet, Teknisk Fakultet

Side 65 af 67

menu(); //Show menu //Here is the core of the program, which will be refered back to after every task. while(1) { if (aktivBuffer == true) { readBuffer(); system("CLS"); //Upon return the screen is cleared menu(); //and the menu is displayed on the screen once again. } else if (Port.ReadDataWaiting ()) //Check for any incoming communication {

Port.ReadData( Read, 3 ); //The communication is recieved as 3 bytes, which is then stored in an Array. dataRecieve(); //Another method is called, in order to process the recieved data.

system("CLS"); //Upon return the screen is cleared menu(); //and the menu is displayed on the screen once again.

} else if (_kbhit()) //Check for any keystrokes by the user { char c = (char)_getch(); //Read the keystroke system("CLS"); //Upon return the screen is cleared

menuChosen(c); //An external function is called, in order to process the input for the menu. menu(); //and the menu is displayed on the screen once again.

} } return true; //The main function is a bool type so a bool must be returned. vid type could

have been used instead, but by using a bool, it is possible to return a false, as to signify an error if wanted.

} void menuChosen(char choice) //External function that handles input for the menu. {

kch[0]=0x55; //Only one type of outgoing communication, so the type may as well be set first, for all scenarios.

if (choice=='1') //Set speed {

cout << "Enter a value between 0-100, to set the percentage of max speed to move at." << endl; cout << "A value below 20 % may not supply the car with enough power to run the engine." << endl << endl;

kch[1]=0x10; //Command is set int speed;

while(!(cin >> speed) || speed < 0 || 100 < speed) //The input to set speed is verified to be within the acceptable limits.

{ if (Port.ReadDataWaiting ()) //Check for any incoming communication

storeBuffer(); cout << "That was not an integer between 1 and 100...\nTry again: "; cin.clear(); //The read part of the input stream is cleared cin.ignore(); //The unread part of the input stream is cleared

} kch[2]=speed; //Data is set Port.SendData(kch,3); //Communication is sent cout << "Speed set to " << speed << " %" << endl << endl; } else if (choice=='2') //Stop car { kch[1]=0x11; //Command is set kch[2]=0; //Data is set Port.SendData(kch,3); //Communication is sent

Page 66: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 13. Bilag Syddansk Universitet, Teknisk Fakultet

Side 66 af 67

cout << "Don't tell me what to do! I'll brake now!" << endl << endl; } else if (choice=='3') //Enable automode { kch[1]=0x12; //Command is set kch[2]=0xFF; //Data is set Port.SendData(kch,3); //Communication is sent cout << "Phase 3 is completed: Activate Skynet" << endl << endl; } else if (choice=='4') //Update displayed statistics { //The program will update automatically on return from this function } } void menu() { // show the menu cout << "Statistics:" << endl << endl;

cout << "Laptime: " << laptime << " Laps: " << lapcount << " Best lap time: " << bestlap << endl;

cout << "Speed: " << speed << endl; cout << endl << endl << "Command center:" << endl; cout << "Control your car with simple commands" << endl; cout << "1. Set speed" << endl; cout << "2. Stop" << endl; cout << "3. Automode" << endl; cout << "4. Update statistics" << endl << endl; return; } void dataRecieve() {

if (Read[0]!=0xBB) // The first byte in the data communication is read to check for errors {

cout << "An error occured during recieval of a package. The type is not valid!" << Read[0];

} else // The second byte in the data communication is identified, to find out what data has been recieved

{ if (Read[1]=1) //Temporary laptime { laptime =+ Read[2]; } else if (Read[1]=2) //Final laptime { laptime =+ Read[2]; finallaptime = laptime; lapcount =+ 1; laptime = 0; } else if (Read[1]=3) //Speed {

speed = (1,899916*5)/((Read[2])*0,016); // Speed is calculated cout << "Hastigheden er: " << speed << " m/s"; } } } void storeBuffer() { aktivBuffer = true; //Set the variable true to show the bufefr is not empty Port.ReadData( Read, 3 ); //Read the recieved data type.push_back (Read[0]); //and dump it into seperate vectors for later use. command.push_back (Read[1]); data.push_back (Read[2]); return; }

Page 67: Semesterprojekt 2012 maj 2012 1. Læsevejledning Syddansk ...simon.traberg-larsen.dk/website/documents/projects/2012/polepositi… · Semesterprojekt 2012 maj 2012 2. Indledning Syddansk

Semesterprojekt 2012 maj 2012 13. Bilag Syddansk Universitet, Teknisk Fakultet

Side 67 af 67

void readBuffer() {

for (int i = 0; i < (int) type.size(); i++) // Construct for-loop depending on the size of the buffer

{ Read[0] = type[i]; //Read the buffer from the ones recieved first

Read[1] = command[i]; Read[2] = data[i]; dataRecieve(); //and proces the data } type.clear(); command.clear(); data.clear(); aktivBuffer = false; //Show that the buffer is now empty. }