Hilfe für Festkommaproblem

Gast #464806
Lesenswert?
• ▲
▼
Liebe Forumsteilnehmer!

Ich habe folgendes Problem: Von einem A/D-Wandler bekomme ich ein 
Datenwort. Dieses ist ein 16bit signed integer, welches die analoge 
Ausgabe eines Präzisions-Temperaturfühlers repräsentiert. Da ich gerne 
die Hardware so simpel wie möglich und insbesondere ohne Abgleichpunkte 
realisieren möchte, dachte ich an eine Software-Korrektur der 
zwangsläufig auftretenden Offset- und Scale-Fehler.

Wie realisiert man das am besten, wenn man ohne 
floating-point-operationen auskommen möchte? Der erwartete 
"Soll"-Wertebereich (darauf ist der instrumentation amplifier 
dimensioniert) liegt bei 0..30.000 LSB; der Offset kann etwa +/-200 LSB 
betragen, der Skalierungsfehler würde bei einem Offset von 0 zu einem 
Endwert von 29.000 bis 31.000 LSB führen.

Kurz mit anderen Worten:

Ausgangssituation:
Ist-Wertebereich: -200 - 31.200 (16 bit signed int)
Soll-Wertebereich: 0 - 30.000 (16 bit signed int)

Korrektur nach Kalibrierung über im EEPROM abgelegte Koeffizienten:

Offset: -200..200 (16 bit signed int)
Scale: ???

Implementation in AVR-ASM oder AVR-GCC ohne Floating-Point-Lib -> ???

Der allein durch die Software-Korrektur erzeugte Fehler sollte natürlich 
möglichst kleiner 1 LSB sein.

Wer kennt sich aus? Vielen Dank schonmal!
Gast #464829
Lesenswert?
• ▲
▼
Den Offset also einfach als Ganzzahl hinterlegen und zum AD-Werte 
addieren, das hast du schon richtig erkannt.

Setzen wir an, dass dein Scale zwischen 0 und 2 liegt und du mit 32 Bit 
rechnen möchtest. Da dein AD-Wert bereits 16 Bit vor dem Komma benötigt, 
bleiben für Scale z.B. 10 Bit für Kommastellen. Also:

AD_Wert: 16.0 Format
Scale:   2.14 Format
(gesamt immer 16 Bit, für die Operationen aber 32 Bit verwenden)

Um den Floating-Point Scale-Wert in das Festkommaformat zu überführen 
musst du ihn mit 2^14 multiplizieren oder einfach um 30 Stellen nach 
links schieben (Vorzeichen beachten!).

Ergebnis = AD_Wert * Scale + Offset

Das Produkt von AD_Wert und Scale ergibt eine Zahl im 18.14 Format. Wenn 
du diese Zahl (32 Bit) um 14 Stellen nach rechts schiebst (oder durch 
2^14 teilst, Vorzeichen beachten!) erhälst du eine Zahl im 18.0 Format. 
Von dieser kannst du deinen Offset noch abziehen und dann ist das 
Ergebnis bestimmt.

Die oben gewählten Festkommaformate kannst du beliebig variieren, um die 
Genauigkeit zu erhöhen. Beachte nur, dass keine Überläufe auftreten 
können. Das Prinzip bleibt jedoch immer das gleiche.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.