Sensor
Der Sensor benutzt einen relativ kleinen Controller vom Typ ATtiny2313.
Um seine Kapazität nicht unnötig zu fordern ist die Firmware in
Assembler gehalten (schließlich wollen wir auch das nicht ganz vergessen, oder?).
Alle Berechnungen werden in der Anzeigeeinheit
durchgeführt, die in C
programmiert ist. Auch die Versorgungsspannung des
Sensors wird von dieser ferngeschaltet. Energieverbrauch
ist daher nur am Rande ein Thema da er nur solange
eingeschaltet ist wie er auch wirklich arbeiten
muss (in der aktuellen
Version maximal 10 s pro Minute).
Das bedeutet aber auch, dass er sich keine Werte im RAM merken kann. Alles was er dauerhaft wissen muss ist folglich im EEPROM abgelegt. Bis zum aktuellen Softwarestand muss er sich glücklicherweise *nichts* merken.
Ultraschallsender
Die Sender-
Ultraschallempfänger
Die Empfängerschaltung wurde in LTspice simuliert und unter Berücksichtigung der Qualitäten des verwendeten Operationsverstärkers auf maximale Verstärkung bei 40 kHz optimiert. Jede einzelne Periode des empfangenen Ultraschallsignals löst im Controller einen Interrupt aus. Dieser kann damit die Laufzeit des Impulses messen und die Entfernung zur reflektierenden Oberfläche berechnen.
Schallgeschwindigkeit
Die Schallgeschwindigkeit ist abhängig von der Temperatur nach
folgender Formel:
wobei v0 die Geschwindigkeit bei 0 °C (331,5 m/s)
und t0=273 K ist.
10 °C würden einen Fehler von etwa 2,4% bewirken was etwa 140 l in
einer 6000 l-Zisterne bedeutet.
Eine Temperaturmessung in der Zisterne ist damit obligatorisch.
Allerdings sollte man sich auch nicht zu viel davon versprechen denn
die Temperatur in der Luftsäule ist besonders im Sommer sehr inhomogen.
Scheint die Sonne auf den Zisternendeckel erreicht die Lufttemperatur
im oberen Bereich locker über 30 °C während sie knapp über der
Wasseroberfläche nur 15 °C beträgt.
Es hat sich gezeigt, dass dadurch im Tagesverlauf scheinbare Wasserzuläufe (auch ohne Regen) im Bereich von 30-50 l erfolgen weil sich der Schall in warmer Luft schneller ausbreitet und dadurch die Oberfläche für den Sensor ferner scheint als sie tatsächlich ist.
Interessanterweise dehnt sich durch die Erwärmung auch das Edelstahl-
Totzeit
Wenn Ultraschallimpulse gesendet werden, empfängt der Sensor
nicht nur das Echo von der Wasseroberfläche sondern zunächst einmal
Vibrationen, die über das Gehäuse und die unmittelbare Umgebung übertragen
werden. Deshalb ist es nötig, eine Totzeit einzuführen. Vor Ablauf dieser
werden empfangene Signale verworfen. Sie kann in Vielfachen von 256×Timer1-
Mikrocontroller
Verwendet wurde der ATtiny2313 bei einer Taktfrequenz von 3,6864 MHz.
Diese krumme
Frequenz erlaubt das fehlerlose Erzeugen gängiger
Baudraten.
Unnötig hoch sollte man die Taktfrequenz nicht wählen, da EMV-
Die 40 kHz-
Der Empfänger liefert für jede Periode des Pakets eine Flanke, die
einen Input-
Wenn Timer 1 überläuft wird die Messung verworfen. Dies wäre bei direktem Systemtakt nach 17,8 ms oder 6 m. Da dies je nach Form und Fassungsvermögen der Zisterne etwas knapp sein kann (in der 6000 L-Zisterne des Autors hängt der Sensor etwa 2,90 m (also 5,80 m hin und zurück) über dem Boden) messen wir in diesem Fall noch einmal mit clk/8. Wird kein Signal empfangen läuft der Timer also nach weiteren 142 ms ab. Spätestens dann bekommt die Anzeigeeinheit auch die Information über die Laufzeit des Signals.
Temperaturmessung
Da die Schallgeschwindigkeit temperaturabhängig ist muss auch die
Temperatur gemessen werden. Das kostet nicht viel, bringt aber, wie wir gesehen
haben, einen deutlichen Genauigkeitsgewinn.
Der Controller besitzt unglücklicherweise keinen AD-
Ausgehend von einem entladenen Kondensator lautet die Formel für den
Spannungsverlauf an einem RC-
Folgende Umformung tut uns dabei gute Dienste da sie sich trivial nach t bzw. τ auflösen lässt:
Zwei Randbedingungen müssen für die korrekte Funktion der Messung erfüllt sein:
- Die Restwelligkeit des gefilterten PWM-
Signals muss kleiner sein als ½ LSB - Die Einschwingzeit der gefilterten Spannung bis auf ½ LSB muss abgewartet werden
Restwelligkeit:
Die höchste Restwelligkeit ist in der Mitte des Messbereichs, bei
50 % Duty Cycle.
Die Ladespannung ist im eingeschwungenen Zustand ½ VCC.
Damit die Restwelligkeit des Signals unter ½ LSB (U/U0=½/128)
bleibt muss die Zeitkonstante des Filters über 8,87 ms liegen (t ist hier
eine halbe Periodendauer, also 34,7 µs).
Wir wählen Werte von 12 kΩ
und 1 µF und damit eine Zeitkonstante von 12 ms.
Einschwingzeit:
Die höchste Einschwingzeit ist zwischen den Extrema, d.h. von 0 auf 255.
Da der höchste Schritt, den wir abwarten müssen, jedoch nur von 0 auf 128 ist
rechnen wir nun mit u=127,5 und u0=128.
Damit die Spannung auf weniger als ½ LSB an den PWM-
Wir könnten die Einschwingzeit für die folgenden Schritte reduzieren da der Spannungshub jeweils nur die Hälfte des vorhergehenden ist aber das ist hier nicht nötig und auch nicht erwünscht.
Das war ziemlich viel Arbeit und ist mindestens 1000 mal langsamer
als ein integrierter Hardware-
Eine Anmerkung zu den Bauteiltoleranzen: der absolute Wert des
RC-
Es ist also nicht nötig, besonders hochwertige Widerstände oder Kondensatoren einzusetzen, das billigste was Sie kriegen können ist gut genug (na ja, jedenfalls fast)...
Der Widerstand R15 über dem Heißleiter sollte jedoch ein 1%-Typ sein,
da sein Fehler direkt in die Genauigkeit der Messung eingeht. 1%-
Unter meinen Elektronik-Rechnern können Sie inzwischen einen Rechner finden, der das RC-Glied einfach bestimmen kann.
Um Verfälschungen des Ergebnisses durch die Treiberleistung des
Portpins zu verringern legen wir das positive Ende des
Widerstand/Heißleiter-1
ist
und verwenden für den Widerstand des RC-
Ich muss gestehen, dieser Teil der Schaltung hat mir am meisten Spaß gemacht. Einfach zu berechnen, einfach zu bauen und funktioniert auf Anhieb!
Wenn Sie mal damit spielen möchten, hier
eine kleine Simulation für LTspice. Die Spannung der PWM habe ich hier auf 255 V gesetzt.
So kann man direkt das Ergebnis des DA-
Gehäuse
Das Gehäuse für den Sensor sollte auf jeden Fall feuchtigkeitsgeschützt
sein. Ich habe ein Bopla
ET-210 verwendet.
Temperaturänderungen und damit die Gefahr der Betauung erfolgen
zwar in einer Zisterne nur sehr langsam, können aber durch die geringe
Eigenerwärmung des Sensors nicht völlig ausgeschlossen werden.
Insbesondere in der kalten Jahreszeit kühlt der Sensor von oben aus
während von unten relativ feucht-
Die Typen UST40R und UST40S haben jedoch mehrere Jahre unbeschadet überstanden.
Auch geringe Mengen Feuchtigkeit können zusammen mit Verunreinigungen auf der Leiterplatte (Flussmittel, Hautfett etc.) korrosive und/oder leitfähige Beläge bilden, die früher oder später zum Ausfall führen.
Nach etwa drei Jahren Betrieb riss bei meinem Sensor das Halteseil, der Sensor fiel in die Zisterne und saugte sich mit Wasser voll. Deshalb entschied ich mich, den nächsten komplett mit Epoxydharz zu vergießen. Eine Schaltung an die man nicht mehr herankommt ist besser als eine kaputte Schaltung!
Dafür habe ich Robnor PX804D/BK verwendet. Es sieht aus wie Altöl und ist etwas zähflüssiger als dieses. Man benötigt etwa 200 g. Nach der halben Menge etwas Schwenken damit auch die Hohlräume ausgefüllt werden. Zum Schluss mit dem Gerät ein paar mal auf den Tisch klopfen damit die Luftblasen aufsteigen. Ideal wäre natürlich der Verguss im Vakuum aber für unsere Zwecke geht es auch so.
Falls Sie über Vakuum-Verguss
nachdenken würde ich Ihnen
Kühlschrank-Kompressoren ans Herz legen.
Sie sind billig (kostenlos aus alten Kühlschränken) und erzeugen ein
durchaus brauchbares Vakuum (etwa bis 0.1 Bar). Vakuum-Techniker lachen an
dieser Stelle für gewöhnlich, aber die Luftblasen in unserem Sensor wären
dann immerhin nur noch 1/10 so groß! Vergießen, Vakuum an, etwas warten
bis die Blasen hochgestiegen sind und Vakuum aus bevor das Harz beginnt
fest zu werden.
Außerdem eignen sie sich auch hervorragend um mühelos Fahrrad- oder Autoreifen aufzupumpen...
Sensor-Ansteuerung
Der Sensor wird in einem festen Zeitraster einmal pro Minute
angesteuert.
Dieses Zeitraster stammt aus einer frühen Entwicklungsphase des Projekts
und ist in seinem jetzigen Stand kaum von Vorteil. Da es aber auch nicht von
Nachteil ist wurde es einfach beibehalten...
Sekunde | Aktion |
0 | Reserviert für Boot-Vorgang Wer Bootzeiten von PCs gewöhnt ist mag eine Sekunde für kurz halten aber Booten beschränkt sich bei der Anzeige auf das Initialisieren der bescheidenen Hardware und das Anspringen der Hauptschleife. |
1 | Die Stromversorgung wird eingeschaltet. Der Sensor führt
daraufhin selbsttätig asynchron Temperatur- und Laufzeitmessungen
durch und sendet die Ergebnisse an die Anzeige. Jede empfangene Laufzeitmessung wird als Füllstand "live" angezeigt. Die Anzeige mittelt 10 Laufzeitmessungen (was grob auch etwa 10 Sekunden dauert) und errechnet daraus die Füllmenge der Zisterne. Mit dem Erhalt der 10. Messung schaltet sie die Versorgung wieder ab. Die Anzeige zeigt nun bis zur nächsten Minute den gemittelten Wert. Die Abschaltung erfolgt asynchron, sie hängt ab von der tatsächlich benötigten
Zeit für 10 Messungen, die ja von der Laufzeit des Signals bzw. schlimmstenfalls
vom Timeout derselben abhängt. Die benötigte Zeit liegt bei |
15 | Die Mittelwerte werden berechnet und auf die Anzeige geschrieben. |
59 | Letzte Fehlerchecks werden durchgeführt. Wenn die Anzahl der
empfangenen Laufzeitmessungen nicht genau 10 ist wird der entsprechende
Fehler angezeigt. Die Stromversorgung wird abgeschaltet um einen sicheren Reset auszulösen. |
Dieses Verfahren mag langweilig oder bürokratisch erscheinen, es
verhindert jedoch auf einfache Weise das Zustandekommen von
Race-
Sensorprotokoll
Der Sensor ist vergleichsweise einfach aufgebaut und führt, abgesehen
von der Temperatur-
Ist das 9. Bit 0
handelt es sich um ein Datenbyte, bei 1
um ein
Kennbyte wie folgt:
Kennbyte | Antwort | Datenbytes folgen |
0x00 | Ende des Datensatzes | 0 |
't' | Temperatur in °C/2. So entspricht z.B. 3510 einer
Temperatur von 17.5 °C Raw-Wert des Software- |
1 1 |
'T' | Laufzeit des Ultraschallimpulses in Timer1- Multiplikator für Timer1 in CPU-Clocks (1 oder 8) Totzeit in 256×Timer1- |
2 1 1 |
Nach jedem Datensatz (vor dem 0x00-Byte) wird ein Checksummen-
Temperaturen größer 63.5 °C werden als 63.5 °C, solche kleiner als -64 °C als -64 °C gemeldet. Der auswertbare Temperaturbereich ist daher von -63.5 °C bis +63 °C. Es bleibt anzumerken, dass die Auflösung in der Mitte des Messbereichs am größten ist (teilweise besser als 0.5 °C) während am Rande des Messbereichs Sprünge von bis zu 5,5 °C/ LSB vorkommen, was bei -64 °C aber keine Rolle mehr spielen dürfte...
Wurde kein Echo empfangen ist die Laufzeit 0.
Der Sensor führt kontinuierlich Messungen durch bis die
Versorgungsspannung abgeschaltet wird. Die relativ lange Messzeit von
etwa 800 ms des Software-
So erweist sich der vermeintliche Nachteil der langsamen AD-Wandlung
durch den Software-It's not a bug,
it's a feature!
)
Programmierung des Sensors
Zur erstmaligen Programmierung des Sensors mit dem AVRISP ist es erforderlich dass
die Sensor-Please enter the real Value for Switched Unreg
erscheint. Der Sensor ist an bis sie erneut Return drücken und Sie können
ihn ganz normal mit dem AVRISP programmieren.
Hinweis: das AVRISP bewirkt einen Reset des Sensors einige 100 ms
nachdem die Sensor-
Fuses
Wenn Sie den Sensor programmieren reicht es nicht, nur das Sensorprogramm
selbst zu programmieren! Achten Sie auch auf die Fuses. Insbesondere
die Clk/8-
Test
Bevor Sie den Sensor vergießen, testen Sie unbedingt die Kommunikation mit dem
Display. Versuchen Sie auch ein Update-versenken
(bitte nicht wörtlich nehmen :-)).
Befestigung
Wenn Ihre Zisterne einen leichten Holzdeckel hat können sie ihn natürlich einfach
mit Edelstahlschrauben daran befestigen.
Meine hat einen 50 kg-
Ich habe in den Zisternenhals vier Edelstahl-