Forum: Mikrocontroller und Digitale Elektronik ADC: 16 Bit in 10 Bit


von 51a (Gast)


Lesenswert?

Guten Morgen,

ein ADC gibt einen Messwert im 16 Bit Format aus.
Habt ihr Empfehlungen für mich, wie ich diese 16 Bit am geeignetsten auf 
10 Bit reduzieren kann?
Der Verlust an Genauigkeit ist mir bewusst und in Ordnung.

Reicht es aus, wenn ich die 16 Bit um 6 Bits nach rechts schiebe? Bzw. 
die 6 LSB sozusagen verwerfe? Die verworfenen 6 Bit könnt ich dann noch 
runden und dann das 7 LSB dementsprechend anpassen.

Vielen Dank.

von Ingo L. (corrtexx)


Lesenswert?

51a schrieb:
> Reicht es aus, wenn ich die 16 Bit um 6 Bits nach rechts schiebe?
Ob das deinen Anforderungen genügt kannst nur du wissen. Aber warum 
willst du 16Bit auf 10Bit abschneiden? Funktionieren tut es auf jeden 
Fall, ich würde aber lieber durch 64 teilen

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

51a schrieb:
> Reicht es aus, wenn ich die 16 Bit um 6 Bits nach rechts schiebe?
Kommt darauf an, ob das Ergebnis des Wandlers vorzeichenbehaftet ist...

von 51a (Gast)


Lesenswert?

Nein, das Ergebnis ist nicht vorzeichenbehaftet. Alles unsigned.

Ich werde mich für die Variante mit der Teilung durch 64 entscheiden.

Vielen Dank für die Antworten.

von Johnny B. (johnnyb)


Lesenswert?

51a schrieb:
> Der Verlust an Genauigkeit ist mir bewusst und in Ordnung.

Die Genauigkeit bleibt dieselbe, nur die Auflösung verringert sich.
Normaleweise schneidet man die nicht benötigten Bits einfach ab bzw. 
maskiert sie aus.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

51a schrieb:
> um 6 Bits nach rechts schiebe

Ingo L. schrieb:
> Aber warum willst du 16Bit auf 10Bit abschneiden?
> ich würde aber lieber durch 64 teilen

Das ist doch alles das Selbe!

von Dergute W. (derguteweka)


Lesenswert?

Stefanus F. schrieb:
> Ingo L. schrieb:
>> Aber warum willst du 16Bit auf 10Bit abschneiden?
>> ich würde aber lieber durch 64 teilen
>
> Das ist doch beides das Selbe!

Das denken viele beim rechten und beim linken Twix auch :-)

SCNR,
WK

von Phil E. (aktiver_mitleser)


Lesenswert?

Wenn du vor dem Abschneiden noch 32 dazu addierst, ist dein Ergebnis 
zumindest gerundet statt abgerundet (round statt floor).

von HildeK (Gast)


Lesenswert?

Ingo L. schrieb:
> Funktionieren tut es auf jeden
> Fall, ich würde aber lieber durch 64 teilen

Könntest du erklären, warum du lieber durch 64 teilst anstatt zu 
schieben - zumindest bei 'unsigned' fehlt mir momentan der Unterschied / 
Vorteil.

von Ingo L. (corrtexx)


Lesenswert?

HildeK schrieb:
> Könntest du erklären, warum du lieber durch 64 teilst anstatt zu
> schieben - zumindest bei 'unsigned' fehlt mir momentan der Unterschied /
> Vorteil.
Ist auch kein Vorteil, aber wenn man sich eine Division statt eines 
Shifts angewöhnt, stellt sich die Vorzeichenfrage garnicht erst ;)

von Thomas E. (picalic)


Lesenswert?

Wenn der AD-Wandler die Daten schon linksbündig zur Verfügung stellt, 
könnte man das Programm auch einfach so schreiben, als hätte der 
AD-Wandler 16 Bit. Wozu schieben? Es spart die Schieberei ein und hätte 
außerdem den Vorteil, daß man das Programm nicht groß anpassen muss, 
wenn man es mal auf eine andere Hardware mit einem genaueren ADC 
portiert.

von Thomas E. (picalic)


Lesenswert?

Philipp M. schrieb:
> Wenn du vor dem Abschneiden noch 32 dazu addierst, ist dein Ergebnis
> zumindest gerundet statt abgerundet (round statt floor).

Und was soll das bringen, außer einer zusätzlichen und völlig unnötigen 
Rechenoperation?

: Bearbeitet durch User
von Volle (Gast)


Lesenswert?

Ich kenne ADCs die könne wahlweise das Ergebnis linksbündig, 
rechtsbündig oder um ein Nippel nach rechts verschoben bereitstellen.

Bei sehr vielen kann man auch die Auflösung einstellen.

Wenn man den ADC richtig konfiguriert muss man in SW gar nicht mehr viel 
machen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Volle schrieb:
> um ein Nippel nach rechts verschoben
Abgesehen von dem falsch geschriebenen Nibble ist in der Aufzählung 
nichts dabei, was annähernd an die gewünschten 6 Bits rankommt.

> Bei sehr vielen kann man auch die Auflösung einstellen.
Zeig mal schnell 5 Stück von unterschiedlichen Herstellern (und das sind 
bei weitem nicht "sehr viele"). Fazit: es gibt nicht "viele", die das 
können, weil di allermeisten sowiso an einem Prozessor hängen, der 
sowieso eine Skalierung muss/wird.

51a schrieb:
> Habt ihr Empfehlungen für mich, wie ich diese 16 Bit am geeignetsten auf
> 10 Bit reduzieren kann?
Bist du dann mit diesem Wert auf diesem Prozessor fertig, oder wird 
anschließend noch mehr damit gemacht? Falls zweiteres: warum den 
Messwert überhaupt zusammenstutzen? Das passiert doch sowieso bei einer 
späteren Rechnung/Skalierung...

von Stefan F. (Gast)


Lesenswert?

>> 51a schrieb:
>> Habt ihr Empfehlungen für mich, wie ich diese 16 Bit am
>> geeignetsten auf 10 Bit reduzieren kann?

> Lothar M. schrieb:
> Bist du dann mit diesem Wert auf diesem Prozessor fertig, oder wird
> anschließend noch mehr damit gemacht? Falls zweiteres: warum den
> Messwert überhaupt zusammenstutzen?

Vielleicht hat er eine CPU, die 10bit schneller berechnen kann, als 
16bit.

Duck und weg...

Nachtrag: Möglicherweise will er große Datenmengen speichern und braucht 
ein paar Bits für andere Zwecke (z.B. Zeitstempel oder Kanal-Nummer).

von Phil E. (aktiver_mitleser)


Lesenswert?

Thomas E. schrieb:
> Und was soll das bringen, außer einer zusätzlichen und völlig unnötigen
> Rechenoperation?

Je nach (nicht genannter Anwendung) bringt das einen geringeren Fehler 
durchs Abschneiden und erzeugt, im Gegensatz zum Abschneiden, kein 
DC-Offset.

von Thomas E. (picalic)


Lesenswert?

Philipp M. schrieb:
> Je nach (nicht genannter Anwendung) bringt das einen geringeren Fehler
> durchs Abschneiden und erzeugt, im Gegensatz zum Abschneiden, kein
> DC-Offset.

Kapiere ich nicht - gib mal bitte ein konkretes Zahlenbeispiel, wo das 
addieren eines halben ADC-LSBs, was dann eh wieder abgeschnitten wird, 
das Ergebnis näher an den realen Messwert bringt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Thomas E. schrieb:
> Kapiere ich nicht - gib mal bitte ein konkretes Zahlenbeispiel, wo das
> addieren eines halben ADC-LSBs, was dann eh wieder abgeschnitten wird,
> das Ergebnis näher an den realen Messwert bringt.
Stichwort: "Aufrunden"
Aber ob das was bringt, und was es bringt, das hängt doch sehr von der 
entsprechenden Anwendung ab.

Ich könnte mir z.B. auch gut vorstellen, dass man nicht einfach ein 
halbes MSB aufaddiert, sondern die führenden 6 Bits. Dann wird umso mehr 
"abgerundet", je näher man bei 0 ist. Und umso mehr "aufgerundet", je 
näher man am Maximalwert ist.
Letztlich wird dadurch die Steigung der Übertragungsgeraden steiler 
gemacht...

von Thomas E. (picalic)


Lesenswert?

Lothar M. schrieb:
> Stichwort: "Aufrunden"

Ich weiss schon, was "Aufrunden" bedeutet. Angenommen, man hat ein 
Digitalvoltmeter, das die Spannung mit Nachkommastellen anzeigt. Um nun 
mit der Spannung in Volt ohne Nachkommastellen als Integer weiter zu 
arbeiten, würde ich einsehen, daß man erstmal zum korrekten Runden 0,5V 
addiert, bevor man die Nachkommastelle abschneidet.
Aber bei einem DVM, das ohnehin nur ganze Volt anzeigt (evtl. auch mit 
permanent "x,0" auf der Anzeige), erschließt sich mir der Sinn dieser 
Rundung nicht so ganz.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Thomas E. schrieb:
> Aber bei einem DVM, das ohnehin nur ganze Volt anzeigt (evtl. auch mit
> permanent "x,0" auf der Anzeige), erschließt sich mir der Sinn dieser
> Rundung nicht so ganz.
Das beispielhafte ganzzahlige Multimeter zeigt bei purem Abschneiden 
eben auch bei 0,99V am Eingang noch 0,0V an. Hier wäre es "gefühlt" 
schöner, wenn es ab 0,5V dann schon 1,0V anzeigt...

: Bearbeitet durch Moderator
von Stefan F. (Gast)


Lesenswert?

Thomas E. schrieb:
> Aber bei einem DVM, das ohnehin nur ganze Volt anzeigt (evtl. auch mit
> permanent "x,0" auf der Anzeige)

Meinst du nicht, dass dieses beispiel ziemlich absurd ist? Das hast du 
Dir doch gerade ausgedacht!

von 51a (Gast)


Lesenswert?

Hallo,

vielen Dank für die vielen Antworten.

Um mich kurz zu fassen:
Die ADC Messung erfolgt immer zu festen Zeitpunkten. Da der Bus für die 
Datenübertragung extrem langsam ist, müssen mehrere Samples zunächst 
gespeichert und anschließend in Datenblöcken gesendet werden. Um alle 
Daten in das Protokoll zu packen, müssen die 16 Bit auf 10 Bit reduziert 
werden. Sonst geht es zeitlich nicht.

Die 16 Bit ADC Messwerte sind aber nicht notwendig. 10 Bit sind völlig 
ausreichend.

Um weiteren Diskussionen entgegenzuwirken:
Das ganze wird nur für einen kleinen Test benötigt. Andere 
Schnittstellen oder ein anderer ADC würde sich für Testzweck nicht 
lohnen, da vorhandenes für den kleinen Test genutzt werden kann.

von M. K. (sylaina)


Lesenswert?

51a schrieb:
> Um alle
> Daten in das Protokoll zu packen, müssen die 16 Bit auf 10 Bit reduziert
> werden. Sonst geht es zeitlich nicht.

Das Datenprotokoll kenne ich jetzt nicht aber welches Protokoll 
überträgt denn nur halbe Bytes denn nur so hättest du ja einen Vorteil 
davon?
Die Systeme, die mir jetzt so in den Sinn kommen, übertragen nur ganze 
Bytes und da ists dann egal ob man 10 oder 16 Bit hat.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

M. K. schrieb:
> welches Protokoll überträgt denn nur halbe Bytes

Zum Beispiel das allgegenwärtige GSM Netz.

Zum Beispiel werden SMS als 7 bit um 160 Zeichen in 140 Bytes zu 
quetschen. Das ist nicht die einzige Stelle, wo im GSM Netz Bits 
abgeschnitten und Bytes zerstückelt und verschoben übertragen werden.

von 51a (Gast)


Lesenswert?

Es werden auch ganze Bytes übertragen aber im Protokoll befinden sich 
außer dem Sample noch weitere Informationen.
Ich kann noch 10 weitere Bits hinzufügen aber eben keine 16.
Die Datenrate zu erhöhen oder das Protokoll zu ändern ist nicht nötigt, 
da für den Test 10 Bit ausreichend sind und sich der Aufwand nicht 
lohnt.

von HildeK (Gast)


Lesenswert?

M. K. schrieb:
> Die Systeme, die mir jetzt so in den Sinn kommen, übertragen nur ganze
> Bytes und da ists dann egal ob man 10 oder 16 Bit hat.

Ich denke, er packt drei 10Bit-Werte in ein 32Bit-Wort und überträgt 
das.

51a schrieb:
> Da der Bus für die
> Datenübertragung extrem langsam ist, müssen mehrere Samples zunächst
> gespeichert und anschließend in Datenblöcken gesendet werden.

von 51a (Gast)


Lesenswert?

51a schrieb:
> Es werden auch ganze Bytes übertragen aber im Protokoll befinden
> sich
> außer dem Sample noch weitere Informationen.
> Ich kann noch 10 weitere Bits hinzufügen aber eben keine 16.
> Die Datenrate zu erhöhen oder das Protokoll zu ändern ist nicht nötigt,
> da für den Test 10 Bit ausreichend sind und sich der Aufwand nicht
> lohnt.

Bzw. 10 Bits sind ungenutzt und stehen noch zur freien Verfügung

von soso (Gast)


Lesenswert?

Da will ich mitdiskutieren.

Du könntest dann ja noch schneller sampeln. Da du nicht warten brauchst, 
bis die letzten 6 Bit gesattelt sind, kannst DU das Ergebnis auch schon 
vorher abfragen, hehe. Somit hast Du - ja richtig - eine Erhöhung der 
Sampelrate. Inwiefern das sachdienlich ist, muss der TO selbst 
entscheiden.

Und tschüss.

von A. S. (Gast)


Lesenswert?

Lothar M. schrieb:
> Ich könnte mir z.B. auch gut vorstellen, dass man nicht einfach ein
> halbes MSB aufaddiert, sondern die führenden 6 Bits. Dann wird umso mehr
> "abgerundet", je näher man bei 0 ist. Und umso mehr "aufgerundet", je
> näher man am Maximalwert ist.
> Letztlich wird dadurch die Steigung der Übertragungsgeraden steiler
> gemacht...

Whow, kannte ich nicht, so einfach, hätte ich oftmals einsetzen sollen, 
... mir war das halbe Bit bisher egal ;-)

von Thomas E. (picalic)


Lesenswert?

Aaaahhh - sorry, ich war da gedanklich völlig auf dem falschen Dampfer! 
Dachte, der TO hätte einen 10-Bit Wandler, der seine Daten als 16-Bit 
Wort "left aligned" ausgibt.
Klar, wenn der Wandler mehr als 10 Bit zur Verfügung stellt, macht eine 
Rundung bei der Reduzierung auf 10 Bit für die Übertragung natürlich 
absolut Sinn!

: Bearbeitet durch User
von Phil E. (aktiver_mitleser)


Lesenswert?

Thomas E. schrieb:
> Aaaahhh - sorry, ich war da gedanklich völlig auf dem falschen Dampfer!
> Dachte, der TO hätte einen 10-Bit Wandler, der seine Daten als 16-Bit
> Wort "left aligned" ausgibt.
> Klar, wenn der Wandler mehr als 10 Bit zur Verfügung stellt, macht eine
> Rundung bei der Reduzierung auf 10 Bit für die Übertragung natürlich
> absolut Sinn!

In diesem Fall hättest du natürlich recht - auf aufgefüllte Nullen ein 
halbes LSB addieren und wieder abschneiden ist tatsächlich sinnlos.

von M. K. (sylaina)


Lesenswert?

soso schrieb:
> Da will ich mitdiskutieren.
>
> Du könntest dann ja noch schneller sampeln. Da du nicht warten brauchst,
> bis die letzten 6 Bit gesattelt sind, kannst DU das Ergebnis auch schon
> vorher abfragen, hehe. Somit hast Du - ja richtig - eine Erhöhung der
> Sampelrate. Inwiefern das sachdienlich ist, muss der TO selbst
> entscheiden.
>
> Und tschüss.

Dann müsste der ADC aber auch unterstützen, dass man eine Wandlung 
abbrechen kann. Da wir nicht den konkreten Wandler kennen wäre ich mit 
so einer Aussage erstmal vorsichtig.

von my2ct (Gast)


Lesenswert?

Thomas E. schrieb:
> Wenn der AD-Wandler die Daten schon linksbündig zur Verfügung stellt,
> könnte man das Programm auch einfach so schreiben, als hätte der
> AD-Wandler 16 Bit. Wozu schieben?

Spätestens, wenn man für Mittelung o.ä. ein paar Werte addieren will, 
merkt man den Unterschied.

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.