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 ;-)
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.
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.
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.
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
> da habe ich dem kleinen wohl viel zu viel > zugemutet. Überhaupt nicht. Es ist nur so, dass deine Programmorganisation sch....wach ist.
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
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.
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
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.