Forum: Mikrocontroller und Digitale Elektronik Komplexe Berechnung auf µC - geschickte Annäherung?


von Gerhard (Gast)


Lesenswert?

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)?

von Hans M. (hansilein)


Lesenswert?

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.

von Hans M. (hansilein)


Lesenswert?

Wenn Deine Funktion z.B. relativ glatt ist könnte eine 
Interpolationssuche viel schneller sein.

von Verwirrter Anfänger (Gast)


Lesenswert?

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.

von Bernd N. (Gast)


Lesenswert?

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

von Knut (Gast)


Lesenswert?

Die Funktion wäre mal interessant!


Knut

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Wie sieht die Funktion denn aus?

von Tip (Gast)


Lesenswert?

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.

von Edi R. (edi_r)


Lesenswert?

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.

von Purzel H. (hacky)


Lesenswert?

Wenn die Mathematik zu Berechnung der Funktion schon zu komplex ist, ist 
ein Approximation zur Vereinfachung schon weit jenseits des Horizontes.

von Nachtaktiver (Gast)


Lesenswert?

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.

von Stauner (Gast)


Lesenswert?

unglaublich wieviele Antworten man auf so eine allgemeine und unpräzise 
Frage bekommt.
Gerhard, wach auf und bring Licht ins Dunkel!

von JojoS (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von gerd b. (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

gerd b. schrieb:
> mit 128 Stützstellen auf Deine Genauigkeit kommen wirst.
Und wofür dann der 24 Bit Wandler?

von gerd b. (Gast)


Lesenswert?

>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

von gerd b. (Gast)


Lesenswert?

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.

von Gerhard (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

Und woher kommt die Annahme, dass das per normaler Berechnung nicht 
geht?

von Lehrmann M. (ubimbo)


Lesenswert?

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.

von Gerhard (Gast)


Angehängte Dateien:

Lesenswert?

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

von Jan84 (Gast)


Lesenswert?

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

von Jobst M. (jobstens-de)


Lesenswert?

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

von Anja (Gast)


Lesenswert?

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

von Matthias L. (Gast)


Lesenswert?

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

von Ingo S. (ingo-s)


Lesenswert?

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

von Purzel H. (hacky)


Lesenswert?

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

von Anja (Gast)


Lesenswert?

Oktav Oschi schrieb:
> 35um entspricht 1 Unze pro Quadratfuss, soweit ich mich erinnere

stimmt.

Gruß Anja

von Jobst M. (jobstens-de)


Lesenswert?

Anja schrieb:
> stimmt.

Und wieso sind es dann nicht 34µm ? :-)


Gruß

Jobst

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