Multitester

Bisher hatte ich mich fast ausschließlich mit AVR-Controllern und 8051-Derivaten beschäftigt. Mittlerweile wir der Markt mit deutlich leistungsfähigeren und dabei sehr preiswerten MCUs überschwemmt (ESP8299, ESP32, Raspberry Pi Pico,…). Deren große Flash-Speicher bieten weiterhin den Vorteil, dass darin ein PYTHON-Interpreter Platz hat und somit eine Firmwareentwicklung komplett in MicroPython erfolgen kann. Dieser Herausforderung wollte ich mich mit einem sinnvollen, praktikablem Einstiegsprojekt in diese Controller-Klasse stellen.

Als Ergebnis möchte hier einen kleinen Multitester in Form eines Prüfstifts vorstellen. Es handelt sich dabei um ein kombiniertes Messgerät zur Gleichspannungsmessung und zur Erfassung und Darstellung von Pegeln und Impulsen diverser Logiksysteme. Es sollte klein und kompakt sein und quasi eine Ergänzung zu meinem Entwicklungsarbeitsplatz MCU-Butler dienen.

Ein Raspberry Pi Pico ist das Herzstück des Testgeräts. Aufgrund seines extrem flachen Aufbaus und seiner Abmaße von nur 51mm x 21mm lässt er sich ideal in einen schmalen Prüfstift integrieren. Die gesamte Schaltung findet auf einem PCB von 100mm x 22mm Platz. Das Gehäuse besteht aus  zwei Halbschalen, die als 3D-Druckteile gefertigt werden. Das Displayfenster ist ein Frästeil aus Plexiglas.

Technische Daten

Hier erst mal zusammenfassend die technischen Daten des Multitesters:

  • Spannungsversorgung 5VDC über Micro-USB Buchse des Raspberry Pi Pico
  • 3 Testmodi – Spannungsmessung, Pegelmessung TTL/LVT, Pegelmessung CMOS 5V
  • Spannungsmessung bis +25VDC mit 3 Nachkommastellen
  • Eingangswiderstand 7 MOhm
  • Signalisierung Bereichsüberlauf
  • Anzeige von HIGH-/LOW-Pegeln für TTL/LVT
  • Anzeige „undefinierter Bereich“ für TTL/LTL
  • Anzeige von HIGH-/LOW-Pegeln für CMOS-5V
  • Anzeige „undefinierter Bereich“ für CMOS-5V
  • Anzeige von Einzelimpulsen und Dauerimpulsen
  • akustische Signalisierung von LOW- und HIGH-Pegeln
  • zyklische Umschaltung der Messmodi über Sensortaste
  • Anzeige über OLED-Display 0,91″, 128*32
  • optionale Displaybestückung für Rechts- und Linkshänder
  • Firmwareentwicklung in MicroPython

Funktionsweise

Funktionsschaltplan
Schaltplan

Ich möchte an Hand der nebenstehenden Schaltpläne die Funktionsweise des Gerätes erläutern. Wie bereits angedeutet, erfolgt die Steuerung des Prüftifts durch einen Raspberry Pi Pico. Über dessen Micro-USB Buchse erfolgt auch die Betriebsspannungszuführung. Hier kann entweder ein USB-Anschluss eines PCs verwendet werden oder ein separates Netzteil. Die Grafikanzeige übernimmt ein OLED-Display mit einem SSD1306-Treiber. Der Datenaustausch erfolgt über I²C. Ebenfalls an diesem Bus hängt ein ADS1115. Dieser 4-fach-ADC hat gegenüber den eingebauten ADCs der MCU nicht nur den Vorteil, dass er mit 16bit eine bessere Auflösung hat, auch die Linearität ist deutlich besser. Von diesem ADC werden zwei Kanäle verwendet.

Zur akustischen Signalisierung der Logikpegel wird ein kleiner passiver Piezo-Signalgeber verwendet.

Über einen Sensorschalter erfolgt die Umschaltung der einzelnen Betriebsmodi.

Spannungsmessung

Am Kanal 1 des ADC erfolgt die Spannungsmessung. Die zu messende Eingangsspannung wird von der Messspitze zunächst einem hochohmigen Spannungsteiler (ca. 8:1) zugeführt. Dieser wird aus den Widerständen R1 und R3 gebildet. Für eine direkte Messung wäre der ADS1115 viel zu niederohmig. Deshalb wird das vorgeteilte Signal zunächst an den CMOS-Operationsverstärker U1 geführt. Dieser wird in Elektrometerschaltung betrieben und fungiert als Impedanzwandler. Er stellt dem ADC ein niederohmiges Ausgangssignal bereit. Der ADC ist so initialisiert, dass er eine maximale Eingangsspannung von 4,096V (Vollausschlag) verarbeiten kann. Bei dem gewähltem Teilerverhältnis könnten somit theoretisch ca. 32V angezeigt werden. Die Betriebsspannung des ADC beträgt jedoch nur 3,3V. Damit ist auch das umsetzbare Eingangsspannungssignal auf diesen Wert begrenzt. In der Praxis bedeutet das eine Maximum bei etwa 26V. Ich habe einen Grenzwert von 25V festgelegt. Alle Werte darüber werden als Bereichsüberschreitung interpretiert und entsprechend im Display angezeigt (——).
Der angezeigte Messwert wird aus 8 Einzelmessungen gebildet, die alle aufsummiert werden. Durch die 8:1 Teilung am Spannungsteiler entsteht somit wieder annähernd der Ausgangswert, der am Eingang der Messspitze anliegt. Außerdem werden durch diese Messwerterfassung zufällige Störsignale (Rauschen) während jeder Einzelmessung kompensiert. Die  korrekten Messwertaufbereitung erläutere ich später bei der Beschreibung der Firmware.
Um auch im Bereich um den Nullpunkt eine exakte Linearität zu gewährleisten, wird der Operationsverstärker mit einer negativen Betriebsspannung betrieben. Diese wird vom Controller und einer Ladungspumpe erzeugt. Dazu wird an GPIO6 eine PWM mit einer Frequenz von 20kHz und einem Tastverhältnis von 50% erzeugt. Eine Villard-Schaltung generiert  daraus die Spannung N3 von -2,7V. Das erfolgt durch geeignete Ladung bzw. Umladung von C8 und C10 durch die beiden Schaltdioden in D5. Wie das genau funktioniert kann man beispielsweise hier erfahren.

Spannungsmessung im gültigen Bereich
Bereichsüberschreitung (>25V)

Pegelmessung

Der Stift soll in der Lage sein statische und dynamische Pegel der Logiksysteme TTL/VTL und CMOS (5V) darzustellen. Die Messwerterfassung ist bei beiden Systemen völlig identisch. Lediglich die Beurteilung der Spannungspegel wird unterschieden. Es gilt folgende Zuordnung für die Logik-Ausgangspegel:

TTL/VTL ………. LOW <= 0,4V < UNDEF <  HIGH >= 2,4V
CMOS 5V ……… LOW <= 0,5V <  UNDEF <  HIGH >= 4,44V

Der Bereich zwischen LOW und HIGH ist undefiniert und wird auch entsprechend angezeigt. Sobald ein Logik-Modus aktiv ist, wird das deutlich niederohmigere Eingangsnetzwerk zur Pegel-Erfassung an die Prüfspitze geschaltet. Das übernimmt der MOSFET-Schalter K1. Die Spannungsmessung der Pegel erfolgt am Kanal 0 des ADC. Das Messsignal wird über R2 zugeführt. Liegt kein Signal an,  wird der Eingang über den Spannungsteiler R8/R9 auf einen Wert von VCC/2= 1,6V gehalten. Das entspricht bei allen Logiksystemen dem undefinierten Bereich. Liegt hingegen eine gültiger Pegel an, wird eine entsprechende Auswertung und Anzeige vorgenommen.

Zusätzlich zur optischen Anzeige auf dem Display, werden Logikpegel auch über den Piezo-Buzzer signalisiert (hoher/tiefer Ton).

undefinierter Bereich bei CMOS-5V, z.B. bei offenem Messeingang
LOW-Pegel bei TTL/LVT
HIGH-Pegel bei TTL/LVT

Auf diese Weise werden statische Signalpegel angezeigt. Bei Einzelimpulsen, Impulsfolgen oder Dauerimpulsen würde die Anzeige viel zu träge reagieren. Um auch solche transienten Signale darstellen zu können, wird das Eingangssignal zusätzlich über ein Hochpass-Filter geführt. An C3, R4 wird das Signal differenziert. Bei jedem Pegelwechsel wird dort ein steiler Impuls erzeugt, der an GPIO19 geführt wird und dort einen externen Interrupt auslöst. Die Interrupt Service Routine setzt im Display ein Impuls-Symbol und startet gleichzeitig einen Timer. Dieser läuft nach 300ms ab und generiert dabei seinerseits einen Timer-Interrupt. Dessen Interrupt Handler löscht das Impulssignal wieder. Das heißt, bei Auftreten eines Einzelimpulses ist für 0,3s ein Impulssignal zu sehen. Impulsfolgen oder Dauerimpulse triggern den Interrupt erneut und verlängern damit dessen Sichtbarkeit.
Bitte beachten, dass durch die Flankensteuerung das Symbol auch einmalig bei Pegelwechsel von LOW nach HIGH kurz erscheint.

Die Umschaltung der einzelnen Messmodi erfolgt auch hier durch Betätigung des Berührungs-Sensors.

rechts das Impuls-Symbol

Aufbau

Aufbau für Rechtshänder, Display links angelötet
Messpunkt für N3

Die gesamte Schaltung befindet sich auf einer Platine mit den Abmaßen 100mm x 22mm. Dabei nimmt der Rasperry Pi Pico schon die Hälfte der Fläche in Anspruch.
Bevor die MCU und das Display fest eingelötet werden (für Buchsen ist in der Höhe kein Platz) erfolgt die Bestückung der Bauelemente von klein nach groß.
Als Erstes sollten jedoch die SMD-Bauelemente für die Ladungspumpe bestückt und deren Funktion überprüft werden. Aus Gründen der Störsicherheit habe ich die unmittelbar an GPIO6, unter der MCU angeordnet, weit weg vom Analogteil. Wenn der Pico erst aufgelötet ist, kommt man da nicht mehr ran! Also sind erst mal D1, C5, C8 und R14 zu bestücken. Dann speist man an Pin 9 des noch unbestückten U3 ein 20hkHz-Rechtecksignal mit 3,3V Impulshöhe ein. Am Pin 2 des Operationsverstärkers muss dann eine negative Spannung von ca. -2,7V zu messen sein. Bei einem 5V-Rechtecksignal ist das entsprechend mehr. Es kommt hier noch nicht auf den genauen Wert an sondern nur auf die Funktion. Ist die gegeben, kann mit der Bauelementebestückung fortgesetzt werden.

Bevor U3 mit zwei Stiftleisten aufgelötet wird, sollten noch zwei flexible Anschlussleitungen für den Buzzer angelötet und unter der MCU herausgeführt werden.
Abschließend wird das Display, ebenfalls mit einer 4poligen Stiftleiste, eingelötet. Hierfür gibt es zwei optionale Bestückungsmöglichkeiten. Die Anzeige ist aufrecht zu sehen, wenn die Anschlussleiste links liegt (Rechtshänder). Wer den Stift mit der linken Hand führen will, sollte die Bestückung so vornehmen, dass die rechte Anschlussleiste verwendet wird. Leider habe ich in diversen Bibliotheken für das SSD1306-Display keine Funktion zur Bildschirmdrehung per Firmware gefunden.
Die Leiterplatte ist jetzt fertig aufgebaut. Wenn nicht schon geschehen, sollte spätestens jetzt der MicroPython-Interpreter auf die MCU geladen werden. Dazu gibt es hier eine sehr gut illustrierte Anleitung. Optional kann auch über THONNY die Laufzeitumgebung in den Flash gebrannt werden. Die Programmierung der eigentlichen Firmware kann auch im zusammengebauten Zustand erfolgen und wird später beschrieben.

Bevor die nach außen geführten Anschlüsse fertig gestellt werden, sind die 3D-Teile auszudrucken, das Plexiglasfenster in die Oberschale einzukleben und die Löcher für die Berührungssensoren durchzubohren.
Für die beiden Sensorflächen habe ich lange Stifte von vergoldeten Stiftleisten verwendet. Dort sind vor der Montage schon die Anschlussdrähte anzulöten. Wird das erst nach Einbau gemacht, könnte sich das Gehäuse durch die thermische Belastung verformen.
Ebenfalls aus einem langen vergoldeten Pin wird der Masseanschluss für den Messeingang gebogen und an der Platine angelötet. Der wird dann später durch eine Dupon-Buchse kontaktiert.
Für die eigentliche Messspitze habe ich einen POGO-Pin mit Federspitze verwendet. Damit kann man auch Pins in MSOP-Gehäusen und 0,5mm Pitch sicher kontaktieren. Damit die Spitze auch sicher gegen Verschiebung im Gehäuse fixiert ist, habe ich im Bereich der Gehäusebohrung ein paar Windungen mit massivem Draht aufgebracht und verlötet. Dort erfolgt auch der Anschluss über eine kurze Litze zur Leiterplatte. Für die Ausführung dieser Messspitze gibt es aber durchaus auch andere Lösungen (Nadel,…).

Nun muss noch der Buzzer in die dafür vorgesehenene Aufnahme eingepasst werden. Die bereits eingelöteten Drähte sind dazu einzukürzen und an den Anschlüssen anzulöten.
Das Gleiche gilt für die Drähte der Sensoranschlüsse.

Wenn man sauber gearbeitet hat, sollten beide Halbschalen jetzt akkurat zusammenpassen. Ich verwende kleine Schrauben, die ich aus anderen Geräten ausgebaut und gesammelt habe, um das Gehäuse zusammenzuschrauben.
Bevor man endgültig die „Bauchbinde“ um das Gehäuse klebt, sollte man aber sicher sein, dass der Stift auch richtig funktioniert. Deshalb werde ich im nächsten Abschnitt erklären, wie die Firmware anzupassen und zu flashen ist.

Firmware

Nachdem der PYTHON-Interpreter im Flash-Speicher der MCU abgelegt wurde, muss die eigentliche Firmware entwickelt und im Dateisystem der MCU abgespeichert werden. Dazu habe ich THONNY verwendet. Das ist ein spezielles Tool zur Entwicklung von (Micro)Python Programmen. Es lässt sich unter diversen Betriebssystemen installieren und bietet mit seinen Erweiterungen eine ordentliche IDE zur Python-Entwicklung. Insbesondere MCUs wie der Raspberry Pi Pico oder die Derivate von ESPRESSIF werden hier sehr gut unterstützt. Ich verweise in diesem Zusammenhang auf folgende Links:

Thonny.org
Die Python IDE Thonny
YouTube Thonny-Tutorial

Die Firmware ist Bestandteil der Entwicklungsunterlagen, die ich unten als Download zur Verfügung stell. Sie liegen im Ordner Firmware Vx.y. Das Hauptprogramm, das nach dem Einschalten der MCU geladen wird, ist main.py. Der Ordner lib enthält alle notwendige Bibliothekfiles, die vom Hauptprogramm aufgerufen werden. Diese Bestandteile müssen auf den Pico geladen werden. Wie das erfolgt, steht in der Beschreibung unter Doc. Diese kann auch, muss aber nicht, auf den Pico geladen werden. Platz ist dort ja reichlich vorhanden.

Kalibrierung Spannungsmesser

Nachdem die Firmware geladen wurde, wird der USB-Stecker kurz gezogen und wieder gesteckt. Jetzt sollte das Programm starten. Auf dem Display erscheint zunächst ein Start-Screen mit Versionsanzeige. Danach wird automatisch in die Spannungsmessung verzweigt. In den seltensten Fällen wird dort ein Wert von 0,000 angezeigt werden. Hier muss zunächst eine Nullpunktkalibrierung vorgenommen werden. Dazu ist main.py in den THONNY-Editor zu laden und in der Variablen Offset der Wert aus dem Display in Volt einzutragen. In meinem Fall war das 0.035. Nach Abspeichern der Änderung und einem Neustart des Programms, sollte dann der Nullabgleich erfolgt sein. Bitte beachten, dass alle Änderungen am Quelltext erst durch ein STOP->START im THONNY übernommen werden. Dabei wird main.py auch automatisch auf der MCU aktualisiert.

Als Nächstes wird der Verstärkungsfaktor angeglichen. Der Teilungsfaktor des Eingangsspannungsteilers ist nicht exakt 8:1. Bei R1=6,2MOhm und R3=820kOhm wird eine rechnerische Spannungsteilung von 8,561….. erreicht. Hinzu kommen noch Bauelementetoleranzen, die sich ebenfalls auf den Teilungsfaktor auswirken. Deshalb habe ich den Korrekturfaktor DivFaktor eingeführt, der alle diese Einflüsse berücksichtigt. Er korrigiert zusammen mit Offset das ADC-Ausgangsignal, aus dem letztendlich der angezeigte Wert im Display errechnet wird. Dazu ist folgendermaßen vorzugehen.

Die Messspitze ist an den Pluspol eines regelbaren Netzteils anzuschließen. Der GND-Anschluss wird über ein Kabel mit Dupon-Buchse mit dem Minuspol kontaktiert. Mit einem guten Multimeter wird die Ausgangsspannung überwacht. Jetzt wir die Spannung hoch gedreht, sodass am Multimeter etwa 24V angezeigt werden. Der Anzeigewert im Display des Multitesters wird davon nach oben oder unten abweichen. Dementsprechend muss DivFaktor im Quellcode angepasst werden. Das ist ein interativer Prozess, der etwas Geduld verlangt. Letztendlich müssen sich die beiden Anzeigewerte so gut wie möglich decken.

Gegebenenfalls muss jetzt der Nullpunkt noch mal nachkorrigiert werden. Ansonsten ist die Spannungskalibrierung damit abgeschlossen.

Kalibrierung Pegelmessung

Letztendlich müssen die Schwellwerte für die Pegel beider Logiksysteme genau eingestellt werden. Die Vorgehensweise ist für TTL/VTL und CMOS-5V absolut identisch. Lediglich die einzutragenden Werte unterscheiden sich. Ich möchte die Vorgehensweise am Beispiel des HIGH-Schwellwertes bei CMOS-5V erläutern. Der ist laut Definition >=4,44V. Bei gleichem Kalibrieraufbau, wie bei der Spannungskalibrierung, werden 4,44V am Netzteil eingestellt. Der Multitester wird mit der Sensortaste in den Modus CMOS-5V geschaltet. Im THONNY-Editor bewegt man sich zum entsprechenden Quelltextabschnitt. Dort gibt es eine if-elif-Anweisung, in der die Schwellwerte, so wie sie vom ADC erfasst werden, zugeordnet werden müssen. Unterhalb des Editorfensters, werden im Terminalbereich die Messwerte angezeigt. Der Wert vor dem Komma muss dann einfach oben eingetragen werden. In meinem konkreten Fall ist das 3047 für den HIGH-Schwellwert. Mit dem LOW-Eintrag ist in der gleichen Weise zu verfahren. Die Prozedur für TTL/VTL ist analog.

Nach Programmneustart sollte in den Pegel-Modi bei offener Messspitze jetzt „UNDEF“ angezeigt werden. Sobald die Spitze einen gültigen Pegel detektiert, wird dieser im Display angezeigt. Gleichzeitig ertönt bei LOW ein niedriger und bei HIGH ein hoher Ton. Kurze Impulse oder Impulsfolgen werden durch das entsprechende Symbol im Display angezeigt.
Damit ist auch die Kalibrierung abgeschlossen und der Multitester kann verwendet werden. Unten liegen die Bauunterlagen zum Download bereit. Viel Spaß beim Nachbau.