Wieso nicht schön ? Bei jedem Timer passiert genau das Gleiche (Clock/teiler)Andere Idee: ein übergeordnetes Taktsignal mit Interrupt machen und für die Rampen dann ein vielfaches davon verwenden.... (auch nicht so schön)
Hallo Leute (ist schon länger her.. )
Ich möchte quasi ein Ansteuerung für Schrittmotoren mit dem Mega 8 machen.
Pro Motor brauche ich da Takt und ein Richtungs- Signal.
Mir geht es jetzt um die Taktausgabe.
Das Taktsignal müsste jetzt eine start Rampe (frequenzanstieg), normale Frequenz und dann eine fallende Rampe (Frequenzabfall) haben.
Für die Takterzeugung dachte ich , das ich sie in einer Interruptschleife mache. (damit sie taktmässig immer korrekt ist)
Aber wie kann ich da die Rampen einbringen ?
Hat jemand einen Lösungsansatz wie man das in etwa machen könnte ?
Noch dazu müsste ich min. drei Taktsignale (Drei Motoren) mit unterschiedlichen Frequenz auch noch ausgeben können...
(= die Rampen liegen zeitlich nicht immer gleich an..)
Zuerst dachte ich, für die Rampen vielleicht die Aufrufrutiene in der Zeit verändern... (kann man das überhaupt mit einer Variablen?)
Aber das würde höchstens für einen Motor reichen und ich brauche min. 3
Andere Idee: ein übergeordnetes Taktsignal mit Interrupt machen und für die Rampen dann ein vielfaches davon verwenden....
(auch nicht so schön)
Hat jemand dazu vielleicht einen Lösungsansatz oder Idee?
Wäre um jeden Tipp dankbar \/
l.G. Roberto
Wieso nicht schön ? Bei jedem Timer passiert genau das Gleiche (Clock/teiler)Andere Idee: ein übergeordnetes Taktsignal mit Interrupt machen und für die Rampen dann ein vielfaches davon verwenden.... (auch nicht so schön)
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hallo Robert
Weis nicht so genau...
* Vielleicht wird die Rampe so zu grob.
* sollte vielleicht mal eine Sinusrampe werden..
* Habe noch keine Idee, wie das konkret funktionieren könnte
l.G.
Wenn, dann doch wohl eine Kurve für gleichbleibende/einstellbare Beschleunigung ?..Sinusrampe werden
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hi
..mmmhh.. Kurve.. Wie meinst Du das jetztWenn, dann doch wohl eine Kurve für gleichbleibende/einstellbare Beschleunigung ?
Meine z.B. ein Rampe die Flach anfängt und dann in der Mitte Steil und oben wieder flach aufhört.. Aber derzeit egal
Derzeitige Überlegung für die Start Rampe:
Interrupt mit hoher Frequenz = maximale Schrittfrequenz.
Für die Startrampe, zwei Variablen im Interrupt.
Variable z.B A und B
A= 255
B = 0
Interrupt:
decr A
if A = 0 then A= 255 -B:
B= B+5
If B >254 then B= 255
end if
.
.
.
Hallo Roberto,
ich hätte das Problem hardwaremäßig gelöst, indem ich für die Takterzeugung U/F Wandler nehme. Sie bringen auf eine anloge Eingangsspannung eine proportionale Frequenz am Ausgang. Die Typenbezeichnung habe ich nicht im Kopf, aber wenn Interesse besteht, würde ich sie heraussuchen.
Gruß
Detlef
Hallo Detlef.
Wie sollte das den dann funktionieren ?
Ich muss ja sagen können, fahre mir 10000 Schritte nach vorne, 10 zurück u.s.w.
Mit U/F Wandler könnte ich mir das höchstens mit einem zusätzlichen Encoder vorstellen..
l.G.
Hallo Roberto,
das sollte nur ein Denkanstoß für die Erzeugung unterschiedlicher Frequenzen sein. Du hast schon Recht, eine schrittgenaue Ansteuerung ist so kaum möglich. Mit dem Zusatzsignal Vorwärts und Rückwärts könne man schon einen Motor steuern, bräuchte dann aber, wie du schon schreibst, einen zusätzlichen Encoder, um die wirkliche Lage exakt zu bestimmen.
Gruß
Detlef
hallo,
der ansatz war schon richtig: du gibst in Bascom einfach den überlauf vor, sodass der timer nach einer bestimmten zeit überläuft und den interrupt auslöst. nach jedem neuen interrupt prüfst du deine aktuelle position und beschleunigst oder verzögerst den ablauf durch änderung des timerwertes, also etwa so:
interrupt:
timer1=newValue
......
-> neuen timerwert berechnen und in newValue speichern
return:
du brauchst auch keine zusätzlichen timer, weil du ja im interrupt eine vektorinterpolation vornehmen kannst, so mache ich das auch. willst du z.b. eine strecke fahren, die in x-richtung 1000 schritte und in y-richtung nur 500 schritte beträgt, wird der motor für die y-achse nur in jedem zweiten interruptaufruf bewegt. such am besten mal nach bresenham-algorithmus, dieser wird eigentlich für die darstellung von linien auf einem bildschirm verwendet, es ist ja das gleiche problem! dieser bietet den vorteil, dass die vektorinterpolation auf integerbasis berechnet wird und er daher sehr schnell ist.
übrigens: für die ausgabe weiterer taktsignale hast du ja zwei timer im atmega8 - nur mal so als denkanstoß...
hoffe, ich konnte dir helfen und hab dich nicht nur verwirrt!
Ruppi
Hallo Ruppi (Danke für die Antort)
Werde mir das mal durchkauen.
Brauche ich für weitere Taktsignale eigendlich zwingend mehr Timmer oder ginge das alles in einem Interrupt ?
Weil ich bräuchte dann mehr als 3 Achsen...
(Soll eigentlich ein Roboterarm werden mit Servomotoren und Harmonicdrive getrieben... )
l.G. Roberto
Lesezeichen