Forum: Mikrocontroller und Digitale Elektronik PWM für Modellbauservo mit Mega8 und 12MHz


von racer (Gast)


Lesenswert?

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?

von Norbert (Gast)


Lesenswert?

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.

von racer (Gast)


Lesenswert?

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?

von Jojo S. (Gast)


Lesenswert?


von MaSehn (Gast)


Lesenswert?

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.

von Ulli-B (Gast)


Lesenswert?

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

von Norbert (Gast)


Lesenswert?

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.

von racer (Gast)


Lesenswert?

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!

von Stefan F. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.