Ein Interruptservice wird mir 400 Hz angesprochen. Nun soll ein Wert pro
Sekunde um 8% wachsen. Also addier ich zu dem Wert pro
Interrupt-Ereignis 8%/400Hz. Stimmt das ... ich glaub nicht. Steh aber
gerade total auf'm Schlauch ... brauche hilfe!
Grüße
Wie oft wird der Interrupt ausgelöst, mit 400 Hz, hab ich das richtig
gelesen?
Pro Sekunde 8% sind wohl für einen Interrupt: 0,08 : 400
Kann man ja fast im Kopf ausrechnen.
Ich hau mich auch gleich aufs Ohr, aber meiner Meinung nach falsch:
nach 400x ist der Wert um 8,3% gewachsen: 1,0002^400 = 1,0833
(Stichwort: Zinseszins)
Was du willst ist 1,08^(1/400) = 1,0001924211134082521262781155983
Wobei ich bezweifle, dass der AVR das so genau rechnen kann,
insbesondere könnte es sein dass sich durch so oftmaliges Anwenden einer
Float-Operation irgendwelche Rundungsfehler hochschaukeln.
Gruß
Roland
Die Zinseszins-Rechnung greift nur, wenn man jedes Mal, also bei jedem
Interrupt berechnet:
neuer Wert = alterWert*0,08/400
Wenn aber von einem Startwert ausgegangen wird, so ergibt sich:
neuerWert = Startwert*0,08/400 + alterWert
Die Frage ist nur, welche Aufgabenstellung ist korrekt? Das kann nur
Gert klären.
Also angenommen ich Starte bei Null. Dann soll der Wert mit 8% pro
Sekunde steigen. Bei 400Hz sollte er ja dann nach 12.5 Perioden bei 100%
sein:
(0.08/400)*400)*12.5=1
Aber irgendwas mach ich glaube ich noch falsch ...
> Bei 400Hz sollte er ja dann nach 12.5 Perioden bei 100%sein:
Das hat mit 400Hz noch gar nichts zu tun: (100%)/(8%/s) = 12,5s
> Aber irgendwas mach ich glaube ich noch falsch ...
Ja, warum? Was stimmt nicht?
Wo ist der Wert nach 12,5 Sekunden?
Mit welchen Zahlen rechnest du (integer oder float)?
Wenn bei Null gestartet wird, ist auch nach 12,5 s der Wert immer noch
Null. 8% von Null sind Null. Mir fallen sofort 'zig
Prozentrechnungswitze ein, viele über Blondinen.
Was solls denn werden? Eine Art Anstiegsbegrenzung? Oder eine Rampe oder
was?
Gib mal paar mehr Infos und vielleicht ein zwei Beispiele. Wo kommen
Werte her, die 8% je Sekunde steigen sollen...?
> 8% von Null sind Null.>>> Bei 400Hz sollte er ja dann nach 12.5 Perioden bei 100% sein
Es soll offenbar einfach bei jedem Timertic ein Wert dazuaddiert werden,
bis nach 12,5 sec der Wert 1 erreicht ist.
Manche verwechseln das mit Prozentrechnen ;-)
Das ist wie mit der einen Frage:
Auf einem Teich mit einer Oberfläche von 0,8765km² wachsen Seerosen mit
einer Oberfläche von 17,6789dm². Jeden Tag verdoppelt sich die Anzahl
der Seerosen. Schon nach 22 Tagen ist die gesamte Teichfläche mit
Seerosen bedeckt. Frage: wann war der Teich zur Hälfte bedeckt?
Wer die Antwort weiß:
bitte noch ein wenig warten, dass auch andere ihren Spass haben ;-)
Genau, eine Rampe soll das werden um ein sprunghaftes Eingangssignal
linear zu verzögern. Wenn z.B. das Eingangssignal von Null auf 50% des
max. Wertes springt, soll der Wert nur mit 8% pro Sekunde steigern.
Vielleicht drücke ich mich mit den %_Wert auch falsch aus ... bin gerade
total verwirrt
> Hast das von 9live ;-)
Nein, auswendig gelernt ;-)
Es ist erstaunlich, wie oft man mit solchen simplen Aufgaben eine
Stammtischrunde zu lang anhaltenden Diskussionen anregen kann.
>>> Hast das von 9live ;-)>> Nein, auswendig gelernt ;-)> 9Live :-))
Mann, ich wusste gar nicht, dass es sowas wie 9live gibt (zu dieser
Bildunglücke stehe ich und ich werde die auch nicht weiter ausmerzen).
So ein Pech, das ist echt miserables Timing, dass die dort irgendwo auch
gerade diese Frage gestellt haben :-/
Also eine andere:
Ich habe zwei halbvolle Weingläser, eines enthält Weißwein, das andere
Rotwein (100ml). Jetzt nehme ich jetzt einen Teelöffel (z.B. 5ml)
Weißwein heraus, schütte den in den Rotwein, rühre den dann um, und
nehme danach einen Teelöffel dieses Gemischs heraus un schütte den
zurück in den Weißwein.
Habe ich jetzt mehr Weißwein im Rotwein oder umgekehrt oder was?
> Genau, eine Rampe soll das werden um ein sprunghaftes Eingangssignal> linear zu verzögern. Wenn z.B. das Eingangssignal von Null auf 50% des> max. Wertes springt, soll der Wert nur mit 8% pro Sekunde steigern.> Vielleicht drücke ich mich mit den %_Wert auch falsch aus ... bin gerade> total verwirrt
Das wird nie eine Rampe, wenn du einmal pro Sekunden einen Wert um einen
Prozentsatz erhöhst.
Das wird bestenfalls eine Art Treppe.
Aber nur dann eine Art Treppe, wenn du dich erst mal einigst WOVON die
verfl*chten 8% genommen werden sollen. Von einem festen Startwert, vom
gewünschten Endwert, oder von dem gerade eingestellten Wert? In allen
Fällen ist 0 dabei ein sehr ungünstiger Wert.
Prozentangaben sind RELATIVE Angaben. Solange du dich nicht darauf
einigst "relativ wozu" kommt halt irgendein Mist raus.
So, und wenn das eine Rampe werden soll, willkommen im Land des
Abtasttheorems. Zu beantworten ist die Frage, was für eine
Abtastfrequenz man mindestens braucht, um aus (künstlich erzeugten)
Daten ein vorgegebenes Signal (Anstieg mit einer vorgegebenen Steilheit)
(re)konstruieren zu können. Dazu wiederum die Frage, bis zur welcher
Oberwelle, also wie genau, man besagtes Signal konstruieren möchte.
Nicht von dem Begriff Abtastfrequenz verwirren lassen. Hier wird nicht
abgetastet, doch es die gleiche Frequenz, mit der man die Ausgangswerte
ändert (ändern muss) um ein vorgegebenes Signal zu erreichen.
Viel Spaß beim rechnen.
>Habe ich jetzt mehr Weißwein im Rotwein oder umgekehrt oder was?
Es ist genauso viel Rotwein im Weißwein, wie Weißwein im Rotwein.
Ich habe es damals selbst nicht geglaubt, bis ich nachgerechnet habe...
Matthias Lipinsky wrote:
>>>Habe ich jetzt mehr Weißwein im Rotwein oder umgekehrt oder was?>> Es ist genauso viel Rotwein im Weißwein, wie Weißwein im Rotwein.> Ich habe es damals selbst nicht geglaubt, bis ich nachgerechnet habe...
Ja, denn ich könnte z.B. einen Teelöffel nehmen, der genau 100ml fasst.
Dann gehts einfacher mit dem Rechnen ;-)
> Ich habe es damals selbst nicht geglaubt, bis ich nachgerechnet habe...
Hab ich auch mal gemacht, ist aber nicht noetig. Hinterher ist in beiden
Glaesern gleichviel drin, da kann das garnicht unterschiedlich sein.
Dito.
Wenn ich eine bestimmte Anzahl an 'Weißweinteilchen' in den Rotwein gebe
und nehme anschließend ein Gemisch aus 'Weißweinteilchen' +
'Rotweinteilchen' mit der Bedingung dass die Summe der Teilchen Konstant
sein muss, dann muss ich weniger 'Rotweinteilchen' als
'Weißweinteilchen' haben (wenn gilt: Weißweinteilchen != 0)
ups... war noch nicht fertig.
...weniger Rotweinteilchen im Gemisch natürlich.
Wenn ich jetzt die wenigeren Rotweinteilchen in den Weiswein gebe habe
ich weniger Rotweinteilchen im Weißwein als andersrum...
verstehs auch nicht...
mhhh...
Also was ich vor habe: Ich starte bei 0. Der Wert soll um 8 Einheiten
pro Sekunde zunehmen.Endwert ist 100. Getaktet werden soll der Zuwachs
von dem 400 Hz Signal. Dann wäre doch der Zuwachs pro Interrupt-Wreignis
8/400. Das wäre dann doch die Steigung der Rampe, oder?
@dgoersch:
Fast richtig.
In den Gläsern befinden sich nachher
909,090909... Einheiten Rotwein | 909,090909... Einheiten Weißwein
+ 90,909090... Einheiten Weißwein | + 90,909090... Einheiten Rotwein
O.k. ich habs auch nachgerechnet - stimmt schon. ....
Becher A | Becher B
------------------------------------------------
1000 Einheiten Rotwein | 1000 Einheiten Weißwein
<< 100 Einheiten
1000 Einheiten Rotwein | 900 Einheiten weißwein
+ 100 Einheiten Weißwein |
100 Einheiten Gemisch >>
909,09... Einheiten Rotwein | 909,09...Einheiten Weißwein
+ 90,90.. Einheiten Weißwein | + 90,90.. Einheiten Rotwein
*Gemisch besteht aus: 90,90.. Einheiten (R) und 9,09.. Einheiten (W)
@Axel Rühl
Auf die Seerosen kommt man schnell, wenn man sich überlegt, dass sie
sich jeden Tag verdoppeln... na kleiner Tip jeden Tag VERDOPPELN... ;)
Gert wrote:
> mhhh...> Also was ich vor habe: Ich starte bei 0. Der Wert soll um 8 Einheiten> pro Sekunde zunehmen.Endwert ist 100. Getaktet werden soll der Zuwachs> von dem 400 Hz Signal. Dann wäre doch der Zuwachs pro Interrupt-Wreignis> 8/400. Das wäre dann doch die Steigung der Rampe, oder?
Ganz genau.
Das hat aber nichts mit Prozent zu tun.
Bei jedem Interrupt wird dein bisheriger Wert um einen 'konstantes'
Delta erhöht.
>Das hat aber nichts mit Prozent zu tun.>Bei jedem Interrupt wird dein bisheriger Wert um einen 'konstantes'>Delta erhöht.
Also sieht deine 440Hz-Routine etw so aus:
pseudocode:
Gert wrote:
> ... und wenn die Augangswert 0..100 % sind.
Sind auch nur Zahlen.
Dein Wert soll dann in einer bestimmten Zeit von 0 bis 100 rauffahren.
Ob das Prozent oder Äpfel oder Schrittmotorpulse sind, ist unerheblich.
Du musst in einer bestimmten Zeit eine Variable vom Startwert zum
Endwert interpolieren.
>
1
>ISR(440Hz)
2
>{
3
>
4
>if(ausgabe<eingabe){ausgabe+=8/440}
5
>
6
>}
7
>
8
>
>> Der Wert wächst aber ca. doppelt so schnell an wie erwartet
Dann sieh dir mal die Timerwerte an.
Obiges (offensichtliche Problem mal beiseite gelassen), erhöht ausgabe
in 1 Sekunde um den Wert 8. Aber nur dann, wenn die ISR wirklich 440 mal
in der Sekunde aufgerufen wird.
Mal mit konkreten Zahl.
Angenommen du hast eine Variable X.
Die soll alle Werte von 129 bis 546 durchlaufen.
Und zwar in 12 Sekunden.
Die Frage ist daher, um welchen Wert muss x jeweils erhöht werden?
In 12 Sekunden, wird die ISR 12 * 440 = 5280 mal aufgerufen.
x soll einen Bereich von 546 - 129 = 417 durchlaufen.
Also muss x bei jedem ISR Aufruf um 417 / 5280 = 0.07897 erhöht werden.
Die 0.07897 sind im Grunde nichts anderes als die Steigung der Geraden,
die du durch die Punkte 0/129 und 12/546 gelegt hast
Jetzt kannst du den Spiess aber auch Umdrehen. Du willst x wieder alle
Werte durchlaufen lassen, von 129 bis 546. Und zwar soll x in 1 Sekunde
um 8% von (546-129) zunehmen.
546 - 129 = 417. 8% davon sind 33.36
In 1 Sekunde muss x also um 33.26 größer werden. (Daraus folgt sofort,
dass
x für den kompletten Ablauf 12.5 Sekunden brauchen wird, den 417 / 33.36
sind 12.5)
Wenn x in 1 Sekunde um 33.26 zunehmen soll, dann muss es daher in einem
ISR Aufruf (der ja 440 mal in der Sekunde erfolgt) um 33.26/440 =
0.07559 zunehmen.