Problem Battery Charge

albertodg2

New member
hello:
I put two batteries in series 12V 7A.
with aap cell battery brand me

Volt 18.81
gohome at 17V
switch at 15 V

charge 18.86
charge zero sense 465
Battery Factor 4.6
Charge Factor 2.7

the problem is the NEXT.

Whenever I turn the first thing to do is go to the charging station
but should (I think) start moving until the voltage drops below 17V (go home)

AC12 are all 30 A 5A no.
Any suggestions or changes to the program

thanks
 
Ich wollte gerade den Strom lade Sensor kalibrieren, habe aber Probleme damit. Ich verwende den standart 5A Sensor

Das Problem ist das weder in der Seriellen Ausgabe noch auf der Handy App der Ladestrom angezeigt wird. Wo kann ich Einfluss darauf nehmen ?? bzw wie sind die korrekten Einstellungen dafür.

Ist es wichtig das der Sensor von der richtigen Seite mit Strom durch flossen wird (Stromrichtung) damit dieser korrekt ausgewertet wird ? Ich messe am Pin A8 ca 2,46V . Trotzdem werden überall 0A angezeigt selbst wenn ich den Sensor abziehe.
Wo muss ich die korrekten Einstellungen vornehmen bzw kann die Stromrichtung in der Formel umdrehen ?


batMonitor = 1; // monitor battery and charge voltage?
batGoHomeIfBelow = 23.7; // drive home voltage (Volt)
batSwitchOffIfBelow = 21.7; // switch off if below voltage (Volt)
batFactor = 0.0612; // battery conversion factor Uwe geändert von 0.0658 auf 0.0612
batChgFactor = 0.0658; // battery conversion factor
batSenseZero =77; // battery volt sense zero point
batFull =27.0; // battery reference Voltage (fully charged) Uwe geändert von 29.4 auf 27.0
chgSenseZero = 0; // charge current sense zero point (auch schon 512 probiert)
chgFactor = 2.7; // charge current conversion factor


Ich benutze Softwareversion 272

Gruß Uwe
 
Hallo Uwe,

ich habe nur kurz im Code nachgesehen, scheinbar fehlt dort eine Zeile für die Aktivierung des Pins beim ADC-Managers?

mower.cpp (Zeile 367):
ADCMan.setCapture(pinChargeCurrent, 1, true);

Das Einlesen erfolgt dann:
-robot.cpp (Zeile 1226)

Eine Anzeige gibt es in:
-Konsole: robot.cpp (Zeile 783)
-pfodApp: pfod.cpp (Zeile 507)


Gruss,
Alexander
 
Danke für die Info
ein paar der Zeilen hatte ich bereits gefunden.

Hast du mal eine Kurze Erklärung was der ADC-Manager macht?

Und wo passiert die Umrechnung von den eingelesenen Wert in den Ausgabe wert in mA.
Ich habe die Formel gesucht und nicht gefunden womit der chgCurrent Wert ausgerechnet wird.

Außerdem habe ich nach diesen Variabelen gesucht die ja eigentlich auch in der Formel berücksichtigt werden müssten um chgCurrent auszurechnen. Habe diese aber ebenfalls über die Suchfunktion nicht gefunden

Könnte es daher sein das die ganze Formel fehlt oder habe ich da noch etwas übersehen

chgSenseZero = 0; // charge current sense zero point (Zeile 137)
chgFactor = 2.7; // charge current conversion factor (Zeile 138)

case SEN_CHG_CURRENT: return ADCMan.read(pinChargeCurrent); break; (Zeile409)



Gruß
Uwe
 
Ja, hast Recht - anscheinend fehlt da noch die Umrechnung.

Zum ADC-Manager:
In einfachen Programmen wird zum Einlesen eines analogen Wertes einfach solange gewartet, bis die Messung abgeschlossen ist. Dann erst läuft das Programm weiter. Das mag für einfache Programme gut funktionieren, wenn aber 5 Sensoren eingelesen werden sollen und dann womöglich noch ein Sensor dabei ist, für den nicht eine Messung sondern 100 Messungen pro Aufruf erfolgen sollen (Stichwort: unser Schleifensensor), kommt jedes Programm zum Stillstand. Für andere Aufgaben wäre so gut wie keine Rechenzeit mehr übrig. Das Programm würde quasi die meiste Zeit mit "warten" auf das Meßergebnis verbringen. Leider sehen die Arduino-Bibliotheken (Befehle "analogRead") das aber genau so vor.

Technisch bietet der Mikrocontroller jedoch eine viel elegantere Lösung an: man teilt ihm mit, für welchen Pin man eine ADC-Wandlung durchführen möchte und dass er bei Abschluß der Messung sich einfach wieder melden soll (d.h. das fortlaufende Programm unterbechen soll). Dieses Konzept nennt man ganz simpel "Interrupt" (Unterbrechung).

Der ADC-Manager kapselt diesen Ansatz (und die dafür notwendige Mikrocontroller-Programmierung) in einer fertigen C++-Klasse. Man teilt dem ADC-Manager mit für welche Pins ADC-Wandlungen durchgeführt werden sollen. Dann ruft man den Manager einfach periodisch auf (in der Hauptschleife). Den Rest erledigt der ADC-Manager dann selber (Ablegen der fertigen Meßergebnisse im Speicher, Starten einer neuen Messung).

Beispiel:


Code:
// ADC initialisieren: 
ADCMan.init();
// analogen Pin am ADC-Manager registrieren:
ADCMan.setCapture(pinMotorMowSense, 1, 1);

// Programmschleife
while (true){
  ADCMan.run();
  // Meßergebnis abholen
  if (ADCMan.isCaptureComplete(pinMotorMowSense)){
    int value = ADCMan.read(pinMotorMowSense);
  }
}
 
Hallo, ich habe noch mal eine Nachfrage
Ich habe mich heute nochmal mit dem Ladestromsensor beschäftigt und habe unter anderem in der
mower.cpp (Zeile 367):
ADCMan.setCapture(pinChargeCurrent, 1, true);
eingefügt.

Was mir aber dabei nicht klar ist:

Was sage ich aber danach mit dem Wert 1 aus?
Was sage ich aber danach mit dem Wert true aus? Ich habe auch einige Zeilen gesehen wo false steht?

Funktioniert das dann bei allen 16 Analogen Eingängen, oder nur bei den ersten 8 Eingängen


in der englischen Beschreibung habe ich folgendes gelesen (wenn ich es richtig übersetzt habe).

Wenn ich es richtig verstanden habe soll es möglich sein im Puffer des ADC-Manager automatisch mehre Messwerte zu speichern woraus ein Mittelwert gebildet werden kann.
Womit rufe ich diese Funktion auf bzw frage den Mittelwert ab.
Ich versuche noch den Messwert des Ladestromsensors zu beruhigen damit die Sprünge nicht so groß sind.

Gruß
Uwe
 
@uwe:

ADCMan.setCapture:
Die Beschreibung der einzelnen Funktionen findet man in "adcman.h":

Code:
// configure sampling for pin:
    // samplecount = 1: 10 bit sampling (unsigned)
    // samplecount > 1: 8 bit sampling (signed - zero = VCC/2)
    void setCapture(byte pin, byte samplecount, boolean autoCalibrateOfs);


Der Parameter "sampleCount" gibt also die Anzahl Samples (ADC-Wandlungen) an, die für diesen Pin durchgeführt werden sollen. Der Parameter "autoCalibrateOfs" gibt an, ob für diesen Pin ein Null-Punkt Offset ermittelt werden wenn die ADC-Kalibrierung (z.B. via pfodApp) durchgeführt wird. Wird eine auomatische Kalibrierung für diesen Pin zugelassen, so wird :
1. beim Kalibrieren einmalig der aktuelle ADC-Wert ermittelt (Null-Punkt Wert/Offset )
2. bei allen späteren ADC-Wandlungen dieser Offset abezogen

Da der Stromsensor z.B. 2,5 Volt liefert wenn kein Strom fließt (würde ohne Kalibrierung beispielsweise den ADC-Wert 511 ergeben), ist es sinnvoll für diesen die Kalibrierung zuzulassen. So liefert der ADCManager für diesen Fall dann bespielsweise den ADC-Wert 0.


Median:
Das hat Max entwickelt - wenn ich das richtig sehe kann man damit den Median ermitteln (wenn SampleCount >1 für diesen Pin ist):


Code:
ADCManager.readMedian(pinCurrent)


Allerdings kostet das schon mehr Rechenzeit (und dadurch würden evtl. andere Dinge wie z.B. ADC-Wandlung für unsere Schleife zu kurz kommen) - ich würde für den Stromsensor stattdessen einen "Tiefpaß-Filter" anwenden (so steht es m.E. auch bereits schon im Code):

Beispiel:


Code:
double chgCurrent; // diese Variable ist bereits in robot.h definiert

aus Funktion "robot.cpp: readSensors":

double current = ((double)((int)(readSensor(SEN_CHG_CURRENT) / 10))) / 10.0;      
double accel = 0.01;

if (abs(chgCurrent-current)>0.4) 
  // falls die Abweichung von neuem Meßwert und alten Meßwert zu groß ist => neuem Meßwert vertrauen
  chgCurrent = current; 
else 
  // andernfals Tiefpaß-Filtern: neuer Meßwert ist: (1-Gewichtung) * alter Meßwert  + Gewichtung * neuer Meßwert
  chgCurrent = (1.0-accel) * chgCurrent + accel * current;


Durch den Tiefpaß nähert sich der Meßwert langsam dem Mittelwert an.
http://helpful.knobs-dials.com/index.php/Low-pass_filter
Beispiel: Oben Rohwerte (ohne Tiefpaß), unten Tiefpaß der Messungen jedes Mal die Gewichtung (für den aktuellen Meßwert) etwas geringer eingestellt. Das Signal paßt sich immer stärker dem Mittelwert an:
Ewma-lowpass-example.png

Attachment: https://forum.ardumower.de/data/media/kunena/attachments/905/Ewma-lowpass-example.png/
 
Zuletzt bearbeitet von einem Moderator:
Hallo,
ich bitte nochmals um Hilfe.
Bei mir wird auch kein Ladestrom angezeigt, dieser ist immer 0 obwohl ich am Analogeingang die Spannung, bzw den Spannungsunterschied wenn Ladestrom fließt, messen kann. Ich benutze die AC712 5A Sensoren.
in der Software habe ich auf diese umgestellt, Batt Monitor ist an, nur Anzeigen mag er in der App nicht.
Und ich vermute das er dann auch nicht in der Ladestation stehen bleibt wenn ich denn endlich eine fertig habe.
 
kannst du deine Mover.Cpp Datei mal hier reinstellen bitte normal und nicht als pdf
in den Zusammenhang kann ich nur die INA 169 empfehlen.

Die ac712 5a Schwanken teilweise sehr stark.

Gruß
Uwe
 
setze das

"chgChange = 0; // Messwertumkehr von - nach + 1 oder 0"

auf 1

Bei mir hat es geholfen.

Gruß
Volker
 
@ Volker du hast es ja schon geschrieben.
der ACS gibt ca 2,5V aus wenn kein Strom fließt. Je nachdem wie herum der Ein oder Ausgang angeschlossen ist verändert sich der Wert. Wird mehr oder weniger. Das kann dazu führen das ein negativer Strom angezeigt wird. "Negative Ströme" gibt es eigentlich nicht und werden werden nicht angezeigt sondern werden als 0Ampere angezeigt.
Die Messwertumkehr ändert das um. Das hat den selben Effekt als wenn man den Ein und Ausgang am ACS miteinander vertauscht.

Gruß
Uwe
 
Ich habs versucht, leider wieder ohne erfolg. Am Pin A8 messe ich die Spannungserhöhung wenn Strom fließt, aber es wird nix angezeigt. Arduino ist auch schon ein neuer, nix hilft. Werd noch mal irre.

Trotzdem Danke für die Tips
 
Dann teste mal folgendes:
stelle mal bei chgSelection = 0 ein
Damit werden die Messwerte vom Analogpin in der Konsole direkt ohne weitere Berechnung angezeigt


Code:
// Sensorausgabe Konsole      (chgSelection =0)
  // Einstellungen ACS712 5A    (chgSelection =1   /   chgSenseZero ~ 511    /    chgFactor = 39    /    chgSense =185.0    /    chgChange = 0 oder 1    (je nach  Stromrichtung)   /   chgNull  = 2)
  // Einstellungen INA169 board (chgSelection =2)
  chgSelection    = 0;
  chgSenseZero    = 511;        // charge current sense zero point
  chgFactor       = 39;         // charge current conversion factor   - Empfindlichkeit nimmt mit ca. 39/V Vcc ab
  chgSense        = 185.0;      // mV/A empfindlichkeit des Ladestromsensors in mV/A (Für ACS712 5A = 185)
  chgChange       = 0;          // Messwertumkehr von - nach +         1 oder 0
  chgNull         = 2;          // Nullduchgang abziehen (1 oder 2)


Im Shop gibt es mittlerweile auch eine Platine. ;)
Ich weiß nicht was du sonst noch an Komponenten verwendest wie z.B Motortreiber usw
 
Hello,
i am partly using my own code and partly the code from ARDUMOWER for my project (plan was to really learn the arduino language). I am using the reciever sensor code from the perimeter wire from ARDUMOWER (i couldnt code that) so I am now using the adcman.h library which prevents an analogRead().

I am having trouble to convert my code which uses analogRead() into the adcman functions. At the moment reading the A1 (Rainsensor) and A3 (voltage) pins returns a maximum value of 127, but in analogRead(A3) I get a value of 564 and over 600 for A1

Would be great if someone could help me with the code translation into adcman. Here are two versions I have written so far of the code I have which should return the same result (but doesnt in adcman as the max value read is 127)

Thanks to anyone who can help!
Phil.
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/4293/ADCMan_Volt_Reading_2017-07-27.ino/
 
Zuletzt bearbeitet von einem Moderator:
Oben