PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo dreht nur in eine Richtung



Grumsch
31.10.2008, 21:07
Hallo,

erstmal wollte ich mich für die tolle Arbeit hier bedanken, vorallem für Einsteiger.
Doch nun ist bei mir ein Problem aufgetreten beidem ich nichtmer weiter weiß.

Ich habe mir 2 Servos bei ebay gekauft, ganz nach dem Motto: ist viel hilft viel. Also 15 kg/cm 50g Digitalservos für 30€.

Sah auch alles ganz okay aus, dann habe ich sie angeschlossen und jetzt drehen sie immer nur in eine Richtung.
Ich programmiere in Bascom und habe den quellcode von dort benutzt, trotzdem sie drehen immer Schrittweise gegen den Uhrzeigersinn bis sie an den mechanischen Anschlag kommen.

habe ich in der programmierung etwas falsch gemacht? sie falsch angeschlossen?

naja, vieleicht kann mir ja ncoh geholfen werden.

mfg.

Ps. wenn ich nur den Strom anschließe ohne datenleitung dreht er jedesmal wenn man den Stromkreis schließt ein stück

williwilli
31.10.2008, 21:32
Hi,

nur einen Verdacht: Stecker verkeht herum? Dann wären Pin 1 (Signal) und 3 (GND) vertauscht, und das könnte so einen Effekt bringen...

Grumsch
31.10.2008, 21:43
Hi,

habe sie mal gedreht, dann macht der Servo garnichts

mfg

Grumsch

Bluesmash
31.10.2008, 21:59
stell mal dein programm rein vielleicht sieht man da etwas...

gruss bluesmash

Grumsch
31.10.2008, 22:01
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000

Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10

Config Portb = Output

Enable Interrupts

Servo(1) = 100
Servo(2) = 100
waitms 1000

End

Bluesmash
31.10.2008, 22:16
du gibst ja auch nur einen wert vor... dann dreh sich das servo zu diesem wert und fertig ist...

probier mal das:



$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000

dim i as byte

Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10

Config Portb = Output

Enable Interrupts

for i = 50 to 100
Servo(1) = i
Servo(2) = i
waitms 100
next

for i = 100 to 50
Servo(1) = i
Servo(2) = i
waitms 100
next

end


gruss bluesmash

radbruch
31.10.2008, 22:17
DO
Servo(1) = 100
Servo(2) = 100
waitms 1000
LOOP

Läuft der Mega32 wirklich mit 16MHz? Fuses?


Ps. wenn ich nur den Strom anschließe ohne datenleitung dreht er jedesmal wenn man den Stromkreis schließt ein stück
Das ist normal.

Grumsch
31.10.2008, 22:42
Hallo,

bei beiden Codes geschieht das gleiche, er käuft bis zum Anschlag und dreht dann dagegen.

ja Fusebits sitzen für 16mhz

@bluesmash: so war es ja auch gedacht, dass sich der Servo zu einem wert dreht und diesen dann hält, aber wie gesagt läzft er edes mal gegen den machanischen Anschlag

radbruch
31.10.2008, 22:44
Was passiert bei extremen Werten?

Servo(1) = 10
Servo(2) = 200

Oder anderen Ports/Pins?

Grumsch
31.10.2008, 22:48
dreht bis zum mechanischen Anschlag, also bei 10 und 200 auch mit gleicher Geschwindigkeit

thewulf00
01.11.2008, 11:42
Wenn der Servo beim Schließen des Stromkreises etwas zuckt, dann ist er ok.

Dann sollte es an den Timings liegen. Da er immer nur in eine Richtung dreht, liegt das daran, dass er meint, Du hast ihm gesagt, dahin zu drehen.

Also kontrollier mal die Fuses. Vielleicht gibts eine Teilerfaktorfuse, die den Takt noch teilt. Dann hast Du sofort falsche Timings und kein Servo funktioniert mehr.

Versuch auch mal einen anderen Servo anzuschließen.

Grumsch
01.11.2008, 12:17
Hi,

der 2. Servo den ich ahbe ist baugleich und macht genau das gleiche.
das zucken beim stromkreisschließen sind ca 40° gegen uhrzeigersinn.



Welches fusebit wäre es denn?

bei den Fusebits die in Bascom eingestellt sind scheinen alle richtig zu sein.

die einzigen die ich nciht verstehe sind

Fusebit High I 1: OCDEN fuse unprogrammed
P 1: osc options not programmed
FE 00:2048 Words boot sice ( wahrscheinlich die größe des boot sectors
d 1: reset vector is $0000


oder meinst du irgendwelche andren fusebits?

mfg

Grumsch

thewulf00
01.11.2008, 12:29
Also der AtMega32 scheint diese Fuse nicht zu haben, wie ich sehe. Aber vielleicht ist er noch nicht korrekt auf einen externen Quarz gefuset?

radbruch
01.11.2008, 13:07
Hallo


15 kg/cm 50g Digitalservos für 30€.
Ich habe bei digitalen Servos mal was von automatischer Nullstellungsfunktion gelesen. Allerdings habe ich damit keine eigenen Erfahrungen. Vielleicht darf man solche Servos erst mit Spannung versorgen wenn das Signal schon ansteht? (Beim RC-Model: Erst Sender dann Empfänger)

Falls das Servo den ersten Impuls als Mitte interpretieren würde könnte auch ein fehlerhafter erster Impuls zu Problemen führen. Gibt es ein Datenblatt zu den Servos?

Wenn die Servos bei 10 und 200 gleichschnell in die selbe Richtung stottern scheint mir aber eher die Impulslänge nicht zu stimmen. Diese kann man auch über Zählschleifen oder delay-Funktionen erzeugen. Das ist transparenter als der servo-Befehl von bascom. Da der delay-Befehl etwa eine ms (1000µs) verzögert scheint er für einfache Tests geeignet zu sein:


do
Portb.0=1 ' Impuls ausgeben
delay ' für ca. 1 ms
Portb.0=0 ' kein Impuls
for i=0 to 18 ' für 19ms
delay
next
loop

Allerdings würde delay bei falschen Fuses auch falsch verzögern, deshalb ein einfacher Test:


do
Portb.0=1
for i=0 to 999
delay
next
Portb.0=0
for i=0 to 999
delay
next
loop
Das sollte den Pin im Sekundentakt umschalten und kann mit Messgerät oder LED geprüft werden.

Gruß

mic

Grumsch
01.11.2008, 13:30
Hi,

mit der Schleife dreht der Servo bis zum Anschlag geht dann kurz aus, und dreht dann weiter gegen den Anschlag.

das Quarz ist richtig gefust, wenn cih in basecom mit dem waitms befehl 1 sekunde warten alsse dauert das auch eine sekunde.

könnten auch die Servos kaputt sein?

mfg

radbruch
01.11.2008, 14:58
Ich glaube nicht das gleich zwei Servos den scheinbar selben Defekt haben.

Ich hatte mal für einen 8MHz-Mega32 einen funktionierenden Code ohne Interrupt in Bascom geschrieben:

'Servo steuern mit dem RP6 6.3.2008 mic'

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

$hwstack = 32
$swstack = 8
$framesize = 8

'Dims --------------------------------------------------------------------------'

Dim Servopos1 As Byte
Dim Servopos2 As Byte
Dim Temp As Integer
Dim Stellzeit As Integer

'Ports -------------------------------------------------------------------------'

Config Porta.0 = Output
Config Porta.1 = Output


'Variablen vorbelegen ----------------------------------------------------------'

' Mitte ist ~80
Servopos1 = 10
Servopos2 = 150

'Hauptprogramm -----------------------------------------------------------------'

Disable Interrupts

Do
For Stellzeit = 0 To 100
Set Porta.0
For Temp = 1 To Servopos1
Waitus 10
Next Temp
Reset Porta.0

Set Porta.1
For Temp = 1 To Servopos2
Waitus 10
Next
Reset Porta.1

For Temp = 1 To 500
Waitus 10
Next
Next Stellzeit

If Servopos1 = 10 Then Servopos1 = 150 Else Servopos1 = 10
If Servopos2 = 45 Then Servopos2 = 125 Else Servopos2 = 45
LoopAus https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=357883#357883

Das Video dazu:
http://s1.ytimg.com/vi/lN_NalOYS_4/2.jpg (http://www.youtube.com/watch?v=lN_NalOYS_4)
http://www.youtube.com/watch?v=lN_NalOYS_4

Grumsch
01.11.2008, 15:10
hi, ich habe den code probiert nur auf 16 mhz umgestellt,

wieder das gleiche

mfg

radbruch
01.11.2008, 15:15
Ich frage nur vorsichtshalber: Du hast gesehen dass mein Programm die Ports A.0 und A.1 verwendet?

Teste mal mit verschiedenen Einstellungen für den Takt! 1Mhz, 8Mhz...

Grumsch
01.11.2008, 15:50
ja, ahbe das auf meinen atmel umgestellt.

ich ahbe eben mal schnell auf ein Streifenplatine einen Atmega32-16pu mit Sockel gelötet. als einziges ist ncoh ein Kondensator für den atmel drauf. dann die Minimalprogrammierung und wieder ganu das gleiche... ES war übrigns ein andrer Microcontroler.

hier die ebay Artikelnummer 150302675086 (weiß nciht ob man hier links posten darf)

ich werde mir wohl neue Servos bestellen, und wenn diese dann funktionieren weiß ich woran es liegt, oder fällt euch noch etwas ein?

zerush
01.11.2008, 16:41
Nur um sicher zu gehen: Du hast die Signalleitung direkt am Microcontroller ohne irgendwelchen Schnickschnack. GND vom Servo ist mit GND vom Controller verbunden?

Ein Oszilloskop hast du nicht zur Verfügung?

radbruch
01.11.2008, 16:48
Wenn waitms scheinbar richtig tickt gehen mir auch so langsam die Ideen aus. Du könntest die Servos noch an eine echte RC-Anlage anschliesen, im Modelbauladen zum Beispiel.

Links zum Thema sind natürlich erlaubt und erwünscht. Die Halbwertszeit der Zielseiten sollte, wenn möglich, nicht zu kurz sein... Offtopic und reine Abzocke allerdings nur in den endsprechenden Rubriken.

Grumsch
01.11.2008, 17:20
oh man, das ist mir jetzt peinlich...

ich hatte sie an einem Doppelnetzteil da ich dachte, dass die hohen ströme des servos sonst vieleicht den atmega beeinträchtigen... und zwischen den beiden massen hatte ich ein Kabel. das kabel ist kaputt... also hat keinen durchgang.

aufjedenfall vielen dank für eure Hilfe.

könntet ihr mir vieleicht noch verraten wie ich die internen pwm des atmega ansteuere? weil sonnst kann ja nichts paralell machen während ich den Servo ansteuere

mfg

radbruch
01.11.2008, 17:28
oh man, das ist mir jetzt peinlich...

Muss es nicht, Hauptsache Problem gelöst ;)


sonnst kann ja nichts paralell machen während ich den Servo ansteuere
Der Servo-Befehl von Bascom verwendet doch einen Interrupt und läuft im Hintergrund.

Andree-HB
01.11.2008, 17:29
....hast Du keine Billigts-Servos zum dortigen Test ?

Vielleicht muss man die Servos auch für den ersten Start etwas anders ansteuern....soetwas hatte ich mit einem Brushless-Regler, den musste man erst einstellen, bevor der normal angesteuert werden konnte.