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 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.
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.
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
>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.
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
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