Also, habe jetzt noch etwas herumgespielt, den Servo ausgetauscht (gegen einen anderen der gleichen Art, also auch ein Robbe FS100).
Habe die Durchlaufzahl der Schleife jetzt mal zu Testzwecken auf 500 gesetzt (500 * 20ms = 10k ms = 10 sek), damit bin ich garantiert auf der sicheren Seite in Sachen "Stell-Zeit" habe ich mir gedacht.
Testablauf jetzt:
Habe den Servo per Hand in die Mittel-Lage gedreht als Ausgangsposition.
Ablauf sollte wie gehabt sein: links, mitte, rechts, mitte, links, ...
Ablauf IST:
SEKUNDE 0: Servo dreht ca 2 mm nach links
SEKUNDE 10: nichts passiert
SEKUNDE 20: nichts passiert
SEKUNDE 30: Servo dreht nach links bis zum Anschlag und zittert dort
SEKUNDE 40 - ca 180: Servo hört bei Sekunde 40 wieder auf zu zittern, dreht sich aber nicht weiter in irgend eine Richtung. Nachdem hier 150 Sekunden lang nichts passierte, habe ich den Test an dieser Stelle wieder abgebrochen.
Ich tippe mal auf einen Software-Fehler, daher hier der "komplette" Code:
(Codeteile die nur LEDs blinken lassen hab ich hier mal der Übersichtlichkeit wegen entfernt, diese Spielen aber lediglich auf Port D, berühren den Servo an Port B also garnicht.)
Code:
#include <avr/io.h>
#include <util/delay.h>
#define SERVO_2 PB1
#define SERVO_3 PB2
#define LEDRED PD6
#define LEDGREEN PD7
void init_portB(void)
{
//PORT B enthält: ISP-Anschluss + Servos
//PB0 =
//PB1 =
//PB2 = SERVO 2
//PB3 = SERVO 3
//PB4
//PB5 = MOSI für ISP (kann zusätzlich belegt werden)
//PB6 = MISO für ISP (kann zusätzlich belegt werden)
//PB7 = SCK für ISP (kann zusätzlich belegt werden)
DDRB |= (1<<SERVO_2) | (1<<SERVO_3); //setzt die LED-Pins auf Ausgang
PORTB |= (0<<SERVO_2) | (0<<SERVO_3); //setzt die LEDs auf OFF (low)
}
void init_AllPorts(void)
{
//init_portA();
init_portB();
//init_portC();
//init_portD();
}
void servo2mitte()
{
for(int i=0; i<500; i++)
{
PORTB |= (1<<PB2);
_delay_us( 1500 ); // in den 1500 steckt die Lageinformation
PORTB &= ~(1<<PB2);
_delay_ms( 18 ); // ist nicht kritisch
}
}
void servo2left()
{
for(int i=0; i<500; i++)
{
PORTB |= (1<<PB2);
_delay_us( 2000 ); // in den 1500 steckt die Lageinformation
PORTB &= ~(1<<PB2);
_delay_ms( 18 ); // ist nicht kritisch
}
}
void servo2right()
{
for(int i=0; i<500; i++)
{
PORTB |= (1<<PB2);
_delay_us( 1000 ); // in den 1500 steckt die Lageinformation
PORTB &= ~(1<<PB2);
_delay_ms( 19 ); // ist nicht kritisch
}
}
int main(void)
{
init_AllPorts();
while(1)
{
servo2left();
servo2mitte();
servo2right();
servo2mitte();
}
}
Lesezeichen