Forum: Compiler & IDEs Kapazitätsanzeige programmieren


von Kim S. (Gast)


Lesenswert?

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

von gast (Gast)


Lesenswert?

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.

von Kim S. (Gast)


Lesenswert?

nein, ich meinte eigentlich nur die Ah.
Mein Fehler

von Tilo (Gast)


Lesenswert?

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.

von Kim S. (Gast)


Lesenswert?

"somit ständig Probleme mit den Einheiten und variablentypen
habe."

von Karl H. (kbuchegg)


Lesenswert?

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.

von Kim S. (Gast)


Lesenswert?

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

von Günter R. (galileo14)


Lesenswert?

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.

von Zumwinkel (Gast)


Lesenswert?

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

von Ups M. (pede-bro)


Lesenswert?

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

von Kim S. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.