Elektronikpraktikum

Werbung
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)
Herunterladen