Forum: Mikrocontroller und Digitale Elektronik Lineare Frequenzänderung mit Atmega


von Pascal Christian (Gast)


Lesenswert?

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

von Spess53 (Gast)


Lesenswert?


von Oliver J. (skriptkiddy)


Lesenswert?

Pascal Christian schrieb:
> 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.

Der Zusammenhang zwischen der Frequenz und dem Zeitintervall ist T=1/f. 
Das heißt, wenn du den Intervall halbierst, dann verdoppelst du die 
Frequenz. Damit kann man sich für diverse Frequenzen eine Lookuptable 
füllen und die grast man dann ab, um seine Rampe zu erreichen oder man 
berechnet es in Echtzeit.

f in Hz  |  1  |  2  |  3  |  4  |  5  |  7  |  8  |  9  |  10
---------+-----+-----+-----+-----+-----+-----+-----+-----+-----
T  in s  | 1/1 | 1/2 | 1/3 | 1/4 | 1/5 | 1/7 | 1/8 | 1/9 | 1/10




Gruß Skriptkiddy

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.