Forum: Mikrocontroller und Digitale Elektronik Servo ohne ruckeln ansteuern?


von Jan Weber (Gast)


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

von Karl heinz B. (heinzi)


Lesenswert?

> $crystal = 1000000

Dein Mega läuft wirklich mit 1Mhz ?

von Rahul D. (rahul)


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).

von Karl heinz B. (heinzi)


Lesenswert?

Was mich stutzig macht ist, das auf seiner
Hardware eine programmierte Wartezeit von 0,1 sec in
der Realitaet 'ca. 1 Sekunde' dauert.
Ich denke mal seine $crystal Einstellung ist falsch.
Damit stimmt klarerweise auch das restliche Timeing nicht.

von Jan Weber (Gast)


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

von Togger (Gast)


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

von Jan Weber (Gast)


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

von Hannes L. (hannes)


Lesenswert?

Selbst in Assembler traue ich mir nicht zu, mit Warteschleifen eine
ruckelfreie Servo-Ansteuerung zu programmieren. Sowas synchronisiert
man mit Timern (auch in einer Hochsprache!).

<Eigenwerbung>
Ein ASM-Beispiel für Servoansteuerung findest du z.B. hier:
http://www.hanneslux.de/avr/7ksend/7ksend01.html
</Eigenwerbung>

...

von AxelR. (Gast)


Lesenswert?

geht waitms tatsächlich bei BASCOM auch bis 1000?!?
bei "meinem" FastAVR geht maximal "Waitms 255".

Gruß
AxelR.

von AxelR. (Gast)


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.

von karlheinz (Gast)


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
}

von Jan Weber (Gast)


Lesenswert?

Hallo,
danke für eure Antworten!
Werde das gleich mal ausprobieren.
Nur wegen Intresse:
Weiß jemand wie der Bascom Interne Servo Befehl abläuft?
MfG
Jan

von Rahul (Gast)


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.

von Frank (Gast)


Lesenswert?

Hallo!

Schau noch mal in die "Fuses" wenn der mit 8 MHz Takt läuft aber der 
Divide internally by 8 aktiviert ist gibt es auch nur Probleme.

CU Frank

von AxelR. (D1RTO) (Gast)


Lesenswert?

Den Servo wirds mittlerweile zerlegt haben (durchgeruckelt).
Wo nehmt ihr immmmmer die alten Threads her?

schönen Gruß
AxelR. ;-))

von Raimond (Gast)


Lesenswert?

>Divide internally by 8 aktiviert

kenne ich vom ATtiny2313, aber beim Mega8 konnte ich das garnicht 
finden. Hab ich was übersehen?

Gruß,
Raimond

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.