Servo ohne ruckeln ansteuern?

Gast #265780
Lesenswert?

Hallo,
ich habe mal mit bascom ein Servo angesteuert und festgestellt, dass
wenn es sich bewegt dies immer in Schritten von ca 10grad geschieht.

$regfile = "m8def.dat"
$crystal = 1000000
Config Servos = 1 , Servo1 = Portd.0 , Reload = 20
Config Portd = Output
Enable Interrupts
Do
Servo(1) = 20
Waitms 100
Servo(1) = 30
Waitms 100
Loop
End

Frage: Kann man mit Bascom ein Servo auch ruckelfrei ansteuern?

Waitms 100
Das heißt doch dass 100ms (also 0,1s) warten soll?
Bei mir dauert es jedoch ca 1s. Habe ich irgendwas falsch eingestellt?
Mit freundlichen Grüßen und Dank für eure Antworten
Jan Weber
#265782
Lesenswert?

So wie ich die Config-Servo-Routine von BAscom verstehe, haben deine
Servos eine Auflösung von 20µs.
Das sind 50 Schritte (1-2ms).
Das ist aber alles egal!
Dein Servo zuckt, weil du ihn dauernd zwischen zwei Endwerten hin- und
herschickst.

Hast du mal das Beispiel in der Bascom-Doku auf Seite 326 ausprobiert?
Normale RC-Servos arbeiten mit Pulsen zwischen 1 und 2ms.
Du müsstest also Werte für servo(1) = 50 oder servo(1) = 100
angeben...
Wie gut, dass ich sowas in C programmiere... Da weiß man, was man hat
(draus wird).
Gast #265784
Lesenswert?

Hallo,
danke für eure Antworten!
Ich habe mir auch schon gedacht dass es irgendwie an der taktung liegen
muss.
Der Mega 8 hat soviel ich weiß einen internen, voreingestellten 1Mhz
Oszillator.
Muss ich dann den Befehl
> $crystal = 1000000
benutzen oder einen anderen?
MfG
Jan
Gast #265785
Lesenswert?

Hi Jan,
wenn du Bascom mitteilst, dass der Chip mit 1Mhz läuft, dann muss er
auch mit 1Mhz laufen, sonst berechnet Bascom falsche Werte für die Wait
Befehle.
Klemm das AVR Studio an und kontrolliere die Fuses.
Stimmt der Wert nicht, dann setz ihn auf 1Mhz intern Oszi.
Doch Vorsicht: programmiere niemals eine externe Frequenz, wenn kein
Quarz montiert ist!!!
Dann kannst den Chip nämlich nicht mehr programmieren.

lg Ralf
Gast #265786
Lesenswert?

Hallo,
habe gerade mal eine einfache Blinkschaltung mit waitms 1000 gemacht
und dei Led Blinkt im 1Hz takt.
Also ist die tacktung richtig eingestellt.
Kann es sein dass der Befehl Servo bei 1Mhz nicht funktioniert?
Ich wede das ganze mal mit 8Mhz probieren!
MfG
Jan
Gast #265789
Lesenswert?

Achso und $Clock für 1Mhz heisst bei mir

'/////////////////////////////////////////////////////////
'///   FastAVR Basic Compiler for AVR by MICRODESIGN   ///
'///
'/////////////////////////////////////////////////////////
$Device = mega16  'used device
$Stack  = 92    'stack depth
$Clock  = 1  'adjust for used crystal
$Source = On    'basic source in Asm
$Baud   = 9600
$Timer0 = Counter, Rising, Compare= DisConnect, Clear 'zählt
Schocksensorimpulse
$Timer2 = Timer,Async,Prescale =128'128 'ext. 32.768 Crystal
$WatchDog = 2048

also "1" und nicht "1000000"... Vielleicht daher?

Aber gut, ich habe FastAVR, ist vielleicht anders hier.

AxelR.
Gast #265790
Lesenswert?

hab auch schon einiges mit servos rumgespielt...
wenn du wirklich das servo ruckelfrei betreiben willst und das bei
jedem servo(sowohl negative als auch positive impulse) , dann nimm
nicht die bascom-interne-servo-ansteuerung, sondern mach dir n
timerinterrupt von 20ms und schalt dein pin dann für 1-2ms ein... je
nach dauer hast du n anderen winkel.
wenn du kein interrupt machen willst kannst du auch einfach:

Schleife
{
waitms 19
pin5=1
waitms 2
pin5=0
}
Gast #265792
Lesenswert?

das steht im Handbuch beschrieben:
Timer 0 läuft alle paar µs (wird vom Programmierer angegeben) über
(Schrittweite), das nutzt Bascom zum herunterzählen einer Variablen
(Servo(n)) Bei Gleichstand wird der entsprechende Pin ausgeschaltet.
Ich finde die Methode doof, weil man den Timer0 nicht mehr für andere
Sachen benutzen kann.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren