Hallo, ich will mir für die Überwachung eine größeren Akkus Systems (48V 100A) eine Kapazitätsanzegie bauen ( mit Mega8). Die Hardware steht schon, aber ich bekomme die Programmierung nicht hin. Diese Antwort aus einem anderen Forum ist zwar logisch, aber wie um alles in der Welt setze ich das um? Das problem ist halt, das die Zahlen recht groß und unhandlich werden und ich somit ständig Probleme mit den Einheiten und variablentypen habe. "Welche Rechnung ? die Amperestunden ? Das ist der Aufsummierte Wert * Irgendwas. Nehmen wir an, ein ADC Wert von 1024 entspricht A [Ampere] und wird addieren alle 10ms. Dann entspricht das A *(1/1024)*(1/100)*(1/3600) Amperestunden, pro Eintrag. Das Irgendwas ist demnach (1/1024)*(1/100)*(1/3600) Amperestunden. " Ich nutze zwar Turbo Pascal aber ein Beispiel in einer anderen Sprache würde mir sicher auch weiterhelfen
Um die Kapazität zu ermitteln, muss Du erstmal definieren, wann der Akku voll und wann er leer ist. Wenn du Einfluss auf die Ladung bzw. Entladung hast, musst du einfach nur von einem Endzustand zum anderen laden bzw. entladen und den Strom integrieren. Wenn du einfach nur "mitmessen" willst ohne Einfluß nehmen zu können, mußt du halt solange den Strom integrieren, bis du zwei Endzustände wenigstens einmal erreicht hattest. Dabei summiert sich der Fehler aber auch auf und man muss sicherstellen. dass die Endzustände überhaupt erreicht werden, sonst ist keine Kapazitätsmessung möglich.
Hm, einfach den Strom über die Zeit integrieren? positiver Strom: Akku wird geladen negativer Strom: Akku wird entladen. Wird die Akkukapazität negativ, stimmt die Anfangskapazität nicht. Sowas lässt sich sehr einfach programmieren. Der Strom kann über einen Referenzwiderstand o.Ä. gemessen werden.
"somit ständig Probleme mit den Einheiten und variablentypen habe."
Kim Schmidt wrote: > "somit ständig Probleme mit den Einheiten und variablentypen > habe." 1 Ampere = 1000 mA (weil Milli nun mal 1/1000 ist) 1 Stunde = 60 Minuten 1 Minute = 60 Sekunden Gegen das Problem der Variablentypen hilft nur: Üben, üben, üben. Eine direkt angegebene Zahl ohne Dezimalpunkt ist erst mal ein Integer (es sei denn sie ist zu groß für einen Integer, dann ist die ein long. Wie auch immer: Sie ist auf jeden Fall ein Ganzzahltyp) Eine direkt angegebene Zahl mit Dezimalpunkt ist ein double, also eine Gleitkommazahl. Bei arithmetischen Ausdrücken orientiert sich der Compiler immer an den Operanden um festzustellen, wie die Operation auszuführen ist. Sind beide Operanden vom Typ Integer, dann wird auch die Operation als Integer-Operation ausgeführt. Ein häufiges Missverständnis besteht darin, dass angenommen wird, dass der Compiler auch noch den Datentyp der Ergebnisvariablen in irgend einer Form berücksichtigt. Rein zur Durchführung der Operation ist ihm dieser Typ komplett schnuppe. double abc; abc = 3 / 2; Hier wird abc den Wert 1 enthalten. Warum? Weil sowohl 3 als auch 2 ein Integer sind. Also wird die Division als Ganzzahldivision durchgeführt und die liefert nun mal 1. Erst danach wird dieses Ergebnis zu einem Gleitkommaergebnis gemacht damit es an abc zu- gewiesen werden kann. Aber: abc = 3 / 2.0; Hier bekommt abc den Wert 1.5 Warum? 3 ist zwar ein Integer. Aber 2.0 ist ein double. Damit wird die Division nicht als Integer-Division durchgeführt, sondern als Gleitkommaoperation und die kann nun mal ein Ergebnis mit Kommastellen liefern. Aber all das ist in C auch nicht anders als in den meisten anderen Programmiersprachen inklusive Pascal auch.
was was ist, ist mir schon kalr. Aber das ständige umwandeln von einem typ in einem anderen macht Probleme. Daher bekomme ich den Zähler nicht zum laufen. Ich hoffe eifentlich, das hier jemand ist, der sowas schon mal programmiert hat. Sitze an dem Problem schon seit einiger Zeit und es nervt. Da ich sehr selten Zeit dafür habe komme ich alle paar Moante mal für einen Tag oder so dazu. Und dazu verbrate ich dann ienen ganzen tag bis spät in die NAcht ohne Ergebnis. Daher hilft hier Übung nicht wirklich. Deswegen nutze ich ein internet Forum als Hilfemedium
Hast Du denn schon eine geeignete Hardware? Wie "gast" schon richtig schrieb, mußt Du die Anfangs- und Endpunkte haben. Dazu benötigst Du einen AD-Wandler, der Dir die Akkuspannung wandelt, und den Spannungsabfall an einem Meßwiderstand, der Dir den Strom (über einen 2. AD-Wandler-Kanal) liefert. Aus der Akkuspannung muß mittels Vergleich ein Auflade- und ein Entladeschluß definiert werden, damit der Akku weder überladen noch tiefentladen wird; das ist von Akkutyp zu Akkutyp (Blei-Akku, NiCd, NiMH, LiION) recht verschieden, weil auch die Lade/Entladekurven verschieden sind. Dann wird der Strom gemessen und in Intervallen von z.B. 1 Sekunde aufaddiert, in einer genügend großen Variablen, z.B. "long" bzw. "int32_t"(32 Bit). Wenn der ADC ein 10-Bit-Typ ist, liest Du ihn in eine int-Variable (16 Bit) aus (int16_t). Diesen Wert addierst Du dann zum long, also z.B. int16_t i_wert=ADConv(IKANAL); int32_t i_summe+=(int32_t)i_wert; Die Funktion ADConv ist Deine selbstgeschriebene AD-Wandler-Funktion, die den Kanal "IKANAL" (dies sei der Kanal, an dem der Meßwiderstand hängt) in einen 16-Bit-Wert wandelt. Die Werte mußt Du geeignet skalieren, also z.B. eine Definition treffen, die z.B. heißt: Integer-Wert in 10mA-Einheiten; dann wäre der Wert 1 eben "10 mA". Ob Du im 10ms-Takt aufaddieren mußt, bezweifle ich; so schnell läuft die Ladung/Entladung eines Akkus doch nicht, da reicht doch ein Sekundentakt. Dann bekommst Du eine Amperestunde, wenn der Wert in Deiner Variablen 360000 beträgt, denn Du addierst dann ja "10mAs" mit jeder Einheit auf. Dann mußt Du noch, wie gesagt, die Spannung im Auge behalten: if (ADConv(UKANAL)>LADESCHLUSS) { ... Ladeschluß bearbeiten } if (ADConv(UKANAL<ENTLADESCHLUSS) { ... Entladeschluß bearbeiten } So oder so ähnlich könnte es aussehen.
Hallo Kim, >Aber das ständige umwandeln von einem typ in einem anderen macht >Probleme. Na schön, aber welche Probleme denn nun genau? Karl-Heinz hat Dir ja schon eine schöne Einführung geschrieben. Man kann Dir auch auf eine konkrete Frage antworten. >Daher hilft hier Übung nicht wirklich. >Deswegen nutze ich ein internet Forum als Hilfemedium Aber einfach nur Probleme lösen ohne sie zu kennen, kann hier auch niemand. Und selbst wenn wir sie kennen, können wir Dir nur helfen Dir selbst zu helfen. Du musst Dich da schon reinknien. Gruss
Hey, ich bin mal so frei und hole einfach mal den Thread wieder hoch. Genau sowas würde ich auch gerne funktionstüchtig aufbauen. Da mir aber die elektronischen Nuancen fehlen, wollte ich mal fragen ob es einen Schaltplan mit einigen kleine/größeren Erklärung und vllt auch schon µC Quelltext für sowas gibt? Mh sowas wie die EierlegendeWollMilchSau Hab die Suchfunktion mal befragt aber iwi nicht das richtige gefunden. Mh fertig gibt es sowas schon, hier zum Bleistift: http://www.cogius.de/Zubehoer/Messgeraete/Watts-Up-20-Power-Checker::488.html?referer=froogle&language=de
in was programmierst Du? Ich hätte Democode in Mikropascal oder AVRco Pascal... Die Strommessung macht Du einfach mit einem Allegro Stromwandler, das IC kann direkt!! bis 150A messen!! http://www.allegromicro.com/en/Products/Categories/Sensors/currentsensor.asp Sind bezahlbar und super einfach zu nutzenEinfach 5V drauf gebgen, dann leigen am Ausgang 2,5V an Bei Vollast +100A sind es 5V bei beim Umpoelen, also -100A sind es 0V am Ausgang
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.