Forum: Mikrocontroller und Digitale Elektronik Zahlenreihe und Formel


von T.S. (Gast)


Lesenswert?

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.

von T.S. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von rudi (Gast)


Lesenswert?

Ich würde das über eine LUT (look up table) machen.

von H.Joachim S. (crazyhorse)


Lesenswert?

Tabelle mit Stützpunkten und zwischen den Stützpunkten interpolieren?
Oder sich mit Excel die Formal ausspucken lassen und auf 
Ganzzahlarithmetik normieren?

von Thomas G. (Gast)


Lesenswert?

Nimm doch die Geradengleichung der roten Linie (Formel per Trendlinie in 
Excel...).

von T.S. (Gast)


Lesenswert?

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

von rudi (Gast)


Lesenswert?

T.S. schrieb:
> das würde eine große
> Tabelle werden...oder?
Naja, aber wenns schnell gehen soll ist das die beste Lösung.

von T.S. (Gast)


Lesenswert?

...die rote Line habe ich nur mal eben eingezeichnet um es zu 
verdeutlichen, habe jetzt aber eben noch eine in Exel eingebaut...

T.

von Krapao (Gast)


Lesenswert?

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

von T.S. (Gast)


Lesenswert?

...mir würde sonst eine Angabe von 11 bis 100% auch reichen, also 89 
Stellen, von 2,1klx bis 19,6klx.

T.

von T.S. (Gast)


Lesenswert?

Atmega48 und da ist noch einges zu tun :-)

T.

von UR Schmitt (Gast)


Lesenswert?

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.

von T.S. (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

>Atmega48 und da ist noch einges zu tun :-)

Na und. Es gibt auch noch ATMega88/168 und 328.

MfG Spess

von Captain S. (captainsubtext)


Lesenswert?

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)

von Martin K. (mkmannheim) Benutzerseite


Lesenswert?

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.

von T.S. (Gast)


Angehängte Dateien:

Lesenswert?

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

von hp-freund (Gast)


Lesenswert?

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.

von Joe (Gast)


Lesenswert?

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

von UR Schmitt (Gast)


Lesenswert?

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

von Michael R. (mexman) Benutzerseite


Lesenswert?

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

von Der mit dem Mathema-Tick (Gast)


Lesenswert?

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)

von Matthias L. (Gast)


Lesenswert?

>Leute schießt ihr eigentlich immer mit Terawattlaser auf Mücken?????

Na sicher. Das erspart das Zielen.

von T.S. (Gast)


Lesenswert?

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.

von T.S. (Gast)


Angehängte Dateien:

Lesenswert?

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

von Jens J. (Gast)


Lesenswert?


von T.S. (Gast)


Lesenswert?

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

von hp-freund (Gast)


Lesenswert?

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.

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


Lesenswert?

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

von UR Schmitt (Gast)


Lesenswert?

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

von Captain S. (captainsubtext)


Lesenswert?

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.

von T.S. (Gast)


Lesenswert?

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.

von Tom (Gast)


Lesenswert?

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

von hp-freund (Gast)


Angehängte Dateien:

Lesenswert?

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.

von T.S. (Gast)


Angehängte Dateien:

Lesenswert?

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

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


Lesenswert?

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;

von T.S. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von T.S. (Gast)


Lesenswert?

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

von T.S. (Gast)


Angehängte Dateien:

Lesenswert?

PWM=100/-X*13+X+120

ich glaube besser kann man das nicht treffen. Zumindest nicht mit 
vergleichbaren Mitteln.

T.

von T.S. (Gast)


Angehängte Dateien:

Lesenswert?

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

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

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.

von Matthias L. (Gast)


Lesenswert?

>PWM=100/-X*13+X+120

Kannst Du da mal paar Klammern setzen?

von Hannes (Gast)


Lesenswert?

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

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Zu faul zunzun.com aufzurufen?

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.