Forum: Mikrocontroller und Digitale Elektronik Servos zittern in Ruhelage


von Florian S. (buddl)


Lesenswert?

Hallo

Ich hab ein Problem mit meinen beiden Servos.
Es handelt sich um 2 HiTec HS422, beide neuwertig.
Beide hängen an einem ATmega128, programmiert in BASCOM, betrieben mit 
6V.

Um das Tastverhältnis kümmert sich die BASCOM-eigene Servo()-Routine. 
Generiert werden die Pulse mit einem Timer-Interrupt. Das ganze dürfte 
recht zu

Das Problem welches ich habe ist, dass zwar Richtungsanweisungen 
anstandslos und perfekt ausgeführt werden, aber der Servo dann in der 
Ruhelage anfängt zu zittern, und zwar gewaltig!

An was kann soetwas liegen?
Den Sourcecode will ich euch nicht zumuten, der stemmt locker 20k 
Zeilen. Ist aber sehr sauber geschrieben und vor allem da die 
Ansteuerung mit einem Interrupt arbeitet glaube ich kaum, dass es am 
restlichen Programm liegt.

Gibts da allgemeine Probleme an was soetwas liegen kann oder auf was ich 
mal achten sollte?

von Dr.Seltsam (Gast)


Lesenswert?

Sowas hat bei mir mal an einer hochohmigen Versorgung aus alten 
NICD-Akkus gelegen. Am Labornetzteil haben die selben Servos perfekt 
funktioniert.


Gruß
Dr.Seltsam

von Eismann (Gast)


Lesenswert?

denen is einfach nur K A L T

von bas_ratte (Gast)


Lesenswert?

Das problem hatte ich auch
das liegt an dem Reload wert.
http://bascom-forum.de/index.php?topic=71.msg953#msg953
mit dem wet klappts bei mir.

von Atmega8 A. (atmega8) Benutzerseite


Lesenswert?

Ich kenne mich mit diesen Kauf-Servos nicht aus, aber
- was liefern die als Feedback-Signal ?
- Wie wertest du das aus?
- Wie ist deine Regelung dafür?

Wenn du willst dass die den Wert 512 (von 0 bis 1023) annehmen dann 
musst du ein gewisses Spiel einbauen. Durch die eigene Masse drehen die 
sich über diese Stellung hinaus und dann dreht sich der Motor wieder 
rückwärts um auszugleichen. Im Endeffekt bekommst du dann eine 
Schwingung, wobei die Frequenz von der Masse des Motors, der 
Übersetzung, der Betriebsspannung usw. abhängt.

Wenn du jetzt die Mitte (512) willst dann sagst du dass der Motor 
stoppen soll wenn du in etwa in diesem Bereich bist.
Also: 512 +/- 10
Intelligenter ist es das PWM- Ansteuerungssignal kurz vorher zu 
verkleiner, schon kurz vor 512 bei einer Pulslänge von NULL zu sein.

Wenn der Motor durch seine eigene Trägheit noch etwas weiter läuft und 
dann zum halten kommt ist das recht genau bei 512.
Der Vorteil: Du erreichst die 512 schneller

von Karl H. (kbuchegg)


Lesenswert?

Atmega8 Atmega8 wrote:
> Ich kenne mich mit diesen Kauf-Servos nicht aus,

dann solltest du eine Antwort sein lassen.
Alle deine Punkte sind völlig irrelevant, da ein
Servo eine komplette Regelelektronik mit im Gehäuse
hat. Du schickst ihm lediglich einen regelmässigen
Puls wobei die Pulsbreite der gewünschten Servoposition
entspricht. Alles andere macht die Elektronik im Servo.

von egal (Gast)


Lesenswert?

so, jetzt könnt ihr euch wegen der definition "servo" streiten!

von 1328 (Gast)


Lesenswert?

Normale Servos schnattern wenn man ihnen ein konstantes Drehmoment 
abverlangt.  Falls das Servo konstante Kraft liefern muss und nicht 
schnattern darf, so ist ein Digitalservo einzusetzen.
Falls die Pulse jittern, dh nicht konstante Laenge haben schnattert das 
Servo auch.

von Rahul D. (rahul)


Lesenswert?

>Den Sourcecode will ich euch nicht zumuten, der stemmt locker 20k
>Zeilen.

Daran wird es aber vermutlich liegen...

von Florian S. (buddl)


Lesenswert?

Danke für eure Hilfe, hier noch ein paar weitere Infos:

- Die gesamte Schaltung wird an einem geregelten Labornetzteil 
betrieben. Störeinflüsse, Oberschwingungen, etc. sind also 
auszuschließen.

- Die Servos haben noch keine Last, die sie bewegen sollen

- @bas_ratte
Hab mir das angeschaut, habe den gleichen Relaodwert, meine 
Initialisierung sieht wie folgt aus:
1
'Initialisierungsroutine für die Servos
2
Config Servos = 2 , Servo1 = Portb.7 , Servo2 = Portb.4 , Reload = 10 , Timer = Timer0
3
Config Portb.7 = Output
4
Config Portb.4 = Output
5
6
'Die Ansteuerung erfolgt dann so:
7
Servo(1) = 100
8
Servo(2) = 100


- @ Atmega8 Atmega8
Ich kann bei den Servos kein Toleranzfeld definieren. Ihnen wird nur ein 
Wert zugewiesen, alles andere übernehmen sie selbstständig.


Es kann doch nicht sein, dass die Servos ständig zittern? Digitale mögen 
von Vorteil sein aber das muss mit denen doch auch gehen.

von Uhu U. (uhu)


Lesenswert?

> Den Sourcecode will ich euch nicht zumuten, der stemmt locker 20k
> Zeilen.

Besteht etwa damit ein Zusammenhang?

Sperrst du womöglich irgendwo die Interrupts?

Gibt es noch weitere Interruptroutinen, die den Prozessor bei gesperrten 
Interrupts belasten?

Kannst du versuchen heauszubekommen, ob auf dem PWM-Signal ein Jitter 
ist?

> Ist aber sehr sauber geschrieben und vor allem da die
> Ansteuerung mit einem Interrupt arbeitet glaube ich kaum, dass es am
> restlichen Programm liegt.

Glauben heißt "nicht wissen".

von bas_ratte (Gast)


Lesenswert?

Enable Interrupts
ja das könnte sein.

von Florian S. (buddl)


Lesenswert?

sorry das Enable Interrupts ist im Code drin, hab ich nur hier vergessen 
reinzuposten.

Ich sperre die Interupts an keiner Stelle, auch gibt es bis auf 2 
PWM-Signale (laufen mit Timer1) keine anderen Interruptsroutinen im 
gesamten Programm und die Timer werden an keiner Stelle umkonfiguriert.


Allerdings sehe ich gerade in den Specs des HS-422, dass er alle 15ms 
einen Puls braucht und nicht alle 20ms? Oder liege ich da falsch?

http://www.hitecrcd.com/product_file/file/49/hs422.pdf


Wie mache ich das Bascom klar? Der Relaodwert 10 steht ja für 20ms. Aber 
welcher wert steht dann für 15ms? Wie ist da der Zusammenhang?

EDIT: Dreher reingebracht und verbessert

von Uhu U. (uhu)


Lesenswert?

> Allerdings sehe ich gerade in den Specs des HS-422, dass er alle 15ms
> einen Puls braucht und nicht alle 20ms? Oder liege ich da falsch?

Also ich sehe im Datenblatt nur was von

   PULSE WIDTH CONTROL 1500usec NEUTRAL
und
   CLOCK WISE/PULSE TRAVELING 1500 TO 1900usec

1500 µs sind 1,5 ms, nicht 15.

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.