PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Stromzähler



YaNnIk
22.01.2010, 17:22
Hi Leute..

Undzwar will ich mir für ein RC Modell einen Stromsensor bauen, der mir auf einem Display die bereits verbrauchten mA anzeigt..

Also nicht den aktuell fließenden Strom, sondern wie viel mA seid dem Einschalten verbraucht wurden...

Der Strom wird über einen Shunt gemessen und mit einem OP so verstärkt, das 0A 0V entsprechen und 20A 5V

Das ganze kann dann ja über einen ADC in einen digitalen Wert umgewandelt werden..

Leider habe ich keien idee wie das Programm aussehen muss um nicht den aktuellen Stromverbrauch angezeigt zu bekommen sondern den gesamten Verbrauchten Strom seid dem einschalten....

Könnt ihr mir Tipps geben oder mir vielleicht sogar kurz ein passendes Beispielprogramm schreiben???

Wäre sehr dankbar für eure Hilfe ;-)

Mfg Yannik

bluelight_electronic
22.01.2010, 17:39
Hi,

willst du die El. Arbeit also (Watt Stunden) rausmessen oder die Elektrische Ladung?

also wenn du die Ladung messen willst (mAh)hast ja( 1A·1h = 3600 C)

wenn du die Arbeit haben willst wie es beim Stromzähler ist is es halt Arbeit = Leistung * Zeit. also (U * I * t)

einfaches Beispiel lampe 100 Watt läuft 1 Stunde, heißt die Elektrische Arbeit sind 100 Wh. (gebräuchlicher in kWh) dort ist nun noch zu sagen
1 kWh = 1 kW · 1 h = 1000 W · 3600 s = 3,6 · 106 J = 3,6 MJ

gruß
bluelight

YaNnIk
22.01.2010, 19:37
Sorry, aber ich habe kein Wort verstanden xD

Also der Strom verändert sich auch ständig.. Es geht halt darum, das mein Akku 3000mA Kapazität hat, und damit ich weiß, wann ich landen muss, soll da halt etwas rein, was mir anzeigt, wie viel mA ich da bis jetzt rausgesaugt habe..

Thomas$
22.01.2010, 19:54
sollte eigentlich bei dir in der schule dran gewesen sein nagut.
die kapazität sind sicher 3000mAh
und du willst wissen wieviel energie schon draußen ist.
jedoch würd ich dir empflehlen das über die spannung zu machen.
was ist das für ein akku (lipo, nimh....)? es gibt für jeden akku typ eine bestimmte spannung bei der man sagt er ist leer weil man ihn ja nicht tiefentladen will.
du könntest den aktuellen stromverbrauch extra angeben.
ein weiterer tip lies dich bei wikipädia mal über spannung, Strom, Kapatzität und etwas über akkus ein

YaNnIk
22.01.2010, 20:03
Ich weil sehrwohl was Spannung, Strom usw. ist.... -.-
Und das man das auch über die Spannung machen kann ist mir sehr wohl klar (Bei mir ein 3S LiPo , also ungefähr bei einer spannung von 9,5V sollte man langsam mit der Landung beginnen..

Aber mit der herausgenommenen Kapazität wäre es halt genauer.. So weiß ich dann genau, wenn ich z.B. 2500mAh (stimmt, das h habe ich die ganze Zeit vergessen zu schreiben) entnommen habe..

Hier (http://alai.h3m.com/~s0350672/catalogo/product_info.php?cPath=43_63_81&products_id=418) kannst du mal sehen was ich meine.. Das ganze funktioniert hier über ein OSD (On Screen Display) da wird auch der aktuelle Strom angezeigt und de gesammte bisher entnommene kapazität.. Und da mir so ein OSD zu teuer ist, will ich halt (vorläufig) eine low-budget lösung machen..

kounst
22.01.2010, 20:23
hi,

Ich denke des sollte so funktionieren:

Wenn du z.B. alle Sekunde den Stromer in Amper ermittelst und die Messwerte immer aufaddierst sollte die Ladung in As rauskommen.

Also:
Summe(aller Strommessungen in A)*T(Periodendauer in s) = Kapazität(in As)


Rein intuitiv denk ich das des so stimmen müsste. Kann auch durchaus falsch sein!!

bluelight_electronic
22.01.2010, 20:32
na also steht doch oben *gg*

das ganz einfach (bei Lipos musst du sowieso ein Tiefentlade Schutz für jede Zelle machen (wenns geht) ansonsten musst zumindest mal schaun dass dein LipoPack auf keinen fall unter 9,3V Entlädst. (Also Die Spannung auf jeden Fall mit messen!)

so zu deiner Kapazität.


1000mA·1h = 1000mAh oder auch 3600 C oder auch 3600 As

Miss den Strom und multiplizier diesen mit der laufzeit (am sinnvollsten Stunden).
Das halt kontinuierlich.

Beispiel deine Schaltung bezieht immer 1000mA

Laufzeit ist 5min also ca 0,083 Stunden

sind also 30000 mA/Sekunden was n unsinnige Angabe ist also in Stunden

(1000mA * 0,083 Stunden) = 83mAh.

Bei 30 min wären dass dann

(1000mA * 0,5 Stunden) = 500mAh.

bei 60 min also

(1000mA * 1) = 1000mAh.

oder eben bei 2 1/2 Stunden

(1000mA * 2,5) = 2500mAh.

hoffe dir ist das nun klarer :)

mfg


// edit ich denke mAh ist in diesem Fall sinvoller für dich als As (Amperesekunden) was gleich mit Coulomb zu setzen ist.

YaNnIk
22.01.2010, 23:49
So, jetzt tun mir die Augen weh, aber ich glaube ich habs rausbekommen :D:D Die Updaterate ist jetzt 0,5Sekunden und es wirrd der Aktuelle Stromverbrauch angezeigt und der gesammte Verbrauchte Strom

Hier der Code :


$regfile = "m8def.dat" 'Definieren des Chips
$crystal = 8000000 'Frequenz

Config Adc = Single , Prescaler = Auto , Reference = Off 'ADC konfigurieren mir Aref als Referenzspannung
Start Adc

Config Lcd = 16 * 1 'LCD konfigurieren
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4

Cls

Config Timer1 = Timer ; Prescaler = 256 'Timer1 (16-bit) konfigurieren
Start Timer1 'Mit dem Prescaler ergibt es 31250Hz
Stop Timer1


Dim Strom2 As String * 5 'Strom 0 bis 1.099.511.628.000
Dim Strom As String * 4 'Strom2 0 bis 4.294.967.296
Dim Strom_wert As Word 'Strom_wert 0 bis 65.536
Dim Verbraucht As Word 'Verbraucht 0 bis 65.536


Do

Gosub Hauptprogramm ' Verweis auf Subroutine

Loop

End

Hauptprogramm:

Timer1 = 0
Start Timer1 'Timer1 Starten

Strom_wert = Getadc(5) 'ADC an Portc.5 auslesen (Werte 0 bis 1024)
Strom = Strom + Strom_wert 'Gemessener Wert wird in jedem Durchgang addiert
Strom2 = Strom * 100000 'Umrechnung des Wertes in den realen Amperewert (in mAh)
Strom2 = Strom2 / 4096 'Umrechnung des Wertes in den realen Amperewert (in mAh)
Verbraucht = Strom2 / 7200 'Umrechnung wie viel mA in einer halben Sekunde verbraucht werden

If Verbraucht < 10 Then
Locate 1 , 4
End If

If Verbraucht < 100 Then
Locate 1 , 3
End If

If Verbraucht < 1000 Then
Locate 1 , 2
Else
Locate 1 , 1
End If

Lcd Verbraucht ; " mAh" 'die bisher verbrauchten mAh werden angezeigt

Strom2 = Strom_wert * 100 'Aktueller Stromverbrauch (in A) ausrechnen
Strom2 = Strom2 / 4096

If Strom2 < 10 Then
Locate 1 , 14
Else
Locate 1 , 13
End If

Lcd Strom2 'Am Ende des Displays wird der aktuelle Stromverbrauch angezeigt
Locate 1 , 16
Lcd "A"

Gosub Warten 'Jetzt ist der Auswertung fertig und der AVR soll warten bis ne halbe Sekunde rum ist

Return


Warten:

If Timer1 > 15624 Then 'Wir errinnern uns - am anfang wurde der Timer gestartet, bei 32,25kHz ist er nach genau einer halben Sekunde bei 15625
Stop Timer1
Gosub Hauptprogramm 'Dann wird das Hautprogramm wieder gestartet und die Werte werden Aktualisiert
Else
Gosub Warten 'Wenn der Wert noch nicht erreicht ist Wird die Subroutine so lange wiederholt, bis der Wert erricht wird
End If

Return

Dabei gibt Bascom mir allerdings noch zwei Errors aus :

Error : 86 Line : 13
Error : 242 Line : 38


Ihr könnts ja mal kopieren und dann könnt ihr genaueres zu den Fehler lesen..

Was haltet ihr von dem Code?? Meiner Meinung nach müsste das dunktionieren, aber ich hol mir lieber noch einmal eine Expertenmeinung ;-)

YaNnIk
22.01.2010, 23:50
So, jetzt tun mir die Augen weh, aber ich glaube ich habs rausbekommen :D:D Die Updaterate ist jetzt 0,5Sekunden und es wirrd der Aktuelle Stromverbrauch angezeigt und der gesammte Verbrauchte Strom

Hier der Code :


$regfile = "m8def.dat" 'Definieren des Chips
$crystal = 8000000 'Frequenz

Config Adc = Single , Prescaler = Auto , Reference = Off 'ADC konfigurieren mir Aref als Referenzspannung
Start Adc

Config Lcd = 16 * 1 'LCD konfigurieren
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4

Cls

Config Timer1 = Timer ; Prescaler = 256 'Timer1 (16-bit) konfigurieren
Start Timer1 'Mit dem Prescaler ergibt es 31250Hz
Stop Timer1


Dim Strom2 As String * 5 'Strom 0 bis 1.099.511.628.000
Dim Strom As String * 4 'Strom2 0 bis 4.294.967.296
Dim Strom_wert As Word 'Strom_wert 0 bis 65.536
Dim Verbraucht As Word 'Verbraucht 0 bis 65.536


Do

Gosub Hauptprogramm ' Verweis auf Subroutine

Loop

End

Hauptprogramm:

Timer1 = 0
Start Timer1 'Timer1 Starten

Strom_wert = Getadc(5) 'ADC an Portc.5 auslesen (Werte 0 bis 1024)
Strom = Strom + Strom_wert 'Gemessener Wert wird in jedem Durchgang addiert
Strom2 = Strom * 100000 'Umrechnung des Wertes in den realen Amperewert (in mAh)
Strom2 = Strom2 / 4096 'Umrechnung des Wertes in den realen Amperewert (in mAh)
Verbraucht = Strom2 / 7200 'Umrechnung wie viel mA in einer halben Sekunde verbraucht werden

If Verbraucht < 10 Then
Locate 1 , 4
End If

If Verbraucht < 100 Then
Locate 1 , 3
End If

If Verbraucht < 1000 Then
Locate 1 , 2
Else
Locate 1 , 1
End If

Lcd Verbraucht ; " mAh" 'die bisher verbrauchten mAh werden angezeigt

Strom2 = Strom_wert * 100 'Aktueller Stromverbrauch (in A) ausrechnen
Strom2 = Strom2 / 4096

If Strom2 < 10 Then
Locate 1 , 14
Else
Locate 1 , 13
End If

Lcd Strom2 'Am Ende des Displays wird der aktuelle Stromverbrauch angezeigt
Locate 1 , 16
Lcd "A"

Gosub Warten 'Jetzt ist der Auswertung fertig und der AVR soll warten bis ne halbe Sekunde rum ist

Return


Warten:

If Timer1 > 15624 Then 'Wir errinnern uns - am anfang wurde der Timer gestartet, bei 32,25kHz ist er nach genau einer halben Sekunde bei 15625
Stop Timer1
Gosub Hauptprogramm 'Dann wird das Hautprogramm wieder gestartet und die Werte werden Aktualisiert
Else
Gosub Warten 'Wenn der Wert noch nicht erreicht ist Wird die Subroutine so lange wiederholt, bis der Wert erricht wird
End If

Return

Dabei gibt Bascom mir allerdings noch zwei Errors aus :

Error : 86 Line : 13
Error : 242 Line : 38


Ihr könnts ja mal kopieren und dann könnt ihr genaueres zu den Fehler lesen..

Was haltet ihr von dem Code?? Meiner Meinung nach müsste das dunktionieren, aber ich hol mir lieber noch einmal eine Expertenmeinung ;-)

Besserwessi
23.01.2010, 01:16
So geht das mit dem Code noch nicht. Die Version davor war schon besser.

Mit Stringvariablen kann man nicht rechnen oder ihnen so einfach Werte zuweisen. Das aufsummieren sollte man besser mit einer variable vom Typ long machen, und dann erst vor der Ausgabe skalieren. Man wird vermutlich auch einen Offset berücksichtigen müssen, denn auch ohne Strom wird der ADC nicht genau 0 geben.

Man wird auch besser nicht nach jedem ADC-wert eine Ausgange machen: der ADC sollte schon recht schnell abgefragt werden, damit der analoge Filter nicht so aufwendig wird. Die Ausgabe sollte man höchstens etwa 3 mal die Sekunde aktuallisieren, eher noch deutlich langsamer.

bluelight_electronic
23.01.2010, 11:57
Hi,

also das Display würd ich maximal alle Sekunde Updaten...

dann hat sich ein kleiner tipp fehler in den kommentaren eingeschlichen.

"gestartet, bei 32,25kHz ist er nach genau einer halben Sekunde bei 15625
Stop Timer1 "

also beim Prescaler von 256 hast 31,25khz und und nicht 32 =) (das mal nur so am rande *g*)

da ich mich mit basecom null auskenne kann ich dir zu den fehlern nicht helfen.

Zum Fehler in Line 38, du versuchst nen String und nen Word zu addieren, das klappt nicht ^^ (ich hoffe mal auch in Basic nicht :o)

Als ich mal in Basecom was getestet hatte musst ich "Enable Timer1" zum starten nutzen ist das mittlerweile anders ?

YaNnIk
23.01.2010, 16:18
So, hier jetzt meine zweite Version, die sich auch ohne Fehler kompilieren lässt :


$regfile = "m8def.dat" 'Definieren des Chips
$crystal = 8000000 'Frequenz

Config Adc = Single , Prescaler = Auto , Reference = Off 'ADC konfigurieren mir Aref als Referenzspannung
Start Adc

Config Lcd = 16 * 1 'LCD konfigurieren
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4

Cls

Config Timer1 = Timer , Prescale = 256 'Timer1 (16-bit) konfigurieren
Start Timer1 'Mit dem Prescaler ergibt es 31250Hz
Stop Timer1


Dim Strom2 As Single 'Strom 1,5*10^-45 bis 3,4*10^38
Dim Strom As Single 'Strom2 1,5*10^-45 bis 3,4*10^38
Dim Strom_wert As Word 'Strom_wert 0 bis 65.536
Dim Verbraucht As Word 'Verbraucht 0 bis 65.536


Do

Gosub Hauptprogramm ' Verweis auf Subroutine

Loop

End

Hauptprogramm:

Timer1 = 0
Start Timer1 'Timer1 Starten

Strom_wert = Getadc(5) 'ADC an Portc.5 auslesen (Werte 0 bis 1024)
Strom = Strom + Strom_wert 'Gemessener Wert wird in jedem Durchgang addiert
Strom2 = Strom * 100000 'Umrechnung des Wertes in den realen Amperewert (in mAh)
Strom2 = Strom2 / 4096 'Umrechnung des Wertes in den realen Amperewert (in mAh)
Verbraucht = Strom2 / 3600 'Umrechnung wie viel mA in einer halben Sekunde verbraucht werden

If Verbraucht < 10 Then
Locate 1 , 4
End If

If Verbraucht < 100 Then
Locate 1 , 3
End If

If Verbraucht < 1000 Then
Locate 1 , 2
Else
Locate 1 , 1
End If

Lcd Verbraucht ; " mAh" 'die bisher verbrauchten mAh werden angezeigt

Strom2 = Strom_wert * 100 'Aktueller Stromverbrauch (in A) ausrechnen
Strom2 = Strom2 / 4096

If Strom2 < 10 Then
Locate 1 , 14
Else
Locate 1 , 13
End If

Lcd Strom2 'Am Ende des Displays wird der aktuelle Stromverbrauch angezeigt
Locate 1 , 16
Lcd "A"

Gosub Warten 'Jetzt ist der Auswertung fertig und der AVR soll warten bis ne halbe Sekunde rum ist

Return


Warten:

If Timer1 > 31249 Then 'Wir errinnern uns - am anfang wurde der Timer gestartet, bei 32,25kHz ist er nach genau einer halben Sekunde bei 15625
Stop Timer1
Gosub Hauptprogramm 'Dann wird das Hautprogramm wieder gestartet und die Werte werden Aktualisiert
Else
Gosub Warten 'Wenn der Wert noch nicht erreicht ist Wird die Subroutine so lange wiederholt, bis der Wert erricht wird
End If

Return


Ich habe die Updaterate jetzt wieder auf eine Sekunde erhöht..

Werde die Hardware bei Zeiten mal aufbauen und die SOftware testen.. Ich werde dann berichten ;-)