Ich suche für eine messtechnische Kalibrationsaufgabe eine allgemeine, einfache programmtechnische Lösung, die Menge von (Mess)Werten A auf eine andere Menge zutreffender (Ergebnis)Werte B abzubilden: Gegeben sei beispielsweise A mit der Folge von 0DB8H bis 0900H und zugehörig B von 100 bis 1500 (mA). Zu beachten hierbei: Die eine Abfolge fällt, die andere steigt dabei. Man könnte sowas natürlich aufwendig in einer großen Tabelle lösen. Gesucht wäre nun eine deutlich platzsparendere Lösung!
:
Verschoben durch Moderator
> Ich suche für eine messtechnische Kalibrationsaufgabe eine allgemeine, > einfache programmtechnische Lösung, die Menge von (Mess)Werten A auf > eine andere Menge zutreffender (Ergebnis)Werte B abzubilden: Das klingt nach einer schnöden Relation (oder im Spezialfall einer Funktion). > Gesucht wäre nun eine deutlich platzsparendere Lösung! Wenn linear reicht dann schafft das ein Einzeiler (zumindest in den üblichen Programmiersprachen). Wenns lesbar sein darf dann auch auf zwei oder drei Zeilen verteilt.
g457 schrieb: > Wenn linear reicht dann schafft das ein Einzeiler (zumindest in den > üblichen Programmiersprachen). Linear reicht. Welcher Einzeiler schafft das nun konkret?
Hier ist der Einzeiler: y = y_min +(y_max-y_min)/(x_max-x_min)*(x-x_min)
df2ds schrieb: > Hier ist der Einzeiler: > y = y_min +(y_max-y_min)/(x_max-x_min)*(x-x_min) Welches Problem dieser Einzeiler löst weiß ich nicht. Dieses hier ist es jedenfalls nicht.
Urs H. schrieb: > Welches Problem dieser Einzeiler löst weiß ich nicht. Dieses hier ist es > jedenfalls nicht. war ja auch für eine positive Steigung ohne Offset! Geradengleichung war schon immer m=dx/dy b=Offset y = m * x + b ohne Offset y = m * x y und x steigend m = positiv ist einer nun fallend also m negativ muss dy oder dx umgedreht werden ist nirgends ein Offset entfällt b kann locker per Hand auf Karopapier oder als Tabelle in Exel überprüft werden.
:
Bearbeitet durch User
Urs H. schrieb: > df2ds schrieb: >> Hier ist der Einzeiler: >> y = y_min +(y_max-y_min)/(x_max-x_min)*(x-x_min) > > Welches Problem dieser Einzeiler löst weiß ich nicht. Dieses hier ist es > jedenfalls nicht. Ich hätte deine Problembeschreibung jetzt so verstanden, dass du einen Raw-AD-Wert auf den echten Messwert skalieren möchtest. Also 1823 bis 245 Digits ergeben am Ende 100 bis 1500mA oder whatever. Oder 4 bis 20mA sollen auf 0...100% umgerechnet werden. Und genau das tut die Funktion, die df2ds angegeben hat. https://www.arduino.cc/reference/de/language/functions/math/map/
Joachim B. schrieb: > war ja auch für eine positive Steigung ohne Offset! Der Einzeiler von df2ds funktioniert für alle Geraden. Also unabhängig vom Vorzeichen der Steigung und unabhängig vom Offset. Urs H. schrieb: > Welches Problem dieser Einzeiler löst weiß ich nicht. Dieses hier ist es > jedenfalls nicht. Dann solltest du deine Problembeschreibung nochmal konkretisieren. Denn wenn dir eine lineare Abbildung der beiden Wertebereiche ausreicht (wie du eigentlich geschrieben hast), dann gibt dir der Einzeler die Rechenanleitung für diese lineare Gleichung.
Sebastian R. schrieb: > Ich hätte deine Problembeschreibung jetzt so verstanden, dass du einen > Raw-AD-Wert auf den echten Messwert skalieren möchtest. Genau. Achim S. schrieb: > Der Einzeiler von df2ds funktioniert für alle Geraden. Ja, ich muss mich korrigieren, hatte das wegen der fehlenden Klammern hinten falsch berechnet. Die Formel passt ansonsten, danke für die Hilfe.
Hinreichend allgemeine und häufig genommene Ansätze: Lookup tables, Neuronale Netze (ja, auch die sind heutzutage einfach aufm µC zu nutzen), ggf. (nicht mehr allzu allgemein) polynomiale Regression (wovon die oben gezeigte Lineare Regression ein Spezialfall ist). Gibt natürlich noch deutlich mehr.
Hier nochmal (ganz ausführlich zur Erklärung) mit "deinen" Werten als Anhang. Viel Erfolg!
Urs H. schrieb: > Urs H. schrieb: > >> der fehlenden Klammern hinten > > um den mittleren Quotienten herum meinte ich Wo meinst Du fehlt da eine Klammer? Man nutzt i.d.r ja auch nicht die Formel, sonder berechnet daraus m und b. Und eigentlich auch nicht aus den Grenzwerten, sondern aus typischen aber weit auseinander liegenden werten oder per linearer Regression. Am Ende gibt es ein m und ein b. Je nach Auflösung kann man zwischen 2 Versionen wählen, die ein unterschiedliches b ergeben: y=mx+b oder y=m(x+b)
Urs H. schrieb: > Die Formel passt ansonsten Ich hatte nur ein richtiges Zufalls-Ergebnis! Also nochmal: Y=mA X=Wert 100 3522 (Ymin/Xmax) 200 3435 300 3348 400 3261 500 3174 600 3087 700 3000 800 2913 900 2826 1000 2739 1100 2652 1200 2565 1300 2478 1400 2391 1500 2304 (Ymax/Xmin) Die Formel so ich sie hoffentlich richtig verstehe: y = y_min + ((y_max-y_min)/(x_max-x_min)) *(x-x_min) Ymin = 100 Ymax-Ymin = 1500-100 = 1400 Xmax-Xmin = 3522-2304 = 1218 Beispiel: Ich möchte für den Messwert X=3000 das zugehörige Y= 700 ausrechnen. Also: Y = 100 + (1400/1218) * 3000-2304 Y= 100 + 1,1494*696 Y= 100+800 = 900! Also Unsinn. Oder was habe ich hier falsch gemacht? A. S. schrieb: > Man nutzt i.d.r ja auch nicht die Formel Ich brauche nur die richtige Formel. Und bitte unzureichende mathematische Kenntnisse zu entschuldigen.
:
Bearbeitet durch User
Urs H. schrieb: > Ich brauche nur die richtige Formel. Die Formel ist richtig, falsch ist die Interpretation, wofür ymin und ymax bzw. xmin und xmax stehen. min bedeutet hier nicht den minimalen Absolutwert. Sondern es steht jeweils für den Wert am Anfang deines Bereichs. max bedeutet hier nicht den größten Absolutwert. Sondern den Wert am Ende deines Bereichs. Wenn du also mit ymin=100mA und xmin=3522 rechnest, geht es auf. Du darfst auch den Bereich umdrehen und ymin=1500mA und xmin=2304 rechnen. Du darfst die min-max-Zuordnung nur nicht bei x und y "mischen".
Achim S. schrieb: > min bedeutet hier nicht den minimalen Absolutwert. Sondern es steht > jeweils für den Wert am Anfang deines Bereichs. > > max bedeutet hier nicht den größten Absolutwert. Sondern den Wert am > Ende deines Bereichs. Danke Nun hab ich's endlich. Passt.
Na also. Deshalb hatte ich in dem angehängten Listing schon "min" und "max" durch "links" und "rechts" ersetzt. Schön, dass es jetzt funktioniert.
df2ds schrieb: > Schön, dass es jetzt funktioniert. Ja, und zwar ganz praktisch und nicht nur als Erleuchtung in der Birne ;) Vielen Dank auch an Dich!
Das Ganze geht uebrigens auch ohne aufwendigen Float. Indem man die Temperatur, Strom, Spannung zB 4 Stellen abbildet und deren letzte Zwei als implizites Nachkomma betrachtet. 1189 = 11.89
Urs H. schrieb: > Ich suche für eine messtechnische Kalibrationsaufgabe eine allgemeine, > einfache programmtechnische Lösung, Dann schau in dein Mathe-Schulbuch. Mich erstaunt es immer wieder, wie sehr gar vielen Leuten hier die Grundlagenkenntnisse fehlen. W.S.
W.S. schrieb: > Dann schau in dein Mathe-Schulbuch. Schau Du in den Thread, der Fall ist längst gelöst. Schneller als gedacht! W.S. schrieb: > Mich erstaunt es immer wieder, wie sehr gar vielen Leuten hier die > Grundlagenkenntnisse fehlen. Mich erstaunt immer wieder, wie manche in solchen Foren statt schneller Hilfsangebote nur Plattformen zur eigenen Selbstdarstellung sehen.
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.