Ein Vielfachmessgerät, das Spannung, Strom und Widerstand misst, vielleicht noch Dioden und Transistoren prüft - manche checken noch L und C - gehört zur Grundausstattung jeder Werkstatt, jedes Repaircafés, es nutzt auch jeder Profi. DMMs sind millionenfach im Einsatz - kein Zweifel.
Was also mag die Motivation sein, dieses „Commodity“ selbst zu bauen, statt es für ein paar €uro einzukaufen - wo bitteschön soll der Nutzen sein? Diese Frage beantwortet ein kurzer Überblick auf die technischen Anforderungen, die an das TDMM gestellt wurden:
Technisches Datenblatt TDMM
- Spannungsmessung DC +/- 0 … 85 V, mit Prüfspitze bis 850 V
- Strommessung DC +/- 0 … 5A (Option 20A)
- Leistungsberechnung aus U und I
- Widerstandsmessung ca. 0 Ω - 0,5 MΩ; Durchgangsprüfer
- Alle Messung erfolgen gleichzeitig, auch die Anzeige der Messergebnisse
- Erweiterung auf AC-Spannungsmessung Veff und Vrms
- Ansage ausgewählter Messwerte durch Sprachausgabe in Deutsch (Option: Englisch); Ansage einzeln wählbar für jeden Messwerttyp (außer der Leistung)
- Genauigkeit 3 ½ Stellen; +/- 1 LSB
- Option: Grenzwertüberwachung und Grenzwertmeldung
- Datenausgabe via USB-UART, über Web (MQTT) und auf OLED-Display
- Erweiterbar als fernsteuerbares Labormessgerät z.B. für automatisierte Messungen
Motivation und Nutzen
Die Idee entstand bei der Arbeit im Repaircafé, die immer spannend, aber manchmal auch etwas stressig ist. Oft hat man keinen Helfer, der Messwerte ablesen kann und arbeitet mit zwei Prüfspitzen in den Händen am defekten Gerät, während man versucht, einen Messwert abzulesen. Wenn das Messgerät sprechen könnte, wäre es fein. Aktuell konnte ich kein Gerät finden, das Messwerte spricht.
Neben dem Motiv „Sprechendes DMM“ (= TDMM) war uns wichtig, ein kompaktes Gerät zu entwickeln, das alle Messungen gleichzeitig durchführt. Nützlich ist das z.B., wenn man Spannung und Strom an einem Prüfling messen möchte, ohne zwei Messgeräte zu benutzen. Wenn man dann noch erfährt, wie viel Leistung gerade „verbraten“ wird, kann das recht nützlich sein. Zugleich beobachtet man einen veränderlichen Widerstandswert, z.B. eines PTC oder eines Schalters.
Drittes Motiv war die Integration des TDMM in ein bestehendes Netz, um Messwerte zu dokumentieren, z.B. in einer SQL-Datenbank zu speichern. Diese Funktionen sind nützlich, wenn man einen Vorgang überwachen möchte oder auch, um einen Versuch komplett zu automatisieren.
Die Gliederung dieser Blog-Reihe
Das Projekt nahm drei Monate an intensiver Arbeit in Anspruch und wurde mehrfach umgebaut. So wird es auf mehrere Beiträge verteilt vorgestellt. Der Themenplan sieht so aus:
1. Beitrag (hier folgend):
- Der AD-Wandler ADS1115 mit seinen Möglichkeiten und seiner Anwendung im TDMM
- Messung von Spannungen +/- 85V mit einer Vorstufe, aber ohne eine Autorange-Funktion.
- Datenausgabe auf dem OLED-Display
- Formatierte Datenausgabe via USB
- Datenausgabe für die Weiterverarbeitung
2. Beitrag:
- Strommessung
- Leistungsberechnung
- Kalibrierung des TDMM für Spannung und Strom
- Widerstandsmessung und Durchgangsprüfer
3. Betrag:
- Das TDMM lernt sprechen; was zu beachten ist
- Technik des DFPlayer
- Erfahrungen mit dem DFPlayer und Hinweise für den Einsatz
4. Beitrag:
- Wechselspannungen messen, Veff, Vrms
- Spannungen > 85 V messen
- Stromversorgung mit LiON-Akku
5. Beitrag:
- Das TDMM im Netz
- Umgang mit MQTT
- Alternativen, um die Messdaten ins Netz zu bringen; Beispiele dazu
6. Beitrag:
- Messbeispiele mit dem TDMM
- Programmierung von „virtuellen Messgeräten“
Der etwas umfangreichere Vorspann war nicht zu vermeiden. Steigen wir jetzt in den ersten Teil des Projektes ein!
Hardware
Für den 1. Teil des Projekts sind folgende Bauteile erforderlich:
ADS1115 ADC Modul 16bit 4 Kanäle
1,3 Zoll OLED I2C 128 x 64 Pixel Display
Widerstände Resistor Kit 525 Stück
Operationsverstärker MCP601 DIL (div. Quellen)
Messungen mit dem 16 Bit Analog-/Digitalwandler ADS1115
Wir schauen uns den ADS 1115 genauer an, denn wir haben mit ihm noch eine ganze Menge vor.
Der ADS1115 bietet u.a.:
- 4 Eingänge A0 … A3 für Analogsignale, die im Bereich von 0 … VDD gemessen werden.
- negative Spannungen können bei den „single-ended“ Eingängen A0 - A3 nicht verarbeitet werden. An diesen Eingängen verträgt er höchstens -0,3 V (siehe Datenblatt).
- Es können jedoch zwei Eingänge zu einem sog. Differenzeingang kombiniert werden. Mit einer speziellen Eingangsschaltung, die wir für das TDMM berechnet und getestet haben, können wir bei einer Betriebsspannung von 3,3V (der ADS1115 kann auch 5V) positive und negative Spannungen problemlos messen.
- Der ADS1115 hat einen eingebauten PGA („programmable gain amplifier“), der das Eingangssignal verstärkt und dabei um maximal 0,01% verfälscht. Das ist ein exzellenter Wert. Wir benutzen hier den PGA nur mit „gain 0“, denn wir brauchen aufgrund der Eingangsstufe keine Autorange-Funktion, die Messbereiche umschaltet! Das ist Vorteil gegenüber klassischer Technologie, denn wir ersparen uns eine klassische Schwachstelle und viel Arbeit. Dennoch bekommen wir zuverlässig eine Genauigkeit von 3 ½ Stellen +/- 1 LSB.
- Bei der Widerstandsmessung verwenden wir alle Möglichkeiten des Messverstärkers und bekommen dadurch einmal in einem weiteren Bereich sehr genaue Messergebnisse ohne dass wir viel Aufwand betreiben müssen. Ohne Zweifel ein ganz großer Vorteil des PGA gegenüber simpleren ADCs.
- Auf dem Chip ist eine präzise Referenzspannungsquelle integriert. Auch das ist wichtig für die Genauigkeit.
Das lesenswerte Datenblatt des Wandlers umfasst 53 Seiten: ADS1115 details siehe auch die AZ-Doku zum Breakout Board mit vielen nützlichen Informationen: AZ-Info zum ADS1115
Die Eingangsstufe zur +/- Spannungsmessung
Diese Baugruppe erhält ihr Eingangssignal über eine Buchse für den Tastkopf (hier dargestellt) oder über zwei klassische 4mm-Buchsen für Bananenstecker. Der Prototyp hat beide Anschlüsse. Hinter jeder m Eingang liegt ein Widerstand von je 1MΩ. Hierfür verwende ich die Widerstände aus dem AZ-Widerstandssortiment, denn es sind Metallschichtwiderstände der Genauigkeitskeitsklasse 1%. Das ist schon sehr ordentlich. Kleine Differenzen kompensieren wir später im Kapitel „Kalibrierung“.
![](https://cdn.shopify.com/s/files/1/1509/1638/files/TDMM_Teil_1_Schaltung_1024x1024.png?v=1738588679)
Schauen wir uns die Schaltung etwas genauer an. Die 1 MΩ-Eingangswiderstände R1, R2 sind mit je 47 kΩ R3, R4 verbunden. Beide 47 kΩ-Widerstände liegen mit einem Anschluss am Ausgang eines Operationsverstärkers MCP601 (alternativ ½ MCP602). Wir klären gleich, warum das so ist.
Wir sehen, dass die Anschlüsse A0 und A1 des ADS1115 ihr Eingangssignal über die beiden Spannungsteiler 1MΩ / 47kΩ beziehen. Die Eingangsspannung wird somit im Verhältnis 21,27:1 geteilt. Das ist natürlich nur der Fall, wenn der Anschluss 6 des Operationsverstärkers einen Masseanschluss darstellt. Und das sieht man vielleicht nicht sofort.
Der MCP601 ist als Buffer mit einer Verstärkung von 1 geschaltet. Damit darf man am Anschluss 6 einen Ausgang mit Impedanz nahe 0 erwarten. Welches Signal treibt denn diesen Buffer? Das sieht man, wenn man den nicht-invertierenden Eingang 3 anschaut. Ihm liefert ein Spannungsteiler mit R5 , R6 offenbar genau die halbe Betriebsspannung 3,3V/2 = 1.65 V. jetzt wird klar, wozu diese Schaltung dient. Das Widerstandsnetzwerk liegt gegenüber der Betriebsspannung genau „in der Mitte“ des Messbereiches. Der Nullpunkt der Schaltung „schwebt“ auf Höhe der halben Betriebsspannung und liefert so eine virtuelle Masse. Hier liegt auch eine potentielle Schwachstelle: Die Versorgungsspannung muss „sauber“ und stabil sein. Tantal-Stützelko an der Stromversorgung können notwendig werden.
Diese Schaltung erfüllt mehrere Anforderungen:
- Der Eingang des ADS1115 ist vor Überspannungen recht gut geschützt. Würden A0 / A1 direkt benutzt - ohne Vorstufe - um z.B. Spannungen bis 3 V zu messen, kann jeder „Unfall“ für den Wandler unangenehme Folgen haben. Die Vorstufe bietet einen guten Schutz für diese Fälle.
- Messungen mit beliebiger Polarität sind möglich. Hier noch einmal zur Erinnerung: Im „single ended“ Betrieb sind negative Spannungen nur bis -0,3 V zulässig.
- Wir erhalten einen Eingang mit hoher Impedanz. Konkret sind dies 2x (1MΩ + 47 kΩ), also ziemlich genau 2,1 MΩ. Parallel dazu liegt die Impedanz des Wandlers, die in der Einstellung „GAIN(0)“ 22MΩ beträgt. Das verfälscht die Messung minimal, aber wir kalibrieren das Gerät. Sie können an den Eingängen mit einem Digitalmultimeter den Eingangswiderstand messen und erhalten als Ergebnis erwartungsgemäß genau diese 2,1 MΩ.
- Mit hoher Eingangsimpedanz ist ein Messgerät viel empfindlicher gegen die allgegenwärtigen Brumm- und Störsignale, als bei niedriger Impedanz. Das gilt aber nur für „single-ended“ Messungen, also mit einem Pol auf Masse und der Messleitung z.B. an A0. Durch die Differenzmessung eliminieren wir dieses Problem nahezu komplett. Der ADS1115 hat eine CMR (common mode rejection) von 100 dB, also einen Faktor 1:100000. Das bedeutet, dass er Störsignale, die beide Messleitungen erreichen, fast vollständig unterdrückt. Das ist die Idee des Differenzverstärkers. Mit dieser Eingangsstufe ist das Grundproblem gelöst, gute Messergebnisse sind nahezu garantiert.
Ohne abschweifen zu wollen: Probieren Sie doch mal aus, wie weit sie die Empfindlichkeit und die Messgenauigkeit des ADS1115 treiben können, wenn Sie den PGA mit einer anderen GAIN-Einstellung benutzen. Achtung: Jede Einstellung verändert Messbereich und Impedanz. Aber die Spielerei lohnt sich. Gute Erläuterungen und Beispiele finden Sie in der Library zum ADS1115.
Ansicht des Breadboards zum Teil 1 unseres Projektes
![](https://cdn.shopify.com/s/files/1/1509/1638/files/TDMM_Teil_1_fritzing_1024x1024.png?v=1738588680)
Sie erkennen den Spannungsteiler mit seinen Widerständen und dem Operationsverstärker. Es lohnt sich, erst einmal diesen Teil aufzubauen, zumal die I2C-Verdrahtung ziemlich einfach ist.
Nach dem Einschalten messen Sie zunächst die Spannung an Pin 6 des MCP601. Es sollte die halbe Betriebsspannung sein: 1,65 V. Es ist wichtig, dass Sie die 3,3 V Betriebsspannung genau messen und aufnotieren. Wir brauchen sie später immer wieder, z.B. für die Widerstandsmessung.
Der Sketch
Unser erster Sketch ist denkbar einfach. Er soll uns mit dem Konzept der Eingangsstufe vertraut machen und das Ergebnis einer Spannungsmessung auf dem OLED-Display darstellen.
// TDMM - the talking digital multimeter - // Michael Klein 2024 - made for AZ Delivery Blog // // Thanks to: Rob.Tillaart for https://github.com/RobTillaart/ADS1X15 #include <ADS1X15.h> #include <U8g2lib.h> //setup OLED-display U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE); u8g2_uint_t offset; u8g2_uint_t width; const char *text = "-- TDMM --"; int16_t val_00 =0; int16_t val_01 =0; ADS1115 ADS(0x48); void setup() { Serial.begin(19200); Serial.println(__FILE__); Serial.print("ADS1X15_LIB_VERSION: "); Serial.println(ADS1X15_LIB_VERSION); ADS.begin(); if (!ADS.begin()) { Serial.println("address ADS1115 or 0x48 not found"); } if (!ADS.isConnected()) { Serial.println("address 0x48 not found"); } Serial.println("AD1115 is properly connected."); ADS.setGain(0); u8g2.begin(); u8g2.setFont(u8g2_font_ncenB14_tr); u8g2.setCursor(20, 20); u8g2.print(text); u8g2.sendBuffer(); delay(3500); // show start screen } void loop() { val_01=0; for (int x=0; x<10; x++){ val_00 = ADS.readADC_Differential_0_1(); val_01=val_01+val_00; delay(2); // delay 2ms } val_01=val_01/10; // mean value float volts_01 = ADS.toVoltage(val_01)*22.74; // multiplier String voltsString = String(volts_01); Serial.print("U: "); Serial.print(voltsString); Serial.println(" Volt"); u8g2.clearBuffer(); u8g2.setFont(u8g2_font_ncenB12_tf); // Messwert auf Display darstellen u8g2.setCursor(0, 20); u8g2.print("U = ");u8g2.print(voltsString);u8g2.print(" Volt"); u8g2.sendBuffer(); delay(2000); }
Der Sketch kann auch aus dem Repository geladen werden:
https://github.com/michael5411/TDMM_talking_digital_multimeter
Zu Beginn binden wir die Library für den ADS1115 und das OLED-Display ein. Danach werden die Voreinstellungen für das OLED-Display eingerichtet. Die zugehörige Bibliothek deckt viele ähnliche Displays ab. Wer sich eingehender mit der Library beschäftigt, wird eine Menge an Einstellmöglichkeiten und Fähigkeiten dieses vielseitigen Displays kennenlernen. Dazu viele Fontsets aller Art.
Nachdem wir einige Variablen festgelegt haben, bilden wir eine Instanz „ADS“ mit dem ADS1115 auf seiner Standard I2C-Adresse und gehen zum setup( ) über.
ADS.begin( ) startet den ADC, der in den nächsten Zeilen getestet wird. Ist die I2C-Verbindung erfolgreich, meldet er das über die serielle Verbindung, auch wenn es nicht gelungen ist.
Die nachfolgende Einstellung ADS.setGain(0) kann auch entfallen. Ich habe sie eingefügt, um Experimente mit dem PGA zu erleichtern. Nach dem Gain-set wird noch ein READ benötigt, bevor die Einstellung wirksam werden kann. Dabei verändert sich die Auflösung im gesamten Messbereich und der Messbereich wird genauer, aber kleiner. Gute Erklärungen bietet auch hierfür die ADS1X15-Library Doku.
Die nachfolgenden Zeilen gelten dem OLED-Display und zeigen eine Möglichkeit von ganz vielen, um den Start-Bildschirm zu gestalten.
Bei jedem Schleifendurchlauf erfolgt eine Messreihe, deren Mittelwert aus 10 Messungen gebildet wird. Der Messvorgang startet in der loop( ) damit, dass die Variable val_01 auf 0 gesetzt wird.
Dann beginnt in der nachfolgenden for-Schleife die Spannungsmessung durch die Abfrage des Messergebnisses mit val_00 = ADS.readADC_Differential_0_1(); Mehr ist nicht zu tun, um den Rohwert zu bekommen. val_00 ist ein Integer-Wert. Die Schleife läuft 10 Mal, während der Messwert in val_01 aufsummiert und am Ende durch 10 geteilt wird.
Das 2ms-Delay unterstützt den „single shot“-Modus und vermeidet „glitches“, die ansonsten auf dem Scope zu sehen sind. Mit dieser Messmethode bekommen wir genaue, stabile Messwerte.
val_01 ist unser Integer-Wert, wie er vom ADS1115 geliefert wird. Die komfortable Funktion ADS.toVoltage(val_01) errechnet aus dem Integer-Wert von val_01 im float-Format den Spannungswert und überträgt nach Multiplikation mit 22.74 in die endgültige Ergebnisvariable volts_01.
Die 22,74 ergibt sich aus dem Spannungsteiler 1 MΩ/ 47 kΩ (1000000 : 47000 = 21,276). Der theoretische Wert weicht von 22.74 ab, weil 22.74 schon unser kalibrierter Wert ist. Mit diesem Wert sind sämtliche Fehler des Eingangsspannungsteilers, einer vielleicht nicht ganz perfekten Einstellung der 3,3 Volt etc., kompensiert.
Dieser Wert wird bei jedem praktisch realisierten TDMM ein wenig anders sein. Wer jetzt schon möchte, kann sich seinen persönlichen „perfekten Faktor“ selbst ausrechnen. Ansonsten widmen wir uns in Teil 2 der Kalibrierung.
Ausgabe auf dem OLED-Display
Die nachfolgende Ausgabe auf dem OLED-Display beginnt mit einer clearBuffer( ) Anweisung. Die Logik des OLED verlangt, dass der jeweilige Inhalt des Display-Buffer dargestellt wird. Der Buffer wird erst gelöscht, dann neu beschrieben.
Um die Messdaten darzustellen, verwenden wir einen etwas kleineren Schritttyp mit 12 pt. Wir setzen den Cursor auf die Position (0,20) und können dann mit einem Befehl u8g2.print(…) unseren Messwert übergeben. Die Anweisung u8g2.sendBuffer() beendet diesen Zyklus.
Wir nutzen damit einen Bruchteil der Möglichkeiten, die das Display bietet. Es macht Spaß, sich mal die Library und einige der endlos vielen Beispiele an zu schauen.
Ausblick und weitere Beiträge
Wir haben einen einfachen Einstieg genommen, um mit wenig Aufwand ein kleines Messgerät zu bauen. Noch offenbart es bislang nur einen kleinen Teil seines Charmes.
Im nächsten Blogbeitrag messen wir den Strom durch einen Verbraucher, wobei Spannungs- und Strommessung vollkommen unabhängig voneinander sind. Die Messungen sind untereinander vollkommen „erdfrei“. Mit einem klassischen DVM ist eine solche Messung gar nicht möglich. Wir können im gleichen Stromkreis, oder in zwei völlig verschiedenen Stromkreisen, problemlos messen.
Wir werden zugleich die Leistung P = U * I berechnen und anzeigen.
Damit unsere Messergebnisse möglichst perfekt sind, werden wir sie später mit einem sehr hochwertigen Labormessgerät vergleichen und dabei überprüfen, ob unser TDMM sauber arbeitet. Ob z.B. bei gleichen Spannungsunterschieden die angezeigten Intervalle auch immer gleich bleiben. Messgenauigkeit ist die andere Größe, die uns neben der Linearität interessiert.
Als nächste Messgröße interessiert uns der Widerstand und die Auswahl einer geeigneten Methode, um ihn zu messen. Es klingt erst einmal einfach. Ist es aber nicht. Wir erfahren auch warum.
Auch in diesem Beitrag wird sicherlich wieder viel Neues enthalten sein und so manche Überraschung.
Bis dahin
Ihr Michael Klein
4 commentaires
Jörg
Dann schau mal bei reichelt.de
Grüße Jörg
Norbert Schrills
Hallo Rene,
siehe https://www.ebay.de/itm/234542360484
4 X MPC 601 für 7,20 €
Michael Klein
Hallo Rene,
wenn Sie zeitnah bei eBAY mit dem Suchbegriff „MCP601“ suchen, finden Sie gerade ein Angebot für 4 Stück zum Preis von 7,20 € / Gratislieferung als DIL-Bausteine.
Tatsächlich tut fast jeder simple OpAmp den gewünschten Dienst: Halbe Spannung / niedrigste Impedanz. Den TL074 hatte ich schon dafür erprobt, auch den OPA2227 / 2228.
Also eine sehr gute Frage – danke, ich hätte gleich dran denken sollen :-)
Herzliche Grüße
Michael Klein
Rene
Das gefällt mir. Gibt es eine Alternative zum OPV MPC601? Den gibt es aktuell nur zu sehr hohen Transportkosten bei Mouser oder Arrow.