Forum: Compiler & IDEs sinusförmige bewegung an modelbauservo


von atze (Gast)


Angehängte Dateien:

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 ;-)

von Rolf Magnus (Gast)


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.

von Rolf Magnus (Gast)


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.

von Karl heinz B. (kbucheg)


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.

von atze (Gast)


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

von Karl heinz B. (kbucheg)


Lesenswert?

> da habe ich dem kleinen wohl viel zu viel
> zugemutet.

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

von atze (Gast)


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

von Karl heinz B. (kbucheg)


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.

von Peter (Gast)


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

von Karl heinz B. (kbucheg)


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.

von atze (Gast)


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.

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.