:) Bin mir etwas unsicher, ob daraus lieber ein Artikel werden sollte.
Gebt mir gerne Anmerkungen zum Projekt. Bestimmt habt Ihr Ideen, was
verbessert werden könnte. Viel Spass beim lesen:
*Nachbau:* Leicht
*Ziel:* Messung einer Wassersäule (Brunnen) von 0-470cm mit einer
Genauigkeit von 5 cm.
*Ergebnis:* Erreichter MaxFehler nach 5-Punkt-Kalibrierung: 2,45 cm.
*Plattform:* Raspberry Pi Pico W MicroPython 2,9" e-Paper-Display
*Sensor:* MPX2050DP (0-50 kPa) 10V (aber betrieben mit 8,4V um Sättigung
des Instrumentenverstärker zu verhindern)
*Zentrale Bauteile:* INA333 (Gain 38), MCP3426 16-bit ADC,
*Funktion:*
Tief im Brunnen ist ein Messing-Endstück an einem 4mm PE Schlauch
versenkt. Über eine kleine 70kPa Luftpumpe wird vor der Messung für 3-4
Sek das Wasser aus dem PE Schlauch gedrückt. Sobald die Pumpe abschaltet
der "Überdruck" der Pumpe abfällt, stellt sich am Sensor der Druck der
Wassersäule ein, der über dem Messing-Endstück ansteht. Der Sensor mißt
so eine Wassersäule von bis zu 4,7 Metern mit einer Auflösung von 2-5cm,
die Daten werden stündlich automatisch erfasst, lokal auf einem
e-Paper-Display angezeigt und über WLAN an einen Raspberry Pi (Server)
übermittelt. Auf dem Pi läuft eine kleine Website, auf der die Daten
dargestellt, strukturiert und gespeichert werden. Der Code wurde
komplett mit Ki (Claude) ge-vibe-coded und von mir überprüft. :)
_*Details:*_
Die gesamte analoge Signalkette besteht aus vier Stufen:
1. MPX2050DP: Wheatstone-Brücken-Sensor liefert 0-40 mV Differenzsignal
bei Vcc = 10 V (ratiometrisch). Bei 8,4 V Vcc reduziert sich das auf
0-33,6 mV Fullscale.
2. R4/R5 (je 100 Ohm): Schutzwiderstände gegen ESD und kapazitive
Kopplung an den INA333-Eingängen.
3. INA333AIDGKR: Zero-Drift-Instrumentenverstärker mit Gain G = 38,04
(R6 = 2,7 kOhm). Hebt das kleine Differenzsignal auf 0-1,28 V an. Der
REF-Pin liegt auf VREF = 2,516 V, wodurch der Ausgang bei 0 kPa auf
2,516 V liegt und mit steigendem Druck ansteigt.
4. MCP3426A0: 16-bit Delta-Sigma-ADC, I2C. CH1+ wird vom INA333-Ausgang
gespeist, CH1- liegt auf VREF. Der ADC misst differenziell - die
Referenzspannung hebt sich heraus und das Nutzsignal wird mit vollem
16-bit-Bereich erfasst.
_*Wichtig:*_
Der INA333 enthält intern drei Op-Amps. Die Vorverstärker A1 und A2
berechnen intern:
Bei Single-Supply-Betrieb (0-5 V) darf VA1 die Versorgung nicht
überschreiten (Limit: ~4,92 V). Mit dem originalen 10-V-Sensor ergab
sich VCM = 5,0 V - bereits im Ruhezustand war der Eingang übersteuert.
Die Lösung: einen 270-Ohm-Vorwiderstand in die Sensor-Vcc-Leitung
einbauen, um die Versorgung auf ~8,4 V zu reduzieren oder einen 9V LDO
Spannungsregler hernehmen. In der Platine hatte ich bereits einen 10V
LDO verbaut und musst ich mich mit einem dazwischen gefrickelten
270-Ohm-Vorwiderstand begnügen. (nicht im aktualisierten Schaltplan) :)
_*Übersicht über Versorgungspannungen:*_
Besonderes Augenmerk wurde auf die Trennung von Analog- und Digital-GND
gelegt. Die untere Platinenebene ist vollständige GND-Fläche. Analog-
und Digitalbereich sind räumlich getrennt und treffen sich nur an einem
zentralen Sternpunkt (12V).
Die Schaltung gliedert sich in vier Teilbereiche:
1. Digital VBus: 12 V DC Eingang, 5 V Digital (LM2576T), 3,3 V Digital
(LT1963A)
2. Analog VBus: 10 V Analog (R1501J100B LDO), 5 V LDO (MCP1703A)
3. Analogsignalpfad: Sensor - R4/R5 - INA333 - R7 - MCP3426
4. Steuerung: Raspberry Pi Pico W, e-Paper SPI, Pumpe/Ventil-MOSFETs,
Taster
*Gain-Widerstand INA333:* R6 = 2,7 kOhm ergibt G = 1 + 100 kOhm / 2,7
kOhm = 38,04. Damit ergibt sich bei Sensor-Vcc = 8,38 V eine
Gesamtsensitivitaet von ~26,9 mV/kPa an den ADC-Eingängen.
*MOSFET-Auslegung:* Der IRLML2502 (SOT-23) schaltet Pumpe und Ventil mit
einem MOSFET gleichzeitig. Der zweite IRLML2502 schaltet ein zweites
Ventil zur Entlüftung der Druckleitung vor der eigentlichen Messung um
den Referenzdruck sicher messen zu können. Gemessener Gesamtstrom bei 12
V: 0,06 A im Normalbetrieb, 0,74 A bei gleichzeitigem Betrieb beider
Lasten. Die Verlustleistung im MOSFET beträgt dabei nur 25 mW - weniger
als 2,3% des zulässigen Maximums.
_*Firmware in MicroPython und Kalibrierung:*_
1. Inhalt der pico.zip komplett auf den Pico laden mit
1 | mpremote connect auto fs cp DATEI.py :
|
3. .env - Zugangsdaten / Environment Datei erstellen und auf den pico
laden:
1 | WIFI_SSID=MeinNetzwerk
|
2 | WIFI_PASS=MeinPasswort
|
3 | PI_HOST=192.168.X.XX
|
4 | PI_PORT=5000
|
4. Inhalt der pi.zip komplett auf den Pi laden und install.sh
ausführen.
*ADC-Konfiguration:*
Der MCP3426 wird folgender Maassen konfiguriert:
ADC_CFG = 0x88 # Kanal 1, One-Shot, 16-bit, PGA x1
Jede Messung wird 32-fach gemittelt (Integer-Summation, einmalige
Float-Konvertierung am Ende). Dies reduziert das Rauschen um Faktor
sqrt(32) = 5,7. ADC-Auflösung: 16-bit / 62,5 uV pro LSB.
*Lineare Kalibrierung:*
Die Kalibrierprozedur nimmt 5 Messpunkte bei bekannten Referenzdrucken
auf und berechnet per Least-Squares-Regression die Koeffizienten a und
b:
Druck [kPa] = a * ADC [mV] + b
Referenzdrücke müssen zur Kalibrierung mit einem hochpräzisen
mmHg-Manometer erzeugt werden (1 mmHg = 1,35951 cm H2O).
BOM folgt morgen oder übermorgen sowie Grafik und Foto vom gesamten
Aufbau die nächsten Tage.
Ich hab noch etwa 10 Platinen an Nachbau-Interessierte zu vergeben.