Forum: Mikrocontroller und Digitale Elektronik ADC ADS1115 mit Arduino - Problem mit Differential-Messung


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Michael E. (meberhardt)


Angehängte Dateien:

Lesenswert?

Liebe Community,

ich hoffe Ihr könnt mir helfen, ich bin gerade etwas am verzweifeln.
Zielsetzung ist die Messung der Leistung einer Phase mit Hilfe eines 
SCT-013-30 mit integriertem Burden-Widerstand, der Sensor liefert 1V~ 
bei 30A.
Um eine höhere Auflösung zu erreichen nutze ich nicht die internen ADC 
des Arduino sondern einen ADS1115 auf Breakout-Board.
Die Schaltung findet Ihr anbei, alles recht simpel. Die Sensoreingänge 
sind mit den Eingängen A2 und A3 verbunden, A0 und A1 sind auf GND 
gelegt um Einstreuungen zu vermeiden.
Grundlegend funktioniert die Schaltung.

Jetzt zu meinem Problem:
Ich habe hier zwischenzeitlich mindestens 15 ADS1115 verschiedener 
Hersteller angehäuft. Es gibt zwei mögliche Resultate: der ADS1115 misst 
richtig (ich teste mit einem Verbraucher mit bekannter konstanter Last 
sowie einer Messsteckdose zur groben Kontrolle). Mit Glück habe ich 
einen "guten" ADS1115 erwischt und ich Messe die Last, die gemessen 
werden sollte.
In ca. 60% der Fälle messe ich jedoch eine deutlich geringere Last. Nun 
könnte man ja meinen ich habe viel Pech mit meinen Lieferungen gehabt..
Was mich allerdings sehr stutzig macht ist die Tatsache, dass die 
"schlechten" ADS1115 alle fast im gleichen Maß falsch messen..
Die korrekte Last liegt bei 42W, alle "guten" ADS liegen in dem Bereich.
Die "schlechten" liegen alle um die 35W.

Mache ich offensichtlich etwas falsch? Gefühlt habe ich schon 2x das 
Internet durchgelesen und konnte leider keine ähnlichen Probleme bzw. 
Lösungen dazu finden.

Beigefügt noch der Sketch, mit dem ich aktuell die Schaltung teste.
Falls ich hier echt Tomaten auf den Augen habe, helft mir bitte auf die 
Sprünge.

Danke & viele Grüße,
Michael
1
#include <Wire.h>
2
#include <Adafruit_ADS1015.h>
3
4
Adafruit_ADS1115 ads;  /* Use this for the 16-bit version */
5
const float FACTOR = 30; //30A/1V
6
const float multiplier = 0.1875F; 
7
void setup(void)
8
{                                                             -------  -------
9
  ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
10
  ads.begin();
11
}
12
13
void loop(void)
14
{
15
  float result; 
16
  result = getCurrent() * 235.0;
17
  Serial.print("Current: "); Serial.println(results3,8); 
18
}
19
20
float getCurrent()
21
{
22
  float voltage = 0;
23
  float current = 0.000000F;
24
  float sum = 0;
25
  float raw = 0;
26
  float vMin = 0.0;
27
  float vMax = 0.0;
28
  long sampletime = millis();
29
  int counter = 0;
30
31
  while(millis() - sampletime < 5000)
32
  {
33
    raw = ads.readADC_Differential_2_3();
34
    
35
    voltage = raw * multiplier;
36
    if(voltage < vMin) vMin = voltage;
37
    if(voltage > vMax) vMax = voltage;
38
    //Serial.println(voltage);
39
    current = voltage * FACTOR;
40
    current /= 1000.0;
41
    sum += sq(current);
42
    counter = counter + 1;
43
  }
44
  
45
  current = sqrt(sum/counter);
46
  Serial.println(counter);
47
  Serial.print("vMin: "); Serial.println(vMin);
48
  Serial.print("vMax: "); Serial.println(vMax);
49
  Serial.print("CUR: "); Serial.println(current,8);
50
  return current;
51
}

von Achim S. (Gast)


Lesenswert?

Michael E. schrieb:
> Die Schaltung findet Ihr anbei, alles recht simpel.

Nein, leider nicht. Das ist nur ein Foto eines Steckbretts, aus dem man 
sich mit Mühe und Glück die Schaltung rekonstruieren kann.

Michael E. schrieb:
> Ich habe hier zwischenzeitlich mindestens 15 ADS1115 verschiedener
> Hersteller angehäuft.

Der ADS1115 ist ein ADC, der meines Wissens nur einen Hersteller hat 
(Texas Instruments). Du hast aus 15 verschiedenen Quellen 15 
(möglicherweise verschiedene) Schaltungen auf Basis des ADS1115 gekauft. 
Die Unterschiede im Messergebniss können von Unterschieden der 
Schaltungen kommen. Du musst dir anschauen, wie der ADS1115 auf der 
Platine jeweils verbaut ist.

Michael E. schrieb:
> Die Sensoreingänge
> sind mit den Eingängen A2 und A3 verbunden, A0 und A1 sind auf GND
> gelegt um Einstreuungen zu vermeiden.
> Grundlegend funktioniert die Schaltung.

Schau dir mal das Datenblatt des ICs an:
https://www.ti.com/product/ADS1115

Die Eingänge des ADS1115 sind zwar hochohmig, aber ein gewisser Strom 
muss in die Eingänge fließen können (bias Strom). Wenn der von der 
Sensorschaltung nicht geliefert werden kann, dann verschiebt sich das 
Eingangspotential des ADCs ggf. so weit, dass die Messwerte verfälscht 
werden.

Dein Stromsensor hat einen Potentialfreien Ausgang. D.h. er kann zwar 
den Strom liefern, der zwischen A2 und A3 benötigt wird (d.h. er kann 
die Differenzspannung festlegen). Er kann aber aufgrund der 
Potentialfreiheit nicht den Strom liefern, der von A2 und A3 nach GND 
fließen muss (d.h. er kann nicht die Gleichtaktspannung/common mode 
Spannung festlegen).

Die Spannung muss aber im gültigen Bereich festgelegt werden. Deshalb 
benötigt die Beschaltung des ADCs bei deinem Sensor zusätzliche 
Widerstände, die den bias Strom liefern können und die die 
Gleichtaktspannung des ADC-Eingangs sinnvoll festlegen (der Sensor 
kümmert sich dann um die Differenzspannung zwischen den beiden 
ADC-Eingängen). Im einfachsten Fall kannst du einen hochohmigen 
Spannungsteiler zwischen VDD und GND bauen und dessen Mittelabgriff an 
einen der beiden ADC-Eingänge anschlißen. Es ist möglich, dass ein Teil 
deiner Schaltungen eines solche Eingangsbeschaltung hat, ein anderer 
Teil nicht. Das solltest du durch genaues Anschauen der verschiedenen 
Schaltungen rauskriegen können.

Zu deinem Code: du berechnest grundsätzlich korrekt den Effektivwert des 
Stroms und multiplizierst den mit dem erwarteten Effektivwert der 
Netzspannung (235V). Das ist im Prinzip die korrekte Formel für die 
Scheinleistung (nicht für die Wirkleistung).

Aber damit der Effektivwert (und damit die Scheinleistung) korrekt wird, 
musst du "ausreichend schnell" Werte einlesen und berechnen. Falls du 
den Default-Wert der Sample-Rate des ADS1115 verwendest (128 
Messwerte/s) hast du pro Periode des Stroms grade mal gut 2 Messpunkte - 
das ist viel zu wenig, um den Effektivwert halbwegs genau bestimmen zu 
können. (Du kannst ja mal deinen Counter mit ausgeben lassen um zu 
sehen, wie viele Messwerte du tatsächlich in den 5s Messzeit aufnimmst).

von Veit D. (devil-elec)


Lesenswert?

Hallo,

wir haben im Arduino Forum zufällig und fast zeitgleich von 2 Usern 
festgestellt, dass gefälschte ADS1115 Breakouts im Umlauf sind. Sind 
laut User Tests umgelabelte ADS1015, also die 12Bit Version.
Kann man an den Rohwertstufungen (0x10 statt 0x01), am max. Fullscale 
und an der Samplerate herausfinden.

Wenn das deine Tests auch bei dir bestätigen, wäre es gut umgehend TI zu 
informieren um den Sumpf trocken zu legen.

: 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.