Moin, ich habe einen relativ komplexen Zusammenhang zwischen einem Messwert, wie er vom A/D-Wandler kommt, und dem anzuzeigenden Ausgabewert. Es kommen Potenzen und Wurzeln darin vor. Mein Anzeigeinstrument hat einen Wertebereich von 0 bis 300 mit einer Nachkommastelle, also 3.000 Werte. Der Wert vom A/D-Wandler ist 24 bit breit. Für eine Tabelle würde ich immernoch zu viel Speicher brauchen. Daher dachte ich an eine Annäherung, die ich mir vorher berechne. Am liebsten würde ich natürlich mit Ganzzahlen auskommen. Welche Annäherungs-Funktionen eignen sich am besten für die Berechnung auf einem µC? Und die wichtigste Frage: Angenommen ich habe eine Tabelle, in der ich jedem der 3.000 Ausgabewerte den "Schwellwert" des A/D-Wandlers zugeordnet habe, wie komme ich dann am einfachsten auf eine Funktion, die diese Werte ausspuckt (Berechnung)?
wenn es nur 3000 mögliche ausgabewerte gibt kannst du ja für jeden die obergrenze abspeichern und dann per binärer Suche den passenden suchen, das sollte höchstens 12 Schritte brauchen, im Mittel etwas weniger. Wie immer wäre mehr information nützlich, wenn Du deine Funktion hier reinschreibst fällt uns vielleicht noch was für diesen Fall besseres ein.
Wenn Deine Funktion z.B. relativ glatt ist könnte eine Interpolationssuche viel schneller sein.
Wenn das genau genug ist, könnte man auch nur 300 (oder 600, oder 1000) Werte in einer Tabelle speichern und dazwischen linear interpolieren (oder evtl. noch quadratisch). Das setzt natürlich vorraus, das die Funktion ihren wert relativ langsam / gleichmäßig ändert.
>> Mein Anzeigeinstrument hat einen Wertebereich von 0 bis 300 mit einer >> Nachkommastelle, also 3.000 Werte. Der Wert vom A/D-Wandler ist 24 bit >> breit. Da hast du aber mit Kanonen auf Spatzen geschossen. Beschreibe mal die Verhältnismäßigkeiten deines Projektes. Was liegt denn am Wandler Eingang an und was soll daraus werden, (0-3000) ist schon klar.
Hans Mayer schrieb: > Welche Annäherungs-Funktionen eignen sich am besten für die Berechnung > auf einem µC? Das kommt sehr drauf an, was das für ein Funktionstyp ist, wie schnell sich dein Eingangswert ändert und wie oft der Funktionswert überhaupt berechnet werden muß. So allgemein läßt sich deine Frage leider nicht beantworten.
Gerhard schrieb: > ich habe einen relativ komplexen Zusammenhang zwischen einem Messwert, > wie er vom A/D-Wandler kommt, und dem anzuzeigenden Ausgabewert. ... > wie komme ich dann am einfachsten auf eine Funktion, > die diese Werte ausspuckt (Berechnung)? Du musst nur die gegebene Funktion oder die Umkehrfunktion verwenden.
Wenn die Mathematik zu Berechnung der Funktion schon zu komplex ist, ist ein Approximation zur Vereinfachung schon weit jenseits des Horizontes.
Erstmal hatte ich an einer Approximation deiner Umrechnungsfunktion gedacht: Da es sich aber um ein Messgerät handelt ist dies aber ein Schritt in der falschen richtig, macht du deine Approximation sehr genau dann gewinnst du eigentlich nichts. Ich würde dir zu einen externen Flash raten (sind nicht teuer) und mit einer Mapping Funktion greifst du auf diese externen Werte zu. Das hat den en zusätzlichen Vorteil das du diese Werte noch zusätzlich manipulieren kannst um Nichtinearitäten, Offsetfehler &etc. auszugleichen.
unglaublich wieviele Antworten man auf so eine allgemeine und unpräzise Frage bekommt. Gerhard, wach auf und bring Licht ins Dunkel!
In der Zeit, die ein 24Bit ADC zum konvertieren braucht, kriegt ein moderner 32Bit µC schon eine ganze Menge weggerechnet. Also erstmal eine Laufzeitberechnung oder Messung machen.
Gerhard schrieb: > also 3.000 Werte. Der Wert vom A/D-Wandler ist 24 bit breit. 3000 vs 16777216, das ist pro Anzeigedigit ein (linearer) AD-Schritt von 5600. Da gehen also auf dem Weg zur Anzeige mehr als 12 Bit flöten. Oder das muss eine ungeheuer dynamische Kurve sein... Mich würde die Anwendung brennend interessieren.
Gerhard schrieb: > ich habe einen relativ komplexen Zusammenhang zwischen einem Messwert, > wie er vom A/D-Wandler kommt, und dem anzuzeigenden Ausgabewert. Es > kommen Potenzen und Wurzeln darin vor. Für ne Anzeige kann man ruhig die komplette Formel ausrechnen, selbst ein 8-Bitter langweilt sich dabei. Mehr als 5 Anzeigewerte/s ist nicht ergonomisch, das wird dann als störendes Flackern wargenommen. Kommerzielle Anzeigemeßgeräte machen daher auch nur 2 .. 5 Messungen/s. Peter
Peter Dannegger schrieb: > Für ne Anzeige kann man ruhig die komplette Formel ausrechnen, selbst > ein 8-Bitter langweilt sich dabei. Weiß man nicht mit sicherheit, um die Formel wird immer noch ein Geheimnis gemacht.
Hallo Gerhard, ich habe hier: http://www.sebulli.com/ntc/index.html ein Script, dass eine Tabelle für NTCs erzeugt. Die NTC Kurve wird aus den Stützstellen interpolliert. Der C-Code, der erzeugt wird ist nur wenige Zeilen lang und sehr schnell, da nur eine Multiplikation, einige Additionen und Schiebeoperationen benötigt werden. Bei 32 Stützstellen liegt der Fehler, der entsteht, weil ich es mit Stützstellen mache, bei nur 0.14%. Deswegen würde ich mal schätzen, dass es bei Deine Anwendung ähnlich sein wird, und mit 128 Stützstellen auf Deine Genauigkeit kommen wirst. Gerd
gerd b. schrieb: > mit 128 Stützstellen auf Deine Genauigkeit kommen wirst. Und wofür dann der 24 Bit Wandler?
>Und wofür dann der 24 Bit Wandler?
Wegen der Dynamik und der Auflösung.
Zwischen den 128 Stützstellen wir linear interpoliert. Der Fehler durch
die Interpolation, also die Abweichung der Gerade zwischen den beiden
Stützpunkten zu der idealen Kurve ist deutlich geringer, als man im
Allgemeinen annimmt.
gerd
Hab grad mal ein Beispiel mit 128 Stützstellen ausgerechnet: Wäre die darzustellende Funktion F(x)=3000 x (sin(x))² , für x = 0..2, so wäre die maximale Abweichung durch die Interpolation: +-0.2. Also noch nicht ganz die 0.1 der Auflösung.
So, nun bin ich wieder wach :) Danke für eure vielen Antworten. Also, es geht um einen Fahrtmesser für ein schnelles Flugmodell. Der Geschwindigkeitsbereich liegt bei 0 bis 300 km/h, wobei ich gerne eine (für's Ablesen nutzlose) Nachkommastelle hätte, die dann für weitere Berechnungen herangezogen werden soll (Windvektor). Die Samplerate (gegeben durch ADC) liegt bei 7,5 Hz. Im Modell gibt es seitlich eine Abnahme für den statischen Luftdruck und ein Pitotrohr für den Gesamtdruck. Daran ist ein Differenzdrucksensor angeschlossen (Bereich 5.000 Pascal), der wiederum ohne Verstärker direkt an einem 24bit-Wandler hängt (der Aufbau ist sicherlich nicht optimal, aber winzig klein, leicht und stromsparend, und funktioniert auch). Ich möchte jetzt den Wert vom A/D-Wandler direkt auf dem Modell in eine Fahrt in km/h (oder von mir aus auch SI-mäßig m/s) umrechnen.
Und woher kommt die Annahme, dass das per normaler Berechnung nicht geht?
Gerhard schrieb: > Die Samplerate (gegeben durch ADC) liegt bei 7,5 Hz. Ist dir klar, was für eine Leistungsfähigkeit selbst ein 8 Bitter hat? Ich weiß ja nicht wie komplex die Formel nun ist, aber ich gehe mal stark davon aus, dass man das locker schafft. Wir können natürlich nicht helfen, wenn du uns nichtal die absolute Grundlage (die Formel) offenlegst. Das ist irgendwie lächerlich. Das ganze mit Fixkommaarithmektik zu lösen klingt nach einem halbwegs vernünftigen Ansatz, je nach Formen. Also bitte die zu berechnende Formel. Von mir aus auch mit falschen Werten, wenn Sie so obergeheim ist. Aber dann zumindest die Struktur und Art der Arithmetik gleich.
Der µC hat nebenher noch eine Menge zu tun, und soll diese Berechnung zusätzlich nebenher machen. Da ich beim testweisen Herumprobieren mit floating point schon den Programmspeicher gesprengt habe, brauche ich mindestens mal den Festkomma-Ansatz. Sorry für das Vergessen der Formel, die wollte ich eigentlich schon in den letzten Post reinschreiben. Im Anhang ist ein NASA-Dokument, wo die Formel für Fahrtmesser angegeben ist: Seite 6 (Seite 12 im PDF), Gleichung 7
Hallo Ich würde die Formel in ADC Einheiten skalieren. In Excel eingeben und eine Tabelle mit n Stützwerten erzeugen - und die Punkte dazwischen interpolieren. Das geht mit einem 8-Bitter innerhalb weniger Mikrosekunden. Jan
Ich habe hier SW für ein GPS mit Grafikdisplay an einem 8051 (AT89S8253). Auf diesem System berechne ich mit 64 Bit Orthodrome (Also Berechnungen auf Kugeloberflächen). Dazu sind neben den Grundrechenarten auch Quadratwurzel ziehen und trigonomische Berechnungen (arccos, arcsin, sin, cos) nötig. Die Berechnungen werden mehrfach pro Sekunde gemacht. Nebenbei wird auch noch die Grafikausgabe erzeugt. Sollte es also nur um diese Formel 7 auf Seite 12 gehen, sehe ich keinerlei Probleme, diese mit 16 oder gar 24 Bit ausrechnen zu lassen. Aber vielleicht mußt Du ja noch jede Menge Umrechnungen machen: - von Zoll-Quecksilber in Pfund-pro-Quadratfuss - von Réaumur in Fahrenheit - von statute Meilen pro Stunde in Knoten oder Fuss pro Sekunde (Habe mich darüber köstlich amüsiert! :-) Gruß Jobst
Jobst M. schrieb: > - von Zoll-Quecksilber in Pfund-pro-Quadratfuss ist zwar OT: aber Du weißt hoffentlich woher die 35um Kupfer auf der Leiterplatte kommen (bzw. warum sind es nicht 25um oder 50um) Gruß Anja
>ist zwar OT: aber Du weißt hoffentlich woher die 35um Kupfer auf der >Leiterplatte kommen (bzw. warum sind es nicht 25um oder 50um) Sprich!
Hallo Gerhard, mal einige Info's auch aus der Praxis des Modellflugs die Geschwindigkeit in m/s ist m/s = Wurzel aus(Luftdruck in Pa*2 / dichte der Luft [kg/m^2]) Hinweis: in Meereshöhe hat Luft 1.225 kg/m^2 Wenn man es besonders genau haben will, kann man über den Umgebungsdruck den Wert der Luftdichte noch anpassen. Die notwendige Auflösung kommt aus der Praxis. Pito und Prandtl Rohr machen unter 30km/h kaum Sinn, da zu hohe Abweichungen auftreten. Dazu kommt, das ein schnelles Modell wohl kaum noch bei 30 km/h flugfähig ist. Rechne Dir einfach mal die Staudruckdifferenz in Pa für verschiedene Geschwindigkeitsdifferenzen in unterschiedlichen Geschwindigkeitsbereichen aus und setze das auf den Ausgangswert des ADC's um und betrachte daraus die notwendige ADC Auflösung. Mehr als 16bit werden es wohl nicht werden tippe ich mal. Selbst bei 30Km/h ist in der Praxis eine Auflösung von 1 km/h vollkommen ausreichend. Wenn man sich auf das wesentliche wirklich für die Praxis notwendige beschränkt geht es auch mit wenig Aufwand und die math Lib benötigt man auch nicht. Mein mini Speed Sensor besteht aus einem MP3V5004 und ATtiny85, der Code ist inklusive Software UART und Anbindung an den MPX Sensor-Bus gerade mal 3kB groß. Mit optionalem BMP085 als Drucksensor für Höhenmessung und Vario Ausgabe kommen knapp 7kB zusammen. Durch ein wenig tricksen, dh. Umschalten der ADC Referenz und Oversampling kann man dem AVR auch 13bit Auflösung entlocken. Gruß Ingo
>>ist zwar OT: aber Du weißt hoffentlich woher die 35um Kupfer auf der >Leiterplatte kommen (bzw. warum sind es nicht 25um oder 50um) 35um entspricht 1 Unze pro Quadratfuss, soweit ich mich erinnere
Oktav Oschi schrieb: > 35um entspricht 1 Unze pro Quadratfuss, soweit ich mich erinnere stimmt. Gruß Anja
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.