mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Servo ohne ruckeln ansteuern?


Autor: Jan Weber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl heinz Buchegger (heinzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> $crystal = 1000000

Dein Mega läuft wirklich mit 1Mhz ?

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Karl heinz Buchegger (heinzi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jan Weber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Togger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jan Weber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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>

...

Autor: AxelR. (Gast)
Datum:

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

Gruß
AxelR.

Autor: AxelR. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: karlheinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
}

Autor: Jan Weber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AxelR. (D1RTO) (Gast)
Datum:

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

schönen Gruß
AxelR. ;-))

Autor: Raimond (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Divide internally by 8 aktiviert

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

Gruß,
Raimond

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.