Forum: Projekte & Code Akku und Wasserstandsdisplay für Wohnmobile


von Willem B. (mr_willem)


Angehängte Dateien:

Lesenswert?

Hallo liebe Mikrocontroller Gemeinde,

nachdem ich so eben eine von zwei Prototyp Platinen für ein 
Wasserstandsanzeiger und Akkuwächter im Wohnmobil fertiggestellt habe, 
möchte ich das Projekt hier Präsentieren. Es ist mein erster Versuch 
TQFP zu löten. Ich bin aber ganz zufrieden mit dem Ergebnis zumal die 
ersten Sachen laufen.

Mehr als nur Akkuwächter und Wasserstandsanzeiger lässt sich mit dem 
System eventuell eine Art Hausbus fürs Wohnmobil realisieren, wobei mir 
für meinen kleinen T4 eigentlich diese Funktionen reichen.

Die erste Platine (Rot), die ich gerade zusammengebaut habe ist der 
Mikrocontroller mit Wasserstandssensor Anschlüssen und Display.
Das Display ist über SPI angeschlossen, ebenso ein 128 MBit Flash 
Speicher der zum aufzeichnen der Akku Daten gedacht ist. Zudem befindet 
sich auf dem Board noch eine DS3231MZ+ I2C RTC für eine eventuelle 
Zeitanzeige aber auch damit der MCU möglichst alle zwei Sekunden Daten 
vom Akku loggt. Ein SO8 IC War mir lieber als noch eine zweite 
Quarzschaltung.
Der Wasserstandsensor ist für einen Spannungsgesteuerten Anzeiger. 
Hierfür bereiten 2 LM339D Quad comparatoren das Signal für den STM32 
auf. Vorgesehen ist auch ein USB Anschluss, damit man per PC die Daten 
des FLASH auslesen kann. Die Kommunikation mit der zweiten Platine 
erfolgt über differential I2C mit Hilfe eines PCA9615. Die Platinen 
können dann über normale Netzwerkleitung mit RJ45 Steckern verbunden 
werden. Neben dem I2C Signal führt die Leitung auch noch +5V und KFZ+ 
vom Akku.
Leider war einer der Elektronikversand zu langsam, deswegen ist das SWD 
interface gerade nicht mit der 1,27 mm Stiftleiste sondern mit Kabeln 
verbunden und die ganzen Kabelklemmen fehlen auch noch. Aber so mit 
Kabeln funktioniert das Interface trotzdem ganz gut. Die Software läuft.


Die zweite, noch nicht zusammen gebaute Platine ist für die Akku 
Funktionen zuständig.
Der Akku wird von einem TI BQ34Z100-G1 ständig überwacht (blaue 
Platine). Dieser IC ist ein Coloumb Counter und zählt sozusagen welche 
Ladung in den Akku rein und raus gehen. Angesprochen ist das ganze über 
I2C. Zudem gibt er ein Alarm Signal raus falls der Akku zu leer geht um 
den Akku aus zu Schalten. Geschaltet wird der Akku über 2 BTS 555 von 
Infineon, Das System ist für einen Strom von ca 55 bis 60 Ampere 
ausgelegt, begrenzt durch die Verlustwärme des Shunt Widerstands. Neben 
dem BQ34Z100-G1 befindet sich auf der Platine noch ein 8 Bit I2C IO 
Expander mit dem der Akku durch einen Mikrocontroller und zusätzlich 
noch andere Verbraucher über Mosfets geschaltet werden können.

Sobald ich die zweite Platine gelötet habe werde ich euch wissen lassen 
ob es funktioniert. Leider wird das wohl einen Monat dauern, da ich 
jetzt erst mal nicht die Zeit dafür habe.

Viele Grüße,
Willem.

von Dirk T. (helipage)


Lesenswert?

Hallo Willem...

Tolles Projekt !
Freue mich schon drauf, weiter davon zu lesen.

Hab ein 22 Jahre altes Wohnmobil mit einem einzigen Zeigermessinstrument 
(umschaltbar) zur Anzeige der Spannungen (Aufbau- und Starterbatterie) 
sowie Wasser (Frischwasser/Abwasser).
Wenn Dein Projekt erfolgreich ist, würde ich das Ganze gern für mein 
Womo nachbauen.

Viel Erfolg und Grüße
Dirk

von Willem B. (mr_willem)


Angehängte Dateien:

Lesenswert?

Kleines Update,

nachdem ich erkennen musste das ich doch noch so zwei drei kleine Fehler 
im Design hatte und ich in der I2C Routine einen Fehler hatte so das es 
zu "unerklärlichen" verhalten kam, funktioniert die Kommunikation der 
Boards jetzt zusammen. (Die Grüne LED (Photo) wird im Sekundentakt an 
und ausgeschaltet.... Es läuft....)
Auch die USB Verbindung zum Konfigurieren ist rudimentär implementiert. 
Zumindest gibt es eine Verbindung und es versteht die Befehle die ich 
über ein Terminal gebe.

Ich habe bis jetzt wenig über den PCA9615 (differential I2C Translator) 
gefunden. Falls jemand danach sucht, mir ist folgendes aufgefallen.

A. Pin3 (EN) ist mit internen PullUp verbunden (steht ja auch im 
Datasheet) und kann unbeschaltet sein.
Mir wurde das aus dem Diagramm im Datasheet nicht 100% klar weil da so 
was stand wie dass der EN Pin nur high gehen darf wenn die Power Sequenz 
komplett ist.

B. Der Chip ist der empfindlichste in meiner Schaltung. Habe vier davon 
verbraten. Wer den einsetzt sollte dass tun was man generell tun sollte. 
Schutzbeschaltung!!!! Einmal ein bisschen mehr als 5 Volt an irgendeinen 
der Eingänge und das war es.

C. Die 3 Meter Kabel die im Datasheet angegeben sind beziehen sich 
wirklich nur auf den 3,4 MHz I2C Modus. Dort steht ja bei weniger 
Geschwindigkeit geht auch längere Leitung. Bei 400 kHz läuft es aktuell 
über 10 Meter twisted pair, ein längeres twisted pair habe ich gerade 
nicht zum testen. SCL+- so wie SDA+- auf der Platine sind alle 
miteinander längenangepasst bis zum Abschlusswiderstand zwischen den 
Paaren in der Hoffnung, dass das noch ein paar Meter mehr rauskitzelt.

Als nächstes wäre dann Kalibrieren des BQ34Z100 Akku ICs dran....

von Herr S. (Firma: Privat) (wumpie)


Lesenswert?

Hut ab, tolles Projekt für alle Womo Freunde, es gibt übrigens bei 
Facebook einer Camper und Womo Gruppe da wird häufig nach so einem 
kleinen Gerät gesucht und dikutiert, wenn Du noch eine Solar Ertrag 
Anzeige mit einbaust wirst auch vielleicht mal ein paar Euro an Deinem 
schönen Projekt verdienen.

von Amateur (Gast)


Lesenswert?

Was mach eigentlich Dein Batteriewächter, wenn ihm (dem Akku) die Puste 
ausgeht?

von Bully (Gast)


Lesenswert?

Was hat man eigentlich von dem ganzen WoMo-Bastelaufwand, wenn man eh 
nirgends autark in Ruhe stehen kann, sondern dicht an dicht auf einem 
Campingplatz für 30 Euro steht (mit Strom- und Wasseranschluss bzw. 
Spülbecken)? Und das vielleicht zwei Wochen im Jahr?

von Der Andere (Gast)


Lesenswert?

Bully schrieb:
> Was hat man eigentlich von dem ganzen WoMo-Bastelaufwand, wenn man eh
> nirgends autark in Ruhe stehen kann, sondern dicht an dicht auf einem
> Campingplatz für 30 Euro steht

Ne Reise ans Nordkap?

von Willem B. (mr_willem)


Lesenswert?

@Christian S.
Es misst den Strom der rein und raus geht, so würde das Ergebnis durch 
Verbraucher gefälscht. Man könnte es aber um einen Coulomb Counter 
erweitern der explizit den Solarladestrom misst.

@Amateur
Derzeitig schaltet die Platine sich selber nicht ab, sondern nur alle 
anderen Verbraucher. Aber der BQ34Z100 könnte wenn ich richtig denke 
autark den Rest vom System an und abschalten. Dann könnte man zwei 
Limits programmieren, ein Soft Limit das alle anderen Verbraucher bei 
einem gewissen Schwellwert abschaltet und ein Hard Limit das auch den 
Mikrocontroller abschaltet. Werde das mit einplanen.
Der BQ34Z100-G1 selbst braucht nur ca. 150 uAmpere, ein kleiner LDO nur 
für ihn sollte dabei auch nicht so viel ziehen, so das der Batterie dann 
noch vielleicht 200 - 300 uAmpere entnommen werden.

@Bully
Ich habe jetzt mehrere Fahrten gemacht wo ich häufiger autark stand. Ich 
fahre aber auch kein Schlachtschiff. Im Sommer nehme ich kein Stromkabel 
mit, da bin ich von der Batterie abhängig. Zudem möchte ich gerne das 
sie heile bleibt und nicht bis aufs letzte entladen wird. Man müsste das 
ja auch nicht unbedingt Anzeigen aber das Display zu proggen ist das 
einfachste. Spannungsbasierte Überwachung der Batterie funktioniert nur 
subobtimal wenn die Stromentnahme stark schwankt. Deswegen der 
aufwändige Coulomb Counter.

von Jürgen (Gast)


Lesenswert?

Hallo Willem,
sehr schönes Projekt.

Welche Wasserstandssensoren hast Du verwendet?

Stellst Du eine Nachbauanleitung mit Plänen und Code noch ein?

Grüße
Jürgen

von Willem B. (mr_willem)


Lesenswert?

Insofern das ganze dann funktioniert poste ich den Code und die Pläne. 
Wie gesagt, sind in der derzeitigen Version auch noch Hardware Bugs die 
ich fliegend verdrahtet ausmerzen musste.

Ich habe momentan eine Wasseranzeige für Resistive Messung. In meinem 
Tank befinden sich dafür schon Elektroden.
Das ganze wird über LM339D Analog Komparatoren mit open Drain Output von 
12 V auf Mikrocontroller freundliche 3,3 V übersetzt.

Ich habe aber schon gesehen das hier einige Projekte für eine Kapazitive 
Tankmessung laufen, mal sehen wie die sich entwickeln, vielleicht kann 
man da ja was von integrieren.
TI hätte mit dem FDC1004 auch einen I2C kompatiblen Chip für kapazitive 
Tankmessung auf dem Markt. Es wäre hiermit möglich mit wenigen externen 
Bauteilen, dem FDC1004 und dem PCA9615 und einem kleinen LDO z.B. eine 
kapazitive Tanksonde direkt über I2C anzuschließen, der PCA9615 ist ja 
multipoint fähig.

von Willem B. (mr_willem)


Angehängte Dateien:

Lesenswert?

Für den in diesem Projekt benutzten BQ34Z100-G1 wird ein Firmware update 
benötigt. Von Haus aus wird er mit Firmware für einen bestimmten typ 
LiIonen Akkus geliefert.
Glücklicherweise hat TI ein relativ einfaches Format, das fs Flash 
Stream Format, in dem die I2C Kommandos direkt stehen. Man bekommt die 
Datei aus BQStudio, dem TI Programm für die Batterie Managment ICs. 
Anbei ein kleines linux Terminal Programm, das die fs Datei einliest, 
dekodiert und per USB com port an den Mikrocontroller STM32F103 sendet. 
Dieser sendet die Daten per I2C weiter an den BQ34Z100-G1.

Vorweg, ich bin kein professioneller Programmierer und wenn jemand meint 
das besser schreiben zu können, so mag er den Code doch einfach ändern.
Der Code funktioniert in so weit das der MCU auf den I2C Bus das 
"richtige", also das was in der Datei steht sendet.
Auch die Compare Routine funktioniert. Fehlerbehandlung ist noch nicht 
implementiert. Ich habe mir zum testen mal eine minimalistische bq.fs 
Datei geschrieben, die die Standard register des BQ34 adressiert.

Was ich leider nicht weiß und wozu ich noch keine Antwort von TI 
bekommen habe ist ob der BQ34 im Flash Modus bei einem Compare Commando 
akzeptiert das das Kommando in I2C write und I2C read (ohne repeated 
start) geteilt ist. Ich habe nämlich noch kein I2C write read 
implementiert. Im nicht Flash Modus macht er das problemlos.

Die usb_cdc.c ist meine usb cdc Datei für den STM32.
void decode_usb_message(void) wird aus der main in der while(1) endlos 
schleife aufgerufen.


Edit

Sorry,

vergessen den GPL Header als Kommentar einzufügen....
Die Dateien im oberen Archiv sind nicht kompilierbar.

Sollte man zwar sehen aber falls es jemand testen will
/* */ vor und hinter den GPL Header einfügen.

: Bearbeitet durch User
von Willem B. (mr_willem)


Angehängte Dateien:

Lesenswert?

Mal wieder ein kleines update..

Um die TI BQ Chips zu kalibrieren muss man einige Daten in die Register 
schreiben. Wenn man nicht gerade die TI Software weil die nur mit dem EV 
2300 Programmer funzt kann man ein Tabellenkalkulationsprogramm zur 
Hilfe nehmen....

Ich habe in der Tabelle die Bits die man laut Datasheet während des 
Designs ändern sollte in Grün markiert.
In Blau sind sonstige Bits markiert.
Unter den Register Daten habe ich teilweise noch kleine 
Berechnungsguides für Werte stehen. Die Eingabefelder sind auch grün.

Ich habe teilweise nicht alle Bytes in der jeweiligen Tabelle 
aufgeführt, weil nicht alle Flash Bereiche gefüllt sind. Ein Byte das 
Null ist ändert auch nichts an der später benötigten Checksumme. 
Generell wird immer für einen 32 Byte block eine Checksumme generiert. 
Diese wird in der Tabelle automatisch berechnet.

Ich habe immer zunächst alle 32 byte an Register Daten für einen Flash 
Block in die Tabelle abgetippt und geschaut ob die berechnete Checksumme 
mit der im Register 0x60 Gespeichterten übereinstimmt.
Dann meine Änderungen vorgenommen und die entsprechenden Bytes oder aber 
den ganzen Block zurück geschrieben und die Checksumme gespeichert.
Das hat bei mir gut funktioniert.

Die Daten haben die Formate z.B. U2 = unsigned Int 16 Bit oder I = 
signed int 8 Bit F4 ist einspezielles TI Format was floating point 
Zahlen speichert.... Siehe Dokument "How EVSW Display the Raw Data 
V1.03.pdf"

Ich hoffe die Tabelle kann eventuell noch jemandem nützen und ist nicht 
ganz undurchsichtig.

von Willem B. (mr_willem)


Angehängte Dateien:

Lesenswert?

Kleines Update,

das Projekt läuft soweit, ein erster Test im Feldeinsatz hat sich über 
einen kleinen Ausflug am Wochenende stabil erwiesen, allerdings wurde 
der Akku nicht so leer das er die verbraucher abgeschaltet hat.
Beim kalibrieren des BQ34Z100-G1 konnte ich diese Funktion allerdings 
schon testen. Auf dem Display sind noch einige Debug ausgaben zu sehen 
wie der Strom und die Spannung, in der Endversion soll das noch anders 
aussehen.

Ich Poste mal die Schaltpläne, erweitert um den LDO für den BQ34Z100-G1 
also so das im Falle einer absolut leeren Batterie nur noch der 
BQ34Z100-G1 Strom verbraucht.

Falls jemand irgendwelche Unsinnigkeiten in den Schaltplänen entdeckt 
kann er mir die gerne schreiben. Wie gesagt, die Schaltung tut das was 
sie soll, aber vielleicht fehlt noch die ein oder andere 
Schutzbeschaltung oder ähnliches.

Als nächstes plane ich in der tat noch eine kapazitive Tanksonde, da die 
resistive Messung mit alter der Sonde immer schlechter funktioniert.

Die Software kann ich die Tage auch noch posten allerdings ist die 
momentan noch sehr unaufgeräumt.
Grüße

von Willem B. (mr_willem)


Angehängte Dateien:

Lesenswert?

Sorry, habe einen Pullup falsch eingezeichnet... Der sitzt am 
BQ34Z100-G1 Alarm Ausgang.

hier die korrigierte Version der Schaltung.

von Torsten R. (dode)


Lesenswert?

Tolles Projekt, sehr anspruchsvoll! Solche nützlichen Sachen selber 
bauen finde ich super, und dein Display ist offensichtlich ja auch für 
andere sehr interessant.

Torsten

von Willem B. (mr_willem)


Lesenswert?

Hier ist ja schon eine gewisse Zeit nichts mehr passiert.

Leider komme ich momentan nicht zur Weiterentwicklung, nicht zuletzt 
weil das System seit Juli im permanenten Einsatz ist. Es ist immerhin 
seit 3 Monaten weder abgestürzt noch kaputt gegangen. Bis jetzt hält es 
durch und hat im Notfall auch schon funktioniert. Allerdings muss ich 
noch durch eine saubere Batterie Kalibrierung...

Nun ja, bald kommt der Winter, der Wagen steht und es kann weiter gehen.
Für alle Leute die es interessiert, ich habe den Quellcode auf mein 
GitHub Profil geladen.
Er ist für das V1 Board, also ohne die von anderen Usern vorgeschlagenen 
Hardware Änderungen.

Ich weise darauf hin....
Bitte lest den Code nur wenn ihr schlechten Programmierstil abkönnt. Nur 
weil er funktioniert heißt das nicht das er 1. Fertig oder 2. Sauber 
ist.
Ansonsten werde ich Updates bei GitHub einfließen lassen.
Programmiert ist es teilweise basierend auf einem Referenz Projekt für 
STM32.

https://github.com/mrwillem

Grüße,

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.