PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Erzeugung von Rampen mit Timer1(ATmega8)



Viktor
20.11.2008, 13:45
Hallo,
ich habe ein relativ einfaches Problem, aber ich stehe irgendwie auf dem Schlauch und komme irgendwie nicht weiter.](*,)
Ich habe bisher alle möglichen Quellen durchforstet, habe aber bisher noch nicht mit den timern gearbeitet.

Zu meinem Problem.
Ich möchte mit dem Timer1 Rampen generieren um einen Schrittmotor (später auch Servos) anzusteuern. Also Pulse mit unterschiedlichen Zeitabständen erzeugen um die Geschwindigkeit zu Steuern.

Meine Frage wäre jetzt, wie berechne ich den Timer wenn ich eine variable Frequenz von 1Hz bis 60kHz haben möchte.
Wenn mein ATmega mit 16MHz läuft?

Meine erste Überlegung war, ich teile 16MHz/256 und hätte dann 62500Hz Takt für meinen 16bit-Zähler(65536). Wenn ich jetzt von dem maximal möglichen Wert des Zählers meine Zählerfrequenz(62500) abziehe, dann bekomme ich den Vorladewert für meinen Timer.

Also, 65536 - 62500(Hz) = 3036

Mit diesem Wert wird die Zeit bis zum Überlauf genau 1s und die Frequenz 1Hz betragen (wenn man natürlich den Overhead unberücksichtigt lässt).

Wenn ich aber den TimerREG mit z.B. 65535 vorlade, dann hätte ich doch meine maximale Frequenz oder?? Oder liege ich da total falsch?

Michael
20.11.2008, 14:07
Hallo Viktor,


Wenn ich aber den TimerREG mit z.B. 65535 vorlade, dann hätte ich doch meine maximale Frequenz oder??
die maximale Frequenz des Interrupts. Wenn du da einen Port toggelst, hast du nurnoch die halbe Frequenz.


Oder liege ich da total falsch?
Wenn du deinen Timer mit 65535 lädst, hast du noch 256 Prozessortakte (wg.Prescaler) bis zum nächsten mal, da müssen Register gesichert werden und so n Zeug. Viel Raum für die Anwendung bleibt da nicht mehr.

Gruß, Michael

Viktor
20.11.2008, 14:20
Also, erstmal ein Dankeschön für deine Antwort

Wenn du deinen Timer mit 65535 lädst, hast du noch 256 Prozessortakte (wg.Prescaler) bis zum nächsten mal, da müssen Register gesichert werden und so n Zeug. Viel Raum für die Anwendung bleibt da nicht mehr.
...das ist mir auch klar, es geht geht mir eigentlich darum, ob ich mit meinem "Gedankenexperiment" nicht falsch liege?
...also hätte ich eine variable Frequenz von 1Hz bis 60kHz, oder nicht?

Michael
20.11.2008, 14:27
Hallo Viktor,

deine Gedanken sind soweit richtig und das funktioniert auch. Dieser Roboter hier z.B. fährt nach diesem Prinzip mit Schrittmotoren und 2 Timern:

http://www.team-iwan.de/videos/pics/xr.jpg (http://www.team-iwan.de/videos/vids/xrace-hr.wmv) <- Link auf Video


...also hätte ich eine variable Frequenz von 1Hz bis 60kHz, oder nicht?eine variable Timerfrequenz, ja.

Gruß, Michael

Viktor
20.11.2008, 15:01
um die Rampen zu erzeugen, müsste ich noch zusätzlich einen zweiten Timer nehmen, z.B. Timer0 bzw. 2, der mit einer festen Frequenz läuft.
Dieser entscheidet dann ob beschleunigt, mit der selben Frequenz weiter gefahren oder abgebremst wird und rechnet den nächsten Preload für Timer1 aus.
Wäre das denn so möglich? Oder gibt es bessere alternativen?

Michael
20.11.2008, 15:08
Hallo Viktor,


um die Rampen zu erzeugen, müsste ich noch zusätzlich einen zweiten Timer nehmen
ähh, nein. Die Timerzeit wird ganz normal im Hauptprogramm errechnet und dann per globaler Variable übergeben.
Pro Schrittmotor gibt es dann einen Timer.


Oder gibt es bessere alternativen?
es gibt sicher andere Varianten, die auch geeignet sind. Da vergleichst du aber Bananen mit Gurken.

Gruß, Michael

Viktor
20.11.2008, 15:24
es gibt sicher andere Varianten, die auch geeignet sind. Da vergleichst du aber Bananen mit Gurken.
der war gut! :lol:

nun gut, dann muss ich mein Vorhaben doch enthüllen. :D
Ich habe vor (ganze) drei Achsen zu interpolieren, dabei gibt es immer nur eine Achse, die mit maximaler Geschwindigkeit gefahren wird, nämlich die, die auch den längsten weg zurück zu legen hat.
Die weiteren zwei werden jeweils nach Bedarf angesteuert, ...es geht dabei um eine Modifikation des 2D-Bresenham Algorithmus'.

Michael
20.11.2008, 15:38
Hallo Viktor,


dann muss ich mein Vorhaben doch enthüllen.
naja, soviel enthüllen gibt es da nicht, das haben schon andere vor dir gemacht ;)


dabei gibt es immer nur eine Achse, die mit maximaler Geschwindigkeit gefahren wird, n
aber auch diese Achse braucht eigene Rampen und damit einen eigenen Timer.


Die weiteren zwei werden jeweils nach Bedarf angesteuert, ...es geht dabei um eine Modifikation des 2D-Bresenham Algorithmus'.
du siehst es ja selbst, es gibt mehrere Möglichkeiten.
Aber brauchst du wirklich 60kHz?

Gruß, Michael

Viktor
20.11.2008, 16:00
Hallo Michael,
dsnke nochmal für deine Geduld!

aber auch diese Achse braucht eigene Rampen und damit einen eigenen Timer.

...gut, aber soweit waren wir schon :mrgreen:


du siehst es ja selbst, es gibt mehrere Möglichkeiten.
Aber brauchst du wirklich 60kHz?

...naja, vielleicht nicht ganz, aber man weiß nie? oder?
meine Stepper Karten arbeiten (im Augenblick) mit 1/16 Mikroschritt.

Ich werd erstmal mit linearen Rampen versuchen, danach werde ich schauen wie man am einfachsten quadratische Rampen implementiert.

wkrug
21.11.2008, 08:43
Kann man nicht den Timer 1 so konfigurieren, das ein Rechtecksignal mit 50/50 Taktung mit variabler Frequenz dabei rauskommt ??
- Schau da mal ins Datenblatt unter den PWM Modes des Timer 1!
Ich hab da so was im Hinterkopf.

Damit liesse sich dann durch Veränderung des OCR1A Registers die Frequenz sehr bequem einstellen.

Wenn Du mit 16MHz + Vorteiler nicht genau auf den gewünschten Frequenzbereich kommst, kannst Du den Timer auch extern takten und so den gewünschten Frequenzumfang erreichen.

Viktor
21.11.2008, 10:56
Hallo wkrug!
Ich weiß jetzt nicht ob du auch alles durchgelesen hast? Aber wenn ja, stimmt das wie ich mir das so ausgemahlt habe?


Damit liesse sich dann durch Veränderung des OCR1A Registers die Frequenz sehr bequem einstellen.
Dein Vorschlag ist natürlich auch gut, ich kann auch den TOP-Wert des Zählers benutzen anstatt das mit Überlauf zu realisieren.

Ich bin jetzt dabei zu überlegen wie ich die Rampen am besten in meinem Programm unterbringe. Den wenn ich eine Rampe mit, sagen wir, 1000 Stützpunkten speichern würde, dann kostet mir das ca 2k des Speichers.
Deshalb überlege ich, nicht die Änderung der Geschwindigkeit(Frequenz) sondern die der Beschleunigung zu speichern. Für diesen zweck würde sich ein 8-Bit Wert auch eignen. Dann bräuchte ich nur 1k des Speichers um die selbe Rampe abzubilden!?
Allerdings überlege ich gerade wie ich es softwaremäßig realisiere?
Was meint ihr?

Ceos
21.11.2008, 12:15
meinst du jetzt im ernst rampen ala sägezahn ? ich steh grad n bissl aufm schlauch wenn dem so ist kannst du die rampen ja extern erzeugen und mit dem controller die steigung steuern, bzw. die frequenz

Viktor
21.11.2008, 12:29
@Ceos
nein, sondern Beschleunigungsprofil eines Schrittmotors.

Die Hardware ist jetzt schon fertig, die Software fehlt allerdings noch, bzw. ist noch nicht ganz fertig.

wkrug
21.11.2008, 18:27
Das mit den Rampen hatte ich tatsächlich nicht so richtig verstanden.
Geschwindigkeitsprofil für einen Schrittmotor ist mir da schon klarer.

Du könntest ja das Beschleunigungsprofils in mehrere Bereiche segmentieren und nur die Anfangs und Endwerte des jeweiligen Segments abspeichern.
Die Zwischenwerte könnten dann ja berechnet werden.
Dadurch sollte sich der Speicherbedarf drastisch kürzen lassen.