PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : HowTo: Messwerttabelle in Formel umrechen



Sheridan
27.04.2007, 08:35
Hallo Robotergemeinde!

Sensoren liefern oft keine lineare Ausgangsgröße, die direkt propertional zur gemessenen Größe ist, wie beispielsweise die Distanzsensoren von Sharp.

Daher ist es in den meisten Fällen notwendig, eine Messwerttabelle zu verwenden, um beispielsweise eine Ausgangsspannung in eine Distanz umzurechnen.

D.h. es werden einige Messwerte experimentell erhoben:
https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1429

Entweder definiert man diese Werte als Array, oder noch schöner: man entwickelt eine Formel, am Besten mit Hilfe von Excel (Trendlinienfunktion).

Dazu erzeugt man zuerst eine Graphik:
https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1430

Dann fügt man über das Menü "Diagramm\Trendlinien hinzufügen" eine geeignete Trendlinien hinzu. Bin kein Mathematiker, also das einfachste ist einfach ein paar Trendlinien ausprobieren, die am Besten in die Kurve reinpassen:
https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1431

Um die Formel zu ermitteln, muss man im Reiter die Option "Gleichung in Diagram anzeigen" auswählen:
https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1432

Volia:
https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1433

Damit kann ich die Fomel einfach im Programm verwenden.

In meinen Fall ist das zb:



Wenn Spannung zwischen 3,1 und 1,05 V dann
y = 0,0119x2 - 0,0166x + 1,1007


Wenn die Werte nicht hinkommen, kann man mit den Konstanten spielen oder nur für Teilbereiche eigene Formeln entwicklen, je nach dem wie genau man die Werte braucht.

Aber hier ging es ja fürs erste nur ums Prinzip!

LG
Georg!

shaun
27.04.2007, 09:45
Schöner Tipp für alle, die noch wissen wollen, was sie tun, aber sich dann doch nicht mit oolynomialer Interpolation befassen wollen. Für mein aktuelles Projekt bliebe die Frage: wie bekomme ich Excel in einen ATmega64 O:)

Manf
27.04.2007, 09:50
Es geht bei der EXCEL Operation wohl nur um die Bestimmung der Koeffizienten der Näherungsformel die dann lokal ausgerechnet werden soll.
Es wird dann auch nicht jede Näherungsformel einfacher auszuwerten sein sein als die Interpolation einer Tabelle.
Manfred

Jaecko
27.04.2007, 10:02
Gibts da auch sowas schönes für Matlab?

Sheridan
27.04.2007, 10:15
Hallo shaun,

ich nehme an, du meintest das als Scherz:


Schöner Tipp für alle, die noch wissen wollen, was sie tun, aber sich dann doch nicht mit oolynomialer Interpolation befassen wollen. Für mein aktuelles Projekt bliebe die Frage: wie bekomme ich Excel in einen ATmega64 O:)

In dem du die Formel, die Excel generiert per Drag and Drop in die Entwicklungsumgebung deines ATmega64 kopierst.

Aber ein Excel-Addin für nen ATmega64 wäre doch was als Projekt :cheesy:

@Manf: Hast du eine Formelsammlung für die Interpolation, oder legst du einfach eine Gerade zwischen zwei Messpunkte durch?
Ob Interpolation oder Näherungsformel hängt natürlich vom Einzelfall. Es gibt immer mehrere Wege zum Ziel...

Sonst könnte man diese Methode plus Interpolation ins rn-wissen aufnehmen, wenn es das noch nicht gibt...

shaun
27.04.2007, 11:57
Der Smiley sollte sowas in der Art wie einen Scherz suggerieren, ja.
Nur hilft mir Dein Vorschlag auch nicht: es geht um 4-5 Strecken (passive wie aktive Bauteile dazwischen), die im f-Bereich von 10kHz bis 100MHz in Betrag und Phase linearisiert werden müssen, und zwar nicht unter Zuhilfenahme externer Rechner, sondern durch gezielte Messungen mit geeichtem Equipment und Übergabe der gemessenen Werte an die Firmware. Das Interpolationspolynom muss der ATmega daraus selbst berechnen.

Frank
27.04.2007, 12:19
Aber ein Excel-Addin für nen ATmega64 wäre doch was als Projekt :cheesy:

Sonst könnte man diese Methode plus Interpolation ins rn-wissen aufnehmen, wenn es das noch nicht gibt...

Gute Anregung, sowas solltet ihr ruhig mal näher aufgreifen und in einem RN-Wissen Artikel verarbeiten. Denkbar wäre auch ein Tool das aus Messwerten nicht nur Formel sondern auch gleich Bascom Code oder/und C-Code erzeugt. Vielleicht hat ja mal jemand etwas Lust und Zeit sowas anzugehen, erspart sicherlich später so einiges an Arbeitszeit.

Gruß Frank

Markus4004
27.04.2007, 13:38
Gibts da auch sowas schönes für Matlab?

Wenn Du die Punkte zeichnen läßt, gibt es im Figure-Window unter Tools den Menüpunkt "Basic Fitting".

Markus4004
27.04.2007, 13:43
Denkbar wäre auch ein Tool das aus Messwerten nicht nur Formel sondern auch gleich Bascom Code oder/und C-Code erzeugt.

Braucht man wirklich ein Programm, um aus

y = 0,0119x² - 0,0166x + 1,1007

die Programmzeile

y = 0.0119*x*x - 0.0166*x + 1.1007;

zu machen? (Bzw. aufgesplittet für Bascom)

Markus

Gock
27.04.2007, 13:57
@Markus4004
@Sheridan


Braucht man wirklich ein Programm, um aus
y = 0,0119x² - 0,0166x + 1,1007
die Programmzeile
y = 0.0119*x*x - 0.0166*x + 1.1007;
Wenn Du von einem Wasserstand ausgehend versuchst, die zugehörige Spannung auszurechnen wohl kaum. Das bringt Dir aber leider nicht viel... Du brauchst nämlich die Umkehrfunktion!!! Und dazu musst Du dann wohl doch Papier und Bleistift bewegen, bzw. Matlab fragen. Zumindest, wenn Du diese Funktion benutzen willst.
Die UF ist übrigens nicht mehr so spaßig, wenn man halbwegs genaue Werte haben will und der µC auch noch was anderes machen soll, als Wurzelziehen...
Das ist übrigens der Grund, warum man sich dann meistens doch für einen LookUpTable entscheidet, jedenfalls auf 8Bit Ebene.
Gruß Gock

Markus4004
27.04.2007, 14:14
Wenn Du von einem Wasserstand ausgehend versuchst, die zugehörige Spannung auszurechnen wohl kaum. Das bringt Dir aber leider nicht viel... Du brauchst nämlich die Umkehrfunktion!!!


Dann würde ich halt die beiden Spalten in der Tabelle vertauschen. Du bekommst dann einen Graphen, der im Vergleich zum vorigen an einer imaginären 45°-Achse gespiegelt ist. Auch daraus kann man z.B. eine Funktion 2. Ordnung ermitteln lassen. Damit hat man dann auch keine Wurzeln mehr.

Markus

Frank
27.04.2007, 18:25
Braucht man wirklich ein Programm, um aus

y = 0,0119x² - 0,0166x + 1,1007

die Programmzeile

y = 0.0119*x*x - 0.0166*x + 1.1007;

zu machen? (Bzw. aufgesplittet für Bascom)


Nu so einfach gehts nicht. Das Tool soll ja aus Messwerten erstmal ne Formel generieren und daraus dann ein fertig compilierbares Rumpfprogramm. Dabei sollte der Code natürlich kompakte sein, was auch bedeutet das man auf Fließkommazahlen möglichst verzichtet. Sowas hätte schon seinen Sinn.

Netbird
27.04.2007, 19:07
Einige Anmerkungen

- In zwei Schritten könnte man so vorgehen: Tabelle erfassen, Excel berechnet das Umkehrpolynom (oben schon erwähnt), dann Koeffizienten im Controller speichern.

- Güte der Anpassung steigt mit dem Grad des Polynoms! Excel macht das schnell. Die Güte der Anpassung wird mit dem Bestimmtheitsmaß R angegeben: R=1 ist vollständige Anpassung, sonst R<1 .

- Berechnung von Funktionswerten für ein Polynom geht durch fortgesetztes Multiplizieren und Addieren mit dem HORNER-SCHEMA
(Das war vor 35 Jahren meine erste Programmieraufgabe in numerischer Mathematik auf einer Maschine, die mit Lochstreifen gefüttert wurde). Ist ideal für AVR geeignet! Das Problem Fließkommazahlen läßt sich bei bekanntem Werteumfang ggf. durch geeignete Zehnerfaktoren ausschalten ..

shaun
27.04.2007, 20:05
Der letzte Punkt ist unter Umständen sehr wichtig. Bei zu geringer Genauigkeit der Gleitkommadarstellung, schlecht konditionierten Gleichungen und ähnlichem kann es schon sehr hässliche Fehler geben. Auch wenn ich mir die Mühe im aktuellen Projekt nicht hätte machen müssen, weil eh mit floats in rauhen Mengen operiert wird, habe ich neulich gerade eine sinnvolle Berechung für das Tuningwort eines DDS-Chips geschrieben. Das 32-bit-Wort n ergibt sich als n=fsoll/freferenz*2^32. Hätte ich fsoll im Bereich von 10^4 bis 10^8 erst durch die Referenz von 416MHz geteilt und dann mal 2^32 genommen, hätte ich eine unnötige float-Division gebraucht. fsoll zu einem 64bit-int gecastet, 32 mal nach links geschoben und dann ganzzahlig durch 4.16*10^8 geteilt ist schneller und kleiner. Schöner Synthesizer übrigens, dieser AD9959. 4 hochagile DDS-Kanäle mit 32 bit Frequenz- und 14 bit Phasenwort, bis 500MHz Systemtakt, eingebaute PLL für Leute, die keine Lust auf einen selbstgebauten 400MHz-VCO haben, digitale Abschwächer an den Ausgängen. Nur doof zu löten, 56 pin TQFN.

Markus4004
27.04.2007, 21:56
Braucht man wirklich ein Programm, um aus

y = 0,0119x² - 0,0166x + 1,1007

die Programmzeile

y = 0.0119*x*x - 0.0166*x + 1.1007;

zu machen? (Bzw. aufgesplittet für Bascom)


Nu so einfach gehts nicht. Das Tool soll ja aus Messwerten erstmal ne Formel generieren


Für Leute die kein Excel haben? Wobei ich mir gut vorstellen könnte, dass es da genug Freeware-Programme gibt, die das auch können.



und daraus dann ein fertig compilierbares Rumpfprogramm.


Was für ein Rumpfprogramm?

Der Code für Floating Point in C sieht z.B. so aus:
y = 0.0119*x*x - 0.0166*x + 1.1007;

Eine einzige Zeile. Mehr ist da nicht.



Dabei sollte der Code natürlich kompakte sein, was auch bedeutet das man auf Fließkommazahlen möglichst verzichtet. Sowas hätte schon seinen Sinn.

Für Fixkommaarithmetik kommen da noch ein paar Shifts hinzu, das passt bei C aber immer noch in eine Zeile.

Gock
28.04.2007, 18:21
Dann würde ich halt die beiden Spalten in der Tabelle vertauschen. Du bekommst dann einen Graphen, der im Vergleich zum vorigen an einer imaginären 45°-Achse gespiegelt ist. Auch daraus kann man z.B. eine Funktion 2. Ordnung ermitteln lassen. Damit hat man dann auch keine Wurzeln mehr.

Eine Wurzelfunktion mit einem Polynom 2.Grades anzunähern ist nicht sehr elegant (siehe Anhang). Dann kannst Du es auch linear annähern und sparst Rechenzeit.

@Netbird
Hornerschema, damit hab ich doch auch schon mal gerechnet, hat Dinge auf jeden Fall vereinfacht, in Linearer Algebra... Hilf' mir doch bitte mal auf die Sprünge... Wie lässt sich damit die Polynomrechnung vereinfachen?
Gruß Gock

Markus4004
28.04.2007, 18:55
Dann würde ich halt die beiden Spalten in der Tabelle vertauschen. Du bekommst dann einen Graphen, der im Vergleich zum vorigen an einer imaginären 45°-Achse gespiegelt ist. Auch daraus kann man z.B. eine Funktion 2. Ordnung ermitteln lassen. Damit hat man dann auch keine Wurzeln mehr.

Eine Wurzelfunktion mit einem Polynom 2.Grades anzunähern ist nicht sehr elegant (siehe Anhang). Dann kannst Du es auch linear annähern und sparst Rechenzeit.


Dann nimmt man halt 3. oder 4. Ordnung. Das sollte immer noch schneller als die Wurzelfunktion sein.

Meistens weiß ich eh nicht, was für eine Funktion ich da eigentlich nachbilden will. Deswegen mache ich das so, dass ich die verschiedenen Ordnungen ausprobiere und mich dann für eine entscheide. Allerdings macht der eingesetzte Mikrocontroller ein fmul in einem Takt, was die Entscheidung für höhere Ordnungen doch sehr erleichtert.

Markus

Netbird
28.04.2007, 20:23
Beispiel: Berchnet werden soll f(3) für f(x) = 2x^3 -5x^2 +x +6

Ausklammern liefert: f(x) = (2*x -5) *x + 1) *x +6

Also f(3) = 2*3=6 -5= 1 *3 = 3 +1 =4 *3 = 12 +6 = 18

Das ist ein Paradebeispiel für eine FOR - NEXT SChleife und Koeffizienten in einem Array.

Auf dem Blatt Papier schreibt man das so auf:
Koeffizienten 2 -5 1 6
x= 3 6 3 12
Start: 2 1 4 18

Vom Startkoeffizienten schräg nach oben multiplizieren, untereinanderstehende Werte addieren, am Schluss steht f(3) = 18

Wird auch zur Polynomzerlegung genommen, wenn man von einem Polynom n-ter Ordnung eine Nullstelle hat und dann zerlegt in ein Polynom n-1 ter Ordnung und einem Linearfaktor.

Viel Vergnügen ..

Netbird
28.04.2007, 20:25
Sehe eben, dass die Formatierung verrutscht ist! Schema schön untereinander schreiben, dann wird's übersichtlich ...

Netbird
28.04.2007, 20:30
Habe eben gegoogelt: Ist prima erklärt in Wikipedia!
Mit Beispielen aller Art... Sehr zu empfehlen.