Servo funktioniert nicht

Gast #2655188
Lesenswert?

Hallo zusammen

Ich will mit einem AT-MEGA8 die Ansteuerung eines Servos testen. Dazu 
habe ich folgenden Code geschrieben/abkopiert:
1
#define F_CPU 1000000UL
2
 
3
#include <avr/io.h>
4
#include <util/delay.h>
5
 
6
int main (void)
7
{
8
  DDRB = (1<<PB1);
9
  _delay_ms(3000);
10
  while( 1 ) {
11
 
12
    PORTB |= (1<<PB1);
13
    _delay_us( 1500 );
14
    PORTB &= ~(1<<PB1);
15
 
16
    _delay_ms( 18 );
17
  }
18
 
19
  return 0;
20
}

Doch die Servos verhalten sich nicht richtig. entweder bewegen sie sich 
ein bisschen irgendwo hin, mal hier, mal da, oder auch gar nicht.
An was könnte das liegen?
#2655273
Lesenswert?

Könnte mir höchstens vorstellen, dass du die FUSES anders gesetzt hast, 
sodass dein Atmega z.B. auf 8MHz lauft (also CKDIV8 aus) anstatt mit 1 
MHz wie F_CPU sagt. Dann wäre dein _delay_us( 1500 ); natürlich 
schneller als du denkst, was die Servos halt falsch interpretieren.
oder eben ein Problem in der Beschaltung (wenn das dein ganzes Prog 
ist). Kann natürlich auch sein, dass deine Spannung zusammenbricht (z.B. 
wenn du Servo und Atmega über einen Regler laufen lässt, der nicht so 
viel Strom schafft, oder schlecht abgeblockt ist.
Gast #2655373
Lesenswert?

Hinweis zur Fehlersuche:
Lass eine LED im Sekundentakt blinken. Dann weisst du, dass du die 
richtige CPU-Frequenz gewählt hast.
Ansonsten:
Servos über Delay zu steuern gehört verboten und alle, die das trotzdem 
verbreiten ausgepeitscht.
Gast #2655477
Lesenswert?

EGS_TI schrieb:
> Das soll ja nur ein kleiner Funktionstest sein, so wie ich das
> verstanden habe...

Ein Servo anzusteuern ist ein etwas aufwändiger Funktionstest...

Da sollte man erst eine LED blinken lassen.
Wenn man das hinbekommen hat, kann sollte man auch eine 
Servo-Tester-Funktion hinbekommen.
#2655485
Lesenswert?

STK500-Besitzer schrieb:
> EGS_TI schrieb:
>> Das soll ja nur ein kleiner Funktionstest sein, so wie ich das
>> verstanden habe...
>
> Ein Servo anzusteuern ist ein etwas aufwändiger Funktionstest...

Der Aufwand ist doch exakt der gleiche.

> Da sollte man erst eine LED blinken lassen.

Der Vorteil der LED wäre (sofern man kein Oszi hat) eher, daß man sehen 
kann, was mit dem Signal passiert. Beim Servo sieht man nur, daß es 
nicht tut.
Gast #2655570
Lesenswert?

Rolf Magnus schrieb:
> Der Vorteil der LED wäre (sofern man kein Oszi hat) eher, daß man sehen
> kann, was mit dem Signal passiert. Beim Servo sieht man nur, daß es
> nicht tut.

Wobei die Fehlerquellen bei der LED wesentlich einfacher einzugrenzen 
sind als beim Servo.
Um die Funktion der LED zu testen brauche ich nur einen Stromkreis 
aufbauen.
Fürs Servo braucht es den Stromkreis und eine PWM-Quelle.

Um die Funktion des Controllers zu überprüfen ist die LED-Version wohl 
doch mit etwas weniger Aufwand verbunden, oder?
Gast #2655577
Lesenswert?

Bitte nicht gleich die Köpfe einschlagen.
Es geht darum zu testen, ob ich es schaffe ein Servon anzusteuern. Bevor 
ich ein aufwändiges Programm schreibe möchte ich mal einfach versuchen, 
das Servo zum laufen zu bringen.
Mit dem Board habe ich schon anderes gemacht, auch LED's blinken lassen.

Ich habe mit AVR-Studio mal die Fuses gelesen und es steht 1 Mhz.

Solange das Servo angeschlossen ist, ist immer ein leichtes Rattern zu 
hören. Am Anfang des Programmes warte ich drei Sekunden. In der Zeit ist 
das Rattern nicht zu hören. Und wenn ich wieder den Reset-Taster klicke, 
dann wartet es auch wieder drei Sekunden. So kann ich ausschliessen, ass 
der Mikrocontroller während des Programmes abstürzt, denn ansonsten 
würde er ja wieder warten.
Oder können Spannungsschwankungen und so noch andere Probleme ergeben 
als einen Neustart? Müsste ich dennoch mal den Stromkreis entkoppeln?

(Übringens: Die 3 Sekunden von Restet bis zum ersten Rattern stimmen, 
das heisst der Prozessortakt muss stimmen....
Danke für die bisherigen Antworten.
Gast #2655878
Lesenswert?

Entschuldigung, dass ich etwas aus der Haut gefahren bin!

Hast du noch ein anderes Servo, dass du an dem Controller testen kannst?
Bzw. kannst du das Servo mal an einen funktionierenden Empfänger 
anschließen und überprüfen ob es funktioniert?
Gast #2655885
Lesenswert?

Alex schrieb:
>     PORTB |= (1<<PB1);
>     _delay_us( 1500 );
>     PORTB &= ~(1<<PB1);
>
>     _delay_ms( 18 );

Ich habe mein Servo so angesteuert:

1. 500us high
2. mindestens 500us low (linker Anschlag)
(3. wahlweise weitere 1000us low (500 us entsprächen der Servomitte))
4. springe zu 1.

Bei dir is das ja iwie anders, vielleicht liegts daran.
Gast #2656383
Lesenswert?

Inzwischen habe ich es mal auf einem anderen Board laufen lassen. Dieses 
ist mit 16mhz getaktet und auch mit einem ATMega8. Ich habe entsprechend 
f-cpu auch auf 16mhz im code eingestellt und da ging es.

Dann habe ich ein kleines board gelötet mit meinen ansprüchen und es 
dort wieder versucht mit einem neuen mega8. wieder das selbe... es ging 
nicht.
das servo stabilisiert sich in keiner position.
durch zufall habe ich gemerkt, dass wenn f-cpu so zwischen 20'000 und 
450'000 ist (vielleicht auch noch tiefer, nicht getestet), dass das 
servo sich dann stabil zur einen endstellung bewegt.
Allerdings ist dann die pause vor dem start viel zu kurz. die pause 
beträgt bei 1mhz f-cpu genau 3 sek wie beabsichtigt! das heisst die cpu 
stimmt.
Was könnte das für ursachen haben???? ich benutze avr-studio 5. könnte 
es sein, dass da was wegoptimiert wird oder so?ich hab keine ahnung 
mehr, was ich noch tun soll. einfach einen 16mhz quarz anzuschliessen 
kann ja keine lösung sein und hat sowieso nicht platz auf dem board.
1
#define F_CPU 1000000UL
2
 
3
#include <avr/io.h>
4
#include <util/delay.h>
5
 
6
int main (void)
7
{
8
  DDRC = (1<<PC0);
9
  _delay_ms(3000);
10
  while(1) 
11
  {
12
    PORTC |= (1<<PC0);
13
    _delay_us(1500);    // in den 1500 steckt die Lageinformation
14
    PORTC &= ~(1<<PC0);
15
    _delay_ms(18);      // ist nicht kritisch
16
  }
17
 
18
  return 0;
19
}
Gast #2657475
Lesenswert?

Alex schrieb:
> ich hab keine ahnung
> mehr, was ich noch tun soll. einfach einen 16mhz quarz anzuschliessen
> kann ja keine lösung sein und hat sowieso nicht platz auf dem board.

Benutz den Timer ohne den Delay-Kram.
Genug funktionierende Lösung gibt es hier im Forum.
So schwer ist es auch nicht, den Timer so zu konfigurieren, dass er mit 
einer Auflösung von 1µs läuft und dann Vergleichswerte (OnCapture) im 
Bereich von 1000 und 2000 vorgesetzt bekommt.
Ob die Gesamtperiodendauer 20ms oder 65ms beträgt ist für einen Test 
erst mal unerheblich.

[OT]
EGS_TI schrieb:
> Bist du auf den Kopf gefallen?

nö, aber manchmal meldet sich meine Tumor-Ansammlung...
http://de.wikipedia.org/wiki/Akustikus-Neurinom

ich hab davon gleich zwei...

[/OT}

Bis zu meinem Post war nicht bekannt, ob das Delay überhaupt richtig 
läuft. Deswegen der Vorschlag mit der LED.

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