Forum: Mikrocontroller und Digitale Elektronik ACS712-30 Probleme mit der Messung


von HighVoltage (Gast)


Lesenswert?

Hallo Zusammen,

ich habe ein Problem mit der Strommessung und dem ACS712-30. Ich 
betreibe es an einem Arduino und möchte Ströme zwischen 0 und 10A 
messen. Das ganze mit 0,1A Genauigkeit.

Leider finde ich nirgends einen vernünftigen Code in dem die Berechnung 
für das ACS712-30 zu finden ist.

Meine bisherigen Programmierergebnisse belaufen sich auf:

//Strommessung

  float average = 0;
  for (int i = 0; i < 1000; i++) {
   // average = (average + (.0264 * analogRead(A1) - 13.505) / 100);

}

Hat jemand Hinweise oder braucht Ihr weiteres Input von mir?

Liebe Grüße!

von Knife (Gast)


Lesenswert?

HighVoltage schrieb:
> möchte Ströme zwischen 0 und 10A
> messen. Das ganze mit 0,1A Genauigkeit.

Das geht nicht, das IC hat eine Genauigkeit von 1.5% (Seite 9).

von HighVoltage (Gast)


Lesenswert?

Knife schrieb:
> HighVoltage schrieb:
>> möchte Ströme zwischen 0 und 10A
>> messen. Das ganze mit 0,1A Genauigkeit.
>
> Das geht nicht, das IC hat eine Genauigkeit von 1.5% (Seite 9).

meinentwegen. Wie sollte der Sktech lauten? Hat jemand ein Beispiel?

Ich habe rausgefunden das 512 = 0mV sind und 1 schritt 0,66mV. Kann ich 
es so berechnen: (Zw= ZwischenWert)

 float average = 0;
  float zw;


    {
     zw = 512 - analogRead(A1);

      average = (zw* 66)/1000;
      Serial.print(average);









    delay(100);

    }

von Martina (Gast)


Lesenswert?

es gibt merhrere rechenwege..
Z.B: legst Du eine last von 2,54A an  (mit dem Multiemter in Reihe!!)
Nun siehst Du auf Derin Anzeige meinetwegen den Wert 832
Also hast Du 2,54A und 832

Nun brauchst Du doch nur noch 2,54 / 823 zu rechnen = 
0,0030862697448359659781287970838396

Also nun kannst Du damit arbeiten z.B.

823 * 0,0030862697448359659781287970838396 = 2,54A

von Dirk K. (dekoepi)



Lesenswert?

Mit externem ADC sieht's so aus:
1
#ifdef ACS712
2
  Vcc=measure_vcc();
3
  // Read ACS712 voltage output differential
4
  adc.setMultiplexer(ADS1115_MUX_P1_N3);
5
  adc.setGain(ADS1115_PGA_4P096);
6
  mVopamp=adc.getConversion();
7
#endif
8
9
#ifdef ACS712
10
  // ACS712: 185mV/1000mA -> 5.4054 mA / 1 mV
11
  current = (((mVopamp) * adc.getMvPerCount())- (Vcc/2)) * 5.4054;  // noise 20mV absolute without filter capacitor.->~100mA "blind"
12
  mVopamp *= adc.getMvPerCount();
13
#endif

Und measure_vcc() (war zu faul, das sauber selber zu schreiben, daher 
Copy&Paste aus dem Netz):
1
long measure_vcc() {
2
  // Read 1.1V reference against AVcc
3
  // set the reference to Vcc and the measurement to the internal 1.1V reference
4
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
5
 
6
  delay(2); // Wait for Vref to settle
7
  ADCSRA |= _BV(ADSC); // Start conversion
8
  while (bit_is_set(ADCSRA,ADSC)); // measuring
9
 
10
  uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
11
  uint8_t high = ADCH; // unlocks both
12
 
13
  long result = (high<<8) | low;
14
 
15
  result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
16
  return (result); // Vcc in millivolts
17
}

Die Variablen sind einigermaßen sprechend deklariert, damit sollte der 
Rechenweg klar sein. Du musst jetzt eigentlich nur die ADC-Werte vom 
internen ADC verwenden und die zugöhrigen Werte anpassen.

Edit: Ups, hab den Code zwar für Shunt/Hall-Sensor strukturiert, aber 
die eigentlichen Berechnungen für den ACS im Single-Ended-Modus schon 
entsorgt gehabt (habe einen 1:1 Spannungsteiler für Vcc/2 am 
differentiellen ADC-Eingang) - der ACS ist mir zu ungenau im Vergleich 
zum Shunt, 0-100mA sieht man gar nicht, erst danach geht's los (siehe 
Bild). Nachgepflegt.

: Bearbeitet durch User
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.