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?
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.