PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Newbee: Servo lässt sich nicht steuern...



FlashCube
30.01.2006, 14:01
Hi RN!

Ich versuche jetzt seit ein paar tagen schon ein servo mit meinem ATmega8 zu steuern...

Also, folgender Aufbau:

Ein MyAVR-Board mit ATmega8 in Bascom Programmiert.
Ein "Sanwa 1301" Servo mit externer Stromversorgung (6V).
PinB.1 ist mit der Signalleitung des Servos verbunden.

Ich habe zwei verschiedene Programme geschrieben:


$regfile = "m8def.dat"
$crystal = 1000000

Config Portb = Output
Config Servos = 1 , Servo1 = Portb.1 , Reload = 10
Enable Interrupts

Do
Servo(1) = 150
Loop

End

mit dem Code Ruckelt das Servo fast am Anschlag mit ~5Hz.

2. Versuch:


$regfile = "m8def.dat"
$crystal = 1000000

Config Portb = Output

Do
Portb.1 = 1
Waitus 1500

Portb.1 = 0
Waitms 20
Loop

End

Mit Diesem Code ruckelt das Servo nicht mehr, es fährt ganz normal bis zum Anschlag.

Das Problem ist nur, dass ich keinen einfluss auf die angefahrene position
habe wenn ich die HI-Periode zwischen 1 und 2 ms schwanken lasse.

Ich weiss wirklich nicht mehr weiter... ich habe schon versucht andere
werte für $crystal zu nehmen... aber 1000000 sollte stimmen oder?

Auch ein vorwiderstand an portb.1 hilft nichts...

Kann es am Servo liegen?

Ich bin wirklich neu auf dem Gebiet, die Lösung kann also durchaus banal sein.

danke schonmal...
FlashCube

king-sixXx
30.01.2006, 17:50
Hallo FlashCube!
Willkommen im Forum!

Wenn du deinen Servo nur um eine bestimmte Schrittzahl drehen willst musst du noch einen Zähler einbauen:


$regfile = "m8def.dat"
$crystal = 1000000
Dim A as Byte
A=1
Config Portb = Output

Do
Portb.1 = 1
Waitus 1500

Portb.1 = 0
Waitms 20
Incr A

Loop Until A = 10


End


Dein Motor sollte sich jetzt um 10 Schritte bewegen...
$crystal gibt übrigens an, wie schnell dein Quarz ist.

MFG!

king-sixXx
30.01.2006, 17:56
Wenns auch vor und zurück gehen soll, dann schau mal hier vorbei:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=733&highlight=l298

FlashCube
30.01.2006, 18:45
Hi king-sixXx,

danke für deine antworten...
ich bin ein bischen verwirrt...
Servo = Schrittmotor?
braucht ein servo nicht ein konstantes signal?
Wenn ich das mit dem Zähler mache, macht das servo zwar nur einzelne "schritte" die sind aber (wenn ich Loop until A = 2 einstelle) bestimmt 10°-15° gross...
und mit der methode kann ich doch auch garkeine servo-positionen einstellen... nur positionsänderungen...
ich dachte wie gesagt, ein servo bekommt ein konstantes positions-signal ?

FlashCube
30.01.2006, 19:51
Wie ist das eigentlich mit der Servo-schaltung?
Es sollte doch langen den Port mit dem Signal-kabel von servo zu verbinden oder?
und was hat es mit dem HI-LO-vertauschen auf sich?
muss ich jetzt 1ms HI und 20ms LO geben oder umgekehrt?

sorry für die newbee fragen!

king-sixXx
30.01.2006, 19:52
upps... nein ein servo is kein schrittmotor. sorry da bin ich aufs falsche Gleis gekommen :oops:

w_else
31.01.2006, 14:56
Hi,
Wenn das Servo, egal wo es steht, immer an den gleichen Anschlag fährt heisst das, dass die Impulslänge falsch ist (entweder zu lang oder zu kurz).
Was hast du denn für einen Quarz? Dein "$Crystal"-Eintarg wäre für einen 1MHz Quarz richtig. Es würde mich wundern, wenn du "nur" einen 1MHz Quarz drin hättest.
Der Servobefehl braucht die korrekte "$Crystal"-Angabe

Walter

Ratber
31.01.2006, 15:08
Ja,neben der korrekten Angabe des Taktes ist auch zu bemerken das er nicht zu niedrig sein sollte.

Mit 1-2 Mhz läuft es nicht.
Bei 4 Mhz gibt es leichte Abweichungen.
Mit 8 läuft er dan gut.

FlashCube
31.01.2006, 16:56
Danke für die hilfe.

aber es funzt leider immer noch nicht...

Ich habe das Fusebit auf 8Mhz und folgenden Code probiert:

$regfile = "m8def.dat"
$crystal = 8000000

Config Portb = Output
Config Servos = 1 , Servo1 = Portb.1 , Reload = 10
Enable Interrupts

Do
Servo(1) = 150
Loop

End

das servo zuckt jetzt zwar nicht mehr aber es fährt immer an den anschlag.
(habe schon werte zwischen 25 und 360 für servo(1) genommen)
das gleiche problem tritt mit dem 2. code auf.

sollte ich mal den reload wert verändern?.. auf was?

Ratber
31.01.2006, 17:16
Ja irgendwas machste da noch falsch oder dein Servo hat nen Hau wech.
Kein Ahnung.

Mein Programm läuft jedenfalls prima.

Der alte S15 läuft hier gerade mit folgendem Programm immer schön hin und her.



$regfile = "M8def.dat"
$crystal = 8000000
$baud = 19200

Config Servos = 1 , Servo1 = Portb.1 , Reload = 10

Enable Interrupts 'Ist nötig
Config Portb.1 = Output 'Servoausgang
Config Pind.6 = Input 'Taster 1
Config Pind.7 = Input 'Taster 2

Dim Ist As Byte
Dim Minimum As Byte
Dim Maximum As Byte
Dim Schrittweite As Byte
Dim Pause As Byte
Dim Z As Word

Minimum = 35 'Rechter Anschlag
Maximum = 155 'Linker Anschlag
Schrittweite = 1 'Schrittweite beim erhöhen
Pause = 25 'Verzögerungszeit in ms damits steuerbar bleibt
Ist = Minimum 'Einfach nur Definierter Startwert

Do
Do
Incr Ist
Servo(1) = Ist
Waitms Pause
Loop Until Ist = Maximum

Do
Decr Ist
Servo(1) = Ist
Waitms Pause
Loop Until Ist = Minimum
Loop

End

FlashCube
01.02.2006, 01:51
JUHU!... es geht

es lag an der externen stromquelle, wenn ich die 5V vom board abgreife gehts einwandfrei.

Ratber
01.02.2006, 10:17
.....wenn ich die 5V vom board abgreife ......


Entschuldige aber nur mal aus neugier.

Wie haste es denn vorher versucht ?

FlashCube
01.02.2006, 11:50
ich hab das servo mit einem externen netzteil betrieben...
nur die PWM-Leitung war mit dem board verbunden...
aber es sollte doch auch mit externer spannung gehen?...

w_else
01.02.2006, 12:25
.... aber die Masse musst du natürlich schon auch mit dem board verbinden!!!!!!!
Gruß
Walter

Ratber
01.02.2006, 12:39
Ja,aber "nur" die Masse sonst macht der Spannungsregler auf dem board Terror.

FlashCube
01.02.2006, 19:14
ok... jetzt läufts mit externem netzteil... danke für den support!!!

Ratber
01.02.2006, 22:03
Yo,kein Problem