mikrocontroller.net

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


Autor: Jan Purrucker (Gast)
Datum:

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

Autor: Sebastian Wille (Gast)
Datum:

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

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

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

Autor: Werner Just (werner_j)
Datum:

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

Autor: Jan Purrucker (Gast)
Datum:

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

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

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.