Forum: Mikrocontroller und Digitale Elektronik Lesen von Messwerten aus Metering-IC


von Sneim (Gast)


Lesenswert?

Hallo miteinander,

ich baue gerade ein Leistungsmessgerät zusammen mit dem CS5463 Metering 
IC:

http://cirrus.com/en/pubs/proDatasheet/CS5463_F3.pdf

Die Register lassen sich über SPI byte weise auslesen und stellen 
allerhand Messwerte bereit. Mein Problem ist nun der Umgang mit diesen 
Registern. Z.b. auf S.28 im Datenblatt.

Die RMS Werte für Spannung und Strom bei denen nur die Nachkommastellen 
kodiert wurden.

Wenn ich diese Zahl byte für byte (ingesamt 24 bit also 3 byte) per SPI 
auslese, wie muss ich sie abspeichern um sie anschließend auf dem LCD 
ausgeben zu können? Insbesondere wenn ich sprintf() verwende? Gestern 
habe ich bereits rumprobiert und nachgemessen, habe aber festgestellt 
dass die angezeigten Zahlen nicht wirklich sinnvoll waren. Speicher habe 
ich genügend, ich verwende einen Atmega 644.

Kann mir einer von euch weiterhelfen? Z.b. einen kelinen Codeschnipsel?

Wie verhält es sich bei den Momentanwerten von Strom,Spannung und 
Leistung (oben auf S.28) ? Hier steht die Zahl sei in zweier Komplement 
darstellung notiert, wie muss ich das handhaben.

Vielen Dank für die Hilfe!

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

also wie die Zahl codiert ist steht ja dort,

The value is represented in two's complement notation and in the range 
of -1.0 <= I, V, P < 1.0, with the binary point to the right of the MSB.

das 2'er Komplement ist die übliche Verarbeitungsform für Werte mit 
negativem Wertebereich. Für den Compiler musst du den Wert eben auf 
32Bit (long) erweitern. Müsste eigentlich so gehen ...
1
if (Wert && 0x800000) {Wert |= 0xFF000000}

Der reale Messwert liegt zwischen -1 und 1. Du hast 24Bit, ein Bit geht 
für's Vorzeichen weg. Damit entspricht +1 == 2^23!

Unten auf S.28 hast du ein Beispiel: Default = 0x01999A = 0.0125 sec

0x01999A = 104858 dez

Messwert = 1 / (2^23) * Registerwert

auf o.g. Beispiel:

1 / 8388610 * 104858 = 0.0125

Sascha

von ... (Gast)


Lesenswert?

Da ist ein & zuviel, so wärs besser:
1
int32_t wert;
2
// hier wert einlesen
3
if (wert & 0x800000)
4
{
5
  wert |= 0xFF000000;
6
}

von Sascha W. (sascha-w)


Lesenswert?

ok - ich schreibe auch eher in ASM ...

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.