AD-Wandler LSB verwerfen

OP #3756614
Lesenswert?

Hi,

ich lese einen 16Bit AD-Wandler via I2C aus.

   byte1 = i2c_readAck();
   byte2 = i2c_readAck();
   byte3 = i2c_readNak();
   i2c_stop();
   byte1 = byte1 << 1;
   byte1 = byte1 | (byte2 >> 7);
   byte2 = byte2 << 1;
   byte2 = byte2 | (byte3 >> 7);
   value = byte1*256+byte2;
   return value;

klappt auch alles ganz wunderbar, nur zuckeln mir die Werte zu viel 
herum. Deshalb wollte ich das niederwertigste, oder die 2 
niederwertigsten Bits einfach verwerfen. Ich verstehe die Berechnung des 
"value" nicht ganz, vielleicht kann mir jemand beim "wegwerfen" helfen ?

Vielen Dank
#3756626
Lesenswert?

Wenn Dein "value" ein 16-Bit-Wert ist, dann machst Du einfach eine 
UND-Verknüpfung mit FFFC (1111111111111100) als Maske und schon sind die 
beiden letzten Bits "weg" (=0)

Die Schiebeoperationen vorher dienen nur dazu, die Messbits an die 
richtige Stelle zu rücken. Mehr dazu im Datenblat vom AD.
Gast #3756629
Lesenswert?

Wie willst du die den "wegwerfen"?
Es gibt da verschiedene Lösungne, das hängt davon ab, wie du die Daten 
weiter verwenden willst. Stört es dich, wenn die unteren beiden Bits 
wackeln? Welche Genauigkeit brauchst du? Ich hatte einen Fall da konnte 
ich die Bits noch gut brauchen. Ich habe dann Oversampling um x4 
gemacht. Danach hat nichts mehr gewackelt.


Die Berechnung von Value ist einfach. Die Daten werden in zwei Bytes 
(high und low) abgerufen. Bei der Berechnung von value werden die beiden 
Bytes zu einem Word zusammengefasst. Damit die Position des High-Bytes 
stimmt, muss mit 256 mutlipliziert bzw. um 8 geschoben werden.
Gast #3756639
Lesenswert?

Michael S. schrieb:
> Ich verstehe die Berechnung des "value" nicht ganz

Die ist auch arg umständlich geschrieben.

Statt:

Michael S. schrieb:
> byte1 = byte1 << 1;
>    byte1 = byte1 | (byte2 >> 7);
>    byte2 = byte2 << 1;
>    byte2 = byte2 | (byte3 >> 7);
>    value = byte1*256+byte2;

Hätte man auch einfach schreiben können:
1
value = byte1 << 9 | byte2 << 1 | byte3 >> 7;

Es wird das oberste Bit von byte3 als unterestes Bit für value genommen, 
die nächsten 8 Bits kommen aus byte2 und die oberen 7 Bits dann aus 
byte1.
#3756662
Lesenswert?

Rolf Magnus schrieb:

> Es wird das oberste Bit von byte3 als unterestes Bit für value genommen,
> die nächsten 8 Bits kommen aus byte2 und die oberen 7 Bits dann aus
> byte1.

Wobei ich mich allerdings ernsthaft frage, was das für ein IC ist, der 
seine Ergebnisse so dermassen seltsam rausgibt (in Wirklichkeit 
eigentlich schon ein 24Bit ADC, bei dem der Originalautor sowieso schon 
die untersten 7 BIt weggeworfen hat?)
(Firma: Brainit GmbH) #3756670
Lesenswert?

Michael S. schrieb:
> zuckeln mir die Werte zu viel
> herum. Deshalb wollte ich das niederwertigste, oder die 2
> niederwertigsten Bits einfach verwerfen.

Das geht so einfach nicht.

Beispiel: Dein Wert "zappelt" zwischen 127 und 128. Jetzt schreib mal 
die beiden Werte binär hin, und überleg dir was du gewinnst, wenn du 
eins oder zwei der niederwertigsten Bits verwirfst...

Funktionierende Lösungsansätze sind:  entweder ein einfacher digitaler 
Filter (PT1-Glied) oder, noch besser, eine Glättung mit Hysterese, und, 
am besten, die Kombination der beiden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren