MICPRG opdracht 3.

© 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.

Bierkelder.

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:

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.

Uitleg en tips.

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.

Aanpak.

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, Nassi–Shneiderman 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:

  1. Het programma moet meerdere dingen "schijnbaar" tegelijkertijd doen. Bedenk welke delen van het progamma in het hoofdprogramma worden uitgevoerd en welke op interrupt basis. Bijvoorbeeld:
  2. Ontwerp een programma dat een regel tekst b.v. "Hallo daar!" op de LCD zet met behulp van de functies waarmee het LCD kan worden aangestuurd. Implementeer en test dit programma.
  3. Ontwerp een interrupt gestuurd programma dat 1x per seconde uitgang PB5 inverteert zodat de LED knippert. Implementeer en test dit programma.
  4. Ontwerp een uitbreiding op het programma uit stap 3 dat 1x per minuut de analoge spanning op ingang PA0 inleest en indien nodig het verwarmings- of het koelelement aan/uit schakelt. Bedenk dat je kunt bepalen of er een minuut is verstreken door de seconden die verstreken zijn te tellen.  Implementeer en test dit programma.
  5. Combineer de programma's uit stap 2 en stap 4 en zet de juiste tekst op het LCD als de toestand veranderd:
  6. Let op het correct gebruik van 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).

Aansturen van de ADC van de ATmega32.

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:

Eenvoudig blokschema.

Registers en tabellen.

The successive approximation circuitry requires an input clock frequency between 50 kHz and 200 kHz.