mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Servo mit AVR


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, dann geh ich mal ans ausprobieren...

Danke für Eure schnelle Hilfe!
Gruß Jens

Autor: Christian (Gast)
Datum:

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

mfg
Christian

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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! :-)

Autor: Holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Björn Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Retro (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

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.