Forum: Mikrocontroller und Digitale Elektronik Über Spannung gemessenen Strom in Dezimal wandeln


von Matze (Gast)


Lesenswert?

Hallo,

Ich möchte den durch einen Strom CAS50 gemessenen Strom in eine Spannung 
wandeln.

Hierführ habe ich folgende Messwerttabelle angefertigt:

-10A : 573
- 9A : 569
- 8A : 566
- 7A : 562
- 6A : 559
- 5A : 556
- 4A : 553
- 3A : 549
- 2A : 546
- 1A : 543
+ 0A : 540
+ 1A : 537
+ 2A : 535
+ 3A : 533
+ 4A : 531
+ 5A : 528
+ 6A : 526
+ 7A : 524
+ 8A : 522
+ 9A : 520
+10A : 518

Es ergibt sich für den positiven Bereich -2,2/A
Für den negativen Bereich +3/A.

Diese Werte möchte ich nun Programmgesteuert in den entsprechenden Strom 
umwandeln.
1
if(i1<540)    //Positiver Strom
2
{
3
  mode2_1[3]='+';
4
  double strom=(double) (i1-540)*-2.2;
5
  int zehn=strom/10;
6
  strom=strom-(zehn*10);
7
  int eins=strom;
8
  strom=(strom-eins)*10;
9
  int zehntel=strom;
10
  strom=(strom-zehntel)*10;
11
  int hundtel=strom;
12
  mode2_1[4]=(zehn+0x30);
13
  mode2_1[5]=(eins+0x30);
14
  mode2_1[7]=(zehntel+0x30);
15
  mode2_1[8]=(hundtel+0x30);
16
}
17
else
18
{
19
  mode2_1[3]='-';
20
  double strom=(double) (i1-541)*3.0;
21
  //double strom=15.29;
22
  int zehn=strom/10;
23
  strom=strom-(zehn*10);
24
  int eins=strom;
25
  strom=(strom-eins)*10;
26
  int zehntel=strom;
27
  strom=(strom-zehntel)*10;
28
  int hundtel=strom;
29
  strom=(strom-hundtel)*10;
30
  mode2_1[4]=(zehn+0x30);
31
  mode2_1[5]=(eins+0x30);
32
  mode2_1[7]=(zehntel+0x30);
33
  mode2_1[8]=(hundtel+0x30);
34
}

Ich nehme also 540 als Nullpunkt an.
Werte kleiner 540 Stehen für positiven Strom, werte > für neg-Strom.

Danach wird der 0-Punkt abgezogen und je nach Pos/Neg mit 3 oder -2,2 
multipliziert.

--> Hier scheint etwas nicht zu funktionieren.
Es kommt z.b. "+°,,(0" raus

Wenn ich jedoch strom z.b. mit 15,29 definiere so steht auf dem Display 
auch 15,29.

Habt ihr eine Idee was an den Zeilen:
1
double strom=(double) (i1-541)*-2.2;
2
double strom=(double) (i1-541)*3.0;

entscheident falsch sein könnte?

von Matze (Gast)


Lesenswert?

Habs gefunden,

mit einem Zwischenschritt scheint es zu funktionieren:

int zwischen=i1-539;
double strom=(double) zwischen*-2.2;

Grüße und vielen Dank

von Falk B. (falk)


Lesenswert?

Kleiner Tipp: Festkommaarithmetik. Dan ist das alles DEUTLICH kürzer 
und übersichtlicher.

von Joe F. (easylife)


Lesenswert?

Deine Berechnung ist falsch. Du müsstest durch -2.2 bzw. 3.0 teilen, um 
den Strom zu errechnen, und nicht damit multiplizieren.

Deine Messkurve kannst du allerdings gut mit einem Polynom annähern 
(Wolfram Alpha hilft hierbei):

strom = i1*i1 / 363 - 1223*i1 / 363 + 122940 / 121

Dann kannst du auch gleich den Strom x100 errechnen, und kommst mit 
reiner Integer Arithmetik aus:
1
int strom = (100*i1*i1 - 122300*i1) / 363 + 101603;
2
3
if (strom < 0) {
4
  mode2_1[3] = '-';
5
  strom = -strom;
6
}
7
else
8
  mode2_1[3] = '+';
9
10
mode2_1[4] = strom / 1000 + '0'; strom %= 1000; // zehner
11
mode2_1[5] = strom /  100 + '0'; strom %=  100; // einer
12
mode2_1[7] = strom /   10 + '0'; strom %=   10; // zehntel
13
mode2_1[8] = strom        + '0';                // hunderstel

von J. S. (engineer) Benutzerseite


Lesenswert?

Die Tabelle ist aber differenziell unstetig - riecht nach Messfehler.

von Joe F. (easylife)


Lesenswert?

Deswegen ist ja mit einem Polynom annähern auch besser ;-)

von W.A. (Gast)


Lesenswert?

Jürgen S. schrieb:
> Die Tabelle ist aber differenziell unstetig - riecht nach Messfehler.

Kein Wunder. Die Messwerte entstammen einer Messung und Messungen sind 
nun mal fehlerbehaftet. Oder meinst du einen Ausreißer, welcher?

Bei der miesen Auflösung von gerade mal 2..4 LSB zwischen zwei 
Stützstellen darf man da wohl nicht viel drauf geben. Schon ein 
Messfehler von 1 Bit schlägt kräftig zu. Da ist wohl die Umrechnung über 
das Ausgleichspolynom die beste Lösung.

von Joe F. (easylife)


Angehängte Dateien:

Lesenswert?

Hier zum Vergleich.

Die 2. Nachkommastelle könnte man natürlich nochmal in Frage stellen, 
wenn die Auflösung der Messung nur ca. 0.3A beträgt... ;-)

von W.A. (Gast)


Lesenswert?

Joe F. schrieb:
> Hier zum Vergleich.

... und da sieht man deutlich, dass das verwendete Polynom schlecht 
geeignet ist, um die Messwerte vernünftig zu approximieren. Im Bereich 
negativer Ströme weicht es systematisch heftig von den Messungen ab. 
Also muss da ein anderes Modell her. Die lineare Annäherung ist wegen 
weniger Freiheitsgraden natürlich noch schlechter.

von Joe F. (easylife)


Lesenswert?

W.A. schrieb:
> und da sieht man deutlich, dass das verwendete Polynom schlecht
> geeignet ist, um die Messwerte vernünftig zu approximieren

Ich nehme eher an, dass die Messwerte in der Tabelle nicht besonders gut 
sind, und bin mal davon ausgegangen, dass die Werte bei -10A, 0A und 
+10A als Eckpunkte stimmen.
Der Sensor hat angeblich eine hohe Linearität, der Fehler sollte bei 
unter 1% liegen.
Warum die Kurve überhaupt gekrümmt ist, ist mir daher nicht klar.
Da scheint schon irgend etwas bei der Spannungsmessung schief zu gehen.

Für eine höhere Genauigkeit im 10A Bereich wäre dann ein CAS 25 besser 
gewesen, warum hast du dich für den CAS 50 entschieden, Matze?

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.