Hallo ! Ich versuche einen Servo mit einem Atmega32 anzusteuern. Ich habe es zunächst hiermit: Beitrag "Servo ansteuern mit ATMega16" probiert. Damit lässt sich der Servo an PA7 ansteuern und fährt auch die entsprechenden Positionen an. Da das ganze aber ohne Timer realtiv unzufriedenstellend ist, habe ich es hiermit: http://www.rn-wissen.de/index.php/Servo#Ansteuerung versucht. Wenn ich das richtig verstehe, dann müsste der Code also in etwa so angepasst aussehen: http://paste.pocoo.org/show/161139/ Es tut sich allerdings nichts an PA7. Auch die LEDs an Port C werde nicht ausgeschaltet, was sie schaltungsbedingt tun sollten, d.h. das Interrupt wird nicht ausgeführt. Was ist verkehrt? Danke Gruß pirat
Wieso muss das Servo-Gehandhabe immer so komisch realisiert werden? Irgendwo hier im Forum habe ich einen funktionierenden Code gepostet, den ich gerade nicht finde.
Es gibt hier im Wiki extra einen Beitrag dazu: http://www.mikrocontroller.net/articles/Modellbauservo_Ansteuerung ist zwar für einen ATiny2313, funktioniert aber mit einem Mega32 sicherlich genauso.
zu dem Wiki-Beitrag: Ich schließe also die PWM Leitung an PB3 an. Ich habe für F_CPU 16 MHz eingestellt. -> es rührt sich nichts. Ist der Teil in der while-Schleife notwendig? Müssen die anderen Werte für 16 MHz angepasst werden? pirat
Isak Svensson schrieb: > zu dem Wiki-Beitrag: > > Ich schließe also die PWM Leitung an PB3 an. Ich habe für F_CPU 16 MHz > eingestellt. > > -> es rührt sich nichts. > > Ist der Teil in der while-Schleife notwendig? > Jap, weil hier die Position des Servos verändert wird. > Müssen die anderen Werte für 16 MHz angepasst werden? Ja, diese müssen angepasst werden an die 16MHz. Das Programm ist für 1MHz Taktfrequenz geeignet. > > pirat
Ich möchte den Servo erstmal nur auf eine Feste Position fahren. Wie berechne ich die Werte für 16 MHz? pirat
Als erstes musst du berechnen wieviele Takte du benötigst, um eine Gesamtperiode zu bilden. Einfach gesagt, wieviele Takte in 20ms / 0,02s reinpassen und das möglichst genau. Bei 16MHz bietet sich ein Prescaler von 64 gut an: 16000000Hz / 64 = 250000Hz Jetzt muss man berechnen, wie oft die Periodenlänge von 250000Hz in 0,02s passt: 0,02s / (1 / 250000Hz) = 5000 Periodenlängen bzw. Takte Nachdem wir nun wissen, wieviele Takte in 0,02s passen, können wir die restlichen Werte berechnen. So zum Beispiel für die Neutralposition (1,5ms): 0,0015s / (1 / 250000Hz) = 375 Periodenlängen bzw. Takte Da der Timer im CTC-Mode ist, muss man die 375 von den 5000 abziehen also: OCR1A_Neutralposition = 5000 - 375 Das zu den Werten. Aber soweit ich weiß sind die Timerausgänge und Timerregister etc. im Mega16 etwas anders. Hier heißt es einfach mal das Datenblatt genau zu lesen. Und dann sollte das ganze auch funktionieren. Ein Oszilloskop hilft da übrigens beim Spiel mit den Timern sehr :D Also nochmal im Überblick: Periodenlänge vom Servosignal (20ms) und Referenzwert für die Signalbildung: 5000 Die 5000 müssen immer da hin, wo ich 2500 gesetz habe. Prescaler: 64 Timermode: CTC mit Comparematch bei erreichen von OCR1A und irgendeinen Timer-Pin bei Comparematch tooglen Damit der Servo erstmal nur auf neutral fährt, musst du einfach ne Endlosschleife nach der Initialisierung bringen. MfG Inox
Danke erstmal. Ich habe jetzt den Code versucht anzupassen und eine ganze weile das Datenblatt: http://www.atmel.com/dyn/resources/prod_documents/doc2503.pdf untersucht. Das ganze sieht jetzt so aus: http://paste.pocoo.org/show/161379/ funktioniert allerdings immer noch nicht. IN TCCR1B habe ich den Prescaler auf 64 gesetzt. Es ist in TCCR1A COM1B0 auf 1 gesetzt, d.h. der Ausgang für das PWM Signal am Atmega32 müsste PD4 sein, richtig? TIMSK kann scheinbar auch nicht so aus dem Wiki übernommen werden. Dort ist TOIE2 gesetzt. Das gibt es beim Atmega32 allerdings nicht. Muss also stattdessen TOIE1 gesetzt werden? Wenn ich die PWM-Leitung vom Servo an PD4 stecke, dann zuckt der Servo beim Anschließen kurz, das tut er aber auch bei anderen Pins. Gruß pirat
Der Ausgang müsste PD5 sein und TIMSK ist falsch gesetzt. Timsk muss: TIMSK=0b00010000; sein. Probier das mal, müsste dann gehen.
Sorry. Ich habe keins. Gibt's noch eine andere Möglichkeit herauszufinden, warum das nicht tut ? pirat
Hm, Fuses mal geschaut? Zum Beispiel die JTAG Fuse noch gesetzt? Alle Ports mal geschaut? Ansonsten hilft nicht viel und du musst dich einfach mal ins Datenblatt reinknien und viel, viel probieren.
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.