PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega8 und Servo ansteuern



Wombatz
30.09.2011, 14:32
Hallo zusammen,

ich habe da mal wieder eine Frage. Gerade habe ich mir einen Servo gekauft und wollte ihn an meinen Atmega8 ansteuern.
Jetzt gleich zu meinem Problem. Wenn ich den Servo bewegen will ruckelt er hin und her....
Im Forum habe ich gelesen, dass man mindestens 8Mhz Crystal braucht... ist das richtig oder geht das auch mit 4Mhz???
Wenn ja kann mir einer den Grund erklären???

Ich versuche nämlich mit 4 anzusteuern....

radbruch
30.09.2011, 14:40
Hallo

Je kleiner der Kontrollertakt ist umso geringer ist die Auflösung der Servopositionen. Mit 4MHz sollte es aber grundsätzlich funktionieren. Zeig mal dein Programm bzw. deine Servoansteuerung.

Gemeinsame GND-Verbindung und ausreichend stabile Spannungsversorgung für das Servo sind natürlich auch wichtig.

Gruß

mic

Wombatz
30.09.2011, 15:05
Ich habe es mit mehrere Programmen versucht... Hier ist meine aktuelle Version


$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600


Config Timer1 = Timer , Prescale = 8 'timer für servos
Enable Timer1

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

Config Portb = Output


Dim A As Word

On Timer1 Pwm

Enable Interrupts

Timer1 = A

'***************** Hauptschleife / Servobewegung ********
Do

A = 63535

Wait 2

A = 61535

Loop
'****************** Label **********************
Pwm:

Toggle Portb.1

Return

Wombatz
30.09.2011, 15:06
mein GND ist mit GND des Boards zusammengeschaltet. Mein Netzteil versorgt beide Geräte mit Spannung... (Ca.7V und 1,5A)... sollte eigendlich reichen

radbruch
30.09.2011, 16:01
Hallo

Was soll das mit dem Timer1? Nach der Bascom-Hilfe verwendet der Servo-Befehl den Timer0. Schau dir mal den Hilfetext zu "Config Servos" an.


Do

A = 63535

Wait 2

A = 61535

Loop


A wird 63535, dann zwei Sekunden warten, dann wird A 61535 und gleich wieder 63535! Dann wieder zwei Sekunden warten... Was passiert dann mit A?

Gruß

mic

Wombatz
30.09.2011, 16:17
Du hast recht ich habe Wait 2 vergessen.... das ändert aber nichts an dem Servoverhalten.
Mit dem Timer1 kann man das wohl auch machen, das habe ich auf jeden Fall im RN-Wissen gelesen.

http://www.rn-wissen.de/index.php/Servoansteuerung

Komisch ist nur, dass der Servo in unregeläßigen Intervallen hin und her dreht

BastelWastel
30.09.2011, 16:32
Ich verstehe gerade nicht wirklich wie du mit diesem Programm ein Servosignal zu erzeugen gedenkst..
..aber das besagte ruckeln kann ich angesichts der wait 2 und waitms 500 ungeprueft glauben.

Schau erst mal hier wie das Signal ausschauen sollte..
http://www.rn-wissen.de/index.php/Servo#Ansteuerung:_Signalform_und_Schaltung

Gruss

Edit: Den Ansatz mit Timer Intterupts zu arbeiten kann ich nur befuerworten, hatte schlechte Erfahrungen mit den Bascom Servo Befehlen (seltsames Zucken)

Wombatz
30.09.2011, 16:42
Ich habe jetzt mal das Beispiel des Links genommen
$regfile = "m8def.dat" ' specify the used micro

$crystal = 3686400 ' used crystal frequency


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

Config Portb = Output

Enable Interrupts


Do
Servo(1) = 100
Servo(2) = 100
Waitms 1000
Servo(1) = 50
Servo(2) = 50
Waitms 1000
Loop

Das PWM-Signal wird erzeugt, nur der Servo dreht sich nicht. Irgendwie ist mir das nicht plausibel.
Der Timer zählt bis 256... Immer wenn er die Zahl 100 oder 50 erreicht, ändert der das Signal.
So müsste die Theorie sein.

radbruch
30.09.2011, 16:53
Grundsätzlich wichtig ist, dass der Takt auch wirklich 3686400Hz ist.

Wombatz
30.09.2011, 16:56
Das stimmt schon...alle anderen Sachen funktionieren auch... es ist ein externer Quarz. Das ist übrigends die Schaltung von Rowalt.de!
Ich habe auch gerade mal den Speaker an den Servopin angeschlossen... Insofern, konnte ich auch hören, dass das PWM erzeugt wird.
Ich versehe nur nicht, wieso der Servo nicht dreht.
Der Servo ist übrigends auch nicht defekt, da ein anderer das selbe Phänomen zeigt

radbruch
30.09.2011, 17:15
Wo soll man da suchen?
http://rowalt.de/index.htm

"Das stimmt schon...alle anderen Sachen funktionieren auch... es ist ein externer Quarz." ist ja nicht wirklich der Beweis für den richtigen Takt. Fuses sind richtig gesetzt? Was wird ausgegeben:

Do
Waitms 500
Toggle Portb.0
Loop
End

Wombatz
30.09.2011, 17:18
Ich gehe mal davon aus, dass der Code richtig ist und theoretisch funktionieren müsste.
Jetzt habe ich mal die Hardware beleuchtet und ein eigenartiges Phänomen festgestellt.
Reibe ich mit dem GND-Pin des Servos an meiner GND-Krokodilklemme, ohne den Kontakt zu verlieren, bewegt sich der Motor manchmal unkontrolliert.
Das PWM-Signal wird allerdings gleichmäßig übertragen... deswegen schließe ich einen Wackelkontakt aus. Weiterhin halte ich alle Kabel statisch. nur die beiden GND reibe ich gegeneinander.....?????.....der zweite Servo macht das gleiche

Wombatz
30.09.2011, 17:22
Ich habe fasst das gesamte Buch von Rowalt durchgelesen und ausprobiert. Alles hat geklappt. Die Fusebits sind auch richtig gesetzt.
Sonst wäre ich schon viel früher auf Probleme gestoßen.
Die Schaltung findest du auf der Rowalt Seite unter

microcontroller=> Einführung 1