Forum: Compiler & IDEs Hilfe für Festkommaproblem


von Heinz Liebherr (Gast)


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!

von Alex (Gast)


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.

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.