www.mikrocontroller.net

Forum: Compiler & IDEs Servo ansteuern - Timer tut nichts


Autor: Isak Svensson (Firma: Youzone) (pirat) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel B. (inox5) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt hier im Wiki extra einen Beitrag dazu:

http://www.mikrocontroller.net/articles/Modellbaus...

ist zwar für einen ATiny2313, funktioniert aber mit einem Mega32 
sicherlich genauso.

Autor: Isak Svensson (Firma: Youzone) (pirat) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel B. (inox5) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Isak Svensson (Firma: Youzone) (pirat) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte den Servo erstmal nur auf eine Feste Position fahren.

Wie berechne ich die Werte für 16 MHz?

pirat

Autor: Daniel B. (inox5) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Isak Svensson (Firma: Youzone) (pirat) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke erstmal.

Ich habe jetzt den Code versucht anzupassen und eine ganze weile das 
Datenblatt: 
http://www.atmel.com/dyn/resources/prod_documents/... 
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

Autor: Daniel B. (inox5) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Ausgang müsste PD5 sein und TIMSK ist falsch gesetzt.

Timsk muss: TIMSK=0b00010000; sein.

Probier das mal, müsste dann gehen.

Autor: Isak Svensson (Firma: Youzone) (pirat) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, der Servo fährt auf keine Position...

pirat

Autor: Daniel B. (inox5) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du mal mit einem Oszilloskop PD4 und PD5 messen?

Autor: Isak Svensson (Firma: Youzone) (pirat) Benutzerseite
Datum:

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

pirat

Autor: Daniel B. (inox5) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.