Servo funktioniert nicht

Gast #2655188
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?
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
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
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.
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
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.