www.mikrocontroller.net

Forum: Compiler & IDEs Hilfe für Festkommaproblem


Autor: Heinz Liebherr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.