www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega8 Problem bei Servo-Ansteuerung in Assembler


Autor: Daniel K. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an alle, ich hoffe ihr könnt mir helfen:

Ich möchte fürs Fesselfliegen mit einem Brushlessmotor ein kleines 
Programm schreiben, was folgenden Programmablauf haben soll:

1. Warten bis Taster gedrückt wird
2. Dann 15 Sekunden warten, damit man Zeit hat zum Griff zu gehen
3. 3 Minuten Vollgas zum Fliegen
4. 5 Sekunden Halbgas um sich auf die Landung vorzubereiten
5. Motor aus um zu landen

Eine LED soll mir dann anzeigen, wo ich bin:
1. LED dauerhaft an
2. LED 1 Sekunden Blinken
3. LED aus
4. LED 1 Sekunden Blinken
5. LED dauerhaft an

Angeschlossen habe ich den Taster an PD6, die LED an PB5 und die 
Impulsleitung vom Servo an PD4. Das ist so merkwürdig, damit ich auf dem 
Lochraster möglichst keine Kabel benutzen musste.

So weit so gut, der Regeler wird ja wie ein normales Servo angesteuert 
und in einem anderen Beitrag habe ich gelesen, das ich alle 20ms ein 
Signal von 1ms bis 2ms erzeugen muss, wobei 1ms 0% entsprechen und 2ms 
100%, dementsprechend sind 1,5ms 50%. Aus dem AVR-Tutorial habe ich mir 
dann das Timerbeispiel von der Uhr genommen und die Werte so verändert, 
das ich mit dem internen Tackt vom Atmega8, also 1MHz, alle 0,5ms einen 
Interrupt bekomme. Über das Register r19 stelle ich nun ein, wie viele 
0,5ms Impluse ich alle 20ms haben möchte.
Und genau hier liegt das Problem, obwohl das 1 Sekunden Blinken der LED 
nach dem Tastendruck funktioniert, das Interrupt also richtig aufgerufen 
wird, läuft ein servo, wenn ich es anschließe an den Anschlag und summt 
weiter vor sich hin, als ob es noch weiter möchte. Am Servo liegt es 
nicht, denn ich habe es mit mehreren Probiert und kann mir nicht 
vorstellen, das alle kaputt sind.

Leider habe ich kein Oszilloskop um mir das Ausgangssignal mal 
anzuschauen, also wollte ich fragen, ob sich vielleicht einer von euch 
mal den Quellcode anschauen kann, und vielleicht den Fehler findet.

Schonmal vielen Dank im Vorraus.

MfG. Daniel

Autor: Software-Entwickler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nutz doch die PWM Funktion vom Controller. Der kann dir eine PWM 
erzeugen, guck mal ins Datenblatt.

Ueber ein Compare-Register kannst du dann die Pulsweite steuern. Ist 
eigentlich nicht weiter schwer.

Autor: Software-Entwickler (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und ueberhaupt: Warum machst du das nicht in C auf einem Mega 8? Ist 
doch genug Flash-Speicher vorhanden.

Hab mal ein Beispiel (hab ich damals fuer den ATTiny2313 gemacht, glaub 
ich) beigefuegt. Interrupts sind momentan auskommentiert.

Uebrigens: Servos sind nicht besonders genau in der Ansteuerung, je nach 
Hersteller verhalten die sich ein wenig anders, was die Pulsweite 
anbelangt.

Autor: Daniel K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal Danke für die Hilfe,
ich versuche es jetzt mit PWM, melde mich nochmal, wenn ich Probleme 
habe.

MfG. Daniel

Autor: Flieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ganz genau werden die 1-2ms von nahezu keinem Servo eingehalten. Es 
können auch mal 1,1-1,8ms sein oder ähnlich. Wenn der Servo an den 
Anschlag fährt und brummt bist du wahrscheinlich mit deiner Ansteuerung 
bei über 100%.

Gruß
Flieger

Autor: Daniel K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei genauerer Betrachtung ist mir aufgefallen, das ich es im Prinzip 
doch genau so mache, wie im Abschnitt "PWM in Software" im AVR-Tutorial 
beschrieben. Es muss also einfach nur ein Problem mit dem Abstand der 
Impulse bzw. der Länge derselbigen geben. Wenn sich jemand mal meinen 
Quellcode anschauen und mir Tipps dazu geben könnte, wäre ich sehr 
dankbar.

MfG. Daniel

Autor: Daniel K. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sry für Doppelpost, habe aber gerade ein vergessenes rjmp eingefügt und 
nach einigem Debuggen jetzt auch Impulslaenge und -abstand einstellen 
können, aber das Servo macht immer noch nicht, was es soll. Jetzt ist es 
nur noch am Ticken, und zwar ziemlich schnell. Am RC-Empfänger 
funktioniert es einwandfrei.
Den geänderten Code hänge ich an.

MfG. Daniel

Autor: Daniel K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, hat sich erledigt, ich hatte den Pin, anstatt ihn auf Low zu 
setzen, High gesetzt, das signal war also genau andersrum, jetzt 
funktioniert alles prima.

MfG. Daniel

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.