Projecten met AVRµC

138
2010- 2011 KAHO Sint Lieven - Gent Coulier Jerome Speliers Koen Coppens Maarten Brijs Thomas Vandamme Thijs [PROJECTEN MET AVR MICROCONTROLLERS] In veel toepassing kan gebruik gemaakt worden van een autonoom toestel dat fysische grootheden zoals temperatuur, vochtigheid, lichtsterkte, … kan meten en deze resultaten opslaan over een langere periode. Omdat een ATMEGA128 μC (AVR-core van Atmel) veel geheugen heeft kan hij voor complexere zaken ingezet worden. Deze microcontroller kan ook geprogrammeerd worden in een hogere programmeertaal zoals Bascom AVR. Dit is een Basic Compiler (geen interpreter) die Basic omzet in machinetaal die snel uitgevoerd kan worden. Hierdoor kan men complexe zaken snel tot een goed einde brengen. Deze voortzetting van een project van vorig jaar bestaat uit een compact batterijgevoed toestel met een LCD uitlezing en enkele selectietoetsen voor de instellingen.

Transcript of Projecten met AVRµC

Page 1: Projecten met AVRµC

2010-

2011

KAHO Sint Lieven - Gent

Coulier Jerome

Speliers Koen

Coppens Maarten

Brijs Thomas

Vandamme Thijs

[PROJECTEN MET AVR

MICROCONTROLLERS]

In veel toepassing kan gebruik gemaakt worden van een autonoom toestel dat fysische

grootheden zoals temperatuur, vochtigheid, lichtsterkte, … kan meten en deze resultaten

opslaan over een langere periode. Omdat een ATMEGA128 μC (AVR-core van Atmel) veel

geheugen heeft kan hij voor complexere zaken ingezet worden. Deze microcontroller kan ook

geprogrammeerd worden in een hogere programmeertaal zoals Bascom AVR. Dit is een Basic

Compiler (geen interpreter) die Basic omzet in machinetaal die snel uitgevoerd kan worden.

Hierdoor kan men complexe zaken snel tot een goed einde brengen. Deze voortzetting van

een project van vorig jaar bestaat uit een compact batterijgevoed toestel met een LCD

uitlezing en enkele selectietoetsen voor de instellingen.

Page 2: Projecten met AVRµC

Pagina 2 van 138

1 Inhoudsopgave 2 Dankwoord ...................................................................................................................................... 6

3 Voorwoord....................................................................................................................................... 7

Datalogger ................................................................................................................................... 8

4 Project omschrijving - Datalogger ................................................................................................. 10

4.1 Blokschema: .......................................................................................................................... 10

5 De grootheden............................................................................................................................... 11

5.1 Temperatuur.......................................................................................................................... 11

5.2 Luchtdruk ............................................................................................................................... 11

5.3 Tijd ......................................................................................................................................... 12

6 Programmeren van de datalogger ................................................................................................ 13

6.1 Programmeren met myAVR: ................................................................................................. 14

6.2 Programmeren met AVRstudio: ............................................................................................ 16

7 Schema analyse ............................................................................................................................. 17

7.1 µC ........................................................................................................................................... 17

7.2 Deelschakelingen met UART ................................................................................................. 18

7.2.1 ISP .................................................................................................................................. 18

7.2.2 USB ................................................................................................................................ 19

7.3 RFM22B ................................................................................................................................. 20

7.3.1 Wat is SPI? ..................................................................................................................... 20

7.3.2 Werking ......................................................................................................................... 21

7.4 Voeding .................................................................................................................................. 21

7.4.1 LM317 ............................................................................................................................ 22

7.4.2 Spanningsomvormer ..................................................................................................... 22

7.5 toetsenbord ........................................................................................................................... 22

7.6 Componenten met I²C ........................................................................................................... 24

7.6.1 Wat is I²C? ...................................................................................................................... 24

7.6.2 Temperatuursensor ....................................................................................................... 28

7.6.3 Luchtdruksensor ............................................................................................................ 29

7.6.4 Real Time Clock.............................................................................................................. 29

7.7 LCD ......................................................................................................................................... 30

7.7.1 Regelen lichtsterkte ....................................................................................................... 30

7.8 Relais ..................................................................................................................................... 31

8 Handleiding.................................................................................................................................... 32

Page 3: Projecten met AVRµC

Pagina 3 van 138

8.1 Instellen van klok ................................................................................................................... 32

8.2 Uitlezing van temperatuur of druk ........................................................................................ 32

8.2.1 Uitlezing van Temperatuur A . ..................................................................................... 33

8.2.2 Uitlezing van Druk B . ................................................................................................... 33

8.3 Aansturen van Relais ............................................................................................................. 34

8.4 Loggen van data .................................................................................................................... 35

9 Code ............................................................................................................................................... 36

9.1 Declaraties ............................................................................................................................. 36

9.2 Toetsenbord .......................................................................................................................... 38

9.3 Real-Time Clock ( RTC ) .......................................................................................................... 39

9.4 Algemene functies ................................................................................................................. 42

9.5 Klok ........................................................................................................................................ 46

9.6 Temperatuur/druk ................................................................................................................. 49

9.6.1 Temperatuur .................................................................................................................. 50

9.6.2 Druk ............................................................................................................................... 52

9.7 Relais ..................................................................................................................................... 53

9.8 Loggen van data .................................................................................................................... 56

9.9 Andere routines ..................................................................................................................... 59

10 Behuizing ................................................................................................................................... 62

11 Totaal schemaoverzicht in eagle ............................................................................................... 63

12 Printontwerp datalogger ........................................................................................................... 67

13 Aanpassingsprint zend / ontvangstmodule ............................................................................... 69

13.1 Schema: ................................................................................................................................. 69

13.2 Printontwerp: ........................................................................................................................ 69

14 Metingen ................................................................................................................................... 70

15 Problemen + oplossingen .......................................................................................................... 72

16 Componentenlijst ...................................................................................................................... 74

17 Prijslijst ...................................................................................................................................... 75

18 Bibliografie................................................................................................................................. 76

18.1 Bronnen ................................................................................................................................. 76

18.2 Gebruikte programma’s ........................................................................................................ 76

18.3 Foto’s ..................................................................................................................................... 77

19 Conclusie ................................................................................................................................... 78

20 Toekomstmogelijkheden ........................................................................................................... 78

Page 4: Projecten met AVRµC

Pagina 4 van 138

MP3 met AVR ............................................................................................................................ 79

21 MP3-speler afspelen met AVR ................................................................................................... 81

21.1 Project omschrijving .............................................................................................................. 81

21.2 Onderzoek ............................................................................................................................. 81

21.2.1 Keuze AVR ...................................................................................................................... 81

21.2.2 AT32UC3B1128 .............................................................................................................. 82

21.2.3 ATmega8 ........................................................................................................................ 82

21.2.4 VS1003 ........................................................................................................................... 83

21.3 Blokschema............................................................................................................................ 84

21.4 Schema analyse ..................................................................................................................... 85

21.5 Printontwerp ......................................................................................................................... 88

21.5.1 Componenten ................................................................................................................ 88

21.5.2 Volledig .......................................................................................................................... 88

21.5.3 Top ................................................................................................................................. 89

21.5.4 Bottom ........................................................................................................................... 89

21.6 Code ....................................................................................................................................... 90

21.7 Behuizing ............................................................................................................................. 106

21.8 Componentenlijst ................................................................................................................ 107

22 Besluit ...................................................................................................................................... 108

23 Toekomstmogelijkheden ......................................................................................................... 108

23.1 Bibliografie........................................................................................................................... 109

23.1.1 Bronnen ....................................................................................................................... 109

23.1.2 Gebruikte programma’s .............................................................................................. 109

Klasse D versterker .................................................................................................................. 110

24 Inleiding ................................................................................................................................... 112

25 Introduction ............................................................................................................................. 113

26 Introduction ............................................................................................................................. 114

27 Principes klasse D .................................................................................................................... 115

28 Half bridge: .............................................................................................................................. 115

29 Full bridge: ............................................................................................................................... 116

29.1 Type AD: .............................................................................................................................. 117

29.2 Type BD:............................................................................................................................... 118

30 Spread spectrum ..................................................................................................................... 119

31 Filtering .................................................................................................................................... 121

Page 5: Projecten met AVRµC

Pagina 5 van 138

32 Componentkeuze .................................................................................................................... 121

33 Rendement .............................................................................................................................. 122

34 Vervorming .............................................................................................................................. 122

35 Klasse D versterker gebaseerd op LM48511 ........................................................................... 122

35.1 SMT / SMD soldeeroven ...................................................................................................... 126

36 Klasse D versterker gebaseerd op VMA2012 .......................................................................... 130

36.1 Metingen ............................................................................................................................. 131

36.2 Visual Analyser 2011 ........................................................................................................... 134

37 Besluit ...................................................................................................................................... 136

38 Bronnen ................................................................................................................................... 137

39 Bijlage ...................................................................................................................................... 138

Page 6: Projecten met AVRµC

Pagina 6 van 138

2 Dankwoord Eerst en vooral wil ik onze school, het KAHO Sint Lieven, bedanken dat wij de mogelijkheid kregen

om onze opleiding als bachelor elektronica te volgen.

Onze bijzondere dank gaat uit naar Dhr Claus voor de begeleiding doorheen dit project.

Page 7: Projecten met AVRµC

Pagina 7 van 138

3 Voorwoord

In het laatste jaar hadden wij de keuze uit verschillende projecten van meerdere docenten.

Uiteindelijk hebben wij een project van meneer Claus toegewezen gekregen, namelijk ‘Projecten met

AVR microcontrollers’. Normaal was dit een project voor 4 studenten maar wij zijn met een groep

van 5. Deze groep bestaat uit: Koen Speliers, Maarten Coppens, Thomas Brijs, Thijs vandamme en

Jerome Coulier.

Dit project bestaat uit 3 subprojecten. Namelijk de datalogger, de spectrum-analyser en de MP3

speler. Wij hebben besloten om ons te verdelen over de verschillende subprojecten. De MP3 speler

wordt gedaan door Koen, Thomas en Maarten. Waarin Maarten zich meer specifiek gericht heeft op

de klasse D versterker. De datalogger wordt onder handen genomen door Thijs en Jerome.

De spectrum analyser werd voorlopig langs de kant geschoven.

Page 8: Projecten met AVRµC

Pagina 8 van 138

Datalogger

Page 9: Projecten met AVRµC

Pagina 9 van 138

De datalogger

Page 10: Projecten met AVRµC

Pagina 10 van 138

4 Project omschrijving - Datalogger

De opdracht van de datalogger loopt nu al een paar jaar. Vorig jaar hebben ze temperatuur –en druk

meting gerealiseerd en ook een LCD uitlezing. Alsook het draadloos verzenden van de data.

De bedoeling voor dit jaar was om de huidige datalogger uit te breiden met extra functies en deze

print ook in te bouwen in een behuizing. De uitbreidingen die wij hebben toegevoegd bestaat uit 2

relais functies, een real time clock en een USB interface.

Via de USB interface zou het dan mogelijk moeten zijn om de data te kunnen exporteren naar Excel.

4.1 Blokschema:

ATMEGA128

microcontroller

USB

Exporteren naar Excel

KEYPAD

RFM22B zend &

ontvangst

module

RTC Realtime Clock

ISP

USB-programmer

LCD

DRUKSENSOR

TEMP.SENSOR

RELAIS

UITGANGEN

Page 11: Projecten met AVRµC

Pagina 11 van 138

5 De grootheden Hier volgt een kort overzicht met welke grootheden wij zullen werken in de datalogger.

5.1 Temperatuur Temperatuur is een maat voor hoe warm of koud iets is. Natuurkundig gezien is het een

kwantificering van de hevigheid van de thermische beweging van atomen en moleculen.

Het woord wordt ook gebruikt in de betekenissen koorts en buitenluchttemperatuur

Temperatuur wordt doorgaans gemeten met een thermometer en in Europa meestal uitgedrukt in

graden Celsius.

Bij ver weg gelegen objecten zoals sterren wordt de temperatuur gemeten via de stralingskromme.

Het correct meten van een temperatuur vraagt een gedegen meettechnische kennis van zowel de

gebruikte meetmethode als het begrip van de thermodynamische verstoring die door de meting

veroorzaakt wordt.

Om temperaturen aan te geven zijn een aantal verschillende temperatuurschalen in gebruik. In

Europa wordt vooral de temperatuurschaal van Celsius gebruikt, in Engelstalige landen die van

Fahrenheit en in de wetenschap de absolute temperatuurschaal die naar Lord Kelvin is genoemd. De

kelvin, afgekort als K (hoofdletter), is de voorgeschreven SI-basiseenheid.

In België worden temperaturen meestal uitgedrukt in graden Celsius. Het nulpunt van de

Celsiusschaal komt overeen met het smeltpunt van water, en 100 graden Celsius is het kookpunt van

water bij een luchtdruk van 1 bar. Dit maakt het in de praktijk gemakkelijk deze twee ijkpunten van

de schaal met enige nauwkeurigheid in ieder laboratorium te reproduceren.

We zijn begonnen met een uitlezing in graden Celsius, er kan in de toekomst eventueel wel een

mogelijkheid voorzien worden om een uitlezing te maken die omzet naar Kelvin en/of graden

Farenheid. Dit kan eventueel software matig gedaan worden.

5.2 Luchtdruk De luchtdruk is de druk die het gewicht van de lucht in de atmosfeer op een oppervlak uitoefent. In

de weerberichten wordt de luchtdruk opgegeven in hectopascal (hPa), wat gelijk is aan millibar, de

oude eenheid voor de luchtdruk.

De luchtdruk wordt gemeten met een barometer. De meeste barometers bevatten een luchtledig

doosje dat afhankelijk van de druk meer of minder ingedrukt wordt. Die verplaatsing wordt

overgebracht op een wijzerplaat, waarop de luchtdruk kan worden afgelezen. Op veel

huisbarometers is nog een schaalverdeling in millimeters kwik te vinden. Deze schaal is eenvoudig

om te rekenen in hectopascal door die getallen met 1,333 te vermenigvuldigen. De gemiddelde

atmosferische druk is 76cm Hg = 1013 hPa = 1 atmosfeer

De enorme kracht van de luchtdruk werd al in 1657 gedemonstreerd met de klassieke proef met een

Maagdenburger bol.

Page 12: Projecten met AVRµC

Pagina 12 van 138

Wij zullen deze grootheid opmeten met een elektronische sensor die dit omzet naar digitale

waarden.

5.3 Tijd Tijd kan na hoogte, breedte en lengte gezien worden als de vierde dimensie. Van een gebeurtenis

kan gezegd worden dat deze na een andere gebeurtenis plaatsvindt. Een gebeurtenis vindt plaats op

een tijdstip. De tijd wordt wel gezien als een opeenvolging van tijdstippen. Daarnaast kan bepaald

worden hoe lang een gebeurtenis na een andere plaatsvindt. Het betreft dan de tijdsduur tussen

twee tijdstippen. Tijd is het begrip waarmee deze volgorde en duur worden beschreven.

Bij ons in het project word dit geïntegreerd aan de hand van de real time clock.

Page 13: Projecten met AVRµC

Pagina 13 van 138

6 Programmeren van de datalogger

Het programmeren van de datalogger gebeurt bij ons via een USB – ISP interface. Meer specifiek

met het “mySmartUSB light” - device.

Via onderstaande link kan je alle downloads, onder “available downloads for this product”

downloaden. Alle software die ik zal gebruiken om het device te configureren kan je afhalen via

onderstaande link:

http://shop.myavr.com/index.php?sp=article.sp.php&artID=200006 .

Eerst moet je de driver voor dit device installeren. Hiertoe volg je de stappen in de ‘USB-Driver for

myAVR-products ’ – link.

Nadat de driver is geïnstalleerd moet je ook nog software van myAVR schrijven op het device zelf,

alvorens het te kunnen gebruiken.

Het schrijven wordt gedaan met de ‘SupportBox’.

Nadat het device is geconfigureerd kan je nu de datalogger programmeren via 2 methodes. Namelijk

via ‘myAVR’ en via ‘AVRstudio’.

Page 14: Projecten met AVRµC

Pagina 14 van 138

6.1 Programmeren met myAVR:

Als je wilt programmeren met de software van myAVR heb je 2 programma’s nodig. Namelijk

‘ProgTool’ en ‘SupportBox’. Hiervoor heb je geen externe voeding nodig! Bij deze methode wordt er

gebruik gemaakt van de 5V uit de USB poort.

Voordat je wilt programmeren, moet je wel de programmer verbinden met de datalogger.

Allereerst moet je het device selecteren via ProgTool. Dit via het ‘vraagteken’ icoontje.

Wanneer je nu een groen kader verkrijgt met informatie in, dan is er succesvol verbinding gemaakt.

Wanneer je een rood kader zou verkrijgen is er iets mis gelopen in het verbinding proces. Mocht dit

gebeuren kan je eerst na gaan of je PC het device wel gevonden heeft, dit kan je onder andere doen

via ‘device manager’ van windows.

In volgende figuur zie je hoe er verbinding moet gemaakt worden:

Vervolgens via de ‘burn’ – tab, kan je het device schrijven.

Dit door de correcte hex file te laden en dan op ‘burn’ te klikken. Deze hex file wordt aangemaakt via

u geschreven code in AVRstudio.

Page 15: Projecten met AVRµC

Pagina 15 van 138

Het programma springt vervolgens automatisch naar de ‘output’ tab. Hier kan je de voortgang zien

van het schrijven van de µC zelf. Als alles goed verlopen is, krijg je het volgende te zien:

Als je dan op de ‘power on’ knop klikt van de ‘supportbox’ programma, voorzie je de USB van 5V.

Hierdoor wordt de datalogger gevoed via de USB aansluiting en krijg je een werkend geheel.

Page 16: Projecten met AVRµC

Pagina 16 van 138

6.2 Programmeren met AVRstudio:

Als je via AVRstudio wilt programmeren kan dit ook. Dit gebeurt als volgt:

Allereerst, als je nog programma’s van myAVR hebt open staan moet je deze eerst sluiten. Deze

kunnen namelijk voor conflicten zorgen tijdens en na het programmeren betreffende de voeding.

In tegenstelling tot het programmeren met myAVR software, heb je hier wel een externe voeding

nodig.

Want als je probeert, gebruik te maken van ‘SupportBox’ voor het bordje te voeden, dan kun je het

device wel programmeren, maar moet je deze elke keer na het programmeren loskoppelen van de

USB en terug aankoppelen. Dit zijn de eerder genoemde conflicten.

Daarom is er de voorkeur om hier wel een externe voeding te gebruiken tijdens het programmeren,

anders is het nogal omslachtig om altijd het USB device af / aan te koppelen. Maar in principe kan het

dus eigenlijk wel.

In onderstaand figuur vind je terug hoe je de µC moet programmeren.

Voor het verbinden van het device selecteer je: STK500 – comx. Dit via het CON icoon.

Comx zijnde de poort waar je het device op hebt aangesloten.

Onder de ‘main’ tab selecteer je de µC en de programmeer methode. Voor ons is dit de’ atmega128’

via de ‘ISP mode’.

Als laatste hoef je enkel nog maar de correcte hex file in te laden bij het ‘flash’ – gedeelte en op

‘Program’ te klikken.

Wanneer alles goed is verlopen, krijg je allemaal OK’s onderaan in je scherm.

Page 17: Projecten met AVRµC

Pagina 17 van 138

7 Schema analyse

Wij hebben in ons schema gewerkt met aangepaste ‘net names’. Hierdoor wordt het schema veel

overzichtelijker. Want op deze manier kunnen we de verschillende schema onderdelen tekenen op

verschillende pagina’s, maar toch aan elkaar linken.

7.1 µC

Het hart van de datalogger bestaat uit een atmega128.

Er is voor de atmega 128 gekozen omdat deze microcontroller veel functies en een relatief groot

geheugen heeft.

Dit is nodig want er zijn namelijk behoorlijk wat dataverbindingen die gemaakt moeten worden met

al de verschillende randcomponenten.

Er is dan ook nog de communicatie met de verschillende sensoren en de real time clock. Deze

gebeurt anders dan bvb de communicatie met de relais of de LCD, hier wordt er namelijk gebruik

gemaakt van de I²C bus.

Page 18: Projecten met AVRµC

Pagina 18 van 138

We maken ook gebruik van de SPI, hier zit de ontvangstmodule op aangesloten. Om de data naar te

PC te kunnen verzenden maken we gebruik van de UART verbinden van de microcontroller.

Het geheugen van de microcontroller is ook belangrijk. Ten eerste, we moeten onze code die we

geschreven hebben kunnen programmeren in de microcontroller.

Ten tweede, het is de bedoeling om een datalogger te maken dus moeten we de data kunnen

opslaan in de microcontroller. De atmega128 heeft voldoende geheugen om de nodige data op te

slaan.

7.2 Deelschakelingen met UART

Wat is UART?

Een UART, ‘universal asynchronous receiver / transmitter’ is verantwoordelijk voor het uitvoeren van

de hoofdtaken bij seriële communicatie met computers.

Data overdracht bij UART werkt over 2 lijnen, namelijk de RxD en de TxD pin.

De chip verandert binnenkomende parallelle informatie naar seriële data die kan worden verzonden

over een communicatielijn. Een tweede UART wordt dan gebruikt om de informatie weer te

ontvangen. De UART voert alle benodigde taken uit zoals timing, pariteitcontrole, etc. die nodig zijn

voor de communicatie. De enige chips die nog extra nodig zijn, zijn line drivers die de signalen van

TTL niveau converteren naar lijn spanningen en omgekeerd.

Om de UART in verschillende omstandigheden te kunnen gebruiken zijn registers aanwezig om de

communicatie instellingen te lezen en te wijzigen. Instellingen die kunnen worden gemaakt zijn

bijvoorbeeld de communicatiesnelheid, de pariteitcontrole methode en de manier waarop

binnenkomende gegevens worden gemeld aan de software.

7.2.1 ISP

Om de µC eenvoudig te kunnen programmeren, hebben we gebruik gemaakt van een ISP verbinding.

ISP staat voor In System Programming. Om ISP te kunnen gebruiken moet je volgende lijnen naar

buiten brengen:

Programmer’s data uitgang lijn ( MOSI )

Reset lijn

Programmer’s clock lijn

Programmer’s data ingang lijn ( MISO )

VCC

GND

Page 19: Projecten met AVRµC

Pagina 19 van 138

Zoals gezegd bij het puntje ‘Problemen + oplossingen’, is de MOSI pin verbonden met de RxD pin en

de MISO pin met de TxD pin, dit via draadbrugjes. Dit zijn de 2 lijnen nodig om via UART te

programmeren.

7.2.2 USB

De USB interface is gerealiseerd met de FT232RL IC. Deze IC is de interface tussen de microcontroller

en de USB poort. Deze interface gebeurd via de UART verbinding.

De jumper JP1 wordt gebruikt om de USB spannings level te kiezen wanneer de USB uitgang actief is.

Er kan gekozen worden tussen 5V en 3.3V.

Wanneer pin 1 – 2 verbonden is 5V;

Wanneer pin 2 – 3 verbonden is 3.3V.

De FT232R is een interface om van USB naar UART om te schakelen.

Waarom USB?

De data die wij loggen via de microcontroller wensen wij in te lezen in Excel. Zodanig dat wij het

verloop van de ingelezen parameters kunnen uitzetten in een grafiek.

Vorig jaar gebruikten ze hiervoor een RS232 interface. Omdat deze interface niet meer op elke PC

aanwezig is, hebben wij besloten deze te vervangen door een USB interface.

Bovendien ligt de dataoverdracht van een USB interface veel hoger. De FT232RL ondersteunt

namelijk USB2.0, deze heeft een maximale overdrachtsnelheid van 480Mbit/s.

Page 20: Projecten met AVRµC

Pagina 20 van 138

7.3 RFM22B

Bij ons project was het ook de bedoeling om data draadloos te kunnen verzenden naar de

datalogger. Hiervoor gaan we gebruik maken van de RFM22B module die meneer Claus voor ons

voorzien heeft.

Deze module communiceert via de SPI bus.

7.3.1 Wat is SPI?

De SPI bus of de Serial Peripheral Interface bus is een twee directionele synchrone bus verbinding die

ontwikkelt is door Motorola.

SPI apparaten communiceren onderling in master en slave mode.

Wanneer we meer slaven willen moeten we gewoon een extra slave select nemen. De SPI bus wordt

ook soms “4 wire bus” genoemd.

Uitleg van de 4 logische signalen.

SCLK: Serial clock. Gegenereerd door master.

MOSI: Master output , slave input

MISO: Master input , slave output

“/SS”: Slave select. (actief laag)

Andere veel gebruikte benamingen voor de 4 draden.

CLK, SCK : Serial clock

SDI, DI, SI : Serial data in

SDO, DO, SO Serial data out

“/nCS”, “/CS”, “/nSS”, “/STI”: Chip select

Wij maken gebruik van SCKK, MOSI, MISO en “/SS” (NSEL).

Sommige apparaten of toepassingen hebben geen MISO en dus ook geen full duplex mode nodig

deze wordt dan gewoon open gelaten.

Page 21: Projecten met AVRµC

Pagina 21 van 138

7.3.2 Werking

Wanneer de “/SS” laag is kunnen we lezen en schrijven met het desbetreffende apparaat. De CLK

heeft op een bepaalde frequentie pulsen. Wanneer er op de eerste puls van de SCK de MOSI lijn een

bitwaarde van 1 heeft zal, op voorwaarde van MSB eerst en een 12 bit waarde, de 12de bit van links

1 zijn. Is er nu op de volgende klokpulsen telkens een 0 op de MOSI zal de slaaf een waarde van 1000

0000 0000 ingelezen hebben. Dit komt overeen met een decimale waarde van 2048.

Hieronder werd afbeelding van een typisch tijdsdiagram voor een SPI-bus ingelast maar er zijn enorm

veel verschillen bij deze bus qua timing. Sommige maken geen gebruik van een MISO andere hebben

nog een aparte uitgang die hoog komt tussen het sturen op MISO en MOSI (Half duplex). Er is ook

een verschil in lezen op verschillende plaatsen van de klokpuls. Er kan gelezen worden op stijgende

flank, dalende flank, net na dalende flank, net na stijgende flank. Er is ook verschil tussen MSB en LSB

dit bepaalt of de eerste ingelezen waarde de Most significant bit is of de Least significant bit. De

voorste bit van de rij is de MSB en de laatste bit van de rij is de LSB dus de minst betekende bit.

7.4 Voeding

Er zijn 2 verschillende voedingen aanwezig. Namelijk de VCC (5V) en de VCC3.3 (3.3V).

De meeste deelschakelingen maken gebruik van de VCC voeding. Enkel de RTC en de RFM22B moest

gevoed worden met een lagere spanning.

Om de datalogger draagbaar te maken, maken wij gebruik van een 9V batterij.

Page 22: Projecten met AVRµC

Pagina 22 van 138

7.4.1 LM317

Om de 5V te verkrijgen maken wij gebruik van de LM317. We gebruiken deze IC omdat deze

makkelijk verkrijgbaar is en ook een stabiele uitgangsspanning geeft.

Deze 5V wordt bepaald door de verhouding van R15/R16 en de gebruikte ingangsspanning.

Als ingangsspanning zullen wij gebruik maken van een 9V alkaline - batterij. Zodanig dat onze

datalogger draagbaar wordt.

7.4.2 Spanningsomvormer

Om de 3.3V te verwerven voor de real time clock, maken wij gebruik van de MAX604 – low-dropout

IC. Deze IC heeft een uitgangsstroom van 500mA, wat meer dan voldoende is voor onze RTC.

7.5 toetsenbord

De interface met de datalogger wordt gerealiseerd aan de hand van een toetsenbord dat er uit ziet

zoals bovenstaande figuur.

Page 23: Projecten met AVRµC

Pagina 23 van 138

Zo een matrix toetsenbord bestaat uit rijen en kolommen en steunt dus op het matrix principe.

Hierbij gaan we de kolomen aansturen en de rijen uitlezen of omgekeerd.

Als we nu op een toets drukken wordt een rij met een kolom verbonden. Als we nu weten op welke

rij we een spanning hebben aangebracht en op welke kolom die spanning aanwezig is dan weten we

welke toets we hebben ingedrukt.

Page 24: Projecten met AVRµC

Pagina 24 van 138

7.6 Componenten met I²C

Alle sensoren en de real time clock, communiceren met de microcontroller via I2C. Al deze

deelschakelingen werken als slave en enkel de microcontroller fungeert als master.

7.6.1 Wat is I²C?

I2C is een overdrachtssysteem dat ontwikkeld werd door Philips. Het is een soort tussen oplossing

tussen serieel en parallel.

Alle datacommunicatie gebeurt bij I2C over 2 draden. Namelijk een datalijn SDA en een kloklijn SLC.

7.6.1.1 Fysieke eigenschappen van de I2C bus

In het fysieke ontwerp van de I2C bus is er een datalijn SDA en een kloklijn SLC gedefinieerd. Deze

twee lijnen creëren een synchrone seriële bus.

Het aantal aan te sluiten apparaten op de bus is slechts gelimiteerd door de maximaal toegelaten

capaciteit op de bus van 400pF. Omdat de meeste ICs met een I2C inteface gebruik maken van low-

power CMOS technologie met een hoge ingangsweerstand, kunnen veel ICs worden verbonden met

de I2C bus voor de maximale capaciteit is bereikt.

Het kloksignaal op de bus wordt gegenereerd door één van de masters die met de I2C bus is

verbonden. Als er geen communicatie plaatsvindt worden de SDA en SLC lijnen met een pull-up

weerstand naar de voedingsspanning getrokken.

I2C bus interface schema

Voedingsspanningsniveaus zijn flexibel. Het is mogelijk om een 5V DC voeding voor de bus en

componenten te gebruiken, maar zelfs spanningen van minder dan 2V DC kunnen worden gebruikt.

Hierdoor kan de I2C bus worden geïmplementeerd in vele soorten circuits zonder de noodzaak van

een eigen voeding.

Level shifters kunnen worden gebruikt wanneer een I2C bus twee subsecties bevat met verschillende

voedingsspanningen, bijvoorbeeld 3,3 Volt en 5 Volt.

Page 25: Projecten met AVRµC

Pagina 25 van 138

I2C inputs van fast mode en high-speed mode ICs gebruiken Schmitt-trigger logica om de effecten

van storingen te verminderen.

7.6.1.2 Start en stop condities op de I2C bus

Alleen masters kunnen dataoverdracht initiëren op de I2C bus. Wanneer een master op de I2C bus

wenst te communiceren met een slave moet het zich eerst de controle over de bus toe-eigenen. Dit

is alleen mogelijk wanneer de bus IDLE is, dit wil zeggen dat zowel de SDA als de SLC lijn hoog zijn.

De master creëert een START conditie om andere apparaten op de bus te melden dat het de bus

overneemt. Om een START conditie te genereren blijft de kloklijn SLC hoog, terwijl de master de SDA

lijn omlaag brengt. Dit is een unieke situatie. Tijdens een normale dataoverdracht zal de SDA datalijn

alleen van toestand wijzigen wanneer de SLC kloklijn laag is.

Elk apparaat op de I2C bus weet dat een nieuwe communicatie sessie start wanneer de datalijn naar

laag gaat terwijl de kloklijn nog hoog is. Hiermee is hersynchronisatie mogelijk wanneer er fouten zijn

opgetreden in de vorige dataoverdracht en apparaten de synchronisatie zijn kwijtgeraakt.

Het einde van een communicatiesessie wordt aangegeven met een STOP conditie. De STOP conditie

wordt gegenereerd door de SDA datalijn hoog te maken terwijl de kloklijn SLC ook hoog is.

Net als bij de START conditie kan deze verandering van de SDA lijn niet plaatsvinden tijdens een

normale dataoverdracht en aangesloten ICs kunnen hun interne communicatielogica zo resetten

wanneer de vorige transfer in een fout is geëindigd.

Nadat de STOP conditie is gegenereerd wordt de I2C bus geacht vrij te zijn voor een nieuwe

communicatiesessie wanneer een gedefinieerde tijd is verstreken. Deze tijd is afhankelijk van de

bussnelheid.

Meerdere herhaalde START condities kunnen voorkomen wanneer een START conditie wordt

gegenereerd zonder een STOP conditie die de voorgaande transfer sessie beëindigd. Na een

herhaalde START conditie blijft de bus bezet en daarom kan deze situatie in het algemeen worden

gezien als een normale START conditie.

7.6.1.3 Dataoverdracht met I2C

Tussen de START en STOP condities vindt de dataoverdracht plaats. De eenheid van de datatransfer

op de I2C bus is de byte. Data wordt van de master naar de slave overgedragen, of terug naar de

master, in bytes. De eerste byte in elke dataoverdracht is het adres van de slave. Slechts zeven van

de acht bits in de adresbyte worden gebruikt om het slave adres de definiëren. De laagste orde bit

geeft aan of het een lees of schrijfopdracht is.

Een laag bit geeft een schrijfopdracht aan, terwijl een hoog bit een leesverzoek inhoudt. Bij de

dataoverdracht wordt het meest significante bit het eerst verstuurd.

Tijdens de dataoverdracht wijzigt de master de toestand van de kloklijn SLC periodiek van hoog naar

laag en terug. Data op de SDA lijn mag alleen worden gewijzigd wanneer de SLC lijn in de laag

toestand is.

Nadat de SDA lijn is gewijzigd naar de gewenste bit waarde wordt de SLC lijn weer hoog gemaakt om

aan de andere ICs op de I2C bus te melden dat er een geldig data bit aanwezig is op de lijn.

Page 26: Projecten met AVRµC

Pagina 26 van 138

ICs op de I2C bus hebben vaak een zeer gelimiteerd geheugen, logica en snelheid. Daarom moet elke

verzonden byte worden bevestigd door de ontvanger.

Wanneer een master een byte heeft verzonden zendt het een negende klokpuls mee, om te zegge

wanneer de bevestiging plaats zou moeten vinden.

Zoals al eerder gezegd wordt de hoog status van de SDA lijn verzorgd door een pull-up weerstand. De

slave moet de SDA lijn omlaag trekken tijdens de negende klokpuls. Wanneer dit niet gebeurt en in

plaats daarvan blijft de SDA lijn hoog, weet de master dat een fout is opgetreden tijdens de

dataoverdracht.

Wanneer een slave bezig is met een opdracht, of eenvoudigweg zeer langzaam in zijn functioneren is

en het kan een volgende byte niet ontvangen voor de vorige is verwerkt, dan kan de periode na het

negende bevestigingsbit worden gebruikt om de master te laten wachten.

Opnieuw is hier de logica om de master af te remmen heel eenvoudig. Wanneer de master een

nieuw byte wenst te verzenden moet de master de SLC lijn naar de laag toestand brengen. De master

wijzigt daarna de SLC lijn naar zijn hoog toestand door zijn uitgang in hoge impedantie te schakelen.

Normaal zal de pull-up weestand de toestand van de SLC lijn naar hoog brengen, maar wanneer de

slave de communicatie wil vertragen trekt het eenvoudigweg de SLC lijn naar de lage toestand voor

de periode die het nodig heeft om zijn voorgaande activiteiten te beëindigen.

De master kan alleen de dataoverdracht voortzetten wanneer het detecteert dat de SLC lijn weer in

de hoge toestand is. Hiermee is een zeer eenvoudige en effectieve methode gecreëerd om langzame

slaves met gelimiteerde verwerkings- en geheugencapaciteit te laten communiceren met snellere

masters.

Wanneer alle bytes zijn ontvangen en verwerkt wordt de STOP conditie door de master gegenereerd

om de bus vrij te geven voor andere communicatie.

7.6.1.4 Speciale situaties: synchronisatie en arbitrage

Eén van de krachtige eigenschappen van de I2C bus is de mogelijkheid om meer dan één master op

de bus aan te sluiten.

Dit kan echter een bron van problemen opleveren. Ten eerste genereert elke master zijn eigen

kloksignaal. Deze kloksignalen kunnen onderling verschillen wat synchronisatieproblemen kan

opleveren. Bovendien moet een systeem worden geïmplementeerd om te voorkomen dat meer dan

één master actief is op de bus op elk gegeven moment.

Beide problemen worden opgelost door de synchronisatie en arbitrage logica in de I2C bus masters.

Elke I2C master heeft twee interne tellers. Eén teller wordt gebruikt om de lengte van de hoog

periode van de SLC kloklijn van de I2C bus te tellen, de andere wordt gebruikt voor het tellen van de

lengte van de lage toestand op de SLC lijn.

Wanneer er slechts één master op de bus aanwezig is bepalen deze twee tellers samen de

klokfrequentie. Wanneer twee of meer I2C masters parallel zijn verbonden kan het voorkomen dat

deze tellers niet op dezelfde snelheid lopen. Dit is waar synchronisatie zijn werk doet.

Zoals al eerder beschreven wordt de SLC kloklijn naar de hoge toestand getrokken door een pull-up

weerstand die met de voedingsspanning is verbonden. Beschouw nu de situatie waarbij de SLC lijn in

de hoge toestand is, en alle interne tellers van de aangesloten masters tellen tot het moment is

Page 27: Projecten met AVRµC

Pagina 27 van 138

bereikt waarop de lijn naar de lage toestand moet worden overgeschakeld.

Zodra één van de masters op de bus de SLC lijn omschakelt naar de lage toestand, detecteren de

andere masters deze situatie en resetten ze hun interne teller. Ze schakelen daardoor allemaal over

naar de lage toestand en de lage periode tellers beginnen met tellen.

Na een bepaalde tijd zal de eerste van deze lage toestand tellers zijn eind bereiken en die I2C master

zal beslissen om de SLC lijn weer naar de hoge toestand te schakelen.

Vanwege het fysieke ontwerp van de bus ,waarbij een pull-up weerstand wordt gebruikt om de hoge

toestand te initiëren, zal de SLC kloklijn niet naar de hoge toestand schakelen zolang er tenminste

één I2C master nog de lengte van de lage toestand aan het tellen is.

Wanneer de laatste I2C master beslist om de SLC lijn om te schakelen naar de hoge toestand zal de

kloklijn van toestand veranderen. Alle masters met snellere counters hebben gewacht op dit moment

waarbij de toestand van de lijn omschakelt,nu kunnen alle masters starten met het tellen van de

lengte van de hoge toestand.

Met dit systeem van synchronisatie wordt de lengte van de hoge toestand van de SLC kloklijn

bepaald door de snelste I2C master die op de bus aangesloten is en de lengte van de lage toestand

door de langzaamste deelnemer.

Arbitrage is een ander interessant geval. Beschouw de situatie waarbij de I2C bus niet actief is en

twee of meer masters op hetzelfde moment beslissen om een communicatie sessie te starten. Een

procedure is noodzakelijk om te beslissen welke master het recht op de bus krijgt, en welke master

moet wachten op de volgende niet actieve periode. Deze procedure wordt arbitrage genoemd.

We weten al, dat een master een communicatie sessie start met de START conditie. De SDA lijn

wordt naar beneden getrokken terwijl de SLC kloklijn hoog blijft.

Wanneer twee masters dit op hetzelfde moment doen kunnen ze niet detecteren of de START

conditie is veroorzaakt door hun eigen actie, of door een andere master. Daarom zullen zij doorgaan

met hun protocol en de eerste databyte verzenden naar de gewenste slave. Elke keer wanneer een

bit wordt gezet op de SDA lijn, controleert de master vervolgens welke waarde aanwezig is op de SDA

lijn. Een master kan alleen de SDA data lijn naar een lage toestand trekken, maar niet naar een hoge.

Wanneer de master een hoog bit wou verzenden, maar het detecteert een lage waarde op de SDA

lijn nadat de SLC kloklijn naar de hoge toestand is gegaan, dan weet het dat een andere master ook

op datzelfde moment aan het zenden is.

De master die als eerste deze situatie detecteert breekt onmiddellijk de communicatie af en zal het

later opnieuw proberen. De andere master vervolgt de communicatie en krijgt prioriteit toegewezen

over de I2C bus.

Het kan een behoorlijk aantal bits kosten voordat een master detecteert dat een andere master ook

informatie verzendt. Speciaal wanneer beide masters dezelfde slave adresseren, wat resulteert in

hetzelfde bitpatroon in het adresbyte, kan het een behoorlijk aantal bits kosten voordat één van de

masters de communicatie afbreekt. Dit heeft echter geen negatieve invloed op de communicatie van

de andere masters omdat er geen bits beschadigde bits zullen zijn.

Een speciale situatie treedt op met ICs die zowel als master en als slave functioneren op dezelfde I2C

bus. Wanneer arbitrage plaatsvindt, kan het zijn dat de verliezende master feitelijk de slave is

waarmee de winnende master contact probeert te maken. In dergelijke gevallen moet de verliezende

Page 28: Projecten met AVRµC

Pagina 28 van 138

master direct omschakelen naar slave mode en de al verstuurde bits interpreteren om te zien of zijn

slave adres door de andere master is geselecteerd.

7.6.2 Temperatuursensor

Voor de

temperatuurmeti

ng gebruik ik de

DS1621 van

Maxim, de

werking wordt

uitgelegd aan de

hand van volgend

blokschema:

De DS1621 maakt gebruik van een bandgap-based temperatuursensor die de temperatuur opmeet.

Deze temperatuur wordt dan omgezet door een analoog digitaal convertor. Deze temperatuur is

gekalibreerd in graden Celsius. De temperatuur bestaat nu uit twee bytes. De eerste byte bevat de

temperatuur voor de komma de tweede byte na de komma.

De eerste byte staat in two’s complement dit wel zeggen dat de msb de tekenbit is. De tweede byte

is oftewel 128 en dat staat voor 0,5°C of 0 en dat staat voor0,0°C. In onderstaande tabel zie je enkele

voorbeelden.

De DS1621 werkt uiteraard enkel als slave.

Page 29: Projecten met AVRµC

Pagina 29 van 138

7.6.3 Luchtdruksensor

Als druksensor maken we gebruik van een csdx081 baro. Deze luchtdruksensor werkt ook met het

I2C protocol en fungeert ook enkel als slave.

Deze sensor geeft de luchtdruk weer aan de hand van counts.

800mbar is 400 counts en 1100mbar is 3600 counts.

7.6.4 Real Time Clock

Om de RTC te realiseren hebben wij gebruik gemaakt van deze ds32x35

Deze RTC is een IC dat de tijd en datum bijhoudt wanneer de datalogger uit staat. Deze IC is onder

andere voorzien van een geïntegreerde temperatuur compensatie en een kristal dat resoneert op

een frequentie van 32.768 kHz. Hierdoor verkrijg je een zeer accurate RTC.

Deze IC controleert ook constant de Vcc3.3 spanning en wanneer nodig schakelt deze automatisch en

direct over naar de batterij spanning.

Via de RST – pin, kan je een externe reset geven. Bij ons dus via het toetsbord.

Een voordeel van deze DS32x35 is het type van geheugen dat gebruikt wordt. Er wordt namelijk

gebruik gemaakt van FRAM geheugen. Hierdoor is het energie verbruik stukken lager dan bvb

geheugen met EEPROM.

Het geheugen gebruik van FRAM is vergelijkbaar met dat van EEPROM, maar dan met het grote

verschil dat er veel meer schrijf cyclussen kunnen plaats vinden. Daar waar EEPROM ongeveer

1milljoen schrijf cyclussen mee gaat, is dat voor FRAM 10biljoen cyclussen. Hierdoor is de levensduur

zeer groot.

Een tweede voordeel van FRAM geheugen is de snelheid waarmee er geschreven wordt. Dit gebeurt

namelijk op de snelheid van het I2C interface. Ook zijn er geen limieten voor de grootte van de

geschreven data. Het is zelfs zo dat je, indien gewenst, het gehele geheugen kan schrijven in 1 schrijf

opdracht.

Page 30: Projecten met AVRµC

Pagina 30 van 138

Een laatste voordeel, is dat er niet moet gekeken worden of de IC klaar is voor schrijfopdrachten te

ontvangen.

7.7 LCD

7.7.1 Regelen lichtsterkte

Het LCD scherm dat wij gebruiken heeft een pin om de contrast te regelen en een om de lichtsterkte

te regelen.

De pin voor de contrast te regelen is de V00, deze hebben wij aan de massa gelegd om zo maximaal

contrast te hebben. Zodanig dat we steeds zeer duidelijke tekst zien.

Om de lichtsterkte te regelen hebben wij geopteerd om gebruik te maken van een PWM – sturing.

Om dit te kunnen realiseren moesten wij wel een versterkend element plaatsen tussen de ledK – pin

en de microcontroller. Hiervoor hebben wij een BC817 transistor gebruikt.

Het PWM signaal wordt ook bestuurd met het toetsenbord

7.7.1.1 Wat is PWM?

Een PWM of Pulse Width Modulation is een spanning of stroom in de vorm van een blokgolf met

dezelfde frequentie. Door het veranderen van de breedte van het signaal kunnen we de gemiddelde

spanning laten dalen of stijgen. In het ideale geval is er geen vermogensverlies over de schakelaar.

Als de schakelaar gesloten is staat er geen spanning over en als de schakelaar open is loopt er geen

stroom door.

𝑈𝑔𝑒𝑚 = Û ∗ 𝛿

𝛿 = 𝑑𝑢𝑡𝑦 𝑐𝑦𝑐𝑙𝑒

Page 31: Projecten met AVRµC

Pagina 31 van 138

In bovenstaande figuur enkele PWM signalen met een verschillende duty cycle.

7.8 Relais

Op de datalogger zijn er ook 2 relais voorzien.

Deze relais worden aangestuurd door een PNP transistor, waarvan de basis via een weerstand door

de µC wordt gestuurd.

De drie contacten van de relais; NC, NO, COM, worden naar buiten gebracht via drie pinnen.

Er is ook een simpele led voorzien om de status van de relais aan te duiden. Wanneer de relais actief

is, licht de led op.

Page 32: Projecten met AVRµC

Pagina 32 van 138

8 Handleiding Hier kan je vinden hoe je de datalogger moet gebruiken.

Bij het aanzetten van de schakelaar wordt het startscherm geactiveerd.

Opmerking: 00:00 is de weergave van de huidige tijd.

Na een korte periode van ongeveer 5 seconden verschijnt volgend hoofdscherm:

Mogelijke keuzes zijn:

A = klok instellen

B = Temperatuur / druk

C = Relais aansturen

D = loggen van data

5 = lichtsterkte met 1 niveau lager zetten.

6 = lichtsterkte met 1 niveau hoger zetten.

8.1 Instellen van klok Na het duwen op knop A op het hoofdscherm verschijnt volgend scherm:

Indien deze weergave niet gewenst is, kan men terugkeren naar het hoofdscherm door middel van

het duwen op knop # .

Als men de klok wilt instellen, kan men aan de hand van het toetsenbord de correcte huidige tijd

gaan instellen. In eerste instantie stelt men de uren in, via de uiterst linkse digit, en nadien worden

ook de minuten en de seconden ingesteld.

Wanneer het instellen is afgerond, duwt men op de knop # . Nadien wordt er teruggekeerd naar het

hoofdscherm.

8.2 Uitlezing van temperatuur of druk Na het duwen op knop B op het hoofdscherm, verschijnt volgend scherm:

Indien deze weergave niet gewenst is, kan men terugkeren naar het hoofdscherm door middel van

het duwen op knop # .

Vervolgens krijgt men twee keuzes: knop A voor de uitlezing van de temperatuur en knop B voor

de uitlezing van de druk.

A=Temperatuur

B=Druk

klok instellen:

00:00:00

A=K B=TD C=R D=L

00:00

DATALOGGER

00:00

Page 33: Projecten met AVRµC

Pagina 33 van 138

8.2.1 Uitlezing van Temperatuur A .

Na het drukken op knop A verschijnt het volgende scherm:

Na 2 seconden verschijnt het volgende scherm:

Opmerking: indien deze menukeuze niet gewenst is, drukt men op # om terug te keren naar het

hoofdscherm.

8.2.2 Uitlezing van Druk B .

Na het drukken op knop B verschijnt het volgende scherm:

Na 2 seconden verschijnt het volgende scherm:

Opmerking: indien deze menukeuze niet gewenst is, drukt men op # om terug te keren naar het

hoofdscherm.

bdr : 250 mBar

Bdr : 265 mBar

Uitlezing

Druk:

btemp : 25,5 C

Btemp : 26,0 C

Uitlezing

Temperatuur:

Page 34: Projecten met AVRµC

Pagina 34 van 138

8.3 Aansturen van Relais

Nadat men op knop C heeft geduwd op het hoofdscherm verschijnt volgend scherm:

Indien deze weergave niet gewenst is, kan men terugkeren naar het hoofdscherm door middel van

het duwen op knop # .

Men krijgt dan twee mogelijke keuzes: knop A voor het aansturen van de 1e relais, knop B voor het

aansturen van de 2e relais.

De functies van knop B zijn analoog aan de functies van knop A , maar met B wordt de 2e relais

aangestuurd.

Bij het drukken op knop A verschijnt volgend scherm :

Hier kan men er vervolgens voor kiezen om de Relais te activeren ( door op knop A te drukken) of

om de Relais te stoppen ( door op knop B te drukken).

Als de Relais geactiveerd is, dan verschijnt volgend scherm A :

Als de Relais gestopt is, dan verschijnt volgend scherm B :

Indien men terug wilt keren naar het hoofdscherm, drukt men op # .

RELAIS 1

GESTOPT

RELAIS 1

GEACTIVEERD

RELAIS 1

A=ACTIV B=STOP

A= relais 1

B= relais 2

Page 35: Projecten met AVRµC

Pagina 35 van 138

8.4 Loggen van data Loggen van data is opslaan van data die worden opgeslagen in het geheugen en worden verzonden

via USB naar de computer.

Nadat men op knop D heeft geduwd op het hoofdscherm verschijnt volgend scherm:

Indien deze weergave niet gewenst is, kan men terugkeren naar het hoofdscherm door middel van

het duwen op knop # .

Je kan nu ingeven na welke periode er wordt gelogd. Bijvoorbeeld: als je wilt dat er elke 2 seconde

moet gelogd worden dan druk je op 2 en daarna op A om te bevestigen. Als je een foutje maakt

kan je op knop B drukken. Daarna wordt er teruggekeerd naar de vorige waarde.

Je selecteert hoeveel logs er dienen te gebeuren. Je voert het aantal in en daarna druk je op A om

te bevestigen, als je een foutje maakt kan je op knop B drukken, daarna wordt er teruggekeerd naar

de vorige waarde.

Als dit scherm tevoorschijn komt, wil dit zeggen dat het apparaat bezig is met het loggen van data.

Daarna word je gevraagd om op de knop A te drukken. Dan worden de gegevens verzonden via de

seriële poort.

Er wordt nu gestart met verzenden van gelogde data naar de computer.

Je ziet dit scherm als de gelogde data verzonden zijn.

Daarna wordt er teruggekeerd naar het hoofdscherm.

GEDAAN

Zenden naar comp

Druk op A

BEZIG

Aantal logs

10

Om sec. loggen

1

Loggen

Page 36: Projecten met AVRµC

Pagina 36 van 138

9 Code Dit jaar hebben wij verder gebouwd op de code van vorig jaar. Omdat ze vorig jaar de code hadden

omgevormd van bascom naar C, schrijven wij dit jaar ook de code verder in C.

We zullen hieronder een reeks van codes opsommen om toe te lichten waarvoor bepaalde codes

dienen. We starten met declaraties.

9.1 Declaraties Hiermee worden globale variabelen bedoeld, wat concreet betekent dat deze variabelen overal

toegankelijk zijn in het hele programma.

unsigned int status;

unsigned char klok1[6];

unsigned char logtel=1;

unsigned char starten=0;

unsigned char odhsl; //aantal logs per minuut

unsigned char aantallogs; // aantal minuten loggen

unsigned char aantallogstel;

unsigned char klokaan=0;

unsigned char b1klok1[OPSLAAN];

unsigned char b2klok2[OPSLAAN];

unsigned char b3klok3[OPSLAAN];

unsigned char b4druk1[OPSLAAN];

unsigned char b5druk2[OPSLAAN];

unsigned char b6temp1[OPSLAAN];

unsigned char b7temp2[OPSLAAN];

unsigned char REL1=0;

unsigned char REL2=0;

Declaratie van het hoofdprogramma:

temp t1,t2,t1oud,t2oud;

druk d1,d2,d1oud,d2oud;

rtc r1,r2,r1oud,r2oud;

unsigned char geg,test,vangop;

unsigned int relay;

Verschillende instellingen, zoals voor de interrups, poorten, timer en TWI communicatie:

// instellen interrups//

SREG =0x80;

sei();

_delay_ms(50);

portInit();

rfInit();

FIFOReset();

// instellen poorten //

DDRE = DDRE|0x18;

Page 37: Projecten met AVRµC

Pagina 37 van 138

// instellen timer1 //

TIMSK =0x04;

TIFR = 0xff;

init_timer1();

init_timer3();

// instellen uart //

UBRR0L = 25;

UBRR0H = 0;

UCSR0B = 0x18;

UCSR0C = 0x86;

// instellen TWI communicatie //

test = i2c_start(ADRESWRITE);

test = i2c_write(CONFIG);

test = i2c_write(CONTMODE);

i2c_stop();

test = i2c_start(ADRESWRITE);

test = i2c_write(STARTCONVERT);

i2c_stop();

In een header file worden er ook verschillende zaken gedefinieerd, waaronder het I2C adres:

#define ADRESWRITE 0x90

#define ADRESREAD 0x91

#define READTEMP 0xAA

#define ADRESRTCW 0xA0

#define ADRESRTCR 0xA1

#define ADRESDRUKR 0xF0

#define ADRESDRUKW 0xF1

Definities voor toewijziging van pin voor Relais uitgangen:

#define DDRD7 1 // Deze zorgt ervoor dat de pin een uitgang wordt

#define DDRD6 1

#define PORTD7 REL2 // Toekenning van een poort aan een variabele

#define PORTD6 REL1

Page 38: Projecten met AVRµC

Pagina 38 van 138

9.2 Toetsenbord

Rij 1 1 2 3 A

Rij 2 4 5 6 B

Rij 3 7 8 9 C

Rij 4 * 0 # D

Kolom 1 Kolom 2 Kolom 3 Kolom 4 Figuur 1: toetsenbord

Het toetsenbord wordt aangesloten aan de microcontroller met 8 lijnen. De 4 hoogste lijnen

activeren de rijen, en de 4 onderste lijnen activeren de kolommen. In onderstaande kader wordt de

werkwijze en de code verduidelijkt.

unsigned char toetsenbord()

unsigned char key=16;

DDRA= 0xF0;

PORTA = 0x0F;

Declareren van pin.

PORTA = 0b11101111;

if (!bit_is_set(PINA, 0)) while(!bit_is_set(PINA, 0)); key = 1;

if (!bit_is_set(PINA, 1)) while(!bit_is_set(PINA, 1)); key = 2;

if (!bit_is_set(PINA, 2)) while(!bit_is_set(PINA, 2)); key = 3;

if (!bit_is_set(PINA, 3)) while(!bit_is_set(PINA, 3)); key = 'A';

Bij het indrukken van de 1e rij wordt op de poort A de 5e bit op 0 gezet. Nadien kijkt de

microcontroller op welke positie wordt gedrukt, door middel van de laagste 4 bits.

PORTA = 0b11011111;

if (!bit_is_set(PINA, 0)) while(!bit_is_set(PINA, 0)); key = 4;

if (!bit_is_set(PINA, 1)) while(!bit_is_set(PINA, 1)); key = 5;

if (!bit_is_set(PINA, 2)) while(!bit_is_set(PINA, 2)); key = 6;

if (!bit_is_set(PINA, 3)) while(!bit_is_set(PINA, 3)); key = 'B';

Bij het indrukken van de 2e rij wordt op de poort A de 6e bit op 0 gezet. Vervolgens kijkt de

microcontroller op welke positie wordt gedrukt, door middel van de laagste 4 bits.

PORTA = 0b10111111;

if (!bit_is_set(PINA, 0)) while(!bit_is_set(PINA, 0)); key = 7;

if (!bit_is_set(PINA, 1)) while(!bit_is_set(PINA, 1)); key = 8;

if (!bit_is_set(PINA, 2)) while(!bit_is_set(PINA, 2)); key = 9;

if (!bit_is_set(PINA, 3)) while(!bit_is_set(PINA, 3)); key = 'C';

Bij het indrukken van de 3e rij wordt op de poort A de 7e bit op 0 gezet. Nadien kijkt de

microcontroller op welke kolom wordt gedrukt, door middel van de laagste 4 bits.

Page 39: Projecten met AVRµC

Pagina 39 van 138

PORTA = 0b01111111;

if (!bit_is_set(PINA, 0)) while(!bit_is_set(PINA, 0)); key = '*';

if (!bit_is_set(PINA, 1)) while(!bit_is_set(PINA, 1)); key = 0;

if (!bit_is_set(PINA, 2)) while(!bit_is_set(PINA, 2)); key = '#';

if (!bit_is_set(PINA, 3)) while(!bit_is_set(PINA, 3)); key = 'D';

Bij het indrukken van de laagste rij ( de 4e rij) wordt op de poort A de 8e bit op 0 gezet. Vervolgens

kijkt de microcontroller op welke kolom wordt gedrukt, door middel van de laagste 4 bits.

return key;

Hierbij wordt de routine verlaten met de waarde van de ingedrukte toets die meegegeven worden.

9.3 Real-Time Clock ( RTC ) Hieronder kan men een aantal functies terugvinden, die gecreëerd worden om de Real-Time Clock te

kunnen aansturen via de microcontroller.

In eerste instantie wordt de structuur voor de g Real-Time Clock edefinieerd.

Uit de Real-Time Clock worden er 3 bytes gehaald. Byte 1 dient voor de uitlezing van seconden, byte

2 voor de uitlezing van minuten en byte 3 zorgt voor de uitlezing van uren.

typedef struct

unsigned char byte1;

unsigned char byte2;

unsigned char byte3;

rtc;

Figuur 2: adressen op Real-Time Clock

Nadien werden er verschillende routines aangemaakt voor het gebruik van RTC in het programma:

Leesinrtc – om Real-Time Clock in te lezen van de IC.

rtc leesinrtc()

rtc r;

unsigned char test;

test = i2c_start(ADRESRTCR)

r.byte1 = i2c_readAck(); //adres 00h //

r.byte2 = i2c_readAck(); //adres 01h //

r.byte3 = i2c_readNak(); //adres 02h //

i2c_stop();

return r

Deze routine zorgt ervoor dat er ingelezen wordt vanuit de IC. Als je de IC oproept via de I2C

communicatie zal de adrespointer van de IC op 00h staan. Als de communicatie wordt gestart vraagt

Page 40: Projecten met AVRµC

Pagina 40 van 138

de microcontroller aan de Real-Time Clock voor bytes ( als de microcontroller een vraag stuurt met

Acknowledge dan vraagt hij om meerdere bytes, als hij een vraag stuurt met Nack dan is het de

bedoeling dat de Real-Time Clock de laatste byte verstuurt). Daarna wordt de I2C communicatie

stopgezet. Er wordt teruggekeerd naar de hoofdfunctie met gegevens van r.

Naar IC van Real-Time Clock schrijven:

void schrijfnaarrtc(rtc r1)

unsigned char test;

test = i2c_start(ADRESRTCW);

test = i2c_write(r.byte1);

test = i2c_write(r.byte2);

test = i2c_write(r.byte3);

i2c_stop();

Met deze routine zullen de 3 bytes met gegevens van de klok ( uren, minuten en seconden )

upgedated worden in de IC.

Klok verwerken

void verwerkklok(rtc r1, char klok1[])

unsigned char bit_klok0, bit_klok1, bit_klok2 ,bit_klok3,

bit_klok4, bit_klok5;

bit_klok0 = (r1.byte1 & 0x0F);

bit_klok1 = ((r1.byte1 & 0x70)>>4);

bit_klok2 = (r1.byte2 & 0x0F);

bit_klok3 = ((r1.byte2 & 0x70)>>4);

bit_klok4 = (r1.byte3 & 0x0F);

bit_klok5 = ((r1.byte3 & 0x30)>>4);

klok1[0] = haaluit(bit_klok0);

klok1[1] = haaluit(bit_klok1);

klok1[2] = haaluit(bit_klok2);

klok1[3] = haaluit(bit_klok3);

klok1[4] = haaluit(bit_klok4);

klok1[5] = haaluit(bit_klok5);

Met deze routine worden de ingehaalde bytes van de RTC omgezet naar het juiste datatype en

daarna worden deze waarden in de array van de klok gezet, zodat de tijd correct weergegeven

wordt.

Page 41: Projecten met AVRµC

Pagina 41 van 138

Inpakken in RTC

void pakinrtc()

rtc r1;

r1.byte1 =(zetomnaarbit(klok1[0])|zetomnaarbit(klok1[1])<<4));

r1.byte2 =(zetomnaarbit(klok1[2])|zetomnaarbit(klok1[3])<<4));

r1.byte3 =(zetomnaarbit(klok1[4])|zetomnaarbit(klok1[5])<<4));

return r1;

Met deze routine is het de bedoeling om de gegevens van de klok in de microcontroller in te pakken

in 3 bytes.

Page 42: Projecten met AVRµC

Pagina 42 van 138

9.4 Algemene functies Hieronder worden de algemene routines en de start van de datalogger uitgelegd. Men start met het

ophalen van de huidige tijd uit de RTC en nadien wordt het startscherm getoond. Vervolgens

verschijnt het hoofdscherm en krijgt men verschillende keuzes om verder te gaan: regeling van de

lichtsterkte, de temperatuur/de druk, instellen van de klok, relais-aansturingen en loggen van data.

START

DATALOGGER

Klok ophalen bij RTC &

verwerken

Startscherm:

“DATALOGGER”

+ klokweergave (HH:MM)

Weergave keuze + klok

(HH:MM)

RELAIS 1

RELAIS 2

DATA

LOGGENTEMPERATUUR EN DRUK

KLOK

INSTELLEN

KLOK TEMP/DRUKRELAIS 1

RELAIS 2LOGGEN

INPUT

DA B C

RE

TU

RN

CONTRAST

2 : +10

3: -10

2/3

LED DISPLAY

5: +10

6: -10

5/6

Page 43: Projecten met AVRµC

Pagina 43 van 138

Bij het aanleggen van de spanning wordt de datalogger opgestart. Eerst wordt de huidige tijd uit de

Real-Time Clock (RTC) gehaald. Vervolgens wordt het beginscherm getoond met de weergave van de

huidige tijd.

r1=leesinrtc(); // Haal gegevens uit de RTC

verwerkklok(r1,klok1[6]); // Verwerkt de bits die uit de RTC gehaald worden naar

de juiste tijd

lcd_init(LCD_DISP_ON); // Zet de display aan

lcd_clrscr(); // Verwijder de tekst op de display

lcd_puts("DATALOGGER"); // Zet “DATALOGGER” op de display

klokaan=1; // Zet de klok aan

klokoplcd(); // Geef de klok weer op LCD

_delay_ms(5000); // Wacht 5 seconden

lcd_clrscr(); // Wis het LCD-scherm

lcdscherm(); // Oproep van routine voor het hoofdscherm

_delay_ms(1000); // Wacht 1 seconde

Klok op LCD – weergave HH:MM

void klokoplcd()

lcd_gotoxy(4,1);

lcd_putc((klok1[5]+48));

lcd_putc((klok1[4]+48));

lcd_putc(58);

lcd_putc((klok1[3]+48));

lcd_putc((klok1[2]+48));

In deze routine wordt er een klok op het LCD-scherm weergegeven in formaat van uren en minuten.

Klok op LCD weergeven – weergave HH:MM:SS

void volklokoplcd()

lcd_gotoxy(2,1);

lcd_putc((klok1[5]+48));

lcd_putc((klok1[4]+48));

lcd_putc(58);

lcd_putc((klok1[3]+48));

lcd_putc((klok1[2]+48));

lcd_putc(58);

lcd_putc((klok1[1]+48));

lcd_putc((klok1[0]+48));

In deze routine wordt er een klok op het LCD-scherm weergegeven in formaat van uren en minuten

en seconden.

Page 44: Projecten met AVRµC

Pagina 44 van 138

Weergave van het hoofdscherm

void lcdscherm()

lcd_clrscr();

lcd_puts("A=K B=TD C=R D=L");

klokaan=1;

klokoplcd();

In deze routine wordt het hoofdscherm met de klok getoond .

Hoofdroutine voor besturing van knoppen

switch(toetsenbord())

case 'A': //klok instellen

while(!(toetsenbord() == '#'))

klokinstellen(r1);

klokaan = 0;

lcdscherm();

break;

case 'B': //Temperatuur / druk

lcd_clrscr();

lcd_puts("A=temperatuur");

lcd_gotoxy(0,1);

lcd_puts("B=druk");

_delay_ms(2000);

while (!(toetsenbord() == '#'))

geg = toetsenbord();

if (geg =='A')

temperatuur(t1,t2,t1oud,t2oud,vangop);

else if (geg =='B')

pression(d1,d2,d1oud,d2oud,vangop);

lcdscherm();

break;

case 'C': //Relais aansturingen

lcd_clrscr();

lcd_puts("A=RELAIS1");

lcd_gotoxy(0,1);

lcd_puts("B=RELAIS2");

_delay_ms(2000);

while (!(toetsenbord() == '#'))

geg=toetsenbord();

if(geg=='A')

relay=1;

else if(geg=='B')

relay=2;

Page 45: Projecten met AVRµC

Pagina 45 van 138

relais_lcd(relay);

lcdscherm();

break;

case 'D': //loggen van data

lcd_clrscr();

lcd_puts("loggen");

loggen();

starten = 1;

while (aantallogstel != 0)

lcd_clrscr();

lcd_puts("BEZIG");

if((aantallogstel == 0) && (odhsl != 0))

verzendserielepoort('M');

lcd_clrscr();

lcd_puts("druk op A");

while(!(toetsenbord() == 'A'))

starten = 0;

computer();

lcdscherm();

break;

case 5: //LEDJE DISPLAY if (OCR3BL < 180)

OCR3BL = OCR3BL + 10;

break;

case 6: if (OCR3BL > 0)

OCR3BL = OCR3BL - 10;

break;

default: break;

Page 46: Projecten met AVRµC

Pagina 46 van 138

9.5 Klok In dit gedeelte wordt de klok ingesteld en daarna teruggekeerd naar het hoofdscherm.

Page 47: Projecten met AVRµC

Pagina 47 van 138

Onderdeel klok instellen bij de hoofdroutine

case 'A': while(!(toetsenbord() == '#'))

klokinstellen(r1);

klokaan = 0;

lcdscherm();

break;

Hier wordt de routine klok instellen aangeroepen, welke tussen de while-lus staat. Wanneer men op

de knop # duwt kan men de routine verlaten, en wordt er teruggekeerd naar het hoofdscherm.

Instellen van een klok – hoofdroutine.

void klokinstellen()

TIMSK =0x00;

init_timer1();

stelinklok(r1);

klokweergave();

Deze routine zorgt ervoor dat de klok ingesteld wordt.

Weergave van een klok.

void klokweergave()

TIMSK =0x04;

init_timer1();

klokaan = 1;

Hier wordt de klok weergegeven, Timer 1 wordt geïnitialiseerd en de klok wordt aangezet.

Page 48: Projecten met AVRµC

Pagina 48 van 138

Klok instellen

void stelinklok(rtc r1)

unsigned char tel;

lcd_clrscr();

lcd_puts("klok instellen");

volklokoplcd();

//_delay_ms(500);

for(tel=0;tel<6;tel++)

_delay_ms(500);

while (((klok1[tel] = toetsenbord()) == 16))

lcd_clrscr();

lcd_puts("klok instellen");

klokoplcd();

Pakinrtc(r1,klok1[6]);

schrijfnaarrtc(r1);

In deze routine verschijnt er eerst op het scherm “instellen klok” en op de volgende lijn de klok. Men

stelt de klok in via het toetsenbord. Daarna wordt de opgegeven waarde in een byte vorm ingepakt

en naar RTC geschreven.

Maken van een klok.

void klok()

klok1[0]++;

if (klok1[0] > 9)

klok1[1]++;

klok1[0]=0;

if (klok1[1] > 5)

klok1[2]++;

klok1[1]=0;

if (klok1[2] > 9)

klok1[3]++;

klok1[2]=0;

if (klok1[3] > 5)

klok1[4]++;

klok1[3]=0;

if (klok1[4] > 3)

klok1[5]++;

klok1[4]=0;

if (klok1[5]>2)

klok1[5]=0;

In deze routine wordt er bepaald hoe de klok moet tellen, onder andere dat er na 60 seconden 1

minuut bij wordt gezet, dat er na 60 minuten één uur wordt bijgezet, en dat na 24 uur alles terug op

0 wordt gezet.

Page 49: Projecten met AVRµC

Pagina 49 van 138

9.6 Temperatuur/druk In onderstaande flowchart kan men zien hoe het onderdeel temperatuur/druk werkt. Men maakt

eerst een keuze tussen de uitlezing van de temperatuur of de uitlezing van de druk. Daarna wordt er

een routine ingezet voor de uitlezing van één van de twee mogelijke uitlezingen.

TEMP/

DRUK

A: TEMPERATUUR

B: DRUK

INPUTLEES

TEMPERATUURA

LEES

DRUKB

Haal op

Temperatuur van

DS1261

Haal op druk van

druksensorRETURN

#

RETURN RETURN

Temperatuur

omrekenen van

byte naar

decimaal

Weergave

temperatuur

Temperatuur

opslaan in byte

Druk omrekenen

van byte naar

decimaal

Weergave druk

Druk opslaan in

byte

Page 50: Projecten met AVRµC

Pagina 50 van 138

Deel van het hoofdprogramma, voor het opstarten van deze routine.

case 'B': lcd_clrscr();

lcd_puts("A=temperatuur");

lcd_gotoxy(0,1);

lcd_puts("B=druk");

_delay_ms(2000);

while (!(toetsenbord() == '#'))

geg = toetsenbord();

if (geg =='A')

temperatuur(t1,t2,t1oud,t2oud,vangop);

else if (geg =='B')

pression(d1,d2,d1oud,d2oud,vangop);

lcdscherm();

break;

9.6.1 Temperatuur

Deze routine zorgt ervoor dat de temperatuur wordt uitgelezen op het scherm. De huidige

temperatuur is btemp en Btemp is de volgende temperatuur.

void temperatuur(temp t1, temp t2, temp t1oud, temp t2oud, unsigned

char vangop)

lcd_clrscr();

lcd_puts("Temperatuur");

_delay_ms(2000);

t2.byte1 = rfRecv();

t2.byte2 = rfRecv();

vangop = rfRecv();

vangop = rfRecv();

FIFOReset();

t1 = leesintemperatuur();

if ((t1.byte1 != t1oud.byte1) || (t1.byte2 != t1oud.byte2) ||

(t2.byte1 != t2oud.byte1) || (t2.byte2 != t2oud.byte2))

lcd_clrscr();

lcd_puts("btemp = ");

rekenuittemp(t1);

lcd_gotoxy(0,1);

lcd_puts("Btemp = ");

rekenuittemp(t2);

t1oud.byte1 = t1.byte1;

t1oud.byte2 = t1.byte2;

t2oud.byte1 = t2.byte1;

t2oud.byte2 = t2.byte2;

Page 51: Projecten met AVRµC

Pagina 51 van 138

Routine voor het inlezen van de temperatuur

temp leesintemperatuur()

temp t;

unsigned char test;

test = i2c_start(ADRESWRITE);

test = i2c_write(READTEMP);

test = i2c_start(ADRESREAD);

t.byte1 = i2c_readAck();

t.byte2 = i2c_readNak();

i2c_stop();

return t;

Routine om de ingelezen byte om te zetten naar de uitgerekende waarde.

void rekenuittemp(temp t1)

if((t1.byte1 & 0x80) && !(t1.byte2 & 0x80))

t1.byte1 = (~t1.byte1)+1;

lcd_putc('-');

else if((t1.byte1 & 0x80) && (t1.byte2 & 0x80))

t1.byte1 = ~t1.byte1;

lcd_putc('-');

getallcd(t1.byte1);

if (t1.byte2 & 0x80)

lcd_putc(',');

lcd_putc(53);

else

lcd_putc(',');

lcd_putc(48);

lcd_putc(' ');

lcd_putc('C');

lcd_data(0xDF);

Page 52: Projecten met AVRµC

Pagina 52 van 138

9.6.2 Druk

Deze routine zorgt ervoor dat de druk wordt uitgelezen op het scherm. De huidige druk is btemp en

Btemp is de volgende druk.

void druk(druk d1, druk d2, druk d1oud, druk d2oud, unsigned char

vangop)

lcd_clrscr();

lcd_puts("druk");

_delay_ms(2000);

vangop = rfRecv();

vangop = rfRecv();

d2.byte1 = rfRecv();

d2.byte2 = rfRecv();

FIFOReset();

//d1 = leesindruk();

if ((d1.byte1 != d1oud.byte1) || (d1.byte2 != d1oud.byte2) ||

(d2.byte1 != d2oud.byte1) || (d2.byte2 != d2oud.byte2))

lcd_clrscr();

lcd_puts("bdr=");

rekenuitdruk(d1);

lcd_gotoxy(0,1);

lcd_puts("Bdr=");

rekenuitdruk(d2);

d1oud.byte1 = d1.byte1;

d1oud.byte2 = d1.byte2;

d2oud.byte1 = d2.byte1;

d2oud.byte2 = d2.byte2;

Routine voor het inlezen van de druk

druk leesindruk()

druk d;

unsigned char test;

test = i2c_start(ADRESDRUKW);

d.byte1 = i2c_readAck();

d.byte2 = i2c_readNak();

i2c_stop();

return d;

Page 53: Projecten met AVRµC

Pagina 53 van 138

Routine om de ingelezen byte om te zetten in de uitgerekende waarde.

void rekenuitdruk(druk d1)

double uitkomst;

unsigned long help;

help = d1.byte1&0x0f;

help = (help << 8) | d1.byte2;

uitkomst = help*0.09375+762.5;

getallcd(uitkomst);

lcd_puts("mbar");

9.7 Relais

RELAIS 1

RELAIS 2

RETURN

A: RELAIS 1

B: RELAIS 2

INPUT

RELAIS 1

A = Activeren B =

stoppen

A

RELAIS 2

A = Activeren B =

stoppen

B

#

INPUT INPUT

RELAIS 1

GEACTIVEERD

A

RELAIS 2

GEACTIVEERD

A

RELAIS 2 GESTOPTBRELAIS 1 GESTOPT B # #

RETURN

RETURN

RETURN

RETURN

In deze routine wordt er bepaald of relais 1 of 2 aangestuurd wordt of niet. REL1 geeft de huidige

status van de relais 1 weer, REL2 geeft de status van relais 2 weer.

Page 54: Projecten met AVRµC

Pagina 54 van 138

Als je op C drukt dan krijg je het scherm voor de keuze van relais, je keuze kan je maken door op A of

B te drukken. Terugkeren kan je door op # te drukken. Nadat er op de relais toets is gedrukt wordt er

een routine “relais_lcd” opgestart.

case 'C': lcd_clrscr();

lcd_puts("A=RELAIS1");

lcd_gotoxy(0,1);

lcd_puts("B=RELAIS2");

_delay_ms(2000);

while (!(toetsenbord() == '#'))

geg=toetsenbord();

if(geg=='A')

relay=1;

if(geg=='B')

relay=2;

relais_lcd(relay);

lcdscherm();

break;

Deze routine zorgt ervoor dat er” relais” op LCD scherm wordt geschreven met het bijbehorende

nummer.

void relay_lcd(unsigned int relais)

lcd_clrscr();

lcd_puts("RELAIS ");

lcd_putc(relais+48);

lcd_gotoxy(0,1);

Page 55: Projecten met AVRµC

Pagina 55 van 138

Deze routine laat je de keuze te maken om de relais te stoppen ( B ) of te activeren ( A ). Als je op #

duwt keert je terug naar het hoofdscherm.

void relais_lcd(unsigned int relais)

relay_lcd(relais);

lcd_puts("A=ACTIV B=STOP");

_delay_ms(2000);

while (!(toetsenbord() == '#'))

geg=toetsenbord();

if(geg=='A')

if(relais=1)

REL1=1;

else if(relais=2)

REL2=1;

relay_lcd(relais);

lcd_puts("GEACTIVEERD");

_delay_ms(4000);

if(geg=='B')

if(relais=1)

REL1=0;

else if(relais=2)

REL2=0;

relay_lcd(relais);

lcd_puts("GESTOPT");

_delay_ms(4000);

Page 56: Projecten met AVRµC

Pagina 56 van 138

9.8 Loggen van data

DATA

LOGGEN

“LOGGEN” op

scherm

weergeven

Loggen om aantal

seconden ingevenStop met ingeven A

Ongedaan maken

B

Uitkomst

verwerkenGetal

Opslaan in

ODHSL (om

aantal seconden)

Aantal logs

ingeven

Uitkomst

verwerkenGetal

Ongedaan maken

B

Stoppen met

ingevenA

Opslaan in

Aantallogs

Loggen van data

Verzenden via

USB naar

computer

A

RETURN

Page 57: Projecten met AVRµC

Pagina 57 van 138

Routine om het loggen te starten, na routine” loggen()” wordt er een waarde bepaald voor het

aantal logs en de frequentie (om aantal seconden). Daarna start het apparaat met loggen. Daarna

worden de gelogde data verzonden via de seriële poort ( UART ).

case 'D': lcd_clrscr();

lcd_puts("loggen");

loggen();

starten = 1;

while (aantallogstel != 0)

lcd_clrscr();

lcd_puts("BEZIG");

if((aantallogstel == 0) && (odhsl != 0))

verzendserielepoort('M');

lcd_clrscr();

lcd_puts("druk op A");

while(!(toetsenbord() == 'A'))

starten = 0;

computer();

lcdscherm();

break;

Hier wordt er data gelogd. Je stelt eerst een aantal parameters in, zoals de frequentie en het aantal

logs

void loggen()

lcd_clrscr();

lcd_puts("om sec loggen");

lcd_gotoxy(0,1);

_delay_ms(1000);

odhsl = leesingetal();

lcd_clrscr();

lcd_puts("aantal logs");

lcd_gotoxy(0,1);

_delay_ms(1000);

aantallogs = leesingetal();

aantallogstel = aantallogs;

Page 58: Projecten met AVRµC

Pagina 58 van 138

Deze routine zorgt ervoor dat de gelogde data verzonden worden naar de computer.

void computer()

unsigned char tel;

lcd_clrscr();

lcd_puts("zenden naar comp");

verzendserielepoort(aantallogs & 0x7f);

for(tel=aantallogs;0<tel;tel--)

//_delay_ms(100);

verzendserielepoort(b1klok1[tel]);

//_delay_ms(100);

verzendserielepoort(b2klok2[tel]);

// _delay_ms(100);

verzendserielepoort(b3klok3[tel]);

// _delay_ms(100);

verzendserielepoort(b6temp1[tel]);

// _delay_ms(100);

verzendserielepoort(b7temp2[tel]);

// _delay_ms(100);

verzendserielepoort(b4druk1[tel]);

// _delay_ms(100);

verzendserielepoort(b5druk2[tel]);

lcd_clrscr();

lcd_puts("gedaan");

_delay_ms(1000);

Page 59: Projecten met AVRµC

Pagina 59 van 138

9.9 Andere routines Omzetten van een bit naar een integer.

void haaluit(unsigned char character)

unsigned int getal;

switch(character)

case 0x00: getal=0; break;

case 0x01: getal=1; break;

case 0x02: getal=2; break;

case 0x03: getal=3; break;

case 0x04: getal=4; break;

case 0x05: getal=5; break;

case 0x06: getal=6; break;

case 0x07: getal=7; break;

case 0x08: getal=8; break;

case 0x09: getal=9; break;

default: getal=0;

return getal;

In deze routine wordt een bit omgezet naar een integer.

Omzetten van een integer naar bit:

void zetomnaarbit(unsigned int getal)

unsigned char character;

switch(getal)

case 0 : character=0x00; break;

case 1: :character=0x01; break;

case 2 : character=0x02; break;

case 3 : character=0x03; break;

case 4 : character=0x04; break;

case 5 : character=0x05; break;

case 6 : character=0x06; break;

case 7 : character=0x07; break;

case 8 : character=0x08; break;

case 9 : character=0x09; break;

default: getal=0;

return character;

In deze routine wordt een integer omgezet naar een bit.

Page 60: Projecten met AVRµC

Pagina 60 van 138

Routine Getal op LCD zetten.

void getallcd(double zetomgetal)

long getal,deel = 1000;

unsigned char tel=1,geg=0;

getal = zetomgetal;

zetomgetal = zetomgetal - getal;

zetomgetal = zetomgetal * 100;

if (getal>0)

while(tel)

if(((getal / deel)%10!=0) || geg )

lcd_putc(((getal / deel)%10)+48);

geg=1;

Else if(deel > 1)

deel /= 10;

else

tel=0;

else

lcd_putc(48);

if (zetomgetal != 0)

getal=zetomgetal;

tel = 1;

deel=10;

lcd_putc(',');

while(tel)

lcd_putc(((getal / deel)%10)+48);

if(deel > 1)

deel /= 10;

else

tel=0;

Deze routine zorgt ervoor dat er een getal op de LCD wordt afgebeeld.

Page 61: Projecten met AVRµC

Pagina 61 van 138

Routine om getal in te lezen

unsigned long leesingetal()

unsigned char geg=0,stoppen=1;

unsigned long uitkomst=0;

while(stoppen)

//_delay_ms(500);

while (((geg = toetsenbord()) == 16))

if ((geg != 'A') && (geg != 16) && (geg != 'B'))

lcd_putc(geg+48);

uitkomst=(uitkomst*10)+geg;

geg =0;

else if (geg =='A')

stoppen = 0;

else if (geg =='B')

uitkomst /=10;

lcd_command(LCD_MOVE_CURSOR_LEFT);

lcd_putc(32);

lcd_command(LCD_MOVE_CURSOR_LEFT);

return uitkomst;

Knop A dient om te stoppen: als je op knop A drukt wordt deze routine verlaten. Knop B zorgt dat je

bij een fout ingetoetst cijfer terug kunt keren naar de vorige situatie. Het reeds ingetikt getal wordt

gedeeld door 10 daardoor valt het laatst ingetikt cijfer weg. Daarna kan je verder gegevens int

Page 62: Projecten met AVRµC

Pagina 62 van 138

10 Behuizing De behuizing G1189BC werd aangekocht bij Velleman.

Deze print heeft al 5 bevestigingsvoetjes en is ook al voorzien van een batterijvak.

Omdat deze behuizing al bevestigingsvoetjes had, hebben wij onze print zo ontworpen dat wij

gebruik konden maken van deze voorziening.

Page 63: Projecten met AVRµC

Pagina 63 van 138

11 Totaal schemaoverzicht in eagle

Page 64: Projecten met AVRµC

Pagina 64 van 138

Page 65: Projecten met AVRµC

Pagina 65 van 138

Page 66: Projecten met AVRµC

Pagina 66 van 138

Page 67: Projecten met AVRµC

Pagina 67 van 138

12 Printontwerp datalogger

De afmetingen van de print zijn 93 * 96 mm. Op zich is dit een vrij grote print voor het aantal

componenten dat wij gebruiken. Dit is echter opzettelijk zo gekozen. Omdat onze behuizing,

standaard, al 4 mounting holes heeft, hebben we de print zodanig ontworpen dat wij deze 4 holes

kunnen gebruiken. Waardoor er geen extra gaten moesten geboord worden voor de print te

bevestigen.

Voor de print te etsen druk je de top en bottom als volgt af:

Rood top (mirror afdrukken)

Blauw bottom (gewoon adrukken)

Inktzijde op print leggen.

Page 68: Projecten met AVRµC

Pagina 68 van 138

Page 69: Projecten met AVRµC

Pagina 69 van 138

13 Aanpassingsprint zend / ontvangstmodule

13.1 Schema:

13.2 Printontwerp:

Page 70: Projecten met AVRµC

Pagina 70 van 138

14 Metingen De eerste metingen die ik had gedaan, waren metingen op de print van vorig jaar. (Zie onderstaande

foto)

Het duurde een hele tijd voordat ik wist hoe ik het bordje van vorig jaar correct moest voeden en aansluiten. Uiteindelijk kon ik de datalogger gebruiken via volgende methode: Heb de ISP connector losgekoppeld en eens direct 5V geplaatst op de voedingspinnen van de ISP – header en de LCD gevoed. Hierdoor werkte de communicatie met de LCD en het menu selectie via het keypad. (Zie Figuur 1)

Doordat de onderste rij niet meer werkt, is het uiteraard niet zo evident om te kijken of alle programma’s werken zoals het zou moeten. Wel heb ik ondervonden dat het instellen van de klok problemen omvat. Volgens mij worden

deze problemen niet veroorzaakt door de gebrekkige hardware maar door een fout in de code.

Het grotendeel van mijn metingen op de nieuwe print bestond uit het controleren of alles correct

was aangesloten en verbonden. Dit door het doormeten van de verschillende banen en

verbindingen.

Page 71: Projecten met AVRµC

Pagina 71 van 138

Metingen op het aansturen van de verschillende deelschakelingen is niet kunnen gebeuren. Dit mede

doordat er problemen waren met de software en de code. Ook omdat het zo lang duurde alvorens

de print aangestuurd kon worden met de PC.

Meten van de 2 voedingssignalen:

Vcc voeding = 5V via usb voeding

VCC3.3 = 3.28V

Page 72: Projecten met AVRµC

Pagina 72 van 138

15 Problemen + oplossingen Op mijn print zijn baantjes aanwezig met rechte hoeken. In het dossier zijn deze aangepast.

Onze relais, besteld bij RS, konden niet tijdig geleverd worden. Pas in juni 2011.

Daarom wordt de werking van de relais aangetoond door een led, die er parallel over staat.

Mijn ISP connector was eerst omgekeerd geplaatst op mijn bord, dus moest ik deze

desolderen en omdraaien. In dit proces is er wel een padje gesneuveld, waarschijnlijk omdat

mijn soldeerbout te warm stond. Toch is er nog steeds een goede verbinding met deze pin.

Ook zijn de connectoren van de LCD en het keypad, omgekeerd geplaatst. Hiervoor moet ik

deze echter niet desolderen. Dit is eenvoudig op te lossen door de kabel omgekeerd te

monteren.

Pin 1 van de µC was aan massa verbonden. Dit is de PEN pin of m.a.w. de ‘programming

enable pin’. Deze is intern hoog, waardoor deze niet aan massa mag hangen om te kunnen

programmeren. In het dossier is dit aangepast. Op de print heb ik deze verbinding door

gekrast met een mes.

De afmetingen van de RFM22B behuizing is foutief. Hierdoor was ik genoodzaakt dit aan te

passen met een aanpassingsprint.

De datalogger kon eerst niet gedetecteerd worden door de PC via de ISP verbinding. Het

eerste wat ik toen heb gedaan is alle baantjes nogmaals extra zorgvuldig onderling

doorgemeten op kortsluitingen en waar nodig verholpen.

Daarna heb ik de 6 lijnen van de ISP connectie zorgvuldig nagekeken en op zitten meten. Ook

hier waren er geen lijnen foutief aangesloten.

Toen ik er zeker van was dat er geen foutieve connecties aanwezig waren in mijn printje,

dacht ik dat de µC beschadigd was door ESD, want dit was namelijk een hergebruikte µC.

Toen heb ik de µc verwijderd en de nieuwe erop geplaatst.

Bij de plaatsing van de nieuwe µc heb ik er zeer goed opgelet om de µc nooit rechtstreeks

aan te raken, dit gebeurde altijd via een speciaal pincet. Door dit te doen heb ik toch het

risico van beschadiging door ESD tot een minimum herleid, met de middelen die mij thuis ter

beschikking stonden.

In dit proces is jammer genoeg de VCC verbinding van de µc stuk gegaan, dit heb ik dan

succesvol heb opgelost met een eenvoudige draadbrug. Daarna had ik alles opnieuw

doorgemeten op eventuele kortsluitingen, waar nodig heb ik deze dan weggewerkt.

Toen ik de datalogger opnieuw probeerde te detecteren met de PC, bleek deze nog steeds

niet te werken.

Nadat ik het bordje van vorig jaar nogmaals extra aandachtig had bestudeerd, zag ik dat de

MOSI – pin verbonden was met de RxD – pin en de MISO – pin met de TxD – pin. Deze waren

echter verbonden via draadbrugjes en door de wirwar van draadbrugjes op de print van vorig

jaar had ik daar de eerste malen klaarblijkelijk overgekeken.

Page 73: Projecten met AVRµC

Pagina 73 van 138

Toen ik ook deze verbinding maakte via een draadbrug, kon de datalogger wel

geprogrammeerd worden.

Waarom de datalogger zonder deze verbinding met het UART kanaal niet wou werken

verstaat ik niet helemaal. Want in theorie was alles aanwezig om succesvol te kunnen

programmeren met de ISP verbindingen.

Page 74: Projecten met AVRµC

Pagina 74 van 138

16 Componentenlijst

Component Package Value nodig

Condensator smd - 0805 100nF 4

Condensator smd - 0805 10nF 5

Condensator smd - 0805 220nF 1

Condensator smd - 0805 15nF 1

C Polair smd - tantaal 10µF 2

C Polair smd - tantaal 4,7µF 1

C Polair smd - tantaal 47µF 1

C Polair smd - elco 470µF 1

Weerstand smd - 1206 10kΩ 6

Weerstand smd - 1206 4k7Ω 2

Weerstand smd - 1206 1kΩ 3

Weerstand smd - 1206 300Ω 1

Weerstand smd - 1206 910Ω 1

Spoel smd - 1812 100µH 1

Transistor - PNP smd - SOT23 BC858 2

Transistor - NPN smd - SOT23 BC817 1

Diode smd - schotky

2

Led - groen smd - 1206

2

Battery knoop - 3V non rech. 1

ISP connector 6 pins

1

ISP con. Kopstuk 6pins

1

Relais smd - G6JU-2FS-Y 2

pinnen male pins 1*3 3

LCD - connector 12 - pins

1

lcd con. Kopstuk 12pins

1

LCD - scherm

AV1621 1

Keypad 8pins

1

keypad - connector 8pins

1

key. Con. Kopstuk 8pins

1

USB - connector type B

1

USB - kabel USB A -> USB B

1

jumpers 2pins hoedje

1

IC's / sensoren:

µC smd atmega 128 1

Dig. Temp. Meter smd ds1621 1

Druksensor pinnen asdx015a24r 1

Page 75: Projecten met AVRµC

Pagina 75 van 138

Spannings omvormer smd MAX604CSA 1

USB controller smd FT232RL 1

RealTimeClock smd DS32x35 1

Voltage regulator TO-220 LM317TS 1

Zend/Ontv. module smd RFM22B 1

17 Prijslijst

Aantal

Component Package Value nodig gekocht Prijs/stuck Totale prijs Leverancier

C Polair smd - elco 470µF 1 5 0,402 2,01 628-4002

Spoel smd - 1812 100µH 1 5 1,324 6,62 190-9835

Transistor - PNP smd - SOT23 BC858 2 20 0,034 0,68 544-9444

ISP con. Kopstuk 6pins

1 5 0,538 2,69 673-7694

Relais smd - G6JU-2FS-Y 2 2 5,42 10,84 683-9586

LCD - connector 12 - pins

1 5 1,488 7,44 360-6730

lcd con. Kopstuk 12pins

1 5 0,66 3,3 673-7745

Battery knoop - 3V non rech. 1 1 3,4 3,4 513-2900

keypad - connector 8pins

1 5 1,266 6,33 360-6752

key. Con. Kopstuk 8pins

1 5 0,612 3,06 673-7708

USB - kabel USB A -> USB B

1 1 8,2 8,2 287-9561

Spannings omvormer smd MAX604CSA 1 1 4,56 4,56 622-8872

USB controller smd FT232RL 1 1 5 5 406-580

RealTimeClock smd DS32x35 1 1 13,69 13,69 419-429

Voltage regulator TO-220 LM317TS 1 10 0,368 3,68 714-0792

Dig. Temp. Meter smd ds1621 1 1 4,86 4,86 540-5264

Totale prijs bij RS: € 86,36

Page 76: Projecten met AVRµC

Pagina 76 van 138

18 Bibliografie

18.1 Bronnen

GrandEVBavr – user manual. (van Propox); Werd gebruikt als basis voor volgende deelschakelingen:

USB

relais

RTC

http://shop.myavr.com/index.php?sp=article.sp.php&artID=200006

Hier hebben we de nodige software en handleidingen gevonden voor de code te programmeren in

de datalogger.

Verslagdatalogger.docx

Verslag van de datalogger 2009 – 2010

Datasheets (zie bijlage CD)

Atmega 128

BC817

csdx0811baro

DS161

lm317

max604

RFM22B

FT232R

DS32x35

LCD av1621

18.2 Gebruikte programma’s

Eagle 5.9

Microsoft Office 2007

AVRSTudio 4

MySmartUSB light:

myAVR_ProgTool

Supportbox

Page 77: Projecten met AVRµC

Pagina 77 van 138

18.3 Foto’s Dit zijn enkele foto’s van het afgewerkte resultaat

Page 78: Projecten met AVRµC

Pagina 78 van 138

19 Conclusie Bij het controleren van de print van vorig jaar konden we tot de conclusie komen dat deze

grotendeels werkte. Zoals de temperatuur en druk uitlezing. Wel kon er al geconstateerd worden dat

er fouten zaten in de code van de klok.

Daarna hebben we eens onze eigen code in de print van vorig jaar geprogrammeerd. Hierbij hadden

wij het probleem met de klok opgelost.

Ook hebben wij eens de code voor de relais erin geprogrammeerd, op een pin dat niet gebruikt werd.

Dit werkte toen grotendeels.

Daarna zijn wij overgegaan naar het ontwerpen van de nieuwe print. Deze print hebben wij volledig

kunnen afwerken. Enkel de relais hebben we er nog niet kunnen opzetten, dit omdat deze niet tijdig

konden geleverd worden door RS.

Toen de print af was, koste het ons enige moeite om de print te kunnen programmeren. Uiteindelijk

bleek het dat wij nog een verbinding moesten leggen met de UART lijnen.

Ook hebben wij al veel fouten uit de code kunnen halen via simulaties in AVRstudio.

Echter door een samenloop van problemen met de programmeer omgeving hadden wij op het einde

tijd te kort om de datalogger te programmeren. Hierdoor konden wij geen enkele deelschakeling

doen werken omdat er geen tijd meer was om de code te testen en aan te passen.

Volgens mij zou in principe de deelschakelingen die wij van vorig jaar hebben geïntegreerd wel

moeten werken.

Desondanks dat het geheel niet werkt, hebben wij toch veel opgestoken en geleerd bij het werken

aan dit project. Mochten wij wat meer tijd hebben gehad gingen de kleine foutjes waarschijnlijk

opgelost geweest zijn en ging de datalogger misschien wel werken.

20 Toekomstmogelijkheden Tot slot heb ik nog een paar ideeën van wat er kan gedaan worden met de datalogger in de

toekomst.

Als uitbreiding kunnen er meerdere sensoren toegevoegd worden. Zoals windsnelheid, windrichting,

neerslag, temperatuur uit lezen in Kelvin, enz.

Wat ook nog een goede meerwaarde met zich zo meebrengen is wanneer de datalogger draadloos

kan communiceren met de PC. Om zo de datalogger over een afstand naar de gebruiker te zenden.

Page 79: Projecten met AVRµC

Pagina 79 van 138

MP3 met AVR

Page 80: Projecten met AVRµC

Pagina 80 van 138

MP3 speler met AVR

Page 81: Projecten met AVRµC

Pagina 81 van 138

21 MP3-speler afspelen met AVR

21.1 Project omschrijving Het doel van dit project is een zeer compacte print te maken met een AVR met USB aansluiting die

geluid kan afspelen. Hiervoor moeten we een geschikte AVR zoeken. Het geluid moet beschikbaar

zijn in MP3 formaat, maar mag ook omgezet worden bij het programmeren. Druktoetsen en/of een

PC programma moeten het af te spelen geluid selecteren.

Bij het afspelen maken we gebruik van een moderne audioversterker-IC in klasse D.

21.2 Onderzoek

21.2.1 Keuze AVR

We gingen opzoek naar een AVR waar we op volgende eigenschappen letten:

Voldoende geheugen (opslaan code + liedjes)

USB aansluiting

Programmeer wijze (taal + programma

21.2.1.1 CY7C68300A

De eerste IC die we bestudeerden was de CY7C68300A. De CY7C68300A is een USB 2.0 naar

ATA/ATAPI IC. Met deze IC kunnen we informatie via USB naar een harde schijf overzetten.

We hebben niet voor deze IC gekozen omdat de schakeling te groot zal uitvallen mochten we onze

gegevens opslaan via SATA op een harde schijf. De IC valt met een prijs van 10€ ook duurder uit dan

andere IC’s.

• Complies with USB-IF specifications for USB 2.0, the USB Mass Storage Class, and the USB Mass Storage Class Complies with T13’s ATA/ATAPI-6 Draft Specification • Supports 48-bit addressing for large hard drives • Support for a single ATA/ATAPI device configured either as master or slave • “ATA-Enable” input signal, which three-states all signals on the ATA interface in order to allow sharing of the bus with another controller (e.g., an IEEE-1394 to ATA bridge chip) • Support for board-level manufacturing test via USB interface • 3.3V operation for self-powered devices • 56-pin SSOP and 56-pin QFN packages.

Page 82: Projecten met AVRµC

Pagina 82 van 138

21.2.2 AT32UC3B1128

De volgende IC die we bestudeerden was een 32bit AVR. Door zijn USB aansluiting en grotere

geheugen wekte hij onze interesse op. Het bleek echter dat de flash geheugen van 128k bytes te

weinig is voor de opslag van onze gegevens (code + liedjes). Een extra nadeel was dat we deze IC niet

konden programmeren met bascom en de hoge prijs van de IC.

•High Performance, Low Power AVR •32 UC 32-Bit Microcontroller •Performing up to 1.39 DMIPS / MHz •High-Performance Data Transfers on Separate Buses for Increased Performance • Internal High-Speed Flash 512K Bytes, 256K Bytes, 128K Bytes, 64K Bytes Versions • Universal Serial Bus (USB) • One Three-Channel 16-bit Timer/Counter (TC) – Three External Clock Inputs, PWM, Capture and Various Counting Capabilities • One 7-Channel 20-bit Pulse Width Modulation Controller (PWM) • One Master/Slave Serial Peripheral Interfaces • 5V Input Tolerant I/Os, including 4 high-drive pins •Single 3.3V Power Supply or Dual 1.8V-3.3V Power Supply

21.2.3 ATmega8

We besloten gebruik te maken van ATmega8 omdat deze al tot onze beschikking staat en verder we

niet meer voor data opslag ga gaan in de AVR maar een extra geheugen gaan toevoegen aan onze

schakeling.

• High-performance, Low-power AVR® 8-bit Microcontroller • Nonvolatile Program and Data Memories – 8K Bytes of In-System Self-Programmable Flash Endurance: 10,000 Write/Erase Cycles – 512 Bytes EEPROM • I/O and Packages – 23 Programmable I/O Lines – 28-lead PDIP, 32-lead TQFP, and 32-pad MLF • Operating Voltages – 2.7 - 5.5V (ATmega8L) – 4.5 - 5.5V (ATmega8) • Speed Grades – 0 - 8 MHz (ATmega8L) – 0 - 16 MHz (ATmega8) • Power Consumption at 4 Mhz, 3V, 25°C – Active: 3.6 mA – Idle Mode: 1.0 mA – Power-down Mode: 0.5 μA

Page 83: Projecten met AVRµC

Pagina 83 van 138

21.2.4 VS1003

De VS1003 zal er voor zorgen dat we onze data gedecodeerd aan de uitgang (klasse D versterker

kunnen plaatsen. De MP3 / WMA audio codec - VS1003 krijgt zijn ingang via een seriële input bus, die

gebruikt wordt als slave. De input wordt gedecodeerd en doorgegeven door middel van een digitale

volumeregeling aan een 18-bits oversampling, multi-bit, (sigma-delta) DAC. Het decoderen wordt

gecontroleerd via een seriële bus.

• Decodes MPEG 1 & 2 audio layer III (CBR +VBR +ABR); WMA 4.0/4.1/7/8/9 all profiles (5-384kbit/s);WAV (PCM + IMA ADPCM); General MIDI / SP-MIDI files • Encodes IMA ADPCM from microphone or line input • Streaming support for MP3 and WAV • Bass and treble controls • Low-power operation • High-quality on-chip stereo DAC with no phase error between channels • Stereo earphone driver capable of driving a 30­ load • Separate operating voltages for analog, digital and I/O • 5.5 KiB On-chip RAM for user code / data • Serial control and data interfaces • Can be used as a slave co-processor • SPI flash boot for special applications • UART for debugging purposes • New functions may be added with software and 4 GPIO pins

Page 84: Projecten met AVRµC

Pagina 84 van 138

21.3 Blokschema

Als eerste ontwerp maken we een MP3 speler die een SD kaart, waar de muziek staat opgeslagen,

uitleest en afspeelt (player) via een klasse D versterker. Wanneer deze schakeling werkt, voegen we

een extra gedeelte toe aan de schakeling, om via USB, de liedjes op de SD kaart op te slaan (reader).

We merken verschillende blokken op:

SD Card Socket – opslaan van de data (muziek)

Drukknoppen – deze knoppen hebben de volgende functies: menu, start, vorige, volgende en

volume regeling.

ATmega8 – programmacode, regelt heel de schakeling

Voeding

VS1003 – audio decoderen

Klasse D versterker

Audio-speaker

Page 85: Projecten met AVRµC

Pagina 85 van 138

21.4 Schema analyse

Voeding - Het voeding gedeelte bestaat uit 2 spanning regelaars (LT1117CST-3.3, LM1117CST-2.5. De LT1117CST-3.3 zorgt voor een spanning regeling van 3.3V. LM1117CST-2.5 regelt de spanning tot 2.5V. De aangelegde voedingspanning is 5V. JP1 aanleggen voedingspanning D amp voeding naar klasse D versterker

Drukknoppen – Met deze knoppen worden verschillende functies van de MP3 ingesteld. Mode: menu Play: start Prev: vorige Next: volgende V- en V+: volume regeling

Page 86: Projecten met AVRµC

Pagina 86 van 138

MP3 / WMA audio codec - VS1003 krijgt zijn ingang via een seriële input bus, die gebruikt wordt als slave. De input wordt gedecodeerd en doorgegeven door middel van een digitale volumeregeling aan een 18-bits oversampling, multi-bit, sigma-delta DAC. Het decoderen wordt gecontroleerd via een seriële bus. MISO verbinding aan pin 29 (SI) MOSI verbinding aan pin 30 (SO) SCLK verbinding aan pin 28 (SCLK) XCS verbinding aan pin 23 (XCS) XDCS/BSYNC verbinding aan pin 13 (XDCS/BSYNC) DREQ verbinding aan pin 8 (DREQ) De DREQ pin/signaal wordt gebruikt wanneer VS1003 FIFO in staat is om data te ontvangen. Wanneer de DREQ pin/signaal “hoog” is, dan kan de VS1003 minstens 32 bytes aan van SDI data of 1 SCI commando. Bij het niet voldoen aan de criteria, dan zal de DREQ pin op “laag” geplaatst worden, en zal de zender stoppen met het verzenden van nieuwe data. Clock - De VS1003 werkt op een 12.228MHz frequentie clock. Deze clock kan opgewekt worden via een externe schakeling of door de interne klok kristal-interface (Pinnen XTALI en XTALO). XRESET verbinding aan pin 3 (XRESET) - Actief “laag” asynchrone reset.

Jumper en ontstoor condensatoren – De jumper zorgt er voor dat we de AT mega kunnen programmeren.

Page 87: Projecten met AVRµC

Pagina 87 van 138

AT mega 8 – in deze IC gaan we de programmacode opslaan. Rond de IC wordt er verscheidene ontstoorcondensatoren geplaatst. Controle Leds Tijdens het initialiseren van de SD kaart zal LED 2 gaan branden. Tijdens het initialiseren van het FAT bestandssysteem gaan LED1 en 2 branden. Bij het afspelen van muziek gaan LED 1 en 2 afwisselend aan/uit Repeat: LED 1 aan, LED 2 uit Random: LED 1 uit/ LED 2 aan

-

SD kaart – hier wordt de data opgeslagen

Page 88: Projecten met AVRµC

Pagina 88 van 138

21.5 Printontwerp

21.5.1 Componenten

Deze 4 pinholes zorgen voor een extra moeilijkheid voor het ontwerpen van de print. We willen

immers de mogelijkheid bieden om de klasse D versterker te monteren op de mp3 speler. Dit is nu

mogelijk gemaakt door dezelfde afstanden te gebruiken als de klasse D print.

Verder hebben we de breedte van de mp3 speler proberen te beperken tot de grootte van de SD

kaart.

21.5.2 Volledig

Page 89: Projecten met AVRµC

Pagina 89 van 138

21.5.3 Top

21.5.4 Bottom

Page 90: Projecten met AVRµC

Pagina 90 van 138

21.6 Code Dit blok bevat verwijzingen naar de noodzakelijke header-files die

de compiler nodig heeft.

#include<avr/io.h> //standaard header van atmel voor AVR's

#include"MMC_SD/MMC_SD.h" //header voor SD-kaart hardwarestructuur

#include"FAT/FAT.h" //FAT filesysteem wordt op SD-kaarten gebruikt

#include"VS1003B/VS1003B.h" //headers van de audio-codec

#include<avr/pgmspace.h> //standaard avrstudio-header

We definiëren enkele typen variabelen die we vaak zullen gebruiken,

om het ons makkelijker te maken.

#define uint8 unsigned char

#define uint16 unsigned int

#define uint32 unsigned long

Het pad naar de directory met de muziek. Kan aangepast worden maar

mag maximum 8 karakters en geen spaties bevatten.

#if FIX_DIRECTORY

#define PATH (unsigned char *)("\\music")

#endif

Het volgende blok bepaalt het gedrag van de indicatieleds.

Bij het opstarten zullen ze error's aangeven en tijdens het afspelen

de toestand van MODE en aantonen dat er afgespeeld wordt.

#define LED1_CON() DDRC|=_BV(PC5)

#define LED1_ON() PORTC|=_BV(PC5)

#define LED1_OFF() PORTC&=~_BV(PC5)

Page 91: Projecten met AVRµC

Pagina 91 van 138

#define LED2_CON() DDRB|=_BV(PB1)

#define LED2_ON() PORTB|=_BV(PB1)

#define LED2_OFF() PORTB&=~_BV(PB1)

De volgende code definieert het gedrag van de 6 drukknoppen

#define STOP _BV(PD2)

#define MODE _BV(PD3)

#define NEXT _BV(PD7)

#define UP _BV(PD4)

#define DOWN _BV(PD6)

#define PREV _BV(PD5)

Page 92: Projecten met AVRµC

Pagina 92 van 138

Een naam toekennen aan de 3 verschillende ondersteunde typen die

standaard een nummer van 1 tot 3 hebben:

#define MP3 1

#define WMA 2

#define MID 3

Definiëren van de verschillende afspeelmodi die door MODE worden

ingesteld:

#define REPET_ALL 0

#define REPET_ONE 1

#define RANDOM 2

Aantal sectoren per cluster vastleggen, de eerste sector die data

bevat en ondersteuning voor FAT32 bestandssysteem

extern uint16 SectorsPerClust;

extern uint16 FirstDataSector;

extern uint8 FAT32_Enable;

Haalt informatie op over het bestand en de locatie

struct FileInfoStruct FileInfo;

struct direntry MusicInfo;

Totaal aan nummers in de hoofdmap van de SD-kaart

uint16 totalsongs;

Page 93: Projecten met AVRµC

Pagina 93 van 138

Bestandstype

uint8 type;

Houdt de informatie bij over de nummers. Een bit in dit arry houdt

voor elk nummer bij of deze al is afgespeeld geweest of niet. Handig

voor shuffle. De functie die dit doet staat op de volgende pagina.

uint8 track[128];

Page 94: Projecten met AVRµC

Pagina 94 van 138

Deze functie wist alle info in de array besproken op vorige pagina

void ClearTrackInfo()

uint8 i;

for(i=0;i<128;i++)track[i] = 0;

Dit is de functie die in de track array voor elk nummer een bit zal

setten wanneer deze is afgespeeld geweest.

uint8 SetTrack(uint16 songs)

uint8 byte_offset;

uint8 bit_offset;

songs--;

byte_offset = songs/8;

bit_offset = songs%8;

if(track[byte_offset] & (1<<bit_offset))return 1;

else

track[byte_offset] |= 1<<bit_offset;

return 0;

Een timing-functie, gebruikt de assembler code 'nop' om klokcycli

over te slaan.

Page 95: Projecten met AVRµC

Pagina 95 van 138

void Delay(uint16 n)

while(n--)asm("nop");

Initialiseren van de Timer (Atmel AVR functie)

void Timer1_Initial()

TCNT1H=0x00;

TCNT1L=0x00;

TCCR1B=0x01;//system clock;

ICR1H=0xff;

ICR1L=0xff;

Page 96: Projecten met AVRµC

Pagina 96 van 138

De volgende functie is de hoofdfunctie voor het afspelen van muziek.

void PlayMusic()

uint16 keylen; //om de input van de drukknoppen te verwerken

uint16 count; //om te tellen

uint8 i; //om te tellen in een lus

uint16 j; //"

uint32 p; //cluster

uint32 totalsect; //totaal aantal sectoren van een bestand

uint16 leftbytes;//bevat de overblijvende bytes van een bestand, omdat

deze geen volledige cluster bevatten.

uint8 *buffer; //buffer

uint32 sector; //neemt de huidige sector op (om eindsector te bepalen)

uint8 flag; //pause-flag

uint16 vol=DefaultVolume; standaard geluidsniveau

uint16 songs=1; //begint standaard bij het eerste nummer

uint8 mode=DEFAULT_MODE; //standaard afspeelmodus: repeat all

uint16 songs_cnt = 0; //telt hoeveel nummers er al zijn afgespeeld

if(totalsongs==0)return; //als er geen muzieknummers zijn

uint32 rand_val;

Timer1_Initial(); //initialiseer de AVR Timer functie

ClearTrackInfo(); //wis alle

Het volgende gedeelte van de PlayMusic functie bepaald hoe de

nummers worden afgespeeld adhv MODE.

next:

if(mode==RANDOM) //als de afspeelmodus op RANDOM staat:

songs_cnt++; //de song count wordt geïncrementeerd

if(songs_cnt == totalsongs && totalsongs<1025)

ClearTrackInfo();

songs_cnt = 0; //wist de trackinfo wanneer alle songs zijn

afgespeeld

rand_val = TCNT1; //Deze random-waarde bepaald welk nummer wordt

afgespeeld

Delay((random() && 0x00ff));

rand_val <<= 16;

rand_val += TCNT1;

srandom(rand_val);

if(totalsongs>1024)

songs =

(uint16)(((random()/214749)*(uint32)totalsongs)/10000)+1;

//Deze code genereert een willekeurig nummer dat vervolgens zal worden

afgespeeld.

while(totalsongs<1025)

songs =

Page 97: Projecten met AVRµC

Pagina 97 van 138

(uint16)(((random()/214749)*(uint32)totalsongs)/10000)+1;//Ëæ»ú²úÉú¸èÇúÐòºÅ

//Deze code genereert een willekeurig nummer dat vervolgens zal worden

afgespeeld.

if(SetTrack(songs) == 0)break; //stopt wanneer alle nummers

zijn afgespeeld

count=0;//wis de tel-variabele

flag=1;

while(count<2048 && (type != MID))//2048 nullen achtereen naar de DREQ

sturen

if((VS1003B_PIN & _BV(VS1003B_DREQ))!=0)

for(j=0;j<32;j++)

VS1003B_WriteDAT(0x00); //de nul wegschrijven

count++;

if(count == 2047)break; //na 2048 nullen deze functie stoppen

VS1003B_SoftReset();//bij afspelen van WMA-nummers, soft reset gebruiken

Wanneer het pad nar de muziekbestanden is aangepast; gebruik dit

pad, anders het standaard pad.

#if FIX_DIRECTORY

Search(PATH,&MusicInfo,&songs,&type);

//zoek het bestand in aangepaste locatie

#else

Search(&MusicInfo,&songs,&type); //zoek het bestand

#endif

In de volgende code wordt berekend welke de eerste cluster van het

bestand is en in 'p' gestoken.

Page 98: Projecten met AVRµC

Pagina 98 van 138

p =

MusicInfo.deStartCluster+(((uint32)MusicInfo.deHighClust)<<16);

//eerste cluster vh bestand

totalsect = MusicInfo.deFileSize/512; //bereken totaal

#sectoren

leftbytes = MusicInfo.deFileSize%512; //bereken de overige

bytes

i=0;

sector=0;

In de volgende code wordt het geheugen van de buffer toegewezen en

de sectoren ingelezen.

while(1)

keylen=0;

for(;i<SectorsPerClust;i++) //1 cluster

buffer=malloc(512); //buffergeheugen toewijzen

FAT_LoadPartCluster(p,i,buffer);//lees 1 cluster in

count=0; //zet de count-variabele op 0

while(count<512)

if(flag==0)if(keylen)Delay(100);keylen--;

else if(type ==

MID)if(keylen)Delay(100);keylen--;

if((VS1003B_PIN & _BV(VS1003B_DREQ))!=0 &&

flag) //data naar de DREQ sturen

for(j=0;j<32;j++) //per 32bytes

VS1003B_WriteDAT(buffer[count]);

count++;

if(keylen)keylen--; //verwerken

van de druktoetsen

if(sector == totalsect && count >=

leftbytes) //wanneer dit het einde van de file is

if(type == MID)//als het midi

bestanden zijn, wachten tot deze gedecodeerd zijn

count=0;

while(count<2048)//2048 '0'-en

naar de DREQ sturen voor naar het volgende nummer te gaan

if((VS1003B_PIN &

_BV(VS1003B_DREQ))!=0 )

Page 99: Projecten met AVRµC

Pagina 99 van 138

for(j=0;j<32;j++)

VS1003B_WriteDAT(0x00);

count++;

if(count ==

2047)break;

i=SectorsPerClust;

break;

//einde van het bestand

if(count == 511)break; //1sector

verzonden; break

if((PIND&STOP)==0 /*&& keylen==0*/)

//PLAY/PAUSE

Delay(100);

if(!(PIND&STOP))

while(!(PIND&STOP));

if(flag)flag=0;

else flag=1;

Delay(1000);

else if(!(PIND&DOWN) && keylen==0) //Volume

zachter

Delay(100);

if(!(PIND&DOWN))

keylen=200;

vol=vol+((uint16)(1<<8)+1);

if(vol>=0xFEFE) vol=0xFEFE;

else VS1003B_WriteCMD(0x0b,vol);

else if(!(PIND&UP) && keylen==0) //Volume

omhoog

Delay(100);

if(!(PIND&UP))

keylen=200;

vol=vol-((uint16)(1<<8)+1);

if(vol<=0x0101) vol=0x0101;

else VS1003B_WriteCMD(0x0b,vol);

Page 100: Projecten met AVRµC

Pagina 100 van 138

else if(!(PIND&NEXT)) //Volgende nummer

Delay(0x7fff);

if(!(PIND&NEXT))

Delay(0x7fff);

if(!(PIND&NEXT))

while(!(PIND&NEXT));

songs++;

if(songs > totalsongs)songs=1;

free(buffer);

// Delay(0xffff);

goto next;

else if(!(PIND&PREV)) //Vorige nummer

Delay(0x7fff);

if(!(PIND&PREV))

Delay(0x7fff);

if(!(PIND&PREV))

while(!(PIND&PREV));

if(songs == 1)songs=totalsongs;

else songs--;

free(buffer);

// Delay(0xffff);

goto next;

else if((!(PIND&MODE)) && keylen==0) //ģʽ

//mode drukknop

Delay(100);

if(!(PIND&MODE))

keylen=0xffff;

if(mode==REPET_ALL)

mode=REPET_ONE;

LED1_ON();

Page 101: Projecten met AVRµC

Pagina 101 van 138

LED2_OFF();

else if(mode==REPET_ONE)//Volgende

'MODE' is shuffle

mode=RANDOM;

LED1_OFF();

LED2_ON();

srandom(((uint32)TCNT1)<<16);//Shuffle mode

else

mode=REPET_ALL;

LED1_OFF();

LED2_OFF();

sector++;

free(buffer);

i=0;

p=FAT_NextCluster(p);//Lees de volgende cluster in

if(p == 0x0fffffff || p == 0x0ffffff8 || (FAT32_Enable

== 0 && p == 0xffff))//Geen clusters meer over

if(mode==REPET_ALL)songs++;

if(songs>totalsongs)songs=1;

goto next;

Het volgende gedeelte bevat de main() functie, deze functie is de

functie waar het programma begint.

int main()

uint8 retry = 0;

DDRD &= 0x03;

PORTD |= 0xfc;

LED1_CON();

LED1_OFF();

LED2_CON();

Page 102: Projecten met AVRµC

Pagina 102 van 138

LED2_OFF();

OSCCAL = 0x00;/de oscillator draait aan zn laagste snelheid

tijdens de initialisatie om met de traagste SD kaarten te kunnen

werken.

Delay(0xffff);

MMC_SD_Init();//SPI (serial peripheral interface) init.

Delay(0xffff);

Initialiseren van de VS1003 codec.

if(VS1003B_Init())

//Led 1 zal blinken tijdens het initialiseren

while(1)

LED1_ON();

Delay(0xffff);

LED1_OFF();

Delay(0xffff);

Page 103: Projecten met AVRµC

Pagina 103 van 138

Even pauzeren tussen het initialiseren.

Delay(0xffff);

Intialiseren van de SD kaart

while(MMC_SD_Reset())//³õʼ»¯SD¿¨ //sd

card initialize

retry++;

if(retry>20)

//LED2 zal blinken tijdens het initialiseren

while(1)

LED2_ON();

Delay(0xffff);

LED2_OFF();

Delay(0xffff);

Na het initialiseren laten we de oscillator op zijn maximum

frequentie draaien. Een kleine delay om te zorgen dat alles stabiel

is. En daarna het FAT bestandssysteem initialiseren.

OSCCAL = 0xff; //Normale werkfrequentie

Delay(0xffff); //Wacht tot alles stabiel is

if(FAT_Init())//initialiseer het bestandssysteem (FAT16/32

support)

//LED1 en LED2 draaien afzonderlijk

while(1)

LED1_ON();LED2_ON();

Delay(0xffff);

LED1_OFF();LED2_OFF();

Delay(0xffff);

Page 104: Projecten met AVRµC

Pagina 104 van 138

Page 105: Projecten met AVRµC

Pagina 105 van 138

Vervolgens worden er nummer gezocht in de hoofdmap, tenzij er met

FIX_DIRECTORY een andere map is ingesteld.

#if FIX_DIRECTORY

Search(PATH,&MusicInfo,&totalsongs,&type);

#else

SearchInit();

Search(&MusicInfo,&totalsongs,&type);

#endif

Nadat de muziekbestanden gelokaliseerd zijn, kan de functie

PlayMusic worden uitgevoerd. Tijdens het afspelen zullen LED1 en

LED2 afwisselend aan/uit gaan.

PlayMusic();

while(1)

while(1)

LED1_ON();LED2_OFF();

Delay(0xffff);

LED2_ON();LED1_OFF();

Delay(0xffff);

return 0;

Page 106: Projecten met AVRµC

Pagina 106 van 138

21.7 Behuizing Als behuizing hebben we gekozen voor een montage op 2 plexiplaatjes. Dit om uitbreiding van de

mp3 speler mogelijk te maken.

Page 107: Projecten met AVRµC

Pagina 107 van 138

21.8 Componentenlijst

Totale componentenlijst

Aantal Ordernummer / Omschrijving Per stuk Totale prijs

(catalogusprijs)

3 9171487 / ATMEGA88-20AU TQFP32 4,610 13,830

5 1288339 / ATMEGA644-20AU 8,81 44,05

2 1711367 / PDIUSBD12PW 2,820 5,640

2 9779205 /LM1117MP-2.5 1,170 2,340

2 1663356 / LT1117CST-3.3#PBF 4,430 8,860

2 9186174 / SD kaartsocket 2,570 5,140

5 1611733 / Crystal 6MHz 1,280 6,400

5 1611787 / Crystal 12,288000 Mhz 0,310 1,550

10 1142607 / green LED 0,080 0,800

10 1142608 / red LED 0,090 0,900

1 1243250 / mini USB socket 1,570 1,570

1 1308878 / USB to mini-USB 5,570 5,570

4 1793577 / Pinheaders 0,177 0,708

12 1086635 / Pushbuttons 2,880 34,560

25 1739026 / Weerstanden 10 kOhm 1% 1206 0,118 2,950

10 1653145 / Weerstanden 510 Ohm 1% 1206 0,094 0,940

10 499250 / Condensator 33pF 1206 0,310 3,100

20 1327703 / Condensator 100nF 1206 0,240 4,800

5 1834231 / Elco 100µF 1213 2,080 10,400

10 1834224 / Elco 10µF 0810 1,470 14,700

10 9697063 / Elco 1µF 0405 0,138 1,380

Totaal 170,19 €

Page 108: Projecten met AVRµC

Pagina 108 van 138

22 Besluit De mp3-speler werkt op heden niet doordat deze niet geprogrammeerd kan worden.

Er is ergens een massafout opgetreden tijdens het solderen van de fijne smd componenten.

Hierdoor meet ik 2,8V op de massa.

Wanneer ik de programmer aansluit vindt deze de ATmega8 niet en kan er dus niet

geprogrammeerd worden. Deze kortsluiting kon niet meer op tijd hersteld worden, dan zou er een

nieuwe print moeten gemaakt worden want hersolderen zou meer kapotmaken dan herstellen.

23 Toekomstmogelijkheden We waren initieel van plan om een SD-kaartlezer in te bouwen zodat we via PC onze SD kaart kunnen

lezen/schrijven en eventueel ook de schakeling voeden.

Hiervoor zouden we een ATmega664 gebruiken die 4 poorten extra heeft en via een USB interface

(PDIUSBD12PW) de SD-kaart zou kunnen lezen en schrijven. Er waren al componenten en code

beschikbaar, maar deze uitbreiding zou nog teveel tijd gekost hebben dus zijn we bij de mp3-speler

zonder USB gebleven.

Page 109: Projecten met AVRµC

Pagina 109 van 138

23.1 Bibliografie

23.1.1 Bronnen

http://www.avrfreaks.net/index.php?module=Freaks%20Academy&func=viewItem&item_id=795&it

em_type=project

http://www.avrfreaks.net/index.php?module=Freaks%20Academy&func=viewItem&item_id=2000&i

tem_type=project

http://www.mictronics.de/projects/mp3stick-mp3-player/

http://brokentoaster.com/butterflylogger/index.html

http://www.frankvh.com/

http://www.brokentoaster.com/butterflymp3/index.html

23.1.2 Gebruikte programma’s

*Eagle 5.10

*Microsoft Office 2007

*AVRSTudio 4

*MySmartUSB light:

myAVR_ProgTool

Supportbox

Page 110: Projecten met AVRµC

Pagina 110 van 138

Klasse D versterker

Page 111: Projecten met AVRµC

Pagina 111 van 138

Klasse D

De vernieuwing in de audio sector.

Page 112: Projecten met AVRµC

Pagina 112 van 138

24 Inleiding

Dit project draait rond een relatief nieuwe techniek in de audio sector, namelijk klasse D.

De begeleidende docent van dit project is Mr. Claus.

De dag van vandaag worden audio versterkers gebruikt in bijna alle mobiele apparaten zoals

navigatie systemen, GSM’s en natuurlijk MP3 spelers. Gewone (klasse AB) versterkers zijn alles

behalve energie efficiënt, dit heeft als gevolg dat de batterij van een mobiel apparaat vlug leeg zal

zijn.

De oplossing voor dit probleem is een relatief nieuwe techniek, klasse D. Klasse D versterkers zijn

zeer efficiënt (tot 95%), ze benutten de beschikbare energie van een batterij het efficiëntst. Niet

alleen zijn ze zeer efficiënt met energie, ook met warmte. Een klasse D versterker warmt zo goed als

niets op waardoor warmteafvoer en grote dure koelvinnen overbodig worden. Ook kunnen gewone

IC behuizingen gebruikt worden zonder speciale voorziening van warmteafvoer.

Bij een klasse D versterker wordt puls breedte modulatie gebruikt om de luidspreker aan te sturen.

Het signaal naar de luidspreker is ofwel de maximum positieve spanning of de maximum negatieve

spanning (uitgezonderd van een verwaarloosbaar stukje tijdens het schakelen van positief naar

negatief). De frequentie waarop geschakeld wordt is vele malen hoger dan de frequenties van het

audio spectrum.

Het grootste nadeel van een klasse D versterker is zonder twijfel de stralingen die opgewekt worden

door de schakeltransistors. Ook het ontwerp en componentkeuze vormen een blok.

Page 113: Projecten met AVRµC

Pagina 113 van 138

25 Introduction

In this final project a new technique is used for designing an amplifier. The supervisor of this project

is Mr Claus.

These days amplifiers are used in almost every portable media device such as navigation systems,

mp3 players, mobile phones. The problem with regular amplifiers is that they aren’t efficient so the

battery of your mobile device will not last long.

The solution for this problem is a new technique called class D. Class D amplifiers are very efficient

(up to 95%), they provide the best use of the finite power available from a battery or other limited

power source. Also this high efficiency eliminates heat-sinking requirements for most amplifiers. This

allows that standard IC packages with no special consideration for thermal dissipation can be used.

A Class D amplifier uses pulse-width modulation for driving the speaker. The output voltage is either

positive or negative, ignoring a brief period of transition during the switching. The switching

frequency is much higher than the frequency’s used in the audio band. In this case the switching

frequency is 300kHz with a bandwidth of 60kHz.

Though, there are a few catches. The electronic components used to build a class D amplifier are too

small to solder with a normal soldering iron. And the switching of the outputs causes EMI radiation.

Concluding can be said that building a class D amplifier is very difficult due to the small electronic

components used. Never the less it has a great future ahead because it is efficient with the energy

consumption.

Page 114: Projecten met AVRµC

Pagina 114 van 138

26 Introduction

Dans ce projet final une nouvelle technique est utilisée pour la conception d'un amplificateur.

Le superviseur de ce projet est M. Claus.

Les amplificateurs sont utilisés dans presque tous les appareils multimédias portables tels que les

systèmes de navigation, lecteurs MP3 et les téléphones mobiles. Le problème avec les amplificateurs

régulière, c'est qu'ils ne sont pas efficaces si la batterie de votre appareil mobile ne durera pas

longtemps.

La solution de ce problème est une nouvelle technique appelée classe D. Les amplificateurs de

classe D sont très efficaces (jusqu'à 95%). Ils fournissent la meilleure utilisation de la puissance

finie disponibles à partir d'une batterie ou autre source d'alimentation limitée. De plus, cette haute

efficacité élimine les exigences dissipation thermique pour la plupart des amplificateurs. Cela

permet que les colis standard IC peut être utilisé.

Un amplificateur de classe D utilise la modulation de PWM pour contrôle l’haut-parleur. La tension

de sortie est soit positive ou négative. La fréquence de commutation est plus élevée que la

fréquence qui est utilisée dans la bande audio. La fréquence de commutation est 300kHz avec

une bande passante de 60kHz.

Bien que, il ya un peu de captures. Les composants électroniques utilisés pour construire un

amplificateur de classe D sont trop petits pour souder avec un fer à souder normal. Et la

commutation des sorties causes rayonnement EMI.

Conclusion, on peut dire que la construction d'un amplificateur de classe D est très difficile en

raison de la petite composants électroniques utilisés. Mais il a un grand avenir parce qu'il est

efficace avec la consommation d'énergie.

Page 115: Projecten met AVRµC

Pagina 115 van 138

27 Principes klasse D Op het internet en in folders wordt vaak gezegd dat een klasse D versterker een digitale versterker is,

voor alle duidelijkheid dit is totaal verkeerd. De letter D in “klasse D” slaat niet op digitaal, de werking

is volledig analoog. Een klasse D versterker werkt met puls breedte modulatie. Het ingangssignaal

wordt vergeleken met een driehoeksignaal en een comparator schakelt vervolgens de eindtrap naar

de positieve of negatieve voedingsspanning. Dit gebeurt met een zeer hoge schakelfrequentie die

zeker tien keer hoger is dan de hoogst waarneembare frequentie in het audio spectrum (dus 200 kHz

of hoger). De breedte van de pulsen varieert mee met de grootte van het ingangssignaal. Als nu

achter de eindtrap een laagdoorlaat filter wordt geplaatst, dan wordt de gemiddelde waarde van het

puls breedte signaal genomen en blijft een analoog signaal over met dezelfde vorm als het

ingangssignaal (maar wel versterkt). Doordat de eindtrap enkel hoeft te schakelen, is het rendement

zeer hoog (90% of hoger).

In het blauw de driehoeksspanning, in het rood het ingangssignaal. Het onderste signaal is het PWM

signaal dat naar de uitgang wordt gestuurd.

28 Half bridge: Principeschema:

Transistoren Q1 en Q2 zullen afwisselend werken, de ene werkt in omgekeerde richting dan de

andere, de comparator zal deze aansturen en ervoor zorgen dat ze niet tegelijkertijd werken. Omdat

het half-geleidingsbied vermeden wordt door de schakelende werking, zal het ontwikkelde vermogen

in de schakelblokken beperkt blijven. Dit verklaart ook waarom klasse D versterkers zo efficiënt zijn.

+B

-B

Q1

Q2

LF in

Triwave in

LOAD

Page 116: Projecten met AVRµC

Pagina 116 van 138

De formule om de versterking te berekenen is zeer simpel, het is de verhouding van het PWM signaal ten opzichte van het driehoekssignaal.

29 Full bridge: Bij de full bridge schakeling zal er aan de uitgang geen massa klem zijn, omdat op beide klemmen steeds de tegengestelde spanning komt te staan waardoor het vermogen verdubbeld. Dus het grote voordeel van een brugschakeling is dat we het uitgangsvermogen verhogen zonder de voedingsspanning aan te passen. Beide bruggen worden in tegen fase aangestuurd, dit om ervoor te zorgen dat er een stroom door de belasting kan vloeien. Dit wil zeggen dat er steeds 2 schakelelementen van de brug moeten samenwerken.

pp,tri

BB

pp,tri

pp,PWM

VV

VV

V

VA

Vdd

VH VL

Page 117: Projecten met AVRµC

Pagina 117 van 138

29.1 Type AD:

De meeste klasse D versterker werken in full bridge. Meestal wordt er één PWM signaal gebruikt om

beide uitgangen te sturen. In de “common mode” zullen de signalen mekaar opheffen, in de

“differential mode” zullen de signalen bij elkaar opgeteld worden. Normaal veroorzaakt de “common

mode” veel storingen die uitgezonden worden door de kabels die naar de luidspreker lopen. De

“differential mode” zal niet zoveel stoorsignalen opwekken. Aangezien het “common mode” signaal

gelijk blijft wordt het type AD gebruikt als de luidspreker ver verwijderd is van de versterker en er dus

lange kabels nodig zijn.

Vdd

VH

VH

VC

VC

VH-VC

Vdd

Vin

Page 118: Projecten met AVRµC

Pagina 118 van 138

29.2 Type BD:

Bij het type BD zullen de draaggolven (driehoekssignaal) in fase zijn, maar deze zullen in tegenfase gemoduleerd worden (inverter op het ingangssignaal). Hier zal het resultaat juist het tegengestelde zijn als bij het type AD. Bij “differential mode” wordt de draaggolf onderdrukt en bij “common mode” zal het volledige uitgangssignaal komen te staan. We merken ook op dat voor dezelfde schakelfrequentie twee keer zoveel schakelovergangen hebben. M.a.w. de schakelfrequentie is verdubbeld, daardoor is ook de bruikbare bandbreedte verdubbeld. Het grote voordeel van een type BD is dat er geen uitgangsfilter nodig is als de kabellengte naar de luidspreker zo kort mogelijk gehouden wordt. Het grote nadeel is dat een type BD zeer veel storingen opwekt!

Vdd

VH

VH

VC

VC

V -VH C

Vdd

Vin

Page 119: Projecten met AVRµC

Pagina 119 van 138

30 Spread spectrum Bijna iedere klasse D versterker is gebaseerd op het fixed frequentie type (een vaste frequentie voor

het modulerende driehoekssignaal). Het grote nadeel hiervan is dat er steeds een LC filter aan de

uitgang moet zijn (buiten bij het BD type, maar dit heeft dan weer andere nadelen door filterloos te

zijn). Zo een LC filter kost veel, is moeilijk te ontwerpen (component keuze!) en neemt veel plaats in

beslag. Moest dit weggelaten kunnen worden dan zou dit een grote stap vooruit zijn.

Nu is er een nieuwe methode (nog steeds in ontwikkeling, patenten zijn onlangs aangevraagd)

waarbij er geen LC filter nodig is aan de uitgang. Deze methode noemt men spread spectrum, dit

betekend eigenlijk een gespreid spectrum. Bij spread spectrum zal men de frequentie van het PWM

signaal variëren. Vb: als de midden frequentie 300kHz is zal men de frequentie gaan variëren van

270kHz tot 330kHz, d.w.z. dat we dan een bandbreedte hebben van 60kHz (men zal nooit meer dan

30% afwijken van de werkelijke waarde van het PWM, anders zal deze techniek niet goed werken).

Het variëren van de frequentie gebeurd random, waardoor de energie verspreid wordt over het

spectrum. Als we de verdeling van de uitgezonden energie door storingen bekijken dan zullen er bij

fixed frequentie pieken zijn op frequenties die overeenstemmen met het aangelegde PWM signaal

(en alle harmonischen hiervan). Bij spread spectrum gaan we de waarde van het PWM signaal

continu random veranderen. Hierdoor ontstaan er geen pieken en de verdeling van de uitgezonden

energie zal veel uniformer zijn. Dit betekend dus dat storingen veel minder hard uitgezonden

worden, maar de storingen zullen verdeeld zijn over een veel breder frequentie spectrum. Omdat het

uitgezonden vermogen niet piekt hebben we dus ook geen uitgangsfilter nodig.

Links zien we het fixed frequentie principe, waarbij er veel pieken ontstaan. Rechts zien we de spread

spectrum methode waarbij de energie uniform verdeeld is.

Page 120: Projecten met AVRµC

Pagina 120 van 138

Fixed frequentie:

We zien duidelijk dat het modulator signaal constant is.

Spread spectrum:

We merken op dat de frequentie van het modulator signaal random varieert.

Page 121: Projecten met AVRµC

Pagina 121 van 138

31 Filtering

Normaal gebeurd de filtering van de uitgang door een tweede orde LC filter. Deze zal de gemiddelde

waarde van het PWM signaal nemen, dit zal overeenstemmen met het ingangssignaal maar dan

versterkt. Toch zal er nog een zeer kleine spanningsvariatie zijn veroorzaakt door het PWM signaal.

Er zijn puristen die zeggen dat dit kleine hoogfrequent signaal een groot verschil maakt en dat dit

vermogen verbruikt zal worden in de tweeter waardoor deze zou opwarmen. Dit is onzin aangezien

de spoel van de luidspreker zich zeer inductief zal gedragen op deze hoge frequentie, dus er zal dan

ook geen (verwaarloosbaar klein) stroom kunnen vloeien die de tweeter zou kunnen opwarmen.

32 Componentkeuze Het ontwerp van een klasse d versterker is zeer delicaat, alsook de componentkeuze. Door de EMI

en de hoge frequenties gaan spoelen zich gedragen zoals condensators en omgekeerd. Een richtlijn

voor de condensators is om de behuizing zo klein mogelijk te nemen, hoe groter de condensator hoe

groter de parasitaire inductantie.

Slecht: goed:

Ook spoelen zorgen voor moeilijkheden bij hoge frequenties, de windingen zullen een parasitaire

capaciteit hebben tegenover mekaar. Ook zal er een parasitaire capaciteit tussen de windingen en de

behuizing of andere metalen objecten zijn.

Page 122: Projecten met AVRµC

Pagina 122 van 138

33 Rendement We weten dat een klasse D versterker zeer efficiënt omgaat met de beschikbare energie. Dit komt omdat er ofwel spanning over de schakeltransistor staat (schakelaar open) ofwel stroom door vloeit (schakelaar gesloten). Er staat dus nooit spanning over de schakeltransistor wanneer er stroom door vloeit. Een bijkomend voordeel is dat er minder vermogen gevraagd wordt van de voeding. Daardoor zal een klasse D versterker een zeer hoog rendement hebben (in de praktijk tot meer dan 90%).

34 Vervorming Het schakelen van de schakeltransistors gebeurt niet oneindig snel. Hierdoor zal er vervorming ontstaan. De volgende figuur geeft dit weer. De rode lijn toont het verschil. vervorming door schakelen: praktische vervorming:

35 Klasse D versterker gebaseerd op LM48511 Het eerste ontwerp voor de klasse D versterker is na veel afwegen en vergelijken gebaseerd op een

LM48511 IC. Deze IC is gebaseerd op de spread spectrum methode dus hierbij is geen LC

uitgangsfilter nodig. De schakelfrequentie van het PWM signaal varieert random 10% rond 300kHz.

Dus het PWM zal variëren van 270kHz tot 330kHz, d.w.z. dat de bandbreedte 60kHz is. Het maximum

vermogen is 3W.

Page 123: Projecten met AVRµC

Pagina 123 van 138

Hieronder uitleg over de componentkeuze en aangelegde spanningen aan de pinnen van de IC:

SD_BOOST: verbonden met VDD. Deze pin zal de volledige schakeling aan of uit schakelen. SD_AMP: verbonden met VDD. Deze pin zal enkel de versterker zelf aan of uit schakelen. SS/FF: verbonden met VDD. Door deze pin aan VDD aan te sluiten kiezen we de spread

spectrum mode i.p.v. fixed frequentie.

Er is gekozen voor keramische condensators zoals X5R en X7R diëlektrische types. Dit omdat deze de

laagste serie weerstand hebben en zeer stabiel zijn voor spanning en temperatuursveranderingen.

De versterking wordt ingesteld door de weerstanden R5, R6 (Ingangsweerstanden) en de

weerstanden R6 en R8 (terugkoppelingsweerstanden).

De versterking kan berekend worden door de formule:

A = 2 x Rf / Rin

Rin = ingangsweerstand (20kΩ), Rf = terugkoppelingsweerstand, A = versterking

De ingangscondensators zorgen ervoor dat de DC component van ieder aangelegd signaal

geblokkeerd wordt. Ook zullen deze tezamen met de ingangsweerstand (Rin) een hoogdoorlaat filter

vormen. Het -3dB punt kan bepaald worden door de formule:

F = 1 / 2 x π x Rin x Cin

Page 124: Projecten met AVRµC

Pagina 124 van 138

Ook zal de ingangscondensator ervoor zorgen dat er geen klik of plop is bij het aanschakelen dit

omdat de condensator voor een kleine tijdsvertraging zorgt. Voor de waarde van de condensator heb

ik gekozen voor 0,18µF.

Voor de uitgangscondensator (C2) is gekozen voor een 100µF tantalum condensator en niet voor een

elektrolyt condensator. Dit omdat elektrolyt condensators niet geschikt zijn voor hoge frequenties.

Voor condensator CS1 is gekozen voor een keramisch type van 10µF, dit omdat deze dient als een

stroom reservoir voor de stroom die naar de luidsprekerspoel vloeit wanneer er geschakeld wordt.

Ook zal deze de spanning afvlakken waardoor er naarmate de waarde van de condensator groter is

minder rimpel en storingen zullen zijn.

Css (0,1µF) is de softstartcondensator, deze zal ervoor zorgen dat de spanning / stroom geleidelijk

aan opkomt bij het aanschakelen (stroom komt op 5,1ms tot op een waarde van 330mA).

Voor diode D1 heb ik een Schottkey diode gekozen van 30V 2A.

Library in eagle:

Het schema:

Page 125: Projecten met AVRµC

Pagina 125 van 138

Bij FB_SEL heb ik demogelijkheid gelaten om te experimenteren. Momenteel is het moeilijk te

bepalen wat de beste verbindingsoptie zal zijn voor FB_SEL (feedback select).

Page 126: Projecten met AVRµC

Pagina 126 van 138

Eagle board:

Bij het printontwerp moest erop gelet worden dat de condensators CS1 (10µF), C3 en C4 (1µF) zo

dicht mogelijk bij de IC moesten komen te staan. Dit omdat het ontkoppel condensators zijn.

35.1 SMT / SMD soldeeroven De LM48511 heeft geen pinnen maar een

massavlak en soldeercontacten aan de

onderkant van de IC. Om dit te solderen

hebben we een soldeeroven nodig. Voor ik

kon starten met solderen heb ik de werking en

veiligheidprocedures van de soldeeroven en

de soldeerpasta bestudeerd. Nadien heb ik

enkele proeven gedaan door verschillende

programma’s te programmeren in de

soldeeroven. Vervolgens heb ik enkele testen

gedaan op printen, ik heb ze één voor één in

de oven gelegd en geprobeerd om het best passende soldeerprogramma te bepalen. Als test heb ik

getracht van een willekeurige SMD component te solderen op een print.

Eerst heb ik opgezocht wat de door de fabrikant aangeraden soldeer temperatuur was voor de

soldeerpasta. Nadien heb ik dit in de praktijk getest door de temperaturen van het soldeerproces aan

te passen naar de minima, nominale en maxima temperatuur uit de datasheet van de fabrikant. Bij

de minimum temperatuur (220°C) van het soldeer proces is gebleken dat dit te weinig is. Als

maximum temperatuur heb ik 250°C genomen ook dit gaf geen goed resultaat.

De solderingen waren niet glanzend, ook niet mooi gevormd en tot overmaat van ramp niet hard

genoeg (ik kon gemakkelijk de soldering kapot duwen met een schroevendraaier).

Nadien ben ik overgegaan naar het aanpassen van de dosering. Bij kleine doseringen kreeg ik het

slechtste resultaat. Als ik een grote hoeveelheid goed mengde en ze uitsmeerde als een dikke laag,

kreeg ik op sommige plaatsen een goede soldeerverbinding en soldeervorm en op andere plaatsen

was de soldeer verbinding dan weer teleurstellend slecht. Toen rees het vermoeden dat de oorzaak

van de problemen te wijten was aan vervallen soldeerpasta (van de eerste tube was de vervaldatum

in 2003 en de tweede tube was vervallen in april 2007). Zoals verder zal blijken is dit niet het geval.

Page 127: Projecten met AVRµC

Pagina 127 van 138

Nadien heb ik een tweede test gedaan met nieuwe soldeerpasta. Ik heb de soldeeroven weer

ingesteld op een goed gekozen soldeerverloop en eerst enkele tests gedaan op een stuk printplaat. Ik

kwam tot de conclusie dat de soldeerpasta weer niet tot een mooie soldeerverbinding uitvloeide.

Nadien ben ik beginnen experimenteren met verschillende temperaturen en verschillende soldeer

tijden. Zelfs als de oven op maximale temperatuur (280°C) en maximale soldeertijd (30 seconden)

ingesteld was wou de soldeerpasta niet smelten en openvloeien, enkel de flux droogde op. Ook heb

ik het te solderen koperoppervlak verkleint om uit te sluiten dat het aan een te groot en dus te

moeilijk opwarmbaar kopervlak te wijten was.

Page 128: Projecten met AVRµC

Pagina 128 van 138

Toen ook dit niet lukte heb ik besloten enkele tests te doen:

Temperatuur binnenin soldeeroven gemeten d.m.v. multimeter: de meet sonde kon niet

tegen hoge temperaturen en begon te smelten bij 180°C.

De soldeerpasta opgewarmd met een soldeerbout (Weller 50W):

-Bij 180°C smelt de soldeerpasta op 0,2 seconden, maar vloeit moeilijk open en

soldeerverbinding met koperoppervlak is ook niet hoe het moet zijn.

-Vanaf 200°C smelt de soldeerpasta ook op 0,2 seconden maar nu vloeit het soldeer wel

open en krijgen we een goede soldeerverbinding met het koperoppervlak.

Na verschillende vruchtloze pogingen om de IC te solderen met de soldeeroven heb ik besloten

enkele andere soldeertechnieken te proberen.

- Eerst heb ik geprobeerd de IC te solderen met een zeer fijne soldeer punt, zelfs deze zeer

fijne punt was te breed om aan de ic klemmen te kunnen solderen.

- Nadien heb ik het geprobeerd met een speciale soldeerbout: Een hete lucht soldeerbout.

Deze blaast zeer zacht warme lucht waarvan de

temperatuur hoog genoeg is om soldeer te

smelten.

Voorafgaand heb ik enkele tests gedaan: een

gewone soldeerdraad kon ik gemakkelijk laten

smelten tot een soldeerverbinding. Nadien heb

ik dit eens geprobeerd met de soldeerpasta: de

flux verdampte maar de soldeerpasta wou niet smelten, ook niet na lang proberen. Dus

waarschijnlijk werkt de soldeeroven toch hoe het moet en is er iets mis met de soldeerpasta.

- Dan ben ik aan de slag gegaan met deze soldeermethode en een gewone tin draad.

De eerste twee pogingen waren mislukt omdat de te solderen ic klemmen niet zichtbaar zijn

met het blote oog, ook niet onder een gewone loop. Nadien heb ik de ic gepositioneerd

onder de “microscoop” en dan voorzichtig gesoldeerd met de warme lucht soldeerbout. Dit

gaf het beste resultaat tot hier toe:

Zoals te zien is op de foto hierboven, zijn de solderingen zeer goed gelukt.

- Na het solderen heb ik een visuele controle uitgevoerd met behulp van de microscoop en de

digitale macro camera. Bij de macro camera was weinig te zien door de aanwezige flux laag

(weerspiegeling van licht).

- Vervolgens heb ik met behulp van een Multimeter gecontroleerd of alle ic connectors

gesoldeerd aan het massavlak werkelijk contact gaven met het massavlak.

Page 129: Projecten met AVRµC

Pagina 129 van 138

- Nadien heb ik gecontroleerd of alle resterende ic connectors geen kortsluiting maakten met

een naastgelegen ic connector.

De bestukte print:

Nadien ben ik overgegaan tot metingen. Tot mijn grote spijt heb ik moeten vaststellen dat de IC

kapot gegaan is tijdens het soldeer proces. Waarschijnlijk is deze te lang blootgesteld aan een te

hoge temperatuur. Bij het aanleggen van de spanning ging de IC volledig door de knieën.

Gelukkig had ik een alternatief: ik had op voorhand al gedacht een vergelijking te maken tussen een

(dure) Europese IC, die veel randcomponenten nodig heeft. En een (goedkope) kant en klare

(Chinese) IC waar enkel nog een afvlakkingscondensator en begrensweerstanden nodig zijn.

Page 130: Projecten met AVRµC

Pagina 130 van 138

36 Klasse D versterker gebaseerd op VMA2012 Het gaat hier over een klasse D versterker met een fixed frequentie van 250kHz (omdat het een type

BD is zal het lijken alsof de frequentie van het PWM signaal 500kHz is) gebaseerd op de VMA2012,

deze kan 2 x 3W leveren. De geluidskwaliteit is goed, en het uitgestuurde vermogen is zeer hoog.

VMA2012:

Schema:

Board met vaste versterking:

Page 131: Projecten met AVRµC

Pagina 131 van 138

Library VMA2012:

36.1 Metingen Om de frequentie karakteristiek weer te geven van de klasse D versterker zal eerst een laag frequent

filter ontworpen moeten worden. Dit omdat de frequentie anders steeds 250kHz of 500kHz zal zijn,

dit is de frequentie van het PWM signaal.

Het meten van de uitgang van een Klasse D versterker is niet vanzelfsprekend aangezien er geen

massa is. De versterker werkt in full bridge en zal dus schakelen tussen de maximum positieve

spanning en de maximum negatieve spanning. (Bij half bridge is er wel een massa omdat dan tussen

de massa en de maximale positieve spanning geschakeld wordt.)

Ook zullen er bij full bridge ground loops ontstaan die roet in het eten gooien. Deze zullen ervoor

zorgen dat meten zeer moeilijk wordt en dat er distortie en storingen ontstaan.

De oplossing voor het meettechnisch probleem is om het differentiaal te meten met 2 probes

waarvan de massa verbonden is (het signaal op de + en de – klem van de uitgang). Hieronder enkele

metingen van het PWM signaal bij verschillende geluidsniveaus en frequenties (sinussen).

De modulatie bij een kleine ingangsspanning: Bij een grotere ingangsamplitude:

Page 132: Projecten met AVRµC

Pagina 132 van 138

Page 133: Projecten met AVRµC

Pagina 133 van 138

Ingangsfrequentie = 50Hz Ingangsfrequentie = 20Hz

Ingangsfrequentie = 1kHz (close-up)

Ingangsfrequentie = 20kHz

We merken duidelijk op dat we te maken hebben met een full bridge type BD klasse D versterker. Dit

omdat de frequentie van het PWM signaal verdubbeld lijkt en de amplitude van het PWM signaal

afwisselend positief en negatief is naargelang de waarde van het ingangssignaal.

Page 134: Projecten met AVRµC

Pagina 134 van 138

36.2 Visual Analyser 2011 Om een zo realistisch mogelijke bron te hebben voor het ingangssignaal heb ik gebruik gemaakt van

het programma “Visual Anaylser 2011” van sillanumsoft. Dit is een zeer volledig en professioneel

programma geschreven door Alfredo Accattatis. Dit programma kan zowel als generator als analyser

gebruikt worden (scoop, fasemeter, spectrum analyser, frequentieteller, distortie meter, …).

Hier zien we enkele voorbeelden:

Sinus 200Hz

Page 135: Projecten met AVRµC

Pagina 135 van 138

Puls signaal:

Blokgolf en fase meter

Page 136: Projecten met AVRµC

Pagina 136 van 138

37 Besluit Een klasse D versterker is gebaseerd op een zeer simpel van principe, maar eens je de verschillende

technieken en mogelijkheden ontdekt merk je al snel dat een klasse D versterker zeer complex is.

Wat dit alles veel complexer maakt is de hoge frequenties die gebruikt worden, dit heeft een grote

invloed op de componentkeuze. Ook het feit dat de klasse D versterker zeer veel stoorsignalen

uitzend door het schakelen van de spanning is een groot struikelblok. Door spread spectrum te

gebruiken, alles zeer goed af te schermen en korte kabels te gebruiken kunnen de effecten hiervan

beperkt worden. Naarmate de versterker een hogere schakelspanning zal hebben zal dit voor meer

storingen / problemen zorgen. Bij relatief lage vermogens (tot 3W) kan de LC filter aan de uitgang

weggelaten worden, maar bij hogere vermogens is dit niet mogelijk en moet er dus steeds een LC

filter aanwezig zijn.

Ook heb ik de verschillen bestudeerd tussen 2 soorten klasse D IC’s.

VMA2012 LM48511

Origine China Europa

Randcomponenten Weinig Veel

Prestaties Goede geluidskwaliteit Hoog vermogen

Geluidskwaliteit onbekend Laag vermogen

Compactheid Zeer compact Neemt veel plaats in door extra componenten

Werkingsprincipe Full bridge type BD 250kHz

Full bridge type spreadspectrum 270kHz – 330kHz

Informatie Weinig tot geen Veel informatie te vinden

Solderen Is gemakkelijk te solderen Is zeer moeilijk te solderen

Totaal prijs +-7€ incl. BTW +-17€ incl. BTW

Tot slot kan ik besluiten dat ik bij het solderen van de LM48511 veel tijd verloren heb doordat het

solderen met de SMT soldeeroven niet lukte. Hierdoor was ik genoodzaakt van een hete lucht

soldeerbout te gebruiken, door de hoge temperatuur en de lange soldeertijd die nodig was om de IC

met deze methode te solderen is de IC stuk gegaan.

De VMA2012 werkt zeer goed, is gemakkelijk te solderen, is simpel van opbouw en neemt weinig

plaats in beslag. Er zijn wel enkele nadelen aan verbonden: er mogen geen lange draden gebruikt

worden, er is zeer weinig informatie te vinden over deze IC en er worden veel stoorsignalen

uitgezonden.

Afhankelijk van de applicatie zullen de voor en nadelen van verschillende IC’s moeten vergeleken

worden. Dus het is moeilijk om te zeggen dat de ene IC beter is dan de andere.

Page 137: Projecten met AVRµC

Pagina 137 van 138

38 Bronnen - DVD Elektor “Klasse-D-versterkers, Masterclass voor audio-liefhebbers en professionals door

Bruno Putzeys” - Pdf “Class D Amplifier FAQ, geschreven door John Guy” - Pdf “De Nayer instituut - Intercom” - Doc “klasse D audioversterkers” - http://www.maxim-ic.com/app-notes/index.mvp/id/3881

- http://www.low-powerdesign.com/article_mcculley_112409.htm

- http://www.circuitsonline.net/forum/view/48338/1/klasse+D

- http://www.circuitsonline.net/forum/view/88052/1/klasse+D

- http://nl.farnell.com/texas-instruments/tpa2028d1yzft/amp-aud-pwr-3w-mono-d-

9dsbga/dp/1815756

- http://www.class-d-amplifier.nl/theory-nld.html

- http://cas1.elis.ugent.be/cas/nl/adesign/kld.php

- https://biblio.ugent.be/input/download?func=downloadFile&fileOId=856145

- http://dspace.howest.be/bitstream/10046/257/1/Thesis_Bourgois_Dimitri.pdf

- http://pdfserv.maxim-ic.com/en/an/AN3881.pdf

- http://www.cirrus.com/en/pubs/whitePaper/Trends_in_class_D_amplifiers.pdf

- http://www.indiasemiconductorforum.com/showthread.php?62-Reducing-EMI-in-Class-D-

Audio-Applications-by-Spread-Spectrum-Modulation-Techniques

- http://www.eetimes.com/design/automotive-design/4016334/Reduce-EMI-in-Class-D-

Audio-Applications

- http://www.low-powerdesign.com/article_natsemi_kwok.htm

- http://www.maxim-ic.com/app-notes/index.mvp/id/1760

- http://www.maxim-ic.com/app-notes/index.mvp/id/3977

- http://www.circuitsonline.net/forum/view/27226/1/klasse+D

- http://www.youtube.com/watch?v=JUyErz0LRSQ

Page 138: Projecten met AVRµC

Pagina 138 van 138

39 Bijlage In de bijlage kan u de verschillende technische documenten en datasheets vinden. Alsook de

componenten bestellijst.