ADC: 16 Bit in 10 Bit

Gast #5594968
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.
Gast
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.
Gast
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.
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 ;)
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.
Gast
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.
Moderator (Firma: Titel) Persönliche Seite
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...
Gast
>> 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).
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.
Moderator (Firma: Titel) Persönliche Seite
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...
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.
Moderator (Firma: Titel) Persönliche Seite
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...
Gast
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.
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.
Gast
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.
Gast
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.
Gast
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.
Gast
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
Gast
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.
Gast
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 ;-)
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!
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.
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.
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.