Jamara 9g Servo

Gast #1422315
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
#1422719
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.
Gast #1424025
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?!
Persönliche Seite #1424075
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.
Gast #1424914
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.
Persönliche Seite #1424928
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.
Gast #1570305
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?
#1570332
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.
Gast #1570599
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren