Forum: Mikrocontroller und Digitale Elektronik Servo mit AVR


von Jens (Gast)


Lesenswert?

Hallo,

wie kann ich mit dem AVR (8535) einen Servo ansteuern?
Gibt es irgendwo Beispiele (vielleicht sogar für avr-gcc)?

Danke für Eure Hilfe...
Jens

von Jonas Diemer (Gast)


Lesenswert?

ganz einfach:

du musst dem motor einen 1-2ms langen puls geben, dann 18ms warten und 
wieder einen puls.

ist der puls 1,5ms lang, steht der motor in mittelstellung, bei weniger 
steht er links, bei mehr rechts. die genauen zeiten hängen jedoch von 
deinem motor ab.

von Jens (Gast)


Lesenswert?

Hallo Jonas,

sehe ich das richtig, muss ich diesen 1-2sec langen Impuls dauernd geben 
oder reicht das auch immer nur einmal?
Oder was passiert, wenn ich keinen Impuls mehr gebe?

Gruß Jens

von Christian (Gast)


Lesenswert?

Hi Jens
hab' für code vision ein Programm geschrieben:

#include <90s2313.h>
#include <delay.h>

#define Servo PORTB.0
#define SERVO_DDRD DDRB.0



void Servo_1(char Impuls)
{
char i;
Servo = 0;    //low legen
delay_ms(20);
Servo = 1;    //high Impuls
delay_ms(1);
for(i=0;i<Impuls;i++)   //solange die Highflanke machen bis i = Impuls
  {
  delay_us(4);
  }
Servo = 0;


}

void main (void)
{
SERVO_DDRD = 1;    //als Ausgang definieren

while(1)
{
Servo_1(150);
}
}

die zahl, die du der Routine Servo_1 übergibst bestimmt die 
Servoposition (256 Stellungen sind mgl.)

Viel Erfolg

Christian

von Jens (Gast)


Lesenswert?

Super, klasse, DANKE

aber noch eine Frage:
was passiert, wenn ich jetzt zwischendrin (im main) irgendwas rechne 
oder so, dann kann das ja vorkommen, dass sich die Zeiten dazwischen 
ändern, hat das Auswirkungen und wie kann ich das lösen?
Denn irgendwie möchte ich ja den Servo in Abhängigkeit von 
irgendendetwas steuern.

Gruß Jens

von Jonas Diemer (Gast)


Lesenswert?

ich hab das mit nem timer gemacht, der alle 20ms (bei mir 18ms) 
aufgerufen wird. dort wird dann der puls gemacht. Die variable Impuls 
muss dann global sein, dann muss dein hauptprogramm nur diese variable 
ändern, und der servo geht in eine andere stellung.

auf diese weise ist auch sichergestellt, dass der servo "kontinuierlich" 
seine pulse bekommt (wobei ich nicht weiß, was passiert, wenn er die nur 
bei änderung bekommt).

von Jens (Gast)


Lesenswert?

ok, dann geh ich mal ans ausprobieren...

Danke für Eure schnelle Hilfe!
Gruß Jens

von Christian (Gast)


Lesenswert?

so genau ist das nicht - ob der Servo die Impulse alle 20 oder alle 18ms 
bekommt ist nicht so wichtig!!

mfg
Christian

von Jonas Diemer (Gast)


Lesenswert?

stimmt. ich hatte seinerzeit gelesen, dass der servo insgesamt 20ms 
braucht, also die pulslänge plus den rest, damits auf 20ms kommt... 
vielleicht stimmt diese info aber auch nicht. klärt mich auf! :-)

von Holger (Gast)


Lesenswert?

Das mit den 20ms hängt damit zusammen, dass übliche Fernsteuerungen 
maximal 10 Kanäle bedienen. Und zwar nacheinander. Sprich: Jedes 
PWM-Signal wird nach dem anderen generiert. 10 * 2ms = 20ms 
Wiederholrate.

von Jens (Gast)


Lesenswert?

@Holger

Wiederholrate, heißt das jetzt das der Servo immer nen Impuls braucht, 
oder müsste ich ihn nur bei einer Änderung "schicken"??

Bin noch nicht so weit mit meinen Tests......
muss erst mal meinen servo rauskramen!

Jens

von Holger (Gast)


Lesenswert?

Servos reagieren unterschiedlich, wenn das Eingangssignal ausbleibt. Die 
Regel sollte aber sein, dass es ohne Signal gar nichts tut, also seine 
Stellung nicht verändert. So ganz hasenrein ist es aber nicht, darauf zu 
bauen. Ich würd' dem Prozessor ruhig beibiegen, alle 20ms nachzulegen. 
In den mindestens 18 ms dazwischen haste doch noch soooo viel Zeit zum 
Rechnen.

von Christian (Gast)


Lesenswert?

fast alle anständigen Servos machen nix, wenn sie nicht angesterut 
werdne - manche flattern dann munter drauf los - ohne ansteuerung ist 
der Servo aber mit der Hand oder mit kleinen Lasten zu verändern --> 
keine gute Lösung!!


mfg

von Marcus (Gast)


Lesenswert?

Hallo

Ich will fuer meine autonome Ameise ein board bauen das mindestens 24 
servos hat und von einem CYBIKO  [http://www.cybiko.com] Teen PDA ueber 
die serielle RS232 gesteuert wird. Ich habe vor dazu 2 Mega8 als slaves 
zubenutzen.
Weiss jemand ob das Probleme verursachen kann?

Baut jemand an etwas aehnlichen? Oder hat Lust zu helfen. Ich bin ein 
Metal Designer und sitze in Hollywood [wollte Monster bauen, kam aber 
zuspaet, die Monster sind weg, nur noch Zombys]
Ich habe eine schicke Ameise aus Alu die ich als Bausatz verkaufen 
moechte [Ich habe eine CNC Machine und kann ganz schnell  viele bauen] 
und brauche nur noch ein board. Wuerde Ameise gegen Hilfe tauschen.

Bis dann schoene Gruesse aus Hollywood

Marcus

von Björn Jonas (Gast)


Lesenswert?

Nach meiner Erfahrung bleibt der Servo ohne Impulse an der aktuellen 
Position stehen. Die Regelung funktioniert dann allerdings nicht mehr 
(gibt ja kein Sollwert), daher läßt er sich per Hand verdrehen.

Problem oder nicht, nachdem was man damit vor hat ! Da das Servo eine 
sehr starke Untersetzung (Getriebe) hat, gibt es bei kleineren Lasten 
kein Problem.

Meines Wissen nach muß der Abstand zwischen den Pulsen 20ms lang sein, 
der genaue Wert ist allerdings nicht so kritisch. Kritisch ist der Wert 
für die Impulslänge. Bei unsauberer Programmierung fäng der Servo an zu 
Zittern. Man man die Abständen zwischen den Impulsen auf 40ms erhöhen. 
Das hab ich mal gemacht, weil ich sonst nicht mehr genug Rechenleistung 
hatte. Einfach mal ausprobieren !

Gruß
Björn

von Retro (Gast)


Lesenswert?

Hallo Christian, du hast eine delay.h benutzt... leider kenn (und hab) 
ich die garnicht!

Kannst du mir mal verraten woher ich sie kriege bzw. sie mal uploaden?

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.