Hi,
ich generiere mit meinem Atmega8 eine Frequenz mittels eines Timers.
Der Code im Überlauf-Interrupt des Timers ist folgender:
1 | Isrtimer1:
|
2 | ' Wenn counter = speed
|
3 | If Motor1ctr >= Motor1speed Then
|
4 | Toggle Motor1clk
|
5 | Motor1ctr = 0
|
6 | End If
|
7 |
|
8 | Motor1ctr = Motor1ctr + 1
|
9 | Return
|
Das Intervall für diesen Timer ist konstant.
Nun möchte ich eine (lineare) Rampe erzeugen, so dass der angesteuerte
Motor langsam anfährt bzw. wieder langsam abbremst.
Das Problem ist nun folgendes:
Dekrementiere ich Motor1speed linear in einem konstanten Intervall um
die Frequenz zu erhöhen, so steigt die ausgegebene Frequenz quadratisch
an. Ist ja klar, weil:
Wenn Motor1speed=2 ist und damit eine Frequenz von 1000Hz erzeugt wird,
wird eine Frequenz von 2000Hz erzeugt wenn Motor1speed=1 ist.
Und da ich die Variable in einem festen Zeitintervall erhöhe, steigt die
Ausgabefrequenz quadratisch, und damit viel zu schnell an (soll linear
ansteigen).
Leider bin ich momentan etwas überfragt, und weiß nicht, wie ich das
Problem beheben könnte.
Mein Ansatz war, das Zeitintervall welches Motor1Speed inkrementiert
dynamisch zu erhöhen:
1 | Isrtimer2:
|
2 | ' Konstante Zeit
|
3 | Load Timer1 , 300
|
4 |
|
5 | ' Motor1Target = Zielfrequenz
|
6 | If Motor1speed > Motor1target Then
|
7 | If Rampetarget = Rampectr Then
|
8 | If Motor1speed > 1 Then
|
9 | Motor1speed = Motor1speed - 1
|
10 | ' Verdoppeln des Rampenintervalls
|
11 | Rampetarget = Rampetarget * 2
|
12 | Rampectr = 0
|
13 | End If
|
14 | End If
|
15 | Rampectr = Rampectr + 1
|
16 | End If
|
17 | Return
|
Das scheint im Prinzip zu funktionieren, ist aber viel zu langsam (und
schneller kann ich den Timer nicht mehr takten).
Ich würde mich sehr über Eure Ideen freuen!
Viele Grüße,
Pascal