Hi, habe diese Zahlenreihe: index wert (pwm) (Helligkeit in klx) 0 2,1 16 2,3 32 2,7 48 3,1 64 3,6 80 4,3 96 5,1 112 6,2 128 7,6 144 9,5 160 11,9 176 14,9 192 18,1 208 19,3 224 19,4 240 19,5 255 19,6 und suche dazu eine Formel zu linearisierung. Wie bekomme ich das mit Ganzzahlen (kein Float/Kommazahl) möglichst gerade? Habt Ihr einen Tip? T.S.
So sieht das im Diagramm aus (blau) und es sollte wie die rote Linie aussehen. Für einen Tip wäre ich dankbar. T.S.
Tabelle mit Stützpunkten und zwischen den Stützpunkten interpolieren? Oder sich mit Excel die Formal ausspucken lassen und auf Ganzzahlarithmetik normieren?
Nimm doch die Geradengleichung der roten Linie (Formel per Trendlinie in Excel...).
>>Oder sich mit Excel die Formal ausspucken lassen und auf >>Ganzzahlarithmetik normieren? daran habe ich auch gedacht, habe das aber vor 10 Jahren das letzte Mal gemacht. Lookup ist schwierig, denn ich habe ja 255 Stufen...das würde eine große Tabelle werden...oder? T.
T.S. schrieb: > das würde eine große > Tabelle werden...oder? Naja, aber wenns schnell gehen soll ist das die beste Lösung.
...die rote Line habe ich nur mal eben eingezeichnet um es zu verdeutlichen, habe jetzt aber eben noch eine in Exel eingebaut... T.
> Lookup ist schwierig, denn ich habe ja 255 Stufen...das würde eine große > Tabelle werden...oder? 256 Bytes, die ggf. RAM-sparend im ROM oder EEPROM liegen. Ist das bei deinem µC viel?
...mir würde sonst eine Angabe von 11 bis 100% auch reichen, also 89 Stellen, von 2,1klx bis 19,6klx. T.
Wenn du eine LUT machst, warum willst du dann linearisieren? Dann kannst du doch die korrekten Werte nehmen, ansonsten baust du dir nur einen zusätzlichen Fehler ein. Alternativ machst du halt nur 8 oder 16 Stützstellen und dazwischen eine Gerade.
>>Alternativ machst du halt nur 8 oder 16 Stützstellen und dazwischen eine >>Gerade. Plan B. wie bekomme ich au Excel diese Formel raus? T.
Hi
>Atmega48 und da ist noch einges zu tun :-)
Na und. Es gibt auch noch ATMega88/168 und 328.
MfG Spess
Such im Netz mal nach der Zwei-Punkte-Form einer Geraden, das ist ganz einfache Mathematik. Für eine einfache Linerisierung kannst du die beiden als Annäherung nutzen: pwm = 102*klx/7 - 30 (genau) oder pwm = 16*klx - 30 (schnell)
Wenn er eh eine Interpolation benötigt, müssen die Punkte nicht genua getroffen werden - im Gegenteil, eine Ausgleichsfunktion isit da besser. Bei Excel kann man den Polynomgrad einstellen, glaube ich.
..werde ich gleich mal testen. ich habe das jetzt noch mal genau anders herum aufgezogen, die Helligkeiten linear eingestellt und die zugehörigen PWM Werte ermittelt: % Helligkeit Wert 10 2,1 0 15 3,15 42 20 4,2 73 25 5,25 95 30 6,3 111 35 7,35 123 40 8,4 130 45 9,45 139 50 10,5 145 55 11,55 152 60 12,6 158 65 13,65 166 70 14,7 171 75 15,75 174 80 16,8 178 85 17,85 183 90 18,9 188 95 19,95 195 100 21 255 Das ist gerade am Ende scheiße krumm! T.
Man kann es zwar berechnen, ich denke aber eine Tabelle ist besser. http://www.arndt-bruenner.de/mathe/scripts/kubspline.htm#rechner Hier kannst Du deine Wertepaare einfügen und berechnen.
Aus dem ersten Bild kann man entnehmen, dass eine! kubische Funktion zur Linearisierung ausreicht. Diese bestimmt man aus 4 charakteristischen Wertepaaren und einem Gleichungssystem. Geringe Abweichungen bleiben, die sind sicher vertretbar. Joe
T.S. schrieb: > Das ist gerade am Ende scheiße krumm! Und deswegen ist es Blödsinn im Quadrat das zu linearisieren. Joe schrieb: > Aus dem ersten Bild kann man entnehmen, dass eine! kubische Funktion zur > Linearisierung ausreicht. Klar, statt einfach ein Array von 256 Werten einmal zu füllen macht man eine kubische Gleichung, die auch noch in (8Bit!) für jeden Wert berechnet werden soll. Leute schießt ihr eigentlich immer mit Terawattlaser auf Mücken?????
Hallo, Den oberen Bereich kannst Du ruhig ausblenden, weil sich in 55 PWM-Steps im Ergenbis (Helligkeit) praktisch nichts mehr tut. Das Reduziert natuerlich Deine Gesamtaufloesung. Natuerlich waere das Beste ein LUT ggf. mit Linearisierung der Zwischenwerte...ein Klacks fuer den geuebten Programmer. Solltest Du wirklich rechnen wollen, so stimmt diese Formel auf <1% (bis eben PWM = 200): Hellikeit = (0.0000241864 x^3 + -0.00150436 x^2 + 0.237658x + 20.3846)/10 Gruss Michael
Kommt drauf an, was Du mit Linearisierung meinst. Also, ich verstehe darunter einfach ein Polynom 1. Ordnung
Wenn Du annimmst, das Deine Wertepaare diesem Zusammenhang gehorchen, kannst Du die beiden Parameter
beispielsweise über einen Least-Squares-Schätzer-Ansatz aus den gemessenen Werten schätzen. Für mehr Hintergrund zum LS_Schätzer bspw. das hier: http://books.google.de/books?id=tYCJ4ZEGhsMC&printsec=frontcover&dq=kiencke&hl=de&ei=yUioTqGUHIfc4QSwtL3tDw&sa=X&oi=book_result&ct=result&resnum=5&ved=0CEUQ6AEwBA#v=onepage&q&f=false (Seiten 18 und 19)
>Leute schießt ihr eigentlich immer mit Terawattlaser auf Mücken?????
Na sicher. Das erspart das Zielen.
Hey, ich habe jetzt mal das hier: X Y 10 0 15 42 20 73 25 95 30 111 35 123 40 130 45 139 50 145 55 152 60 158 65 166 70 171 75 174 80 178 85 183 90 188 95 195 100 255 Bei: http://www.arndt-bruenner.de/mathe/scripts/kubspline.htm#rechner eingegeben, und das ist seitenweise was dabei raus kommt, unmögliche Zahlen. @Michael: da hast du recht, ich könnte aber auch die Werte bis 95% linearisieren und von 96 bis 100 dann dran hängen. Was ist in deiner Formel X? Ich möchte im Controller eine %-Zahl zwischen 10 und 100 angeben und einen PWM Wert entsprechend oben stehender y Werte raus bekommen. Habe auch diese Formel: pwm = 102*klx/7 - 30 (genau) von Captain Subtext getestet, allerdings wollte ich die Helligkeit im Controller nicht in klx sondern in % angeben :-). Aber so eine Gleichung in der Form ist das was am besten machbar wäre. Vielen Dank für die zahlreichen Antworten bis hierher. Ich hoffe es findet sich eine gute Lösung. Gruß, T.
...diese sollte sich doch relativ einfach bilden lassen, oder? muss ja nicht exakt so sein, aber eben annähernd :-) Der Tip von dir war gut Michael! Gruß, T.
...schau dir das http://www.acroname.com/robotics/info/articles/irlinear/irlinear.html mal an. Jens J.
...kenne ich, das ist ein ähnliches Problem, aber leider ist dort nicht zu sehen wie die Lösung ermittelt wurde... @Captain Subtext Wie kommt man denn mit der 2 Punkteform einer Geraden auf so eine annäherung? Irgendwas stimmt mit deiner Formel: 102*klx/7 - 30 nicht, von wo nach wo rechnet sie denn um? Danke trotzdem, T.
T.S. schrieb: > Bei: > > http://www.arndt-bruenner.de/mathe/scripts/kubspli... > > eingegeben, und das ist seitenweise was dabei raus kommt, unmögliche > Zahlen. Stell mal den Koeffizienten auf 2 Dezimalstellen, dann sieht das Ganze freundlicher aus.
Ich würde (wie schon mal vorgeschlagen) eine 16 Punkte Tabelle machen und zwischen den Stützpunkten linear interpolieren. Das geht ganz ohne großartige Mathematik. Und insbesondere ohne Division...
Lothar Miller schrieb: > Ich würde (wie schon mal vorgeschlagen) eine 16 Punkte Tabelle machen > und zwischen den Stützpunkten linear interpolieren. Das geht ganz ohne > großartige Mathematik. Hallo Lothar, Ich habe so langsam den Eindruck, daß der Gute mit der interpolation zwischen 2 Punkten schon etwas überfordert ist: T.S. schrieb: >>>Alternativ machst du halt nur 8 oder 16 Stützstellen und dazwischen eine >>>Gerade. > > Plan B. > wie bekomme ich au Excel diese Formel raus? > T. Sorry, aber das kaue ich ihm nicht vor. Er soll einfach mal merken daß Mathe in der 8. Klasse doch nicht fürn Arsch war :-))
T.S. schrieb: > ...kenne ich, das ist ein ähnliches Problem, aber leider ist dort nicht > zu sehen wie die Lösung ermittelt wurde... > > @Captain Subtext > Wie kommt man denn mit der 2 Punkteform einer Geraden auf so eine > annäherung? > > Irgendwas stimmt mit deiner Formel: > > 102*klx/7 - 30 > > nicht, von wo nach wo rechnet sie denn um? > > Danke trotzdem, > T. Sie rechnet vom Startpunkt (2,1) zum _Endpunkt(19,6), allerdings habe ich die entstehenden Werte gerundet. Eine Tabelle ist wohl die beste Lösung.
Hallo, @UR Schmitt immer locker bleiben, ich würde das lieber als Formel einsetzen wenn möglich. Deswegen konzentriere ich mich etwas mehr dahingehend. Die Interpolation wäre nicht das Problem. Spontan habe ich zwar keine Idee wie ich schnell den passenden Index ermittle. Würde mich ungern in einem if-else Grab verlieren. 1) den index der darunter und darüber liegenden Stützstelle ermitteln. Hier würde ich warscheinlich ohne zu teilen nicht zum Ziel kommen, mir schwebt immer die Modulo Funktion vor Augen... 2) linear interpolieren...Beispiel: 17% Stützstelle bei 15% = 42, bei 20% = 73. 73-42=31 31/5*(17%-15%)=12,4 42+12,4=54,2 Aber wie gesagt lieber als kurze integer Formel. Die 100% weg zu lassen ist eine gute Sache. Dennoch frage ich mich wie man auf die Formeln kommt. @Captain Subtext Ich habe die Formel mal auf meine Messwerte angewandt: klx Ergebnis 2,1 0,6 2,3 3,514285714 2,7 9,342857143 3,1 15,17142857 3,6 22,45714286 4,3 32,65714286 5,1 44,31428571 6,2 60,34285714 7,6 80,74285714 9,5 108,4285714 11,9 143,4 14,9 187,1142857 18,1 233,7428571 19,3 251,2285714 19,4 252,6857143 19,5 254,1428571 19,6 255,6 Das ist dann aber genauso krumm. Zumal ich ja von % nach PWM will: Beitrag "Re: Zahlenreihe und Formel" Kannst du mir sagen wie du auf diese Form 102*klx/7 - 30 kommst? Gruß, T.
Eigentlich sollte man erstmal klären, wieso die Kurve ab 200 in die Sättigung geht, bevor man krampfhaft versucht, den Verlauf in Puzzlearbeit nachzubauen. Oder man verwendet nur den Bereich 0..200
T.S. schrieb: > Hey, > > ich habe jetzt mal das hier: > > X Y > 10 0 > 15 42 > 20 73 > 25 95 > 30 111 > 35 123 > 40 130 > 45 139 > 50 145 > 55 152 > 60 158 > 65 166 > 70 171 > 75 174 > 80 178 > 85 183 > 90 188 > 95 195 > 100 255 > > Bei: > > http://www.arndt-bruenner.de/mathe/scripts/kubspli... > > eingegeben, und das ist seitenweise was dabei raus kommt, unmögliche > Zahlen. Ich habe diese unmöglichen Zahlen mal in ein (Libre) Office Dokument eingefügt und berechnet. Hab es auch mit Rechnen in C versucht, aber das braucht auf jeden Fall mehr Speicher als die 91 byte die Du für die Tabelle (siehe Tabelle: c freundlich) benötigst.
...ich spiele gerade mal ein bissl mit einer selbstgebastelten Formel rum. sieht gerade so aus: Y=PWM Wert X=%angabe Y=100/-X*10 + X + 100 Liefert die blaue Linie. Das ist schon relativ nah dran...leider ein "-" enthalten. T.
T.S. schrieb: > Spontan habe ich zwar keine Idee wie ich schnell den passenden Index > ermittle. Würde mich ungern in einem if-else Grab verlieren. Der wichtigste Trick dabei ist, die Tabelle äquidistant aufzubauen. Und zwar willst du eine Helligkeit und suchst einen PWM-Wert dafür. Du teilst also den Bereich zwischen zwischen min. und max. Helligkeit in 16 lineare Stufen (du hast also 17 Tabellenwerte: das ist wie bei Zäunen mit den Pfählen. Du brauchst einen Pfahl mehr als du Zaunfelder hast) und suchst die passenden PWM-Werte dafür. Und jetzt nimmst du von einem 8-Bit Wert für die gewünschte Helligkeit die oberen 4 Bit zur Auswahl des "Blocks" und die unteren 4 Bit für die Gewichtung zwischen den beiden Stützwerten. Und weil die Werte so geschickt gewählt wurden, ist nach Aufsummierung nur ein 4er-Shift und keine Division nötig. Also, nehmen wir mal diese Werte:
1 | // Stuetzpunkttabelle
|
2 | uint8_t sp[17] = {7,23,45,56,78,89,100,115,145,167,179,182,200,210,220,230,255}; |
3 | |
4 | uint8_t h; // Helligkeit 0..255 |
5 | uint8_t p; // PWM-Wert |
6 | uint16_t tmp // Hilfvariable |
Dann gibt das zusammen mit dieser Formel den passenden Wert:
1 | // Gewichtung sp "links" + Gewichtung sp "rechts"
|
2 | tmp = ( sp[(h>>4)&0xf]*(16-h&0xf) + sp[((h>>4)&0xf)+1]*(h&0xf) ); |
3 | pwm <= tmp/16; |
Danke für die Ausführung. Das bedeutet ich müsste diese Formeln die auch noch unendlich viele Floats enthalten alle in den Code einbauen!? Ich habe hier nun durch Spielerei: 100/-X*12+X+110 am Start. Liefert das (siehe Anhang). Aber es ist noch nicht ganz perfekt, zumal durch negative Zahlen geteilt wird.... T.
@Lothar Miller danke für deine Ausführung. Ich habe schon vermutet dass du bei 16 Abschnitten die oberen 4 Bit verwenden willst, aber wenn ich von 0-100% angeben will, müsste ich erst linear von 0-100 auf 0-255 umrechnen, das wäre in Kombination mit dem Trick die oberen 4 Bit zu nehmen, schon mal ein weiterer Trick um die if-else Geschichte zu umgehen. Deine Formel muss ich erstmal in ruhe ansehen, vielen Dank dafür. Sieht auf jeden Fall nach recht wenig Code aus :-) Gruß, T.
PWM=100/-X*13+X+120 ich glaube besser kann man das nicht treffen. Zumindest nicht mit vergleichbaren Mitteln. T.
..so gehe jetzt erstmal in Bett. Ich habe die Formel: Beitrag "Re: Zahlenreihe und Formel" die etwas darunter lag genommen, da es sonst ab 80% wirklich fehlte. Es ist nicht ganz linear, aber schon sehr gut zu sehen :-) Die Formel ist erstmal so eingebracht: return ( (100/((int16_t)percent*(-1))*12) +percent+110); Ich bin weiterhin für jeden Tip dankbar. T.
Wenn dir das noch nicht reicht, dann nimm eines der Tools im Internet. Du brauchst allerdings einen, der dir verschiedene Grundfunktionen zur Auswahl anbietet und auch selbst optimiert. Also insbesondere die Wertepaare nicht fix an eine Stelle knallen will. Stichworte wären: curve fitter online Hier einer: http://statpages.org/nonlin.html Meinen Liebling finde ich auf die Schnelle gerade nicht. Hm, lange her. Ich glaube der ist es: http://zunzun.com/ Ist etwas komisch in der Bedienung, aber extrem leistungsfähig.
Hi, ich habe ein ähnliches Problem: X Y 1 130 10 171 20 195 30 209 40 215 50 220 60 225 70 227 80 230 90 233 100 240 Wie bekomme ich eine reltiv einfache und angenäherte Formel dabei raus? Hannes
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.