Forum: Compiler & IDEs Servo funktioniert nicht


von Alex (Gast)


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?

von Timmo H. (masterfx)


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.

von STK500-Besitzer (Gast)


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.

von EGS_TI (Gast)


Lesenswert?

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

von Ralf G. (ralg)


Lesenswert?

Alex schrieb:
> An was könnte das liegen?

Plus- und Steuerleitung vertauscht?

von Rolf M. (rmagnus)


Lesenswert?

Prozessor korrekt beschaltet? Reset, Abblock-Kondensatoren u.s.w? 
Vielleicht kommt der Prozessor durch Störungen aus dem Tritt, sobald der 
Motor vom Servo anläuft.

von STK500-Besitzer (Gast)


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.

von Rolf M. (rmagnus)


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.

von STK500-Besitzer (Gast)


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?

von EGS_TI (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> Da sollte man erst eine LED blinken lassen.
> Wenn man das hinbekommen hat, kann sollte man auch eine
> Servo-Tester-Funktion hinbekommen.

Bist du auf den Kopf gefallen?
Alex schrieb:
> Ich will mit einem AT-MEGA8 die Ansteuerung eines Servos testen.

Wie soll er das durch Ansteuerung einer LED machen?

von Alex (Gast)


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.

von EGS_TI (Gast)


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?

von EGS_TI (Gast)


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.

von EGS_TI (Gast)


Lesenswert?

Aaah, vergiss was ich da geschrieben habe, ich habe das gerade mit einer 
PPM-Geschichte verwechselt. Ich glaub ich mach den PC jetzt besser 
aus... ;)

von Alex (Gast)


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
}

von Rolf M. (rmagnus)


Lesenswert?

Vielleicht Optimierungen ausgeschaltet? Bei einer Wartezeit von 3 
Sekunden spielt das keine Rolle, aber bei 1,5 ms schon.

von STK500-Besitzer (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.