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