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
>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...
Oh, tut mir leid - hatte auf Vorschau geklickt und da isser wohl flöten gegangen. Also auf ein neues. LG, Björn
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
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.