Perimeter V2 VER 592 mit ACS712-5A Sensor

Hallo,

ich brauch Hilfe!!!!!
Gestern ist mein Schleifengenerator fertig geworden. Ich habe einen Nano + L298N Dual H + ACS712 5A + DC-DC verbaut. Ich bekommen aber keine sinnigen Werte für den Stromsensor zustande.

Hat jemand den Sensor mit Perimeter V2 Software im Einsatz?
Kann mir jemand beim Code anpassen helfen, damit der Sensorwert richtig berechnet wird?



Code:
if (USE_PERI_CURRENT) {
      // determine perimeter current (Ampere)
      periCurrentMeasurements.getAverage(v);    
      //periCurrentAvg = ((double)v) / 1023.0 * 1.1 / 0.525;   // 525 mV per amp (ORIGINAL)
      periCurrentAvg = ((double)v) / 1023.0 * 0.048875855327468 / 2.5 ;   // for ACS 712 5A (mein Versuch)
      unsigned int h;
      periCurrentMeasurements.getHighest(h);    
      //periCurrentMax = ((double)h) / 1023.0 * 1.1 / 0.525;   // 525 mV per amp (ORIGINAL)
      periCurrentMax = ((double)h) / 1023.0 * 0.048875855327468 / 2.5 ;   // for ACS 712 5A (mein Versuch)
    }
 
Kennst du diese Seite schon: http://shelvin.de/den-acs-712-5a-strom-sensor-am-arduino-auslesen/

Im alten arduino Code für den Mover findest du folgendes. Vielleicht hilft dir das weiter:

Code:
//  Anfang Ladestromsensor berechnen
   // ********************************************************************
   //  Variabeln 
    float vcc, asensor, amp;     
    float chgAMP;                                               //Sensorwert des Ladestrompin

    //Sensor Wert Ausgabe auf Seriellen Monitor oder HandyApp   wenn chgSelection =0
    if ((chgSelection)==0) chgCurrent = current;

    // Berechnung für Ladestromsensor ACS712 5A                 wenn chgSelection =1
    if ((chgSelection)==1) {

    chgAMP = currentmitte;                                     //Sensorwert übergabe vom Ladestrompin
    vcc = (float) 3.30 / chgSenseZero * 1023.0;                // Versorgungsspannung ermitteln!  chgSenseZero=511  ->Die Genauigkeit kann erhöt werden wenn der 3.3V Pin an ein Analogen Pin eingelesen wird. Dann ist vcc = (float) 3.30 / analogRead(X) * 1023.0;
    asensor = (float) chgAMP * vcc / 1023.0;                   // Messwert auslesen
    asensor = (float) asensor - (vcc/chgNull);                 // Nulldurchgang (vcc/2) abziehen
    chgSense = (float) chgSense - ((5.00-vcc)*chgFactor);      // Korrekturfactor für Vcc!  chgFactor=39
    amp = (float) asensor /chgSense *1000 ;                    // Ampere berechnen
    if (chgChange ==1) amp = amp / -1;                         //Lade Strom Messwertumkehr von - nach +
    if (amp<0.0) chgCurrent = 0; else chgCurrent = amp;        // Messwertrückgabe in chgCurrent   (Wenn Messwert kleiner als 0 dann Messwert =0 anssonsten messwertau8sgabe in Ampere)
    }
    
    // Berechnung für Ladestromsensor INA169 board              wenn chgSelection =2
    if ((chgSelection)==2) {
    chgAMP = currentmitte;
    asensor = ((chgAMP * 5) / 1023);                          // umrechnen von messwert in Spannung (5V Reference)
    amp = asensor / (10 * 0,1);                               // Ampere berechnen RL = 10k    Is = (Vout x 1k) / (RS x RL)
    if (amp<0.0) chgCurrent = 0; else chgCurrent = amp;       // Messwertrückgabe in chgCurrent   (Wenn Messwert kleiner als 0 dann Messwert =0 ansonsten Messwertaußsgabe in Ampere)
    }  
    
    
    //  Ladestromsensor berechnen ********** Ende



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    = 1;
  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)

Gruß
Uwe
 
@UweZ: Vorsicht, das ist der Code vom Ladestromsensor.

@Silas

Okay, gehen wir das ganze systematisch an.
Was genau sind für dich keine sinnigen Werte? Poste mal bitte ein paar Zeilen des Consolenoutputs.

1.
DCDC funktioniert, Ausgangsspannung ist auf wieviel V eingestellt?.

2.
Was macht die LED (Pin13) ?
ON: perimeter closed, OFF: perimeter open, BLINK: robot is charging

3. Benutzt du ein Poti an A3 um den Duty Cycle zu regeln? Use pot ggf auf 1 gesetzt?
#define USE_POT 0 // use potentiometer for current control? (set to '0' if not connected!)

4. Strommessung der Schleife an A0 angeschlossen und auf 1 definiert? Bei 0mA sollten hier relativ genau 2V5 anliegen.
#define USE_PERI_CURRENT 1 // use pinFeedback for perimeter current measurements? (set to '0' if not connected!)

5. Fault Pin vom Motortreiber an Pin 4 angeschlossen und ggf. definiert?
#define USE_PERI_FAULT 0

6. Spannungen an allen ogn. Pins bitte messen.

Mir würde die Information zu der LED vermutlich sehr bei der Fehlereingrenzung helfen.

Grüße, Stephan

Nachtrag:
Hast du den Schleifenwiderstand gemessen? Auch gegen die Erde (auf Schluss/Offen geprüft?)
 
Der Codeschnipsel ist schon der richtige Teil, den Uwe da rausgesucht hat.

Zunächst muss man ja wissen, dass der Sensor bei 0,5*U seinen 0-Wert hat. Dahin muss er kalibriert werden. Also man nimmt den ADC-Wert, der im Leerlauf (ohne Strom) rausgeschmissen wird und speichert ihn. Anschließend zieht man ihn immer vom ADC-Wert ab (oder addiert ihn, je nachdem wie rum man die Kabel angeschlossen hat, der Sensor kann beide Stromrichtungen messen). Und dann müsste die Formel erst zum Tragen kommen, die Silas gepostet hat, um den Strom zu berechnen.

Gruß,
Jem
 
@ Stephan:

Sinnige Werte sollten irgendwo bei 0.00 sein

Schleife war ca. 2m Draht und 22Ohm Last, zusammen 22,6Ohm (hatte nichts anderes da).
Schleifenwiederstand:
IMG_20160504_203557.jpg


Console war so:

time=34 chgCurrent=0.000 chgCurrentADC=1023.00 isCharging=0 periCurrent avg=0.02 max=0.02 duty=1.00 dutyPWM=255 faults=0

zu 1. DC-DC ist OK und auf 5,05V eingestellt (5,00V am Arduino und ACS)

zu 2. LED ist aus

zu 3. #define USE_POT ist 0 (keins dran)

zu 4. #define USE_PERI_CURRENT ist 1 (an A0 angeschlossen und es sind im Leerlauf ca. 2,512V / bei ca. 530mA sind es 2,574V)
ohne Schleife:
IMG_20160504_204209.jpg


mit Schleife:
IMG_20160504_204310.jpg


zu 5. #define USE_PERI_FAULT ist 0 (nicht angeschlossen)

zu 6. siehe Bilder oben

Hier noch ein Bild der Spannungsänderung mit dem Oszi gemessen, wo ich die Schleife angeschlossen habe:
IMG_20160504_204959.jpg

Attachment: https://forum.ardumower.de/data/media/kunena/attachments/2109/IMG_20160504_203557.jpg/
 
Zuletzt bearbeitet von einem Moderator:
Ich habe gehofft, es hat jemand gleich den passenden Code.

Ich werde mich wohl mal tiefer in den Code reinarbeiten müssen und den Teil umschreiben für den ACS712-5A.
 
Danke für die Info, bin gerade nur unterwegs und werde mich später damit befassen...
Mir kommt es nur seltsam vor, da ich auch den ACS verwende...

Grüße, Stephan
 
Ich werde den Code von Uwe rein basteln.
Bei der Original Schleife hab ich auch höhere Strome. Mal sehen, was da so zu messen ist. Ich denke nicht so paar 0,0..V ;)

@Stephan: Wie sieht dein Code aus? Hast du die Berechnung angepasst oder Original gelassen.
 
Hallo zusammen,
ich bin mir nicht mehr ganz sicher, ob ich den Code damals angepasst habe.
Soweit ich mich erinnere, bin ich beim Sender im Developer Mode unterwegs.
Ob ich die Stromwerte jemals mit dem DMM geprüft habe, weiß ich mittlerweile auch nicht mehr -.-

Wenn ich mal den aktuellen Code der Version 592 durchschaue, kommt mir auch der Faktor von 525 mV je Ampere etwas spanisch vor (Oder ist der vom INA?)

Wenn ich den 5A Typ vom ACS verwende ist dieser mit 185 mv/Ampere angegeben.

0,0A = 2,512V in deinem Fall
0,53A = 2,574V

Alle temperaturabhängigen Varianzen außer Acht gelassen komme ich gerechnet auf 2,61005 V(welche in den 1,5% Toleranz des Chips enthalten sind).

Wenn ich nicht falsch liege, müsstest du zum einen den Faktor hier anpassen:

Code:
if (USE_PERI_CURRENT) {
      // determine perimeter current (Ampere)
      periCurrentMeasurements.getAverage(v);    
      periCurrentAvg = ((double)v) / 1023.0 * 1.1 / [b]0.525;   // 525 mV per amp [/b]   => 0.185
      unsigned int h;
      periCurrentMeasurements.getHighest(h);    
      periCurrentMax = ((double)h) / 1023.0 * 1.1 / [b]0.525;   // 525 mV per amp    [/b] => 0.185
    }


Deine weitere Berechnung hab ich mir noch nicht genauer angeschaut, aber die 2,5V sollten meines Wissens nach subtrahiert werden..

Grüße, Stephan
 
Stephan schrieb:
Wenn ich den 5A Typ vom ACS verwende ist dieser mit 185 mv/Ampere angegeben.

Ähm joa.. Was willst du uns sagen, Jemihi ? :silly:
 
Zuletzt bearbeitet von einem Moderator:
Achso, jetzt hab ichs gecheckt :)
Habe mir eben mal den Spaß gemacht und bisschen mit der allerersten Formel rumgerechnet,
Werte ersetzt usw. aber irgendwie komme ich auf keinen grünen Zweig..
Ich hol mir glaub noch n Kaffe, dann geb ich mir den Code von Uwe ;)
 
Oben