© Harry Broeders (met aanpassingen van Ben Kuiper)
Deze pagina is bestemd voor studenten van de Haagse Hogeschool - Academie voor Technology, Innovation & Society Delft groep EQ1.2.
Volgens de website http://www.biernet.nl/bier/merken is de ideale drinktemperatuur van een bepaald biertje 4 tot 10 °C. Een student die niet beschikt over een koele kelder voor het koelen van dit bier heeft de volgende oplossing bedacht.
De temperatuurmeter geeft een analoge spanning af. Deze spanning wordt via ingang PA0 in de AVR ingelezen. Het verwarmings- en koelelement worden met een digitale uitgang (0V = uit, 5V = aan) aangestuurd. De uitgang PB7 van de AVR wordt gebruikt om het verwarmingselement aan te sturen en de uitgang PB6 wordt gebruikt voor het koelelement. De LED is verbonden met de uitgang PB5 van de AVR. Op de LCDisplay moet bij elke verandering van toestand één van de volgende teksten verschijnen:
Het verwarmings-
element is aan.
Het koelelement
is aan.
De temperatuur
is perfect!
Om te voorkomen dat de verwarming of koeling steeds aan en dan weer uitgeschakeld wordt, moet slechts (ongeveer)1x per minuut de temperatuur worden gemeten. De LED moet knipperen om aan te geven dat de installatie goed functioneert. Ongeveer 1 seconde aan en 1 seconde uit.
De temperatuur wordt gemeten met behulp van een NTC weerstand WNC2013 van Western Electronic Components Corporation. Deze NTC weerstand is opgenomen in de volgende schakeling:
Uin=5V, R0 = 47K, RT = NTC en Uuit is verbonden met PA0 van de ATmega32. De specificaties van de NTC WNC2013 kun je via deze link vinden.
Schrijf een programma voor de AVR zodanig dat:
Test dit programma met behulp van het AVR STK500 practicumbord.
Om het verwarmings- en koelelement op het juiste moment aan te sturen is het niet nodig om in je programma de temperatuur te bepalen. Je kunt met behulp van wat rekenwerk en de tabellen van de NTC bepalen bij welke uitgangswaarden van de ADC (Analog Digital Converter) van de AVR het verwarmings- en/of koelelement aan/uit geschakeld moet worden.
In de specificaties van de NTC WNC2013 is gegeven dat de Dissipation Constant 2 mW/°C bedraagd. Doordat er stroom door de NTC loopt warmt deze zichzelf op. Deze zogenaamde "self-heating" veroorzaakt een meetfout. De dissipation constant geeft aan dat er 2 mW vermogen nodig is om de temperatuur van de NTC met 1 °C te laten stijgen. De gekozen NTC heeft bij 25 °C een weerstand van 20K. Als R0 47K wordt gekozen en Uin 5V bedraagt dan is het opgenomen vermogen in de NTC bij 25 °C 0,11 mW. De fout ten gevolge van self-heating is in dit geval dus te verwaarlozen.
Op het AVR STK500 practicumbord bevindt zich een potentiometer. Met deze potentiometer kun je de spanning op PA0 varieren. De potentiometer vervangt dus bij het testen de temperatuurmeter.
Je kunt natuurlijk gewoon achter een PC gaan zitten hacken.... maar een meer systematische aanpak levert hoogstwaarschijnlijk sneller een beter resultaat op! Maak eerst een ontwerp van je programma voordat je gaat coderen (b.v. in de vorm van een flowchart, NassiShneiderman diagram of in pseudocode). Probeer niet het gehele probleem in een keer op te lossen maar verdeel het probleem in deelproblemen en los deze 1 voor 1 op. Deze methode wordt functionele decompositie, of ook wel verdeel en heers, genoemd. Maak een stappenplan en maak een schatting van de tijd die je denkt voor elke stap nodig te hebben zodat je een goede tijdsplanning kunt maken. Een voorbeeld van een stappenplan voor het maken van deze opdracht zou kunnen zijn:
Het verwarmings-
element is aan.
Het koelelement
is aan.
De temperatuur
is perfect!
volatile
bij het doorgeven
van de toestand (verwarmen/koelen/perfect) vanuit de Interrupt Service Routine
(ISR) naar het hoofdprogramma!
Bedenk dat het bovenstaande stappenplan slechts een voorbeeld is! Voor sommige studenten zijn de stappen te groot (zij hebben meer tussenstappen nodig) voor andere studenten zijn de stappen juist te klein. Je kunt ook een andere aanpak kiezen. Maak indien nodig een persoonlijk stappenplan! Maak voordat je een (deel)programma gaat coderen eerst een ontwerp op papier (b.v. in de vorm van een stukje pseudocode).
In het hoofdstuk "Analog to Digital Converter" van de datasheets van de ATmega32 wordt uitgelegd hoe de ADC gebruikt kan worden. De belangrijkste gegevens, registers en tabellen zijn hieronder weergegeven:
ADEN
: ADC EnableADSC
: ADC Start ConversionADSC
has been written after the ADC
has been enabled, or if ADSC
is written at the same time as
the ADC is enabled, will take 25 ADC clock cycles instead of the normal 13.
This first conversion performs initialization of the ADC. ADSC
will read as one as long as a conversion is in progress. When the conversion
is complete, it returns to zero. Writing zero to this bit has no effect.
ADATE
: ADC Auto Trigger EnableADTS
in SFIOR
.
ADIF
: ADC Interrupt FlagADIE
bit and the I-bit in SREG
are set.
ADIF
is cleared by hardware when executing the corresponding
interrupt handling vector. Alternatively, ADIF
is cleared by
writing a logical one to the flag.
ADIE
: ADC Interrupt EnableSREG
is set,
the ADC Conversion Complete Interrupt is activated.
The successive approximation circuitry requires an input clock frequency between 50 kHz and 200 kHz.