Ich versuche gerade, ein Servosignal (1-2ms, damm 20ms Pause) für einen Kanal mit möglichst guter Auflösung zu generieren und mit möglichst wenig Prozessorlast. Ich habe einen 12MHz externen Quarz (auch für andere Zwecke) angeschlossen. Also denke ich, Timer1 ist der richtige. Wenn der voll durchzählt ohne Vorteiler, erhalte ich ca. 5ms (zu kurz) Also Vorteiler 8 - dann dauert es etwas 40 ms bis er von vorn anfängt. Er brauchte also nur bis 30000 zählen und müsste dann von vorn anfangen. Außerdem müsste ich irgendwie OCR1 zwischen 666 und 1333 setzen können, und in dieser Zeit müsste das Signal auf H und der Ausgabepin (Port B.1) müsste geschaltet werden (das hieß irgendwie "compare up"). Die 666 Schritte Auflüsung würden mir reichen. Klingt erstmal einfach, aber ich finde mich nicht durch die ganzen Modi und Register - ist das einer der PWM-Modi, was ich da beschrieben habe? Bzw. welchen Modus soll ich nehmen? Es müsste ja einer sein, in dem ich TOP auf 30000 stellen kann und trotzdem OCR an ein Pin ausgeben.. Geht das überhaupt? Wenn ja, wie?
racer schrieb: > Ich versuche gerade, ein Servosignal (1-2ms, damm 20ms Pause) für einen > Kanal mit möglichst guter Auflösung zu generieren Du wirst - wie ich auch - feststellen, das die Auflösung der Servos das begrenzende Element ist. Von einem befreundeten Modellbauer bekam ich eine Anzahl verschiedener Servos (Hersteller) zum Test. Wenn man kontinuierlich die Pulsweite änderte, konnte man meistens erst nach ca. 7µs - 9µs eine Änderung sehen. Manche schafften auch nach 5µs eine Positionsänderung, dann war aber Schluss. Die besten Servos hatten also eine Auflösung von <= 200 Schritten.
Na gut, also ich brauche nicht ganz so viel Auflösung. Ändert aber nichts an der Fragestellung.. oder geht es einfacher - vielleicht denke ich zu kompliziert?
die Wiki Artikel hast du schon gesehen? http://www.mikrocontroller.net/articles/Modellbauservo_Ansteuerung http://www.mikrocontroller.net/articles/AVR-Tutorial:_Servo
Auf Seite 97 des Datenblattes zum ATmega8(L) gibt es eine Tabelle der Modes. Nimm Mode 14 (Fast PWM und ICR1 als Top). In das ICR1 kommt dann dein Begrenzung (30000?) und in das OCR1A der Wert für die Pulslänge. Mit den COM1A0 und COM1A1 Bits wählst du dann noch aus, ob der OC1A Pin während TCNT1 Stand 0 bis OCR1A auf high oder low geschaltet ist.
Norbert schrieb: > racer schrieb: > Ich versuche gerade, ein Servosignal (1-2ms, damm 20ms Pause) für einen > Kanal mit möglichst guter Auflösung zu generieren > > Du wirst - wie ich auch - feststellen, das die Auflösung der Servos das > begrenzende Element ist. Das ist so nicht ganz richtig. Was Du "gemessen" hast war die Hysterese des Servos. Wenn Du jedoch zB. immer von max. Ausschlag links in Richtung rechts erst in 10microsec-Schritten (mein Handy hat kein micro-Zeichen), dann in 11microsec-Schritten usw. fährst, dann wirst Du bemerken, dass doch jedes Mal eine andere (korrekte) Position angefahren wird. Sobald also das Delta-Pos grösser als die Hysterese ist, hat der Servo sehr wohl eine hohe Auflösung. Natürlich rede ich hier nicht von Conrad-Servos oder anderem Chinaschrott. Je nach Anwendung lohnt es sich, eine gute Auflösung zu generieren. mfG Ulli-B
Ulli-B schrieb: > Norbert schrieb: >> racer schrieb: >> Ich versuche gerade, ein Servosignal (1-2ms, damm 20ms Pause) für einen >> Kanal mit möglichst guter Auflösung zu generieren >> >> Du wirst - wie ich auch - feststellen, das die Auflösung der Servos das >> begrenzende Element ist. > > Das ist so nicht ganz richtig. > Was Du "gemessen" hast war die Hysterese des Servos. > Wenn Du jedoch zB. immer von max. Ausschlag links in Richtung rechts > erst in 10microsec-Schritten (mein Handy hat kein micro-Zeichen), dann > in 11microsec-Schritten usw. fährst, dann wirst Du bemerken, dass doch > jedes Mal eine andere (korrekte) Position angefahren wird. Sobald also > das Delta-Pos grösser als die Hysterese ist, hat der Servo sehr wohl > eine hohe Auflösung. Natürlich rede ich hier nicht von Conrad-Servos > oder anderem Chinaschrott. > > Je nach Anwendung lohnt es sich, eine gute Auflösung zu generieren. > > mfG Ulli-B Erstaunlich, das du weist was ich alles gemessen habe! ;-) Wenn man mal einen halben Meter Holzstab mit dem Servo verschraubt und sich am Ende in einem Teilbereich eine Skala erstellt, kann man Schritte sehr wohl erkennen. Und ja, das geht sowohl vorwärts, rückwärts als auch mit 'random seek'. Es werden zwar durchaus auch mal 'Zwischenpositionen' angefahren, die korrelieren aber nicht im Geringsten mit den generierten Timings und sind mehr als random noise anzusehen. Damit komme ich wieder zu meinem Eingansstatement: Reproduzierbare Ergebnisse und Auflösungen sind verschieden und Herstellerabhänging. Wenn man glaubt mit einer 1µs Auflösung vom Controller auch eine 1000 Schritt Auflösung des Servos zu erreichen, glaubt man auch das Zitronenfalter Zitronen falten. ;-) Vielleicht gibt's aber auch ein €500,- Servo welches diese Auflösung bietet.
MaSehn schrieb: > In das ICR1 kommt dann dein Begrenzung (30000?) und in das OCR1A der > Wert für die Pulslänge. Danke, hat super funktioniert! Das war das fehlend Stück vom Puzzle!
Ich habe für meine Roboter-Basteleien festgestellt, dass eine Auflösung von 100 Schritten genug ist. Ich hatte mal auf 1000 Schritte erhöht, dabei jedoch keine sichtbare Verbesserung feststellen können.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.