Traunstein, Germany
Offline
Full Member
Karma: 0
Posts: 111
|
 |
« on: July 30, 2011, 08:33:34 am » |
Hier meine Aufgabenstellung (ist für einen Belichtungsrechner für meine Camera):
tStart = gewünschter Anfangswert tEnd = gewünschter Endwert now = das "Jetzt" seit starten des Programmes runStart = hier wurde das Programm gestartet tDuration = gewünschte Dauer des Programmes Momentanwert = ?
alle Werte sind in ms.
Beispiel:
tStart = 1 tEnd = 1000 now = 5000 runStart = 4000 tDuration = 2000
Hier ist der Momentanwert 499,5, denn ich befinde mich in der Mitte der Zeit (now - runStart = tDuration / 2) und somit habe ich die Hälfte zwischen tEnd und tStart ((tEnd-tStart)/2)
Gewünscht ist zu jedem beliebigen JETZT (now) den aktuellen Wert zwischen tStart und tEnd abfragen zu können, abhängig natürlich von der Dauer der linearen Änderung von "tStart" zu "tEnd" über die Dauer "tDuration".
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 16
Posts: 3196
20 LEDs are enough
|
 |
« Reply #1 on: July 30, 2011, 09:02:02 am » |
Ich glaube Du solltest Deine Variablen besser benennen. Dann klappt es auch mit der Rechnerei:
t0:= Startzeit t1:= Zielzeit t := aktuelle Zeit
s0:= Startwert s1:= Zielwert s := aktueller Wert
Wenn der Zusammenhang linear soll, dann also:
(t-t0)/(t1-t0) = (s-s0)/(s1-s0)
oder eben:
t = (t1-t0)/(s1-s0) * (s-s0) + t0 s = (s1-s0)/(t1-t0) * (t-t0) + s0
|
|
|
|
« Last Edit: July 30, 2011, 11:12:00 am by Udo Klein »
|
Logged
|
|
|
|
|
Munich/Germany
Offline
God Member
Karma: 8
Posts: 559
|
 |
« Reply #2 on: July 30, 2011, 09:23:14 am » |
ergebnis = (now - runStart) * (tEnd - tStart) / tDuration + tStart;
|
|
|
|
|
Logged
|
_______ Manfred
|
|
|
|
Traunstein, Germany
Offline
Full Member
Karma: 0
Posts: 111
|
 |
« Reply #3 on: July 30, 2011, 12:00:35 pm » |
Hallo MaFu, das funktioniert super! Du hast nicht zufällig noch die passende Formel (mit den gleichen werten) für exponentielle Wertänderung in deinem Mathematikerkopf?
Da würde ich glatt Freibier springen lassen ;-)
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 16
Posts: 3196
20 LEDs are enough
|
 |
« Reply #4 on: July 31, 2011, 02:17:02 am » |
(exp(t)-exp(t0))/(exp(t1)-(exp(t0)) = (s-s0)/(s1-s0)
oder
s = (s1-s0)/(exp(t1)-exp(t0)) * (exp(t)-exp(t0)) + s0
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 63
|
 |
« Reply #5 on: July 31, 2011, 02:31:06 am » |
Für so lineare Sachen kann man einfach die Funktion MAP nehmen
momentanwert = map(now, runStart, runEnd, tStart, tEnd)
du müsstest halt zunächst aus runStart + runDuration dein runEnd ausrechnen.
|
|
|
|
|
Logged
|
|
|
|
|
Traunstein, Germany
Offline
Full Member
Karma: 0
Posts: 111
|
 |
« Reply #6 on: July 31, 2011, 02:36:02 am » |
Hallo Udo,
leider klappt das nicht. Gibt mir immer "0" aus. :-(
Ich komme auch ganz gut klar mit meinen Bezeichnungen, vor allem weil ich immer weiß was es ist (das geht mir mit S0 leider nicht so). Ich halte hier immer eine art Namenskonvention ein, die Variablennamen sind halt relativ lang...
@TelosNox: Da habe ich auch schon dran gedacht, das werde ich mal testen - allerdings glaube ich nicht das die lineare Rampe funktionieren kann...
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 16
Posts: 3196
20 LEDs are enough
|
 |
« Reply #7 on: July 31, 2011, 02:37:06 am » |
Dann poste mal Deinen Code. Nimmst Du floats oder ints?
|
|
|
|
|
Logged
|
|
|
|
|
Traunstein, Germany
Offline
Full Member
Karma: 0
Posts: 111
|
 |
« Reply #8 on: July 31, 2011, 02:44:32 am » |
Ich werde das mal ausdünnen und posten, im Moment ist der Code noch recht konfus...
Für die Zeitangaben verwende ich "unsigned long".
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 16
Posts: 3196
20 LEDs are enough
|
 |
« Reply #9 on: July 31, 2011, 02:48:08 am » |
Das ist das Problem. Sobald Du mit Exponentialfunktionen arbeitest wird es mit Integers schwierig. Ich will nicht sagen, daß es überhaupt nicht gehen kann, aber dazu muß man dann sehr genau verstehen wie die Formeln funktionieren und auch genau auf die Wertebereiche aufpassen. Deshalb wäre es vermutlich besser wenn Du dazu auf floats umstellst.
|
|
|
|
|
Logged
|
|
|
|
|
Traunstein, Germany
Offline
Full Member
Karma: 0
Posts: 111
|
 |
« Reply #10 on: July 31, 2011, 02:58:06 am » |
Ich habe keine floats genommen, weil ich da immer Probleme bekomme mit der Wandlung in Strings. Ich habe ein Display dran hängen und gebe hier einen String aus. Teilweise sind das dann auch Werte aus den Berechnungen. Bei "long" geht das ohne Probleme, bei float sträubt sich das Arduino erfolgreich.
|
|
|
|
|
Logged
|
|
|
|
|
|
|
Traunstein, Germany
Offline
Full Member
Karma: 0
Posts: 111
|
 |
« Reply #12 on: July 31, 2011, 04:11:22 am » |
Ja, die Funktion habe ich auch ausprobiert. Wenn ich allerdings da nicht-floats durchjage, gibt's lustige Zeichen auf meinem LCD.
|
|
|
|
|
Logged
|
|
|
|
|
Munich/Germany
Offline
God Member
Karma: 8
Posts: 559
|
 |
« Reply #13 on: July 31, 2011, 05:37:11 am » |
(exp(t)-exp(t0))/(exp(t1)-(exp(t0)) = (s-s0)/(s1-s0)
oder
s = (s1-s0)/(exp(t1)-exp(t0)) * (exp(t)-exp(t0)) + s0
Hast Du das mal selber auf dem Arduino ausprobiert? Ich denke, dass bei den Zahlen von derHerrKohler viel zu große Werte rauskommen. Die können auf dem Arduino nicht mehr verarbeitet werden. Für so lineare Sachen kann man einfach die Funktion MAP nehmen
momentanwert = map(now, runStart, runEnd, tStart, tEnd)
du müsstest halt zunächst aus runStart + runDuration dein runEnd ausrechnen.
Meine obige Formel entspricht weitestgehend der map Funktion. Nur werden da zwei Rechenschritte gespart (runEnd berechnen welches map anschließend wieder für das errechnen der differenz verwendet) und es funktioniert so auch mit float (map ist nur für int definiert).
|
|
|
|
|
Logged
|
_______ Manfred
|
|
|
|
0
Offline
Faraday Member
Karma: 16
Posts: 3196
20 LEDs are enough
|
 |
« Reply #14 on: July 31, 2011, 07:26:21 am » |
Wozu ausprobieren? Solange er nicht sagt wie die Wertebereiche sind ist unklar ob das Probleme geben wird oder nicht. Man kann auch andere Exponentielle Formeln nehmen. Genaugenommen ist ein Freiheitsgrad zuviel da. Wie gesagt: solange er das nicht sagt ist es ziemlich nutzlos das auszuprobieren. Ich für meinen Teil würde keine exponentielle Funktion nehmen sondern Splines. Und ich würde auch mal schauen was hier: http://openmoco.org/ so getan wird.
|
|
|
|
« Last Edit: July 31, 2011, 07:30:15 am by Udo Klein »
|
Logged
|
|
|
|
|
|