Forum: Compiler & IDEs Servo ansteuern - Timer tut nichts


von Isak S. (Firma: Youzone) (pirat) Benutzerseite


Lesenswert?

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

von STK500-Besitzer (Gast)


Lesenswert?

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.

von Daniel B. (inox5) Benutzerseite


Lesenswert?

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.

von Isak S. (Firma: Youzone) (pirat) Benutzerseite


Lesenswert?

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

von Daniel B. (inox5) Benutzerseite


Lesenswert?

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

von Isak S. (Firma: Youzone) (pirat) Benutzerseite


Lesenswert?

Ich möchte den Servo erstmal nur auf eine Feste Position fahren.

Wie berechne ich die Werte für 16 MHz?

pirat

von Daniel B. (inox5) Benutzerseite


Lesenswert?

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

von Isak S. (Firma: Youzone) (pirat) Benutzerseite


Lesenswert?

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

von Daniel B. (inox5) Benutzerseite


Lesenswert?

Der Ausgang müsste PD5 sein und TIMSK ist falsch gesetzt.

Timsk muss: TIMSK=0b00010000; sein.

Probier das mal, müsste dann gehen.

von Isak S. (Firma: Youzone) (pirat) Benutzerseite


Lesenswert?

Nein, der Servo fährt auf keine Position...

pirat

von Daniel B. (inox5) Benutzerseite


Lesenswert?

Kannst du mal mit einem Oszilloskop PD4 und PD5 messen?

von Isak S. (Firma: Youzone) (pirat) Benutzerseite


Lesenswert?

Sorry. Ich habe keins. Gibt's noch eine andere Möglichkeit 
herauszufinden, warum das nicht tut ?

pirat

von Daniel B. (inox5) Benutzerseite


Lesenswert?

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