mikrocontroller.net

Forum: Compiler & IDEs sinusförmige bewegung an modelbauservo


Autor: atze (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,

kann mein Modelbauservo nun mit Hilfe eines C-Prog und ATMEGA8515
(4MHz) ansteuern... würde jetzt aber gerne eine kontinuierliche
Bewegung nach einer Sinusfunktion realisieren.

Folgendes ist mir dazu eingefallen (siehe Anhang)... leider dreht das
Servo dann voll gegen die Begrenzung. Muss irgendwo ein Fehler im
Quellcode sein, den ich einfach nicht finde.
Für Hilfe bin ich wie immer sehr dankbar!!!

Gute Nacht, atze ;-)

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verstehe deinen Code nicht so recht. Was soll der Interrupt
eigentlich tun? Wo wird der Servopuls erzeugt? Warum willst du 16
Sekunden warten? Und warum setzt du nach einem Timerüberlauf den Wert
auf 0xffff? Dann läuft er doch im nächsten Takt gleich wieder über.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich merke gerade, daß nur die Sonderzeichen in der Datei
verlorengegangen sind und es eigentlich 16 Mikrosekunden sein sollen.
Damit wird schon einiges mehr klar.
Alle 16 Mikrosekunden einen Interrupt auszulösen, dürfte den Controller
allerdings schon ziemlich stressen. Dazu kommt, daß in deiner
Hauptschleife, die eigentlich sehr timingkritisch ist, eine ewig lang
dauernde Sinusberechnung bei jedem Durchlauf ausgeführt wird. Das
wird deine Impulsdauer stark beeinträchtigen und ist vermutlich für den
beobachteten Effekt verantwortlich.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie Rolf schon sagte:
Der Programmaufbau ist nicht so toll.
Was du anstreben solltest:
Dass der Timer völlig selbsttätig (d.h. ohne Mithilfe
von main()) das Servo ansteuert.

Wenn du dieses Ziel erreicht hast, dann bedeutet Servo
bewegen einfach nur eine Zahl in eine bestimmte Variable
zu schreiben und um alles andere kümmern sich die Timer-
Routinen. Insbesondere sollte in main() da nicht mit
irgendwelchen Zeiten rumgerechnet werden oder so.

Autor: atze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mahlzeit,
danke für die Postings... da habe ich dem kleinen wohl viel zu viel
zugemutet. Werde dann doch mal was mit "look-up-tabelle" machen
müssen.

VIELEN DANK!!!

gruss, atze

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> da habe ich dem kleinen wohl viel zu viel
> zugemutet.

Überhaupt nicht. Es ist nur so, dass deine Programmorganisation
sch....wach ist.

Autor: atze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahaaa... interessant!!!
ich dachte die Interruptroutine sollte so kurz wie möglich gehalten
werden. aber könnte ich ja problemlos bißchen umstricken und die
sinusfunktion etwas seltener ausführen lassen.
mal schauen ob ich da was hinbekomme.
danke und gruss, atze

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Interrupt handelst du alles was du zum stellen des
Servos an eine Position brauchst. Nicht mehr und nicht weniger.

Wie dann die Positionen zustande kommen, sei es durch eine
Tabelle oder indem du eine Formel auswertest oder indem
ein Signal ausgewertet wird, ist nicht mehr Aufgabe der
Interrupt Funktion. Die kümmert sich einzig und alleine
darum, dass das Servo an eine bestimmte, vorgegebene
Position kommt. Dazu muss die auch nicht viel machen: sie
erzeugt einfach einen Puls dessen Länge die gewünschte
Servoposition repräsentiert.

Du musst endlich die Generierung der Servo-Position
(deine Sinus Funktion) von der Arbeit des
Servo-an-diese-Position-stellen abkoppeln. Die beiden
haben nichts miteinander zu tun. Ausser dass der eine
eine Soll-Position generiert, die er in einer globalen
Variablen hinterlässt und der andere diese Soll-Position
in Form eines Pulses an das Servo weitergibt. Aber ausser
dieser einen globalen Variable haben die 2 Bereiche keine
Überschneidung.

Und ja: Interrupt Funktionen sollen so kurz wie möglich sein.
Sie sollen aber auch so lang wie notwendig sein. Und einen
Puls generieren ist eine klassische Aufgabe für eine
Interrupt Funktion.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, warum speicherst du im flash nicht die sinuswerte??
eght sehr viel schneller..

meine idee.

ein Timeroverflow steuert über PWM im CTC mode den Servo an.
denke das sollte kein Thema sein.

der andere Timer loesst dann alle xµS xmS aus und laed das OCR Register
von Timer mit dem PWM Timer

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hallo, warum speicherst du im flash nicht die sinuswerte??
> eght sehr viel schneller..

Weil das eigentlich nicht sein Problem ist.
Sein Problem ist, dass er die Pulserzeugung nicht
vollständig im Interrupt macht, sondern in der Hauptschleife
in main(). Dadurch kommt ihm die sin-Berechnung in die
Quere.

Wenn er die Pulserzeugung komplett in den Interrupt
auslagert (so wie du vorschlägst: ein Timeroverflow steuert über
PWM im CTC mode den Servo an. denke das sollte kein Thema sein.)
dann hat die Hauptschleife alle Zeit der Welt einen Sinus zu
berechnen. Das reicht dann auch noch um zwischendurch ein 'paar
teuflisch schwere quadratische Gleichungen zu lösen' (tm) :-)
Zumal der AVR wesentlich schneller rechnen kann als sich das
Servo drehen kann.

Autor: atze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bin heute nicht zum proggen gekommen... aber habe neue ideen dank
euch!!!
poste meine resultate sobald vorhanden :-)
d a n k e!  gruss atze.

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.