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