Bei meinem Basteleien ergibt sich gelegentlich die Aufgabe, den zeitlichen Verlauf eines oder mehrerer Messwerte (meist Spannungen) anzuzeigen/aufzuzeichnen. Sind die Verläufe der Messwerte periodisch, und der zeitliche Messbereich liegt im Bereich von Milli- bis Mikrosekunden, lässt sich das recht einfach mit einem –bei jedem (einigermassen ausgestatteten) Elektronikbastler vorhandenen– Oszilloskop bewerkstelligen. Bei einmaligen Vorgängen wird jedoch schon ein Speicheroszilloskop benötigt... Aber wie sieht es denn aus, wenn es sich um sehr langsame Verläufe und damit um Aufzeichnungbereiche von Minuten (oder gar Stunden) handelt? In Ermangelung eines DSOs (Digitales Speicher Oszilloskop) oder eines entsprechenden "Datenloggers" habe ich somit die ersten Entladungskennlinien von Akkus (mein zu der Zeit aktuelles Experimentiergebiet) mit Hilfe von Multimeter, "Küchentimer", Bleistift und Papier aufgenommen, die aufgezeichneten Daten in den PC übertragen, und mir dann die entsprechenden Kurvenverläufe darstellen lassen -> Ein mühseliges, zeitraubendes, fehleranfälliges, und nicht besonders effektives/genaues Verfahren... Diese stumpfsinnige Tätigkeit lässt sich doch bestimmt auch einem PIC mit A/D-Wandler übertragen...
Die Datenübertragung
Die Stromversorgung
Da der Messadapter möglichst unabhängig von einer externen
Stromversorgung arbeiten soll, und der vorgesehene
PIC-12F675
recht sparsam im Stromverbrauch ist, bietet sich Batteriebetrieb an. Jedoch
eine serielle Schnittstelle nach RS-232
benötigt eine negative Spannung. Ein üblicher Interface-Chip vom Typ
MAX232
(der diese Spannung aus +5V erzeugt) verbraucht aber mindestens 4mA, das wäre
das Doppelte des Stromverbrauchs des PICs. Bestimmt existieren auch ähnliche
Chips, die den Pegel nur eines seriellen Kanals wandeln und weniger
Strom verbrauchen, nur die sind dann wieder schwer zu beschaffen... Also
entwickle ich mir lieber selbst einen Pegelwandler. Die ganze Schaltung soll
sowieso "recht klein" ausfallen, somit bietet sich eine 9V-Blockbatterie
(oder ein entsprechender Akku) an. Da der PIC (incl. A/D-Wandler) bei der
Verwendung des internen Oszillators ab 3V arbeitet, und für die Referenz
des A/D-Wandlers auf jeden Fall eine stabilisierte Betriebsspannung benötigt, liegt
es doch nahe, die "restliche" Spannung zu den 9V als negative
Spannung für die serielle Schnittstelle zu verwenden. Damit liegt zwar
der Minuspol der Batterie nicht mehr auf "Masse", aber bei
Batteriebetrieb ist das ja auch nicht notwendig... Die nebenstehende Schaltung
erzeugt ein "passendes Massepotential", indem sie den Pluspol der
Batterie genau so weit verschiebt, daß sich eine stabilisierte Spannung
von ca. 4.5V (abhängig von den Kennlinien des FET) für den PIC
ergibt. Der "Rest" der 9V dient zur Erzeugung der negativen Spannung
für die serielle Schnittstelle (und schwankt ggf. abhängig von der
Batteriespannung). Das Ganze funktioniert natürlich nur, wenn ein
Stromverbraucher (der PIC) an der positiven Betriebsspannung (gegen
"Masse") angeschlossen ist... Der PIC benötigt (je nach
"Aktivität") 1-2mA, diese Stabilisierung etwa 200µA, und
der "serielle Treiber" (beim Senden von Daten) nochmal etwa 1mA. Im
Mittel sollte der Stromverbrauch also bei weniger als 2mA liegen, womit ein
9V-Akku mit 150mAh mindestens 3 Tage lang "halten" sollte, eine
Batterie vermutlich sogar noch länger.
Achtung: Der für R9 (und/oder auch R3) zu verwendende Wert ist abhängig von der Kennlinie von T2 und muss ggf. angepasst werden: Die Spannung über R9 sollte knapp 2V betragen, die Spannung über R3 etwa 5.1V. |
Das Steuerungsprogramm
Der erste Ansatz zu diesem Messadapter ergab sich aus einer
Problemstellung, bei der es darum ging, einige Messwerte in Intervallen
von einer Sekunde aufzuzeichnen und davon Kurven in einem Diagramm zu
erstellen. Da zwischen den Messungen mehr als genügend
"Rechenzeit" vorhanden war, entschloß ich mich (im Gegensatz
zu dem Verfahren bei meinem Solarwandler),
die Daten gleich im PIC in dezimale ASCII-Ziffern umzurechnen. Das ersparte
mir ein zusätzliches Skript/Programm zur Datenumwandlung. So konnte
ich die mit einem Terminalprogramm aufgezeichneten/gepeicherten seriellen
Daten direkt an Gnuplot
"verfüttern", welches mir (mit Hilfe einiger weniger
Skriptzeilen) daraufhin die gewünschten, "fast präsentierbaren"
Diagramme erzeugte. Danach wanderte die Konstruktion (wie viele der von
mir enwickelten "temporären Problemlösungen") in den
Karton mit der Aufschrift "Zum Ausschlachten". Da sich bei einem
der folgenden Projekte eine ähnliche Aufgabe ergab, kramte ich die
Schaltung wieder hervor, passte das "hartcodierte" Progamm auf
die neue Anforderung an, erledigte damit die notwendigen Messungen, und
packte den Prototypen wieder zurück in den Karton. Nachdem ich den
Adapter das dritte Mal "wiederbelebt" hatte, fiel mir mir auf,
daß diese kleine Schaltung anscheinend doch ein sehr nützliches
Hilfsmittel ist, welches durchaus mehrfach verwendbar ist. Nur das
Umprogrammieren auf die jeweils neuen Anforderungen war dabei ziemlich
lästig. Also war es notwendig, die hartcodierten Parameter (das
Messintervall und die Anzahl der zu messenden Kanäle) irgendwie
"einstellbar" zu machen. Wie soll das denn gehen, wenn
sämtliche I/O-Pins des verwendeten PICs bereits mit A/D-Eingängen,
serieller Ausgabe und Reset belegt sind? Nach intensiven Lesens des
Datenblatts des PICs fiel mir auf, daß ein separates Reset-Signal
nicht unbedingt notwendig ist, falls die Betriebsspannung einigermassen
stabil ist. Ok, mit der (in diesem Fall wohl zulässigen)
"Zweckentfremdung" des Reset-Pins ergab sich ich die
Möglichkeit einer "Benutzereingabe" mittels eines Tasters.
Und für die Informationen, die vom Programm zum Anwender
gehen sollten, konnte ich ja die bereits vorhandene serielle Schnittstelle
verwenden.
|
Das "Konfigurationsmenü"
Das "OSCCAL"-Problem
Da der PIC mit seinem eingebauten 4MHz-Oszillator betrieben wird, sind alle
Intervalle (u.a. auch die Taktrate der seriellen Daten) von dieser
Oszillatorfrequenz abhängig. Diese Frequenz ist jedoch u.a. von der
Betriebsspannung und der Temperatur abhängig. Um Toleranzen bei der
Chipfertigung kompensieren zu können, hat der Hersteller der PICs eine
Möglichkeit vorgesehen, die Oszillatorfrequenz mit Hilfe des Inhalts
einer Speicherstelle (eines Registers names "OSCCAL")
"abzugleichen". Nach der Fertigung der Chips wird eine spezielle
Funktion in den Programmspeicher "gebrannt", die beim Aufruf aus
dem PIC-Programm den chipspezifischen Abgleichwert (für 5V
Betriebsspannung und 20° Umgebungstemperatur) als Ergebnis liefert. Ein
PIC-Programm, welches "zeitkritisch" arbeitet, sollte daher beim
Start diese Funktion aufrufen, und das Ergebnis in das OSCCAL-Register
schreiben. Danach ist davon auszugehen, daß der interne Oszillator
"abgeglichen" ist. Wird der PIC jedoch mit einer anderen Spannung
als 5V betrieben (und/oder bei einer anderen Temperatur als 20°), muss
dieser Wert nicht mehr unbedingt "richtig" sein... Ausserdem
überschreiben viele Programmer (Hard- und Software zum "Brennen"
eines Programms in den PIC) die spezielle Funktion zur Ermittlung des
Abgleichwertes... Mir fiel bei einer Messung mit vielen Messintervallen
auf, daß das Produkt aus der Anzahl und der Dauer der Messintervalle
doch etwas von der Gesamtzeit der Messung differierte. Also musste ich in
meinem Konfigurationsmenü noch eine Möglichkeit zur Kalibrierung
des internen Oszillators des PICs schaffen. Nur wo sollte ich denn das
dazu notwendige Kalibrierungssignal ausgeben? Nach einigem Überlegen
habe ich mich dazu entschlossen, dafür ebenfalls den Pin, der die
serielle Schnittstelle ansteuert, zu verwenden (der zweckentfremdete
Reset-Pin könnte durch die Taste kurzgeschlossen sein, und die
analogen Eingänge könnten ebenfalls "irgendwie verschaltet"
sein). Die Ausgabe eines 1kHz-Signals für fünf Sekunden erzeugt zwar
ggf. eine Menge "seltsamer Zeichen" in dem zum Abgleich verwendeten
Terminalprogramm, aber es kann dabei "nichts kaputtgehen".
Da der Abgleichwert aus sechs Bits besteht, und ein "Durchprobieren"
der sich daraus ergebenden 64 Möglichkeiten ein ziemlich langwieriges
Verfahren darstellen würde, habe ich mich entschlossen, diese
Einstellmöglichkeit auf zwei mal drei Bit (jeweils acht Möglichkeiten)
aufzuteilen (->OscH und OscL), wobei erst eine Grob- und dann die
Feineinstellung erfolgt.
|
Der Kalibrierungsvorgang
Bekannte Eigenarten ("Known Bugs") des Prototypen
Das "Material"
Schaltplan (V0.1) im Eagle-Format
Layout (V0.1) im Eagle-Format
Quellcode (V0.2) des Steuerungsprogramms (unter GPL2)
Hexcode (V0.2) des Steuerungsprogramms (unter GPL2)
Hinweise für Nachbauwillige
Um den Prototypen dieses Adapters nachzubauen, sind Möglichkeiten der Herstellung einseitiger Leiterplatten und Programmierung des verwendeten Microcontrollers notwendig. Es handelt sich hierbei nicht einen Bausatz, sondern eher um eine Anregung zu eigenen Konstruktionen. Alles, was ich dazu anbieten kann, befindet sich auf dieser Seite, d.h. Nachfragen nach Bausätzen, fertigen Leiterplatten oder programmierten PIC-Controllern sind zwecklos → Ich "produziere" ausschliesslich für Eigenbedarf.
Für der Funktionalität und Nachbausicherheit dieser Schaltung kann ich keinerlei Verantwortung übernehmen. Eine kommerzielle Verwendung des Schaltplans oder des Layouts ist nur mit meiner ausdrücklichen Genehmigung zulässig. Das PIC-Programm unterliegt der GNU Public License Version 2.
Startseite Hardware Rechtliches Kontakt Darstellung