Elektronikpraktikum - SS 2014 H. Merkel, D. Becker, S. Bleser, M. Steinen Gebäude 02-413 (Anfängerpraktikum) 1. Stock, Raum 430 Serie 8: Microcontroller 17./18.07.2014 I. Ziel der Versuche Erster Erfahrungen mit einem Microcontroller sollen gesammelt werden, die grundlegenden EinAusgabe-Operationen werden realisiert. II. Vorkenntnisse Microcontroller (RISC AVR-Mikrocontroller „ATmega8“ der Firma ATMEL), PulsweitenModulation, Analog-Digital-Converter, Grundzüge der Programmierung in C. III. Aufbau Für den Versuch steht eine Enwicklungsplatine „myAVR Board MK2“ zur Verfügung. Diese Platine enthält einen Microcontroller, einen USB-ISP-Adapter, sowie verschieden Ein- und Ausgabemöglichkeiten, die mittels Steckkabeln mit den Ports des Microcontrollers verbunden werden können. Die Platine wird über USB mit dem Laptop verbunden, auf diesem läuft eine Entwicklungsumgebung zum Programmieren des Controllers. In der Entwicklungsumgebung „myAVR Workpad PLUS“ können Sie mit „Neu“ ein neues Programm erstellen. Wählen Sie im nächsten Schritt „C/C++ Grundgerüst“. Sobald Sie en Programm geschrieben haben, können Sie bei eingestecktem myAVR Board mit „Brennen“ das Programm kompilieren und in den Microcontroller laden. Es startet dann automatisch. Sie können die Programme natürlich auch anschließend für das Protokoll abspeichern. IV. Durchführung 1. Digitale Ausgabe Bauen Sie eine klassische Ampelschaltung. Verbinden Sie hierfür drei der Ausgänge, z.B. B0, B1 und B2 mit den entsprechenden LEDs und programmieren Sie eine Schleife mit folgenden Phasen: Rot 5s Rot-Gelb 3s Grün 5s Gelb 3s Hierfür müssen die entsprechenden Pins von Port B auf „Ausgang“ programmiert werden mit Hilfe des Registers DDRB (= Data-Direction Port B, Bit „0“ für Eingang, „1“ für Ausgang), die Schaltzustände werden anschließend auf PORTB ausgegeben. Benutzen Sie die Funktion waitMs(zeit_in_ms) zum definierten Warten. 2. Eingabe über Taster Bereits in Serie 7 wurde das Prellen der Taster erwähnt. Um die Taster als Eingabe für den Microcontroller verwenden zu können, müssen diese über Software entprellt werden. 2.1 Schätzen Sie mit Hilfe des Oszilloskops ab, wie lange die Taster prellen. Die Taster schließen die entsprechenden Anschlüsse auf Masse, d.h. für diese Messung müssen sie mit einem Pullup-Widerstand (ca. 1K) an „HI“ angeschlossen werden. 2.2 Verbinden Sie den Taster mit einem Eingang (z.B. C0) und drei Ausgänge mit den LEDs. Die entsprechenden Bits in DDRC und DDRB müssen gesetzt werden, das Ausgabebit in PORTC muss auf „1“ gesetzt werden (Pull-Up). Auf PINC kann die Eingabe gelesen werden. Programmieren Sie ein „Lauflicht“, das mit jedem Tastendruck eine LED weiter schaltet (zuerst ohne Entprellung). Lesen Sie hierfür in einer Schleife den Eingang aus und, sobald dieser auf 0 ist, warten Sie wieder auf eine 1, um den Schaltvorgang durchzuführen. 2.3 Entprellen Sie nun den Schalter, in dem Sie bei jedem Tastendruck warten, bis der Schalter sich beruhigt hat. Suchen Sie die minimale Zeit, bis das Lauflicht definiert jeweils eine LED weiter schaltet. 3. Analoge Ausgabe über Pulsweiten-Modulation Der Microcontroller verfügt über keinen Analog-Ausgang, allerdings können die Ports B0, B1 und B2 zur Pulsweiten-Modulation konfiguriert werden. Hierbei wird ein periodisches Rechtecksignal mit konstanter Frequenz, aber unterschiedlicher Pulsbreite ausgegeben. Das Ausgangssignal kann anschließend über einen Tiefpass geglättet werden, so dass annähernd eine Gleichspannung proportional zum Verhältnis der Pulsbreite zur Gesamtbreite resultiert. Bei langsamen Ausgabegeräten (z.B. LED) kann auf eine Glättung verzichtet werden. 3.1 Konfigurieren Sie Port B1 für die Pulsweiten-Modulation. Hierfür müssen die entsprechenden Bits laut Dokumentation in den Timer/Counter Control Registern TCCR1A und TCCR1B gesetzt werden. Die Bits WGM10, WGM11, WGM12 setzen den PWM Modus auf 10 Bit, CS10 startet dem Zähler, COM1A1 setzt die Ausgabe. DDRB = (1<<PB1); TCCR1A = (1<<COM1A1) | (1<<WGM11) | (1<<WGM10); TCCR1B = (1<<WGM12) | (1<<CS10); Anschließend kann mit Register OCR1A im Bereich von 0 bis 1023 die Pulsbreite gesetzt werden. 3.2 Nehmen Sie mit dem Oszillographen Bilder mit 10%, 50% und 90% Pulsbreite auf. 4. Analoge Eingabe über Analog-Digital-Konverter Die Ports C0-C5 können als Analog-Digital-Converter konfiguriert werden. Hier ein StandardProgrammfragment zum Einfügen vor „main“, dass die Konfiguration sowie die Auslese vornimmt. unsigned short readadc(short port) { ADMUX = (1<<REFS0) | port; ADCSRA |= (1<<ADPS2) | (1<<ADPS0); ADCSRA |= (1<<ADEN); ADCSRA |= (1<<ADSC); while (!(ADCSRA & (1<<ADSC))); while (!(ADCSRA & (1<<ADIF))); return ADCW; } // // // // // // choose internal reference voltage 5V divide by 32, i.e. 115.2 kHz enable ADC start conversion; Wait for conversion finished Wait for Interupt bit set Dies definiert ein Unterprogramm, dass anschließend mit readadc(0) verwendet werden kann. Schließen Sie ein Potentiometer an Ausgang C0 an, und variieren Sie damit die Helligkeit einer LED über Pulsweiten-Modulation. 5. Blumen-Gieß-Automat Im Folgenden kombinieren wir die ADC-Auslese und die digitale Ausgabe zu einem Regelkreis. Bauen Sie folgende Schaltung auf. Die Spannung für den Motor kommt aus einem Labornetzteil. +9V M FDP7030BL D µC Port B0 Sensor µC Port C0 G µC Port B1 µC Low R1 S µC Low 5.1 Messen Sie den Widerstand des Sensors in feuchter Erde und in trockener Erde. Dimensionieren Sie R 1 so, dass der angestrebte Schaltwert auf Port C0 in der Mitte des Messbereichs des ADCs liegt. 5.2 Die Wasserpumpe kann im Amperé-Bereich Strom ziehen. Daher muss die Leistung über einen MOSFET geschaltet werden. Es wurde ein MOSFET ausgewählt, der im TTLBereich durchschaltet und mit einer internen Schutzdiode (warum ist diese zum Schalten eines Motors unbedingt nötig?) versehen ist. 5.3 Messen Sie mit zwei Bechern, wie lange der Motor laufen muss, um ca. 100ml zu pumpen. Verbinden Sie hierfür das Gate des MOSFET statt mit Port B1 kurz mit „High“. Es empfiehlt sich, den Motor nicht bei 12V, sondern bei ca. 6V zu betreiben (der MOSFET wäre auch geeignet, die Geschwindigkeit über PWM zu regeln!). Legen sie den Ausgang B1 gleichzeitig auf eine LED, um den Schaltzustand zu sehen.. 5.4 Konfigurieren Sie den Microcontroller mit B0, B1 als Ausgang und C0 als ADC. Realisieren Sie folgende Schaltlogik in einer Schleife: 1. Der Sensor wird erst kurz vor der Messung eingeschaltet, um Korrosion durch eine permanent anliegende Spannung zu vermeiden. Schalten Sie hierzu B1 ein und warten Sie dann ca. 5 Sekunden. 2. Messen der Sensorspannung an C0 und berechnen Sie den Widerstand des Sensors aus der Spannung. 3. Schalten Sie den Sensor wieder aus. 4. Bei Erreichen der gewünschten Schaltschwelle wird die Pumpe für 100ml eingeschaltet. Danach muss mindestens 60 Sekunden gewartet werden, bis der Sensor reagieren kann. 5.5 Die Schaltlogik kann noch nach Belieben erweitert werden,z.B. 1. Schaltschwelle per Potentiometer einstellbar 2. Gießen Sie nur, wenn der Lichtsensor sagt, dass es Tag ist (fürs Schlafzimmer) oder Nacht ist (fürs Büro). 3. Begrenzung der Gesamtmenge Wasser/Tag zur Sicherheit. 4. Überprüfen Sie, ob der Sensor reagiert (sollte sich nach dem Gießen deutlich geändert haben) bevor Sie weiter gießen. Im Fehlerfall rote LED einschalten und auf Reset mittels Taster warten. 5. ... Datenblätter und Dokumentation Datenblatt FDP7030BL Dokumentation des Entwicklungsboards myAVR Board MK2 Referenz-Karte Datenblatt Atmel ATmega8 (sehr umfangreich)