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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.