Forum: Mikrocontroller und Digitale Elektronik Jamara 9g Servo


von Marco -. (Gast)


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:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
5
int main(void){
6
  
7
  DDRE = (1 << DDB2);
8
  PORTE &= ~(1<<PB2);         //ausgang low
9
10
  while(1){
11
      PORTE |= (1<<PB2);             //ausgang high
12
      _delay_ms(2);
13
      PORTE &= ~(1<<PB2);            // ausgang low
14
      _delay_ms(18);
15
  }
16
17
  return 0;
18
}

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

von Ulli B. (ulli-b)


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

von Simon K. (simon) Benutzerseite


Lesenswert?

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

von Marco -. (Gast)


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

von Simon K. (simon) Benutzerseite


Lesenswert?

Hast du die Optimierung denn eingeschaltet beim Kompilieren?

von Marco -. (Gast)


Lesenswert?

Optimierung?

von MS (Gast)


Lesenswert?

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

von Nightowl (Gast)


Lesenswert?

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

von Marco -. (Gast)


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!

von Ronald S. (mline)


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.

von Marco -. (Gast)


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?!

von Simon K. (simon) Benutzerseite


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.

von Marco -. (Gast)


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.

von Nightowl (Gast)


Angehängte Dateien:

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.

von STK500-Besitzer (Gast)


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:
1
        #define fosc 3686411      //Taktfrequenz in Hz 
2
        #define UpperLimit   (unsigned int) (fosc*0.0022)  // Anzahl Ticks für 2,2ms
3
        #define LowerLimit   (unsigned int) (fosc*0.0008)  // Anzahl Ticks für 0,8ms
4
        #define Middle     (unsigned int) (fosc*0.0015)  // Anzahl Ticks für 1,5ms
5
        DDRB = (1<<PB2);         // PB2 ist Ausgang (OCR1B)
6
  DDRD = (1<<PD6) | (1<<PD7);   // PD6 & 7 sind Ausgang, 
7
  PORTD = (1<<PD2) | (1<<PD7);  // PD2 hat Pullup eingeschaltet, PD7 ist Ein, LED ist aus.
8
9
  // Init Timer2 for ICP and FastPWM Mode 15
10
  OCR1A = 0xFFFF;      // TOP = 65535
11
  OCR1B = Middle;  // Debug
12
13
  TCCR1A = (1<<COM1B1) | (1<<WGM11) | (1<<WGM10);  // non-inverting OC-Mode
14
  TCCR1B = (1<<CS10)  | (1<<ICES1) | (1<<WGM13) | (1<<WGM12);  // no Prescaler, Trigger on rising edge
15
  TIMSK = (1<< TOIE1) | (1<<TICIE1);  // ICP und Overflow-Interrupt freigeben
16
17
  sei();

Teil, der die Pulslänge festlegt.
1
        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.

von Simon K. (simon) Benutzerseite


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.

von Jamara (Gast)


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?

von Karl H. (kbuchegg)


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.

von Rolf Magnus (Gast)


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.

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.