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
intmain(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
return0;
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
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
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
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!
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.
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?!
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.
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.
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.
>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.
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.
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.
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?
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.
> 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.