Forum: Mikrocontroller und Digitale Elektronik Polynom in Assembler zur Linearisierung (ATMega8)


von Jan Purrucker (Gast)


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

von Sebastian Wille (Gast)


Lesenswert?

Hi Jan,

ich würde das Problem mit einer LookUp-Table lösen. Einmal z.B. in
Excel alle Werte rechnen lassen und dann die Tabelle in den Atmel
speichern.

Sebastian

von Μαtthias W. (matthias) Benutzerseite


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

von Werner J. (werner_j)


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

von Jan Purrucker (Gast)


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

von Μαtthias W. (matthias) Benutzerseite


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

von crazy horse (Gast)


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.

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.