Polynom in Assembler zur Linearisierung (ATMega8)

Gast #259007
Lesenswert?

Hallo allerseits,

ich habe folgendes Problem:
Ich habe eine nichtlineare Kennlinie eines Kraftsensors. Diese
nicht-lineare Ausgangsspannung (Kraft ist nicht direkt proportional zur
Ausgangsspannung) lese ich mit dem ADC am ATMega8
(Assembler-Programmierung) ein.
Im Datenblatt ist nun ein Polynom angegeben, dass die Kennlinie des
Kraftsensors nachbildet. Meine Frage daher:

Wie programmiere ich so ein Polynom mit Float-Zahlen-Koeffizienten
(oder Ganzzahlen, und dann shiften). z.B. y=a*x^5 + b*x^4 + c*x^3...
Ich möchte, dass der eingelesene Wert des ADCs das Polynom durchläuft,
und dann als Ausgabewert der lineare Wert herauskommt.
Der ATmega hat ja schon Befehle für Float-Arithmetik, Polynome damit
aber zu berechnen artet in Assembler in umfangreichen Code aus. Gibt es
brauchbare und kurze Möglichkeiten?
Vielen Dank schon mal für Anregungen und Lösungsvorschläge.

Gruß
Jan Purrucker
Persönliche Seite #259009
Lesenswert?

Hi

look-Up Tabelle? Bei maximal 10 Bit ADC Auflösung braucht die 1024
Werte. Bei 2 Byte pro Wert geht 1/4 des Programmspeichers für die
Tabelle drauf. Wenn du dein Polynom nur mit ein paar Stützstellen (32,
64, 128) in die Tabelle legst und dann linear interpolierst verkleinert
sich diese nochmal deutlich ohne das dein Fehler alzu groß wird.

Matthias
#259010
Lesenswert?

Hallo Jan,

Multiplikationen mit Float Zahlen approximiere ich i.a. durch eine
Addition von Teilfaktoren.

z.B. x* 0,75 = x/2 + x/4

Die Divisionen lassen sich so auf shift/add  opperationen
zurückführen.
Das geht schnell und und der Code bleibt relativ kompakt.

Zur Potenzbildung fällt mir allerdings nichts ein, was ggf. riesiege
Zahlen vermeiden würde.

Ciao,
Werner
Gast #259011
Lesenswert?

Hallo nochmal,

mit einer Look-up-table jeden Wert abzuspeicheren braucht also sehr
viel Code. Wenn ich das Polynom in gewissen Bereichen aber linear
nähere, dann brauche ich jeweils eine Steigung und einen Offset
(y-Achsenabschnitt) in meiner Tabelle für die jeweiligen Bereiche.
Problem ist dann nur, wenn ich eine Näherung für einen Bereich ändere,
dann muß ich alle anderen Näherungen auch ändern, weil mir sonst der
Ausgangswert "springen" kann, da die Kennlinien dann nicht stetig
wären. Deshalb halte ich an dem Konzept für das Polynom fest.

Der Vorschlag von Werner ist schon mal nicht schlecht.
Nun müsste ich nur noch wissen, wie man "Code-schonend" und ohne
große Zahlen ein Polynom (bzw. Potenzen) programmiert?
Danke für weitere Anregungen für das "Polynom-Problem"

Gruß
Jan Purrucker
Persönliche Seite #259012
Lesenswert?

Hi

dann nimm halt das Horner-Schema[1]. Damit bekommst du zumindest mal
keine riesigen Werte und die Berechnung wird auch etwas fixer. Je nach
Wertebereich und Koeffizienten mußt du dann halt entweder mit float
rechnen oder aber ein Fixpunktformat wie 8.8, 16.8 oder ähnliches
implementieren.

[1] http://de.wikipedia.org/wiki/Horner-Schema

Matthias
Gast #259013
Lesenswert?

die Frage ist doch leicht zu beantworten: Hast du den Platz für eine
Tabelle, dann nimm die. Passt es nicht rein, such nach Alternativen.
Konkret: wir gross ist das Restprogramm? AUf jeden Fall ist das die
Variante mit der kürzesten Laufzeit.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren