www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Jamara 9g Servo


Autor: Marco -. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
ich habe ein Problem mit dem Servo. Ich hab ein ganz einfaches Programm 
geschrieben, um den Servo zu testen, doch es tut sich nichts. Ich habe 
den Servo direkt ans STK500 ( mit Atmega 8515 ) angeschlossen. Die rote 
Ader an +5 V, die schwarze Ader an GND und die orangene Ader über einen 
560 Ohm Widerstan an PE2. Die Spannung am Servo passt auch soweit, ich 
habe sie gemessen. Nun zum Programm:
#include <avr/io.h>
#include <util/delay.h>


int main(void){
  
  DDRE = (1 << DDB2);
  PORTE &= ~(1<<PB2);         //ausgang low

  while(1){
      PORTE |= (1<<PB2);             //ausgang high
      _delay_ms(2);
      PORTE &= ~(1<<PB2);            // ausgang low
      _delay_ms(18);
  }

  return 0;
}

Wie gesagt er ist sehr einfach aber funktionieren sollte es doch 
trotzdem?! Der Servo sollte sich doch in eine Richtung drehen. An PE2 
habe ich auch 0,5 V gemessen aber nur mit einem Multimeter. Die Spannung 
passt aber auch zu meinen Zeiten: 5 V * 2 ms / 20 ms = 0,5 V
Habe ich etwas übersehen, einen Denkfehler oder was auch immer...

Gruß
Marco

Autor: Ulli B. (ulli-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Marco,

das kann verschiedene Gründe haben, weshalb es nicht funktioniert.
Hast Du ein Oszilloskop um zu überprüfen ob der Impuls wirklich 2ms lang 
ist ?
Was soll der 560 Ohm-Widerstand bringen ?


... Ulli

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Orange Ader könnte auch + sein am Servo. In der Mitte vom 3 
Polstecker ist jedenfalls +5V.

Autor: Marco -. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe kein Oszi zur Hand sonst hätte ich den Impuls schon überprüft. 
Ich habe in einigen Foren gelesen, dass man in die Signalleitung einen 
Widerstand einbringen muss/soll...

Die Belegung sollte richtig sein.
http://www.rn-wissen.de/index.php/Servos

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du die Optimierung denn eingeschaltet beim Kompilieren?

Autor: Marco -. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Optimierung?

Autor: MS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht das direkt am Port des avr ?
Oder brauchts da einen Transistor / Treiber dazwischen ?

Autor: Nightowl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn sich die Zeiten nicht ändern wird sich wohl auch nix am Servo 
ändern.
Die Bewegung geht ja aus dem Tastverhälnis hervor.

Autor: Marco -. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok das werde ich mal tun. Vielleicht sollte ich es auch direkt per PWM 
machen aber ich wollte erst einmal schauen wie sich der Servo verhält, 
weil das meine ersten Gehversuche in Sachen Servo/PWM sind.
Danke!

Autor: Ronald S. (mline)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco G. schrieb:
> Ok das werde ich mal tun. Vielleicht sollte ich es auch direkt per PWM
> machen aber ich wollte erst einmal schauen wie sich der Servo verhält,
> weil das meine ersten Gehversuche in Sachen Servo/PWM sind.
> Danke!

delay_ms ist ja auch sehr ungenau...
Servos müssen zwischen 1 und 2ms angesteuert werden. 1,5ms wäre also ca 
die Mitte. Natürlich ändert sich das von Hersteller zu Hersteller etwas.
Es gäbe da noch "delay_us". Damit wird das ganze sicher genauer.

Autor: Marco -. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
ich hätte es vielleicht direkt per PWM versuchen sollen. Der Servo 
bewegt sich jetzt aber noch nicht so ganz wie ich möchte. Entweder liegt 
es jetzt an meiner Konfiguration der PWM oder die Zeiten stimmen nicht. 
Ich habe mal bei Jamara nachgefragt welche Zeiten er wofür braucht.
Den 560 Ohm Widerstand in der Signalleitung von µC und Servo brauche ich 
also nicht?!

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Widerstand brauchst du nicht, ich würde ihn trotzdem drin lassen, 
falls du mal falsch anschließt oder einen Kurzen baust oder das Servo 
irgendwie ungünstig kaputt geht, himmelst du nicht deinen 
Mikrocontroller.

Was war denn eigentlich das Problem? Hat der Servo sich nicht dauerhaft 
bewegt, oder stand er immer noch in Neutralstellung? Mit dem Code in 
deinem ersten Post wirst du nur bewirken, dass sich das Servo auf 
Maximalausschlag (in einer Richtung) stellt.

Autor: Marco -. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Er hat nichts getan. Ich hatte es dann auch mal mit us anstatt ms 
probiert aber da hatte sich nix geändert. Dann hab ich mich mit der PWM 
beschäftigt und schon funktionerte es so halb.

Autor: Nightowl (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
PWM für die Servos ist m.e. nicht so zielführend.
Du kannst das aber auch über die timer counter machen.
Im Anhang ein Beispiel zum testen.
Müsstest Du allerdings auf Deinen Compiler anpassen.
stephan.h ist unwichtig und dient nur der Tastenbehandlung das kannst Du 
alles weglassen.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>PWM für die Servos ist m.e. nicht so zielführend.

Was heisst denn PWM?
"Pulsweitenmodulation". Ein Modellbauservo wird mit einem Puls 
unterschieldlicher Länge angesprochen, wobei die Länge des Pulses 
proportional in eine Bewegung umgesetzt wird.
Diesem Impuls folgte eine Pause. Wird der Impuls in regelmäßigen 
Abständen erzeugt, hat man eine Periode - den Kehrwert einer Frequenz.

Hier mal der Code, den ich meistens benutze:
Teil der Main:
        #define fosc 3686411      //Taktfrequenz in Hz 
        #define UpperLimit   (unsigned int) (fosc*0.0022)  // Anzahl Ticks für 2,2ms
        #define LowerLimit   (unsigned int) (fosc*0.0008)  // Anzahl Ticks für 0,8ms
        #define Middle     (unsigned int) (fosc*0.0015)  // Anzahl Ticks für 1,5ms
        DDRB = (1<<PB2);         // PB2 ist Ausgang (OCR1B)
  DDRD = (1<<PD6) | (1<<PD7);   // PD6 & 7 sind Ausgang, 
  PORTD = (1<<PD2) | (1<<PD7);  // PD2 hat Pullup eingeschaltet, PD7 ist Ein, LED ist aus.

  // Init Timer2 for ICP and FastPWM Mode 15
  OCR1A = 0xFFFF;      // TOP = 65535
  OCR1B = Middle;  // Debug

  TCCR1A = (1<<COM1B1) | (1<<WGM11) | (1<<WGM10);  // non-inverting OC-Mode
  TCCR1B = (1<<CS10)  | (1<<ICES1) | (1<<WGM13) | (1<<WGM12);  // no Prescaler, Trigger on rising edge
  TIMSK = (1<< TOIE1) | (1<<TICIE1);  // ICP und Overflow-Interrupt freigeben

  sei();

Teil, der die Pulslänge festlegt.
        OCR1B = Dauer;

In dem Code ist auch noch das Einlesen eines Fernsteuersignals 
"versteckt". Die ISR dazu habe ich nicht mitgeschickt.
Bei diesem Programm (für den Mega8) wird der Servo an einen OC-Pin des 
Timer2 angeschlossen.
Man muss also nur OCR1B setzen, wenn die Position geändert werden soll. 
Den Rest macht der Controller alleine.
Dass der Controller mit 3,686MHz nur ~17ms Periodendauer hat, stört 
meine Servos nicht.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jup, das ist wohl die gängigste Methode. Bei einer 16 Bit PWM hat man 
auch noch eine hinreichende Genauigkeit (Um die  +/- 2500 Steps pro ms 
bzw. pro 90° bei einem normalen Servo. Das wird ja wohl dicke reichen).

Vorteil ist, dass man sich wirklich um nichts mehr kümmern muss und 
quasi eine direkte Schnittstelle (in Form eines Registers hat), wo man 
die Position bzw. Auslenkung des Servos vorgibt. Viel einfacher gehts ja 
schon nicht mehr ;) Das alles in Hardware.

Autor: Jamara (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
hat mal jemand diesen Servo benutzt? Die meisten Servos benötigen ja 
einen high-Pegel von 1 - 2 ms am Anfang der Periode. Bei einem 
high-Pegel von 1 ms bzw 2 ms sollte der Servo dann seine maximale 
Endlage anfahren, was er aber nicht tut. Die PWM stimmt aber, da sie 
nachgemessen wurde.
Ist vielleicht das Taktverhältnis bei diesem Servo anders?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jamara schrieb:

> high-Pegel von 1 ms bzw 2 ms sollte der Servo dann seine maximale
> Endlage anfahren, was er aber nicht tut.

Nimm die 1 ms bzw. 2 ms nicht als von Gott gegeben.
Das ist bei jedem Servotyp ein wenig anders.

Die maximale Endlage wird mechanisch durch Blockieren der 
Abtriebsscheibe mit einem Zapfen in einer Nut erreicht. Diese Position 
kann jetzt bei 1 ms erreicht werden. Meistens wird man das aber nicht 
tun, damit man beim Servoeinbau noch ein wenig Spiel hat, ehe das Servo 
ansteht. Die Maximallage wird dann bei vielleicht 0.8ms erreicht. Auch 
gibt es Servos, die 180 Grad drehen, welche die 170 Grad drehen und 
wieder andere haben 300 Grad. Manche Servos haben sogar rund 1400 Grad 
Verfahrweg, die nennt man dann aber auch Segelwinde :-)

Auch gibt es Servos, die ihre Neutrallage nicht bei 1.5ms haben, sondern 
bei 1.2ms. Da gibt es den Multiplex-Standard und den Rest der Welt.

Also: Die Endlagen ausmessen und im Programm einstellbar machen, wenn du 
vorhast, das Servo gegen ein anderes tauschen zu können. Nicht umsonst 
hat praktisch jeder neuere Fernsteuerungssensor eine Möglichkeit, die 
Servoendlagen einzustellen. Damit entfällt dann das mühsame Abstimmen 
der Abtriebsgestänge durch Änderungen am Hebelarm bzw. Umlenkhebeln, bis 
man die Ausschläge am Endgerät hatte, die man wollte.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> delay_ms ist ja auch sehr ungenau...

Nicht wirklich.

> Es gäbe da noch "delay_us". Damit wird das ganze sicher genauer.

Warum sollte es?

Jamara schrieb:

> hat mal jemand diesen Servo benutzt? Die meisten Servos benötigen ja
> einen high-Pegel von 1 - 2 ms am Anfang der Periode.

Naja, was heißt "am Anfang"? Die Pausenzeiten sind dem Servo relativ 
egal, und bei den im Modellbau oft eingesetzten PPM-Empfängern ist die 
Periodendauer auch großen Schwankungen unterlegen.

> Ist vielleicht das Taktverhältnis bei diesem Servo anders?

Nicht so weit, daß er mit 2 ms Puls und 18 ms Pause überhaupt nicht klar 
kommen würde.

Karl heinz Buchegger schrieb:

> Die maximale Endlage wird mechanisch durch Blockieren der
> Abtriebsscheibe mit einem Zapfen in einer Nut erreicht. Diese Position
> kann jetzt bei 1 ms erreicht werden. Meistens wird man das aber nicht
> tun, damit man beim Servoeinbau noch ein wenig Spiel hat, ehe das Servo
> ansteht.

Naja, "ein wenig" ist untertrieben. Die Standard-Servos, die ich so 
kenne, haben ihren Anschlag so ca. bei +/-90° oder mehr. Die 1 bis 2 ms 
bringen aber meistens nicht mehr als ca. +/-45°. Da ist schon noch eine 
große Reserve da.

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.