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.
Tabelle mit Stützpunkten und zwischen den Stützpunkten interpolieren?
Oder sich mit Excel die Formal ausspucken lassen und auf
Ganzzahlarithmetik normieren?
>>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.
> 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?
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.
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.
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
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.
...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.
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:
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.
..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