Forum: Mikrocontroller und Digitale Elektronik Servo ansteuern - Timer1 zu schnell?


von Björn R. (sushi)


Lesenswert?

Hallo! Gleich vorweg, ich habe 5 von den Threads die mir beim 
Thread-Erstellen vorgeschlagen wurden gelesen, und irgendwie machen es 
alle mehr oder weniger genau so wie ich, nur meins funktioniert nicht 
richtig g.
Es soll also ein Servo angesteuert werden. Dazu lasse ich den 16 bit 
Timer1 im CTC-Modus (Clear timer on compare Match) laufen. Also wenn der 
Wert in OCR1A erreicht wird, wird der Interrupt ausgelöst und der Timer 
wieder auf 0 gesetzt(wenn ich es denn richtig verstanden habe. Der 
Interrupt sollte alle 20ms ausgelöst werden. Zusätzlich habe ich noch 
einen zweiten Vergleichswert angegeben(OCR1B). Der zugehörige Interrupt 
sollte je Wert 1-2ms nach dem zurücksetzen des timers ausgelöst werden. 
Der CompareMatch A setzt den Ausgang auf H, B setzt ihn auf L. Damit 
hatte ich erhofft, ein gültiges Signal zu erzeugen. Die Realität sieht 
allerdings anders aus: Das Servo zittert leicht, und der einstellbare 
Bereich(Über Tasten an PB1 und PB3 verstellbar, Taste an PB2 für 
Neutralposition(1,5ms))ist sehr klein, will sagen, das Servo erreicht 
nicht seinen vollen Ausschlag. Irgendwie habe ich den Eindruck, das 
Ganze läuft zu schnell. Ich benutze den internen Oszillator auf 8Mhz, im 
makefile ist F_CPU auch mit 8000000 angegeben, die Fuse-Bits habe ich 
auch kontrolliert, CKDIV_8 ist auch deaktiviert. Ach ja das ganze läuft 
auf einem ATtiny2313. Die Vergleichswerte habe ich mit folgender Formel 
berechnet:

Vergleichswert = CPU-Takt/(2*N*(1/t))

wobei N der Wert des Prescalers ist(ich habe 8 gewählt).

Wenn man die Formel entsprechend umformt, kommt man auch genau zu der 
Formel, die im Datenblatt steht.

Den Code habe ich angehangen, wäre nett, wenn ihr da mal reinguckt.
LG, Björn

von Rahul (Gast)


Lesenswert?

>Der zugehörige Interrupt sollte je Wert 1-2ms nach dem zurücksetzen des >timers 
ausgelöst werden. Der CompareMatch A setzt den Ausgang auf H, B >setzt ihn auf L.
>Damit hatte ich erhofft, ein gültiges Signal zu erzeugen.

Sollte auch so gehen.

>Den Code habe ich angehangen, wäre nett, wenn ihr da mal reinguckt.

Kein Code zum Reingucken da...

von Björn R. (sushi)


Angehängte Dateien:

Lesenswert?

Oh, tut mir leid - hatte auf Vorschau geklickt und da isser wohl flöten 
gegangen. Also auf ein neues.
LG, Björn

von hans (Gast)


Lesenswert?

F_CPU 8000000 Prescale 8 => Zähler mit 1 MHz  1µs

Wert für 1,5ms = 1500µs != 749   !!!!!!

deine werte sind falsch!!

setz mal ohne PRG-änderung den oscillator auf 4MHz und es läuft!

gruß hans

von Björn R. (sushi)


Lesenswert?

Tatsache... hab jetzt mal die Werte verdoppelt. Ist ja dann sogar 
richtig praktisch - da muss man gar nichts mehr rechnen...
Ich weiß sogar wo der hase läuft, also woher der Fehler kommt: Die 
Formel im Datenblatt baut auf der Frequenz auf, und eine komplette 
Periode besteht aus 1x highund 1x low, also ist sie doppelt so lang wie 
das was ich brauchte...
Was allerdings nicht weg ist, ist das üble Zittern...
Ist der interne Oszillator zu ungenau oder woran liegt das? Habs auch 
schon mit mehreren Servos getestet, die machen das alle. Werde mal einen 
Quarz dranhängen...


[edit] Mit Quarz gehts tatsächlich besser...
LG, Björn

von hans (Gast)


Lesenswert?

der interne oscillator reicht locker wenn die Versorgungsspannung
bei 5 Volt liegt (oder 4,8Volt nach Sevospecs) und Zimmertemperatur.

Das Problem dürfte die Versorgung der Servos sein. Der Strom
ist meist höher als gedacht, besonderst beim Anlaufen.
Wenn er dann noch resetet und wieder neu startet ist das Zittern da.
=> mit wirklich kräftigem Netzteil testen.

Den Abeitsbereich der Servos ruhig größer wählen zum Grenzen
testen (0,5 - 2,5 ms  und Strom beachten; oft ist 1,5ms auch nicht
ganz mittig)

gruß hans

von Maria (Gast)


Lesenswert?

Wenn man die Impulsleitung schneller Servos direkt an einen ATMEGA 
Ausgang hängt dann entsteht ein Zittern. Immer einen Widerstand von 
mindestens 100 Ohm (1k) in Reihe zwischenschalten.
Habe selbst diese üble Erfahrung gemacht.

von Björn R. (sushi)


Lesenswert?

Den 1k Widerstand hatte ich schon die ganze Zeit dazwischen - zittert 
trotzdem. Versorgung sind 6V und vor dem Plus-Pin des ATtiny2313 eine 
Diode. Das Servo ist ein ganz normales Standardservo(Graupner C577). Ich 
habe jetzt einen Qurz dran gehäng(4,000 Mhz weil ich den noch da hatte) 
und das Zittern ist weg. läuft jetzt perfekt die Sache.
Danke nochmal!
LG, Björn

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.