Hallo,
um besser mit den Timern und den Interrupts klarzukommen (lerning by
doing) habe ich mir gestern mit Hilfe des Datenblatts und der WinAVR
Beispiele ein Programme gebastelt, das ein Modellbauservo ansteuern
soll.
Ich war erstaunt wie einfach es zu sein scheint ein solches Programm zu
schreiben und dass C dafür eigentlich übertrieben ist... aber ich lasse
es erst mal so :)
Laut Oszi ist das Ausgangssignal des AT90S4433 (war noch übrig) ok. Ich
habe zwei Graupner C341 Servos getestet, die auf jedenfall Fall in
Ordnung sind und beide drehen bei einem Wert von 1500µs nicht in
Mittelstellung sondern recht nah an den Anschlag :(
Das Programm habe ich mal angehängt. Habe mich bemüht es einigermaßen
zu dokumentieren :)
Grüße,
Marco
@Marco:
Das Programm erzeugt ein Signal mit einem Puls-/Pausenverhältnis von
20:1,5 bei einer Periodendauer von 21,5 ms. Die vorgegebene
Periodendauer sollte aber 20,0 ms sein, oder? Korrigiere den Pausenwert
auf 18500 (20000-1500) und es sollte gut sein ;)
Oh danke, werde es mal ändern... also "Servo_Pause=20000-Servo_Puls",
stimmt's?
Hatte mal gehört dass die 20ms nicht soooo genau eingehalten werden
müssen und eher ein Richtwert sind. :)
@marco
Die Periodendauer (20ms) ist nicht so wichtig. Die von mir verwendeten
Servos funktionieren einfach nur bei dieser Frequenz ganz gut. Der
Servo regelt bei jedem Puls die Position der Abtriebswelle nach, bei
50Hz eben 50mal/s. Gibst Du dem Servo den Puls beispielsweise mit 1Hz,
regelt er die Position nur 1mal pro Sekunde nach, was für die meisten
Anwendungsfälle natürlich zu wenig sein dürfte.
Gruß,
Andreas
Ausserdem stimmt die Sache mit 1ms bis 2ms als Pulslänge
auch nicht ganz. MPX Servos haben zB. ein etwas anderes
Timing.
Also, am einfachsten: Probier einfach Werte aus, bis
du den rechten und den linken Extremwert gefunden hast.
Dazwischen sollte es allerdings schon linear sein. D.h.
Mittelstellung = ( linker_anschlag + rechter_anschlag ) / 2;
Bist Du Dir sicher, daß Deine Berechnungen richtig sind? Eventuell
verwendest Du beim AVR gar nicht den Quarz, sondern den internen
RC-Oszillator. Prüfe doch mal das Signal am Oszi.
mfg, Stefan.
> Also, am einfachsten: Probier einfach Werte aus, bis> du den rechten und den linken Extremwert gefunden hast.
Aber sei vorsichtig: Im Getriebe ist normalerweise eine
mechanische Sperre drinnen. Servos moegen es gar nicht gerne,
wenn sie an diesen Anschlag gefahren werden und dort längere
Zeit gehalten werden. Das erkennst Du im übrigen daran, dass
der Motor deutlich zu knurren anfängt.
Wenn der Hebel nach dieser Auslotung dann immer noch nicht
(für Dich) in Mittelposition kommt, dann mach folgendes:
Der Hebel ist festgeschraubt. Mach die Schraube los, zieh
den Hebel ab und setz ihn anders in die Verzahnung ein. Schraube
wieder anziehen und fertig.
@Stephan.:
Das ist bei mir zum Glück nicht möglich. Als der AT90S4433 hatten die
Controller noch keinen internen Oszillator :)
Und auf dem Oszi kann ich erkennen dass die Pausendauer wirklich 20ms
beträgt. Von daher sollte auch die Pulsdauer stimmen... theoretisch.
@Andreas:
Danke für die Erklärung! Gut zu wissen dass man durch kürzere Pausen
die Servos dazu bewegen kann sich öfter zu justieren... damit auch
schneller? Nein oder? Der Motor kann ja nicht auf einemal schneller
drehen. Schade :)
@Karl Heinz:
Danke, vielleicht könnte ich mal messen was am Servo ankommt wenn ich
die Signale von meinem Sender erzeugen lasse.
Ich habe mich auch da schon oft gewundert dass man den Servoweg noch
ein Stück spreizen kann wenn man es nur am Sender entsprechend
einstellt... also testen, messen und übertragen.
Grüße,
Marco
Hallo
Ich bin neu hier und habe noch nicht soviel erfahrung mit der
programmierung.
Kann schon ein paar LED´s mit dem at90S2313 ansteuern.
Programm in Bascom geschrieben.
möchte gerne ein Servo an steueren um etwas zu bewegen.
Das Servo soll mit einem Taster zur Linken Seite und mit dem anderen
Taster zur Rechten Seite laufen.
wie kann ich das mit Bascom erstellen?
kann man das auch mit einem Tiny 13 oder 15 machen?
würde mich sehr über eine Antwort freuen.
Mit Dank andreas-bahn
> möchte gerne ein Servo an steueren um etwas zu bewegen.
Gute Idee...
> Das Servo soll mit einem Taster zur Linken Seite und mit dem anderen> Taster zur Rechten Seite laufen.
Das Beispiel im Anhang läuft bei gedrücktem Taster zur einen Position,
bei losgelassenem Taster zur anderen Position.
> wie kann ich das mit Bascom erstellen?
Das kann ich Dir leider nicht sagen, für BASCOM bin ich zu unwissend,
ich programmiere AVRs nur in Assembler.
> kann man das auch mit einem Tiny 13 oder 15 machen?
Ja, das geht mit Tiny 12, Tiny13 und auch Tiny15, denn es benötigt nur
einen Timer-Interrupt. Tiny12 oder Tiny15 sollten allerdings auf
Nennfrequenz calibriert werden, sonst stimmen die Impulsbreiten nicht.
...
Bascom hat eine Servo-Funktion, die im Handbuch beschrieben ist.
Vielleicht findet sich ja mal jemand, der das Ding ins Deutsche
übersetzt.
>Ob Bascom was mit den Tinies anfangen kann, weiß ich nicht. (Sollte auch im
Bascom-Handbuch stehen).
Hallo an alle
Erst mal Danke an alle die mir geholfen haben.
Aber was ist "c" und wo bekommt man es?
habe noch nichts davon gehört.
Ist es besser als Bascom?
Mit Dank andreas
>Aber was ist "c" und wo bekommt man es?>habe noch nichts davon gehört.
Das ist nicht dein Ernst, oder?
C ist übrigens ein lateinischer Buchstabe...
>Ist es besser als Bascom?
Ja! (und das ist meine ganz persönliche subjektive Meinung!)
Wenn du einen Blick in die Spalte auf der linken Seite werfen möchtest,
wirst du ein AVR-GCC-Tutorial finden - Da ist dann auch beschrieben, wo
man C findet (nicht nur zwischen "b" und "d"... ;)