|
Einige Grundlagen der Messtechnik |
Themen |
1. AD-Wandler |
Dient zum Messen von Spannungen (analog) und Ausgabe eines digitalen Wertes. Will man Spannungen mit einem Mikrocontroller messen, braucht man einen AD-Wandler, weil nur der digitale Ausgabewert weiterverarbeitet werden kann. Es gibt die verschiedensten Typen von AD-Wandlern. Man muss jeweils den besten Kompromiss zwischen Genauigkeit und Messdauer suchen. Unser Prozessor kann in 8 Kanälen mit einer Auflösung von 10 bit, also mit einer Auflösung von 1024 Stufen, messen.
Die Maximalspannung wird durch eine "Referenzspannung" Vref vorgegeben, die häufig als Betriebsspannung genommen wird, oder einem wohldefinierten Teil von ihr, z.B. die Hälfte, oder durch eine eigene "Referenzspannungsquelle" bestimmt ist. Das ist ein eigenes IC, das unabhängig von der Betriebsspannung stets sehr genau eine bestimmte Spannung liefert.
Wenn wir die Betriebsspannung 5,0 V als "Referenzspannung" Vref verwenden, haben wir 210 = 1024 Stufen à 5,0 V / 1024 = ca. 5 mV zur Verfügung, eine bereits recht hohe Auflösung. Für viele Zwecke würde eine Auflösung von 8 bit reichen. Dann würde die Referenzspannung in 28 = 256 Stufen geteilt werden.
Da unser Mikroprozessor nur mit Spannungen zwischen 0 V und 5 V arbeitet, müssen auch die Eingangsspannungen des AD-Wandlers in diesem Bereich liegen. Wechselspannungen kann er deshalb eigentlich nicht registrieren. Mit einem zusätzlichen Verstärker (z.B. auf der Basis des ICs TLC 272 ) kann man aber zur Wechselspannung eine Gleichspannung hinzuaddieren, so dass die Summe immer positiv bleibt. Nach dem Messen wird der Gleichspannungsanteil wieder rechnerisch vom Prozessor subtrahiert.
Mit zusätzlichen Schutzdioden muss man dann dafür sorgen, dass weder dieser Baustein, noch der Prozessor durch kleinere Spannungen als 0 V oder größere Spannungen als die Betriebsspannung 5 V zerstört wird. Am besten sind Schottky-Dioden zu verwenden, weil sie sehr schnell durchschalten und so den Baustein bzw. den Prozessor nur sehr kurzzeitig mit einer falschen Spannung belasten.
Solche Schutzdioden sind nicht verzichtbar! Ohne diese Schutzschaltung sollte man den AD-Wandler unseres Prozessors nicht benutzen, wenn nicht von vornherein gesichert ist, dass die Spannung die Grenzen nicht überschreitet!
Die Grenzen werden z.B. sicher eingehalten, wenn man die Spannung vieler Sensoren abfragt, die mit 5 V Betriebsspannung betrieben werden. Also: Von Sensoren, die von der 5V-Betriebsspannung der Prozessor-Platine versorgt werden, ausgegebene Spannungen können in der Regel gefahrlos mit dem Prozessor gemessen werden.
Beim AVR-Prozessor können interne Pullup-Widerstände zugeschaltet werden. Dies ist sehr nützlich zum Messen von Spannungsabfällen an externen Widerständen (z.B. Fotowiderständen), aber unbrauchbar, wenn man externe Spannungen messen möchte.
In diesem Fall müssen die internen Pullup-Widerstände abgeschaltet werden.
(Beim AVR:
Zugeschaltete Pullup-Widerstände sind beim AVISE-FORTH Wort AIN die Normaleinstellung). Vgl. Ansteuerung von Ports durch AVISE-FORTH
Mit AVISE-FORTH geht das Messen einer Spannung sehr einfach:
$ A7 AIN .
misst die Spannung an PORT A,7 (mit AIN: Analogspannung In) und gibt sie an den PC aus als Wert zwischen 0 und 3FF bzw. 1023. Durch eine geeignete Skalierung kann der Wert in einen Spannungswert in mV umgewandelt werden.
Gemessen werden soll die Spannung eines Punktes gegenüber einem anderen, meistens gegenüber Masse (COM = "common" = GRND = "ground"). Dazu braucht man die beiden Punkte nur mit den beiden Anschlussbuchsen eines Spannungsmessers verbinden. Gute Spannungsmesser sollten einen hohen Eingangswiderstand haben (bei digitalen Vielfachmessgeräten typisch einige MOhm). Deshalb wird durch das Messgerät kein "Kurzschluss" zwischen beiden Punkten erzeugt. Um das Messgerät vor Überlastung zu schützen, muss vorher jedoch der richtige Messbereich eingestellt werden. Bei Zeigermessgeräten muss man evtl. auf die richtige Polarität achten.
Würde man die zwei Punkte mit einem Strommesser verbinden, würde dieser höchstwahrscheinlich in Rauch aufgehen, weil sein hoffentlich geringer Innenwiderstand den Strom zwischen beiden Punkten nicht begrenzen würde. Der Kurzschluss hätte verheerende Folgen.
Spannungsmessungen mit unserem Mikroprozessor erfolgen mit den AD-Wandler-Eingängen. Sie sind geeignet, um Spannungen zwischen 0 V und 5 V in 1024 Stufen ("10-bit-Wandler") zu messen.
Beachten Sie:
Die "Masse" (COMmon) hat mit "Erdung" in der Regel nichts zu tun.
Erdung bedeutet eine Verbindung mit der Erde (über Wasserleitung oder eigene Erdungskabel) und ist eine Maßnahme, um atmosphärische Spannungen (Blitz) oder Hochfrequenzschwingungen "zur Erde abzuleiten". Manchmal kann man solche Störungen auch in Elektronik-Schaltungen verringern, wenn man die Masse zusätzlich noch mit Erde verbindet.
Masse ist ein gemeinsamer Vergleichspunkt, gegenüber dem alle Spannungen in der Schaltung gemessen werden.
Fast jeder Mikrocontroller kann Zeiten messen. Dazu sind 1 oder mehrere TIMER vorgesehen. Grundfunktionen des TIMERS sind:
Zählen und Zeiten messen könnte man auch, indem man eine Schleife durchlaufen lässt und die Zahl der Durchläufe mitzählt. Das geht allerdings nur bei Prozessoren, die nicht Multitasking durchführen, d.h. nach vorgegebenen oder zufällig eintretenden Rhythmen zwischen verschiedenen Aufgaben (Tasks) wechseln. Bei Multitasking könnte eine Schleife in jeweils anderer Zeit durchlaufen werden, weil gelegentlich zwischendurch der Prozessor mit anderen Aufgaben (mit anderen "Tasks") beschäftigt war. Software-Zählschleifen funktionieren z.B. also nicht unter Windows.
TIMER dagegen werden vor Gebrauch einmalig durch ein Programm "konfiguriert" (Betriebsart, Zählrichtung aufwärts oder abwärts, Faktor, durch den die Frequenz des Eingangssignals vor dem Zählen geteilt wird. Nach dem evtl. ebenfalls softwaremäßig ausgelösten Start erfolgt dann das Zählen bzw. die Zeitmessung rein hardwaremäßig, unabhängig von dem, was der Prozessor sonst tut. Deshalb ist Zeitmessen und Zählen mit einem Timer viel zweckmäßiger als softwaremäßig durch ein Unterprogramm, weil der Prozessor anderweitig genutzt werden kann, und weil das softwaremäßige Zählen nicht durch Konkurrenzprozesse gestört werden kann. Gerade Multitasking-Betriebssysteme, wie Windows NT, unterbrechen ihre Tätigkeit im 2 kHz-Rhythmus zu verschiedenen konkurrierenden Prozessen. Mit ihnen kann man softwaremäßig also nicht zählen und nur ungenau Zeiten messen.
Start / Stopp eines Timers können softwaremäßig ausgelöst werden, aber auch durch externe Signale mittels Interrupts.
Ein Interrupt ist eine Vorrichtung von Prozessoren, mit der bei bestimmten Ereignissen ein Sprung zu einem bestimmten Unterprogramm ausgelöst wird, ganz gleich, womit der Prozessor gerade sonst beschäftigt ist, oder aber eine Hardware-Reaktion.
Die AVR-Prozessoren haben z.B. mindestens 2 Interrupt-Leitungen INT0 und INT1. Zu ihnen können ganz normale Ein-/Ausgangsports umfunktioniert werden. Je nach Konfiguration des Interrupts, wird z.B. der Interrupt ausgelöst, wenn das Signal an der Leitung INT0 von 5 V auf 0 V fällt ("fallende Flanke") oder von 0 V auf 5 V wächst ("steigende Flanke"). Im Unterprogramm, zu dem der Prozessor dann springt, kann z.B. gezählt werden, oder ein Schrittmotor eine Stufe weiterrücken, oder ein Ton ausgegeben werden. Auch die Timer selbst können einen Interrupt auslösen, wenn ein bestimmter Zählerwert erreicht wird, oder wenn der Zähler seinen maximal möglichen Wert überschreitet ("Overflow" und dann wieder von vorn anfängt).
Es gibt 8-bit-Timer und 16-bit-Timer. Ein 8-bit-Timer kennt nur 256 Stufen, ein 16-bit-Timer 65536 Stufen. Manchmal kann man mehrere Timer "kaskadieren", d.h. hintereinanderschalten. Im vorliegenden Beispiel hätte man dann einen 24-bit-Timer mit 256*65536 Stufen.
Die AVR-Prozessoren haben in der Regel je einen 8-bit-Timer und einen 16-bit-Timer. Unser Baustein, der 8535, hat sogar 2 8-bit-Timer (TIMER0 und TIMER2) und einen 16-bit-Timer (TIMER1).
Zeitmessung mit unserem Prozessor : Es lassen sich leicht Zeiten bis zu 65 s mit einer Auflösung von ms messen. Für längere Zeiten müsste man den Überlauf des Timers berücksichtigen.
: ZEITTEST FFFF FFFF MS BEGIN KEY? UNTIL DROP TIME - . ;
Mit FFFF MS wird der Timer auf Millisekunden gestellt und mit dem maximalen Startwert FFFF (Hexadezimal) geladen. Dann folgt eine leere BEGIN - UNTIL -Schleife, die bei Tastendruck abgebrochen wird. DROP entfernt den Code der gedrückten Taste vom Stack. TIME legt den momentanen Zählerwert auf den Stack. Durch die Subtraktion von FFFF wird die Zahl der Millisekunden seit Starten des Timers auf den Stack gelegt und mit . ausgedruckt. Ähnlich einfach lässt sich der Programmablauf für eine bestimmte Zeit anhalten (WAIT).
Im allgemeinen würde man 2 Worte definieren:
Var VA
: STARTZEIT FFFF VA W FFFF MS ; (Schreibt Startwert FFFF in Variable VA und schreibt Startwert FFFF in Timerregister)
: ZEIT? VA R TIME - ; (Liest den Inhalt der Variablen VA auf den Stack, holt den momentanen Inhalt des Timerregisters auf den Stack und bildet die Differenz ohne sie auszudrucken.
Statt ZEITTEST könnte man also auch definieren:
: TEST STARTZEIT BEGIN KEY? UNTIL DROP ZEIT? . ;
Prinzipiell gibt es zwei Messverfahren: Entweder wird die Zeit für eine Periode gemessen und daraus die Frequenz errechnet, oder es wird eine bestimmte Zeit lang, z.B. 1 s lang, die Zahl der Schwingungen gezählt. Das zweite Verfahren verbindet den Vorteil einer hohen Genauigkeit mit dem Nachteil einer langen Messzeit. Frequenzmessungen können bei bestimmten Sensoren nötig sein. Beispiele sind Spannungs-Frequenz-Wandler, mit denen man Spannungen messen kann, oder bestimmte Temperatursensoren, deren Ausgabefrequenz eine Funktion der Temperatur ist, oder bestimmte Lichtsensoren. Frequenzmessung kann natürlich auch eine eigenständige Messaufgabe sein. Softwaremäßig (mit einer in gleichen Zeiten durchlaufenen Zählschleife) kommt man bei Mikrocontrollern kaum über 5 kHz. Mit dem Timer kann das genauer gehen.
Frequenzausgabe: FREQ
Dabei handelt es sich um eine besonders Schaltung, ein IC, die ein Rechteckssignal einer bestimmten Frequenz ausgibt. Diese Frequenz hängt in der Regel linear von der Eingangsspannung ab. Ein solcher U-f-Wandler ist als billige Möglichkeit zum Messen von Spannungen brauchbar, weil Zeiten mit einem Timer sehr leicht gemessen werden können. Er kombiniert den Vorteil einer eventuell hohen Spannungs-Auflösung (z.B. 10000 Schritte auf 5 V) mit dem Nachteil einer relativ langen Dauer einer Messung. Manche Bauteile (z.B. Temperatur- oder Lichtsensoren) haben von Haus aus einen integrierten U-f-Wandler. Man kann dann mit dem TIMER z.B. Temperaturen messen.
Gemessen werden soll die Stromstärke des Stromes, der im vorhandenen Stromkreis (durch die Stelle A) fließt, auch, wenn keine Messung vorgenommen wird.
Dazu ist der Stromkreis zu unterbrechen, an die beiden Enden der Unterbrechungsstelle werden die beiden Anschlussbuchsen des Strommessers angeschlossen. Der ohnehin im Kreis fließende Strom fließt dann durch das Messgerät.
Damit das Gerät nicht überlastet wird, muss man unbedingt auf den richtigen Messbereich achten, bei Zeigermessgeräten evtl. auf die richtige Polarität. Damit der Strommesser keine Auswirkung auf den im Kreis fließenden Strom hat, sollte sein Innenwiderstand möglichst klein sein. Gerade dadurch ist aber der Strommesser extrem gefährdet.
Durch einen Strommesser darf niemals ein neuer Stromkreis aufgebaut ( geschlossen ) werden. Weil dann wegen des kleinen Innenwiderstandes eine Strombegrenzung fehlen würde, hätte der Kurzschluss riesige Stromstärken zur Folge; das Messgerät würde nicht überleben.
Würde man dagegen in den Stromkreis versehentlich statt des Strommessers einen Spannungsmesser einbauen, würde dem Messgerät nichts passieren. Wegen seines hohen Innenwiderstandes würde es aber den Strom im Stromkreis total verändern.
Strommessung auf elektronischem Weg ist direkt kaum möglich. Immer muss erst die Stromstärke in einen Spannungswert umgesetzt werden, der dann mit einem AD-Wandler gemessen wird. Dazu dient ein Strom-Spannungs-Wandler.
Der einfachste Strom-Spannungs-Wandler ist ein Widerstand, der vom zu messenden Strom durchflossen wird. Die Stromstärke führt dann zu einem proportionalen Spannungsabfall. Leider stört bei diesem Strom-Spannungswandler, dass der Widerstand die im Stromkreis fließende Stromstärke beeinflusst. Man muss das weitgehend durch die Wahl eines sehr kleinen Widerstands verhindern, erhält dann aber nur sehr kleine, ungenau messbare Spannungen. Ein besserer Strom-Spannungswandler ist mit einem Operationsverstärker aufgebaut, oder verwendet einen sehr kleinen Widerstand, dessen sehr kleiner Spannungsabfall stark verstärkt wird.
Hier wird ein billig erhältliches Standardbauteil missbräuchlich eingesetzt, nämlich ein Infrarot-Sender und ein Infrarot-Empfänger aus einer "Fernbedienung". (Abstandssensor Typ "Poor Man")
Die Infrarot-Empfänger sind darauf eingerichtet, Informationen vom Handsender zu erhalten, die mit einer bestimmten Frequenz, z.B. 36 kHz, gepulst sind. Der Baustein SFH 506-36 (oder z.B. TSOP 1736 ) z.B. ist auf diese Sendefrequenz eingerichtet. Er arbeitet dann mit größter Empfindlichkeit. Wird er mit höheren Frequenzen betrieben, verringert sich seine Empfindlichkeit. Sein Ausgangssignal ist dann bei gleicher Entfernung des Senders geringer, eventuell so gering, dass die nachfolgende Elektronik das Signal nicht mehr erkennen kann.
Zur Entfernungsmessung wird nun mit einer Infrarot-LED ein gepulstes Lichtsignal mit einer bestimmten Frequenz abgestrahlt. Es kann an Hindernissen reflektiert werden. Bei der optimalen Frequenz 36 kHz ist das reflektierte Signal vielleicht noch ausreichend, um am Ausgang des SFH 506-36 von unserem Prozessor registriert zu werden. Bei der Frequenz 38 kHz aber vielleicht nicht mehr, erst recht nicht bei 40 kHz. Nähert sich aber der Roboter dem Hindernis, ist das reflektierte Signal vielleicht so stark, dass auch bei einer Sendefrequenz von 38 kHz der Prozessor das Ausgangssignal erkennen kann, aber nicht mehr bei 40 kHz. Erst noch stärkere Annäherung führt zur Erkennung des Signals auch bei 40 kHz, usw.
Das Messprinzip beruht also darauf, nacheinander gepulste IR-Signale mit unterschiedlichen Frequenzen, z.B. zwischen 36 kHz und 42 kHz, auszusenden und vom Prozessor feststellen zu lassen, bei welcher Frequenz am Ausgang des SFH 506-36 (oder TSOP 1736) kein Signal mehr registriert wird. Fehlt ein reflektierender Gegenstand oder ist er sehr weit weg, dann kann selbst bei 36 kHz kein Empfangssignal registriert werden. Erst bei stärkerer Annäherung wird das 36 kHz-Signal registriert. Je näher das Hindernis, bei desto "unempfindlicheren" Frequenzen wird kein Signal mehr registriert: Durch die Frequenz, bei der gerade kein Signal mehr festgestellt werden kann, hat man eine - grobe - Entfernungsskala gewonnen.
Der Prozessor hat damit folgende Aufgaben zu erledigen:
Diese Tabelle muss vorher durch Ausprobieren ermittelt werden.
Die infrarotempfindliche Videokamera zeigt die Funktion der "Scheinwerfer". |
Man wird in der Regel mindestens zwei solche Entfernungsmesser anbringen müssen (links vorne und rechts vorne), wenn man den Aufprall auf ein Hindernis verhindern möchte.
Der Ausgangsstrom des PWM ist in der Regel zu gering um eine kräftige IR-LED anzusteuern, damit man nennenswerte Abstände registrieren kann. Er schaltet deshalb einen Transistorschalter, der dann Ströme von typisch 100 mA durch die IR-Sendediode schicken kann, geeignet begrenzt durch einen Vorschaltwiderstand. Bei U = 5V, 2 in Reihe geschalteten IR-LEDs und durchgeschaltetem Transistor ist bei I = 100 mA ein Widerstand R = UR/I = ( 5 V - 2 x 1,2 V - 0,6 V) / 0,1 A = 2 V / 0,1 A = 20 Ohm ) geeignet.
36 kHz erreicht man in AVISE-FORTH 2.2 mit $ 171 FREQ (Höchste Empfindlichkeit für SFH506-36 oder 'TSOP1736). Man sollte das Empfindlichkeitsmaximum aber selbst ausprobieren. Beim aktuellen AVISE-FORTH 2.4 muss man das selbst programmierte Wort FREQ verwenden. Dort gibt $ 6F FREQ ca. 36 kHz aus. Analog für PWM2 $ 6F FREQ2.
8. Finden eines Weges
Der Roboter soll eine weiße oder schwarze Linie auf dem Boden verfolgen können, die zwischen den Rädern in Bewegungsrichtung verläuft. Zum Bodenbelag sollte möglichst viel Kontrast bestehen.
Verwendet werden Fotowiderstände (mindestens ein Paar), die gegen den Boden gerichtet sind. Sie werden mit dem AD-Wandler abgefragt (AIN mit eingeschalteten Pullup-Widerständen - Normalzustand).
Der Roboter wird so gesteuert, dass beide Eingangssignale gleich groß sind. Kommt er von der rechten Seite her zu nahe an die weiße Linie, fällt die Spannung am rechten Sensor. Der Roboter muss dann leicht (und vorsichtig) nach rechts gelenkt werden, bis beide Sensoren wieder gleiches Signal liefern.
Wenn die weiße Linie einen Knick macht, gelingt dieses Manöver nicht. Spricht der rechte Sensor stärker an, muss jetzt ganz stark nach rechts gelenkt werden.
Verwendet man 4 Fotosensoren, kann man zwischen beiden Situationen unterscheiden: Bei einem Rechtsknick zeigen dann beide rechten Sensoren etwa gleiches Signal, die linken nicht.
Das Verfolgen eines Weges geht aber auch mit 1 Lichtsensor. Lediglich zur "Eichung" der Hell-Dunkel-Werte haben wir gute Erfahrungen mit einem zweiten Lichtsensor gemacht. Problem ist das Umgebungslicht. Bei "passiven Lichtsensoren" braucht man eine bestimmte Resthelligkeit, die nicht abgeschirmt werden darf. Zu starkes Umgebungslicht wird durch Papierhüllen abgeschirmt. Mit Abschirmung verhindert man auch, dass der Roboter seinem eigenen Schatten nachläuft. Bei "aktiven Lichtsensoren" mit einer LED als Lichtquelle kann man das Umgebungslicht so weit wie möglich abschirmen.
Eine bestimmte "Torzeit" lang werden Ereignisse gezählt, deren Signal an einem bestimmten Zähleingang anliegen. Bei uns ist das PORT D, 3 . In der Regel muss eingestellt werden, ob der Zählvorgang durch ein fallendes oder ein steigendes Signal ausgelöst werden soll.
Mit AVISE-FORTH geht das sehr einfach. Der Nutzer muss den Zählvorgang nur einschalten. Er läuft dann interrupt-gesteuert im Hintergrund ab, während der Prozessor andere Dinge tut.
COUNT legt den momentanen Zählerwert auf den Stack. Fallende Flanke löst den Zählvorgang aus.
ENCODE arbeitet ähnlich. Durch das Signal an PORT D,6 kann aber eingestellt werden, ob der Zähler herauf- oder herunterzählt.
Mit COUNT lässt sich leicht ein Frequenzzähler realisieren, wenn man z.B. mit WAIT (Timer0) den Prozessor zwischen zwei Auslesevorgängen des Zählers 1000 ms lang anhält.