Hallo,
ich habe einen kleinen Code geschrieben (das meiste kopiert), der aber
leider nicht funktioniert. Ich glaube das etwas mit der Timerbrechnung
nicht stimmt. Also angeschlossen werden fünf Servos und mittels eines
Interrups angesteuert. Der soll ja alles 20ms schalten.
Könnt ihr bitte mal drüberschauen, was da nicht passt? Wenn ich ein
Servo anschließe, dreht es ein paar schritte in eine Richtung weiter und
macht nichts mehr. Es fährt definitiv nicht in die Mitte!
DANKE
Lg
Peter
Peter schrieb:> leider nicht funktioniert. Ich glaube das etwas mit der Timerbrechnung> nicht stimmt.
Genau.
Wenn dein µC mit 8 Mhz Taktet und der Vorteiler auf 8 steht, dann zählt
der Timer mit 1Mhz ( 8000000 / 8 )
Der Timer muss von 45535 bis 65536 hochzählen, das sind über den Daumen
20000 Zählschritte.
Wie lang braucht er dafür, wenn er in 1 Sekunde bis 1 Mio zählen könnte?
20000 / 10000000 = 0.02 also 20 Millisekunden.
Das ist zu lang für den Servopuls. Der sollte für Mittelstellung bei ca
1.5 Millisekunden sein und nicht bei 20
> Also angeschlossen werden fünf Servos und mittels eines> Interrups angesteuert. Der soll ja alles 20ms schalten.
Bei 4 Servos hintereinander brauchst du den 20ms keine großartige
Beachtung mehr schenken. Die sich ergebende Pause nach den Pulsen ist
mit einiger Sicherheit lang genug, dass kein Servo mehr ins straucheln
kommt. Zumindest ist mir noch nie eines untergekommen.
Hallo Karl Heinz,
danke für die Infos.
Nun gut, Mittelstellung ist 1,5ms. das wäre bei 1000000 hz =1500
Zählschritte.
also 65536-1500=64036
Nun gut, leider funkt der Code dadurch auch noch nicht...
Für was genau ist der Timerwert am Anfang des programms? Also bei meinem
Beispiel 45536? Das ist doch dafür da, dass alle 20ms die Signal
ausgeschickt werden?
Und ganz unten im Programm ist nochmal ein Timer, der quasi die 20ms
"auffüllt".Bei fünf Servos müssen da noch 10ms offen sein.
Kannst du bitte nochmal drüberschauen?
Sorry wenn ich lästig bin, bin noch Anfänger...
Peter schrieb:> Hallo Karl Heinz,>> danke für die Infos.>> Nun gut, Mittelstellung ist 1,5ms. das wäre bei 1000000 hz =1500> Zählschritte.>> also 65536-1500=64036>> Nun gut, leider funkt der Code dadurch auch noch nicht...
Hast du deine 8Mhz überprüft?
> Für was genau ist der Timerwert am Anfang des programms?> Also bei meinem Beispiel 45536?
Für nix
> Und ganz unten im Programm ist nochmal ein Timer,
Im ganzen Programm gibt es nur 1 Timer, der nacheinander die Pulse in
jedem Overflow Interrupt erzeugt. Die Zahl die jedesmal in den Timer
geladen wird, betimmt die Zeit bis dann der nächste Overflow auftreten
wird.
> Bei fünf Servos müssen da noch 10ms offen sein.
Die kannst du getrost ignorieren. Die sind nicht das Problem.
Wahrscheinlich wird dein Mega nicht mit 8Mhz arbeiten, sondern mit dem
1Mhz mit dem er von Atmel ausgeliefert wird.
Du musst die Kanalnummer schon auf 0 setzen!
Sonst kommt da auf jedem Kanal nur 1 Puls raus!
Lass es erst mal so wie es ist (auch mit der Zuweisung an den Timer)
Das ganze lebt davon, dass die Variable Kanal nacheinander die Werte 0,
1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, .... annimmt. Wenn du Kanal nie auf 0
setzt ... von alleine passiert das nicht.
Da ist im Original übrigens ein Fehler.
Es muss