Translate

24 November 2011

Erstmals wirklich mit dem ATtiny24-Messwandler gemessen

Heute wars soweit!
Der ATtiny24-Messwandler hat erstmals nicht nur Reihen aus Bytes
übertragen, sondern auch mal wirklich selber eine Spannung gemessen
und übertragen.

Da ist noch nicht an der Auswertung gefeilt etc,
sondern nur mal ganz grob die Übertragung an sich getestet.

Der Wert wird hier im Empfänger umgerechnet und angepasst, das muss später
natürlich im Messwandler abgeglichen werden, aber so gings jetzt
einfacher und zum Testen reicht das auch.
Später muss natürlich auf die Zahl aus dem Messwandler Verlass sein!
Jeder Abgleich bzw jede Korrektur muss vor der Übertragung erfolgen.

Der Wandler hat das "Daisychain-Programm" drauf, das ich kürzlich mal ganz schnell
getippt habe. (Natürlich war noch ein kleiner Fehler drin....vielleicht findet ihn jemand...;-).....
eine Variable ist zu klein definiert....das passiert schnell mal......)

aber jetzt funktioniert das!

Anmerkung vom 26.nov.2011:

Die Startzeichen haben sich geändert! eventuell gibt es noch eine Änderung!
Neuester Stand:
"1" Wird ohne Verzögerung durchgereicht und löst in jedem Messmodul
eine Spannugsmessung aus
"2" ist das neue Startbyte und startet in Kombination mit "3"das Auslesen der
zuvor mit "1" erfassten Messwerte.
Sinn und Zweck ist, die Messwerte zeitlich möglichst knapp zusammen zu haben.
Der rest bleibt sinngemäß gleich


Der Auswerterechner schickt zuerst den Lesebefehl (1) der so schnell wie möglich an alle
weitergeleitet wird und in jedem Modul eine Messung auslöst, aber noch keine Übertragung
danach schickt erein Startbyte (2) raus und auch gleich ein Stopbyte(3)
es ist ja noch kein Messwert im String.
Der Messumformer erkennt zunächst die "zwei" und setzt seine "Datenzeichenkette"
auf 0
Dann schreibt er die "zwei" also ein Byte mit Wert 2 als erstes Zeichen rein
und ergänzt die Zeichenkette um jedes empfangene Zeichen, bis die "drei" (3)
kommt.
Wenn die 3 empfangen wird, dann schreibt der Messwandler den zuvor ermittelten Messwert
als Byte als zunächst letztes Zeichen in die Datenzeichenkette,
und dann noch das Stopbyte, die drei (3) in die Zeichenkette, also den String aus Startbyte,
je ein Byte pro Messwert und am Ende ein Stopbyte.
Dann wird der String seriell weitergesendet zum nächsten Messwandler, und der
fügt seinen Messwert dazu..........
Am Ende kommt eine Zeichenkette von z.B. 48Byte bei 46 Zellen raus.
Jedes Byte (ausser dem ersten,das immer 2 ist und dem letzten, das immer 3 ist)
entspricht dem Messwert einer Zelle

Bei der Übertragung kann man noch einiges verbessern, aber das hat in den ersten
Versuchen noch nicht ganz so wie gewünscht funktioniert.
Eigentlich bräuchten die Zeichen gar nicht zwischengespeichert werden, aber aufgrund
Software-Schnittstellen klappt es nicht, gleichzeitig zu empfangen und zu senden.
Ein Zeichen geht noch, aber wenn der String kommt, dann folgen die Zeichen zu
schnell hintereinander, und gepufferter Empfang bzw Senden klappt hier auch nicht.
Wie man beim Senden des String pausen zwischen den Zeichen einfügen kann
weiss ich noch nicht,aber das würde letztlich auch zu lange dauern
aber man braucht hier auch gar keinen String erzeugen.
Es ist aber nicht so toll mit 50 Variablen zu arbeiten, deshalb brauche ich hier ein Array
und müsste dann die Zeichen einzeln rausschicken, und sofort weiterreichen.
Wenn die Zeichen in einem kurzen Abstand gesendet, aber sofort weitergeleitet werden,
dann machen ein paar Millisekunden zwischen den Zeichen des String nicht viel aus.
Wenn aber der String immer erst gesammelt, dann ergänzt und dann erst gesendet wird.
dann multipliziert sich das ganz gewaltig, und bei gut tausend zeichen macht eine
Millisekunde schon eine gute Sekunde zusätzlich aus.......
aber da brauche ich erst einen besseren Versuchsaufbau, bei dem ich zum Umprogrammieren
nicht jedes Mal den Baustein umstecken muss

Ich habe einfach mal die Werte 1 bis 14 für Befehle und Meldungen reserviert
und so kann ich jetzt mal von ca 63mV bis zur Referenzspannung von ca. 1,1V
messen. Diese Messung erfolgte ohne Eingangsspannungsteiler und der Wert wurde
wie oben schon erwähnt im Empfänger umgerechnet und angepasst.
(Das ist jetzt nur für Testzwecke so,weils einfacher ging,da der Empfänger im
STK500 steckt und direkt umprogrammiert werden kann.

 

Das Anreihen der Byte funktioniert auch, das habe ich 
schon zuvor erfolgreich getestet.
Weiter geht es demnächst dann mit dem Weiterreichen
der Daten zum nächsten Messwandler in der Kette.
Das will ich dann mit einem "open Collector - Transistor
und Pull-Up zur nächsten Zelle machen.
Dass die Übertragung per Isolator bzw Optokoppler
zum ersten und Letzten Messmodul funktionieren sollte 
nehme ich einfach mal als selbstverständlich an.
Ach ja eh ichs vergesse... der ATtiny läuft jetzt mit 4MHz
Das reicht bei 2400Baud um alle Zeichen zu verarbeiten
und auch die Spannung zu messen.
Der "Software-UART" ist recht rechenintensiv, und
ich konnte da bisher noch keinen Empfangspuffer 
aktivieren, weil der Speicherplatz zu knapp ist.
Vielleicht gehts mit dem ATtiny44..... der ist auch kaum
teurer und hat halt doppelt so viel Speicher........
Aber eine Zeichenkette von 50Byte ist auch mit
2400 Bd schnell mal übertragen.


Da ist alles drauf, um eine Zelle zu messen, und es sind noch einige Pins
frei, mit denen man noch so manches machen kann......





Ein paar Ni-MH-Akkus sind gut zum Testen geeignet, die gehen von 2V - 4,6V ohne zu explodieren














Die Übertragung der Daten über den ADUM läuft inzwischen auch schon.
Bei den ersten Versuchen mit einem einzelnen Modul konnte ich das direkt anklemmen,
aber später muss das Signal zum ersten Messwandler getrennte Wege gehen.(Optokoppler)
Hier sieht man, wie winzig der ADUM5241 in Wirklichkeit ist! Ein zweikanaliger Isolator.
(Das linke IC) Der hat einen DC-DC-Wandler drin für 5V 10 mA  und zwei isolierte Datenkanäle!
Je einen in jede Richtung, also ideal für RS232.
Die Ausgänge schalten aktiv, also kein Pullup etc nötig !!!













Etwa so habe ich das mit dem ADUM und dem Optokoppler
geschaltet. (nur eine schnelle Skizze, aber den Sinn sollte man so verstehen)

Das größte Problem der ganzen Datenübertragung ist die geringe Spannung bei
leeren Akkus! mit knapp 2V (der ATtiny 24V läuft ab 1,8V; derart leer sollten die
Akkus niemals werden, aber unter Last kann das schon mal passieren)
kann ich weder den Adum noch einen Optokoppler
ansteuern. Da leuchtet noch keine LED so richtig. ich bin daher auf die Spannung
aus dem Adum angewiesen. Zum Auslesen der Daten verwende ich die 5V
des Adum für den Pull-up des letzten Übertragungstransistors. so habe ich
ein sauberes Signal. Der Transistor braucht zum Schalten 0,7V aus dem
ATtiny, das geht noch ohne Probleme.Hier ist kein Mosfet geeignet.
Die Übertragung zum ersten Messmodul läuft über einen Optokoppler.
Die Versuche, den auch gleich vom Adum aus zu betreiben waren
nicht ganz so gut verlaufen, wie erhofft, aber das macht nichts.
Der Adum ist dafür einfach etwas zu schwach, und soll ja nur
Signale übertragen und isolieren, aber nicht gleich LEDs versorgen.
(obwohl die angegebenen 10mA hier erstens reichen müssten
und zweitens nicht überschritten waren, aber was solls.....)
Eigentlich kann ich den Optokoppler auch direkt vom Steuerrechner
aus ansteuern. Das ist kein Problem, zumal das erste und das letzte Messmodul
unter Umständen weit voneinander entfernt sein können.
und die Daten sowieso auf ganz unterschiedlichen Wegen laufen werden.
(Die Frage ob Module auf jeder Zelle, oder ein zentrales Gerät ist noch
völlig offen. möglich ist beides, vielleicht bau ich auch beides........)
Die Übertragung zum ersten Modul per Optokoppler ist übrigens inzwischen
erfolgreich getestet und für gut befunden worden. (01.12.2011)


Der Testaufbau......
Drei Ni-MH Akkus vom Penny haben auch so cirka 3,5V das tuts zum Testen!
Der ATtiny wird direkt vom Akku versorgt, wie später auch
Das blaue Ding ist ein Resonator (nicht so exakt wie ein Quarz, aber es reicht)
Der kleine Transistor ist der, der das Signal zur nächsten Messeinheit
weiterreicht. (Der Pull-up hängt halt jetzt noch hier an 3,6V dran,
unt interessanterweise kann mein USB-seriell-Wandler und auch der
Max232 auf dem Evaluation-Board dieses Signal noch erkennen
Das wird aber zukünfig als TTL-Pegel weitergeleitet, dazu muss ich die Signale
im Wandler invertieren gegenüber dem momentanen Zustand)
und als Spannungsteiler nehme ich recht gerne Widerstandsnetzwerke.
mit einem gemeinsamen Pin. Weil es hier nur auf das Verhältnis der
Widerstände ankommt sind die meist sehr genau!

Ich habe noch versucht, das Programm zu verbessern, aber das
brachte nicht den gewünschten Erfolg. wegen der "Software-Schnittstellen"
ist Duplexbetrieb nicht möglich! (gleichzeitig senden und empfangen)
Ich muss also weiterhin erst den String "sammeln", dann den Messwert
dranhängen und dann den kompletten String zur nächsten Einheit
weiterreichen. Das dauert halt einen Moment! ich kann noch nicht recht
abschätzen, wie lange die gesamte Übertragung dauern wird.
Das ist nicht weiter schlimm, aber das hat einige Zeit gekostet!
Wie ich dieses Übertragungsproblem gelöst bekomme ist noch unklar,
Nehme ich einen ATtiny, dann gibt es keinen, der zugleich AD-Wandler und UART
drin hat.Ich würde aber sowieso lieber mit Soft-UART arbeiten, weil ich da
nach Belieben die Signale invertieren kann. Bei Hardware-UART geht das nicht.
aber der Transistor invertiert nun mal das Signal. da bräuchte ich dann einen Treiber
der aus 2 - 4,5 V am Eingang 4 - 9V am Ausgang macht, ohne zu invertieren.
( ich muss das Signal ja zur nächsten Zelle weiterreichen)
Das könnten z.B. kleine Mosfet-Treiber recht gut (TL 4432 etc) aber mit der
niedrigen Spannung einer leeren Zelle mache ich mir Sorgen, ob das noch geht!
Und genau diesen Aufwand wollte ich sparen.......
......da wird mir schon noch was einfallen......
Erst mal ermitteln, wie lange die Übertragung tatsächlich dauert,
wenn ich es so mache wie es jetzt ist, dann wird es sich schon zeigen,
ob es nötig ist derart umzugestalten.

Eben weil die Zeichen von 1 bis 14 (willkürlich gewählt)reserviert sind
und zu Steuerzwecken oder Meldungen genutzt werden sollen brauche ich gar nicht
ständig messen und berechnen etc... sondern kann die Messmodule bei Störungen
einfach unaufgefordert eine Meldung schicken lassen, und dann muss halt mal geschaut
werden wo irgendwas nicht passt.
Wenn dann das Auslesen aller einzelnen Spannungen ein paar Sekunden dauert
ist das nicht weiter schlimm.

Eine kleine Verbesserung ist aber jetzt schon mal drin:
Ein eigenständiges Lese-Signal!
Ich schicke also erst eine 1 die wird gleich weitergereicht
( bei einem einzelnen Zeichen klappt das prima) und löst zugleich
in jeder Einheit auch noch das Einlesen der Spannung aus.
erst dann starte ich mit der Kombination 2 und dann 3 das Auslesen
der gemessenen Werte.
Das dauert insgesamt kaum länger, aber die Messungen erfolgen so
an allen Zellen sehr schnell hintereinander, sind also besser vergleichbar.

Und, nicht uninteressant....die Stromaufnahme liegt bei  nur 4mA !!!
und das ohne "Sleep-Mode" ich glaube, das kann ich mir sparen.

Genauigkeit..... Man kann die Module natürlich ganz spezifisch auf
eine bestimmte Spannung hin abgleichen, das hat dann noch nicht mal was mit
Messgenauigkeit zu tun, aber wenn die Messung bei ca 3,5V um
nur wenige mV (ca.5) daneben liegt dann bin ich zufrieden,
das spielt sich auf der dritten Nachkommastelle ab, die später eh nicht
mehr angezeigt wird und das ist besser als 0,5% des angezeigten Wertes.
Ebenso bin ich von der Temperaturstabilität angenehm überrascht!
Wenn ich den ATtiny mit Kältespray misshandle, dann läuft die
Anzeige irgendwo bei -40° um 40mV davon .
Damit habe ich kein Problem! der Unterschied von Raumtemperatur
auf 0° macht etwa 1mV aus (0° ist dann, wenn der Eispanzer
nach der Kältespayattacke schmilzt ;-)  ) das ist also alles durchaus
im grünen Bereich!Wie schon erwähnt arbeite ich mit der internen
Referenzspannung des ATtiny24 von ca. 1,1V Diese ist nicht immer
ganz exakt, deshalb muss ich jeden ATtiny den ich zum Messen verwende
unbedingt einzeln kalibrieren. Das war aber von Anfang an klar!
Ich habe aber bisher die Qualität der Referenz noch nie genauer untersucht,
weil ich damit nur in ein paar Sonderfällen Potistellungen ausgewertet habe,
da gings nicht genau, sondern da musste nur der Drehwinkel reduziert werden.
("Gasgriff" für eine kleine PWM-Schaltung)


Noch eine Anmerkung zur Genauigkeit............
Die Genauigkeit der Messung wird oft überbewertet
Nur um die leere Zelle zu erkennen ist es nicht nötig, aufs Millivolt genau zu messen.
ob der Alarm nun bei 2,4 oder 2,5V kommt ist nicht sooooo wichtig,
wichtig ist nur, dass er kommt! die Zellen schwanken in ihrer Spannung unter Last
durchaus mal um ein paar zehntel Volt! um so mehr natürlich, je leerer sie sind!
Die berühmten 2,5V oder so... sind eine Angabe für leere Zellen OHNE Last!!!
Wenn also so eine Zelle ohne Last noch 3V hat und nur unter Last auf 2,5V oder gar 2,4V
absinkt, dann ist das noch nicht problematisch, sondern nur ein Zeichen, dass die Zelle
FAST leer ist. (oder der Strom zu hoch!)
Natürlich muss man darauf reagieren und wieder laden
und auch diesen Betriebszustand vermeiden, aber die Schwelle für einen
sofortigen Alarm braucht nicht bei 2,5V liegen, sondern etwas tiefer,
sonst nervt die Überwachung jedes Mal wenn man aufs Strompedal tritt!
(Das "Mini-BMS" zeigt so mit der Länge der Warnung den Ladezustand
an.........nicht ganz optimal, aber eine pragmatisch einfache Lösung)
Eine dezente Vorwarnung an diesem Punkt mit etwas Zeitverzögerung
macht aber durchaus Sinn! Wenn sich die Zelle nicht mehr SOFORT erholt
ist sie definitiv leer! Der Bereich von fast leer bis gefährlich leer
ist sehr klein, nur wenige Km!!!!!
So lange die Zellen voll sind bringt das Messen der Spannung überhaupt
kein sinnvolles Ergebnis sondern dient nur der Information.
Ähnlich verhält es sich beim Laden. So lange das Akkupaket halbwegs balanziert ist,
haben alle die gleiche Spannung und die Werte driften erst auseinander, wenn
die ersten Zellen so voll sind, dass sie den Knick ihrer Kennlinie erreichen
und "davonlaufen".

Aus diesem Grund bin ich zur Überzeugung gekommen,
dass es Sinn macht das Balanzieren mit einer eher höheren Spannung zu
erledigen als man im Normalbetrieb als Obergrenze betreachtet.
Wenn man die Zellen normalerweise bis z.B. 3,6V lädt, dann geht das wunderbar mit einem
Ladegerät, das eben auf  diese Grenze eingestellt ist, und dann begrenzt.
Und wenn das Akkupaket ordentlich (oben!!!) balanziert ist, dann ist an diesem Punkt
jede Zelle auf den gewünschten 3,6V, ohne dass irgend ein Shunt eingreifen muss.
Viele betreiben ihre Akkus ganz ohne Balancer und das geht auch meist gut!
Es ist also definitiv nicht nötig, jedesmal mit der Hammer-Methode aufs
hundertstel Volt mit glühenden Shunts die Zellen "perfekt" zu balanzieren.
Es reicht völlig aus, die Zellen gut zu beobachten und gelegentlich mal
ein bisschen zurechtzurücken, so als eine Art Pflegemaßnahme!
Die Zellen nehmen aber keinen Schaden, wenn man gelegentlich zum Balanzieren
gerinfügig höher auflädt, das aber dann ganz gemütlich mit wenigen Ampere
erledigt, so dass keiner der Shunts wirklich arbeiten muss.
Wenn die oben erwähnten 3,6V der normale Betriebszustand sind, dann kann man
durchaus mal mit 3,8V Balanzieren ohne sich Sorgen um seine Zellen machen zu müssen!
Die halten auch mal 4,2V aus ohne gleich Schaden zu nehmen, nur wirklich gut tut
ihnen das auf Dauer nicht.Aber je weiter oben im Knick man die Zellen balanziert,
desto besser liegen sie nachher beieinander.

Mein mittlerweile schon alter Spruch: wenn es die selbe Zelle ist, die zuerst voll
und auch zuerst leer ist, und alle anderen liegen dazwischen, dann ist das
Gesamtpaket perfekt balanziert.

mfG
Franz

Kommentare:

  1. Klasse, dass es schon funktioniert!

    Einen kleinen Hinweis möchte ich noch geben:
    Die maximal 48 Byte gehen schon ganz schnell üner den Bus. Wenn jetzt aber immer erst gewartet werden muss bis ein Datensatz von vorherigen Modul gelesen werden muss und dann der A/D-Wandler einen Wert ermittelt der dann gesendet wird, Vergeht viel Zeit!

    Du könntest ein Steuerbyte hernehmen um allen Modulen den Befehl zu geben, dass gemessen und mit dem Cal-Wert im ROM verrechnet werden soll. Das geschieht unmittelbar nachdem das Steuerzeichen empfangen worden ist.
    Der nächste Befehl wirde dann von der Zentrale erst verschickt, wenn der Messbefehl durch alle Module durch ist.
    Dann sind aber schon alle Spannungen gemessen und stehen im RAM zum Senden bereit und können zeitnah verschickt werden.

    Zum Kalibrieren:
    Mann kann dazu auch ein Steuerbyte heranziehen. Das Messmodul wird z.B. mit 3,0V versorgt. Jetzt schickt die Kalibrierstation das Steuerbyte. Das Modul legt den gemessenen AD-Wert (10bit) ins ROM. Idealerweise gibt man den Wert mit einem Cal.-OK an die Kalibrierstation.
    Das macht man mit allen Modulen.

    Bei der Messung während des Betriebs wird der A/D-Wert gemessen (10-bit). Danach wird gerechnet:
    AD_wert / Cal_wert * 3,0V = gemessene_Spannung

    Die "gemessene_Spannung" braucht ja nicht unbedingt ein Dezimalwert sein, sondern kann auch Byte sein.

    Was mir jetzt gerade so gekommen ist:
    Ich würde nicht unbedingt einen String verschicken, so wie in deinem Beispiel-Listing.
    Wenn die Übertragung in HEX-Zahlen über die Serielle läuft, kann man noch ein wenig mehr Speed aus der Übertragung rauskitzeln.

    Grüße

    P.S.: Wir sollten uns mal treffen !!!

    AntwortenLöschen
  2. Der Fehler im Listing ist:

    Dim Voltadc As Byte

    anstatt

    Dim Voltadc As Word

    Weil der ADC ja 10-bit ist.

    AntwortenLöschen
  3. Hallo Bruno,

    Das mit dem "jetzt messen"-Befehl hatte ich schon vor! Wichtig ist die möglichst gleichzeitige Messung, die Übertragung hat schon ein bisschen Zeit.....

    Ich hab einfach mal die Byte 1-14 reserviert,
    das kann man immer noch erweitern
    Ich will gar nicht immer messen, auslesen
    und auswerten, sondern Die Module sollen auch von sich aus Alarme schicken können
    Dann muss man halt schauen, was da los ist.

    Ich übertrage jeweils ein Byte pro Zelle,
    aber die Korrektur sollte noch mit dem
    10-bit-Wert erfolgen, bevor ich durch 4 teile.

    Ich werde da noch ein bisschen spielen.....
    es kann ja jede Zahl ausser dem Stop-Byte
    sofort weitergereicht werden.....
    erst das Stopbyte löst das Senden des Messwertes
    aus und dann folgt wieder das Stopbyte!
    ...und löst die Übertragung im nächsten Modul aus.......
    Da fällt mir schon noch was ein ;-)

    Das erscheint mir auch als DIE Lösung,
    um mit der Baudrate ev. etwas höher zu
    kommen. 9600Bd wären so sicher drin,
    aber bei einzelnen Bytes ist das nicht sehr
    viel Unterschied.......

    Das mit dem String zusammensetzen und
    dann auseinanderpflücken konnte ich fast
    unverändert aus der Curtis-Auswertung
    übernehmen und als Funktionstest reicht das!

    Danke für Deine Tipps!

    Manchmal sieht man halt einfachste Dinge
    selber nicht sofort, obwohl sie
    sehr naheliegend sind, weil man sich auf
    ganz was anderes konzentriert....

    AntwortenLöschen
  4. .....ach ja.....
    Das mit dem String war beim Auswerten
    die bessere Lösung, als ich die 840er
    Nachbildung in einen ATtiny2313 quetschte!
    50 Variablen sind zu umständlich und
    das mit den Arrays habe ich noch nicht
    so ganz verinnerlicht.....
    Die Zeichen werden schon als Byte übertragen,
    und die Umwandlung in den Messmodulen ist
    wirklich nicht nötig, weil ja auch kein wirklicher Grund da ist, sie erst
    zwischenzulagern und dann als Block zu
    schicken!Das brauche ich NUR im Empfänger!
    Das BMS in der Franzbox ruft die Werte
    nacheinander auf, und vergleicht, ob
    einer größer oder kleiner als die bisherigen Extreme ist.
    Da haben die Bäume wieder den Blick auf
    den Wald versperrt.......

    AntwortenLöschen
  5. Hmmm........So einfach geht das jetzt
    doch nicht.........erst mal zurück
    zum Urzustand.....
    Wenn ich die Zeichen sofort weiterleite
    kommt der ATtiny nicht mehr mit!
    Dadurch dass ich mit Soft-UART sende
    und empfange geht das nicht zugleich!
    Aber der 24er hat kein UART drauf.
    Mit passender Hardware ginge das,
    aber ich kann jetzt keinen Atmega nehmen.
    und UART + ADC haben die Tinys nicht.
    und ich will mit Soft-UART arbeiten,
    weil ich da direkt invertieren kann.

    AntwortenLöschen