Servo und ATTiny Frequenz

#6865912
Lesenswert?

Liebe alle,

dies sind wohl mehrere Fragen in einer und ich hoffe, hier einen 
Lösungsansatz zu bekommen. Ich verwende ein Standard-Modellbauservo 
(Reely, maximal 32 Ncm) um ein Zahnrad zu drehen. Hierfür verwende ich 
einen ATTiny84. Servo und ATTiny werden aus gleicher Spannungsquelle 
(aktuell Labornetzteil) betrieben, zur Glättung habe ich einen 470 µF 
Elko eingefügt. Mit der Arduino IDE habe ich unter den Beispielen bei 
Servo das Programm "Sweep" hochgeladen, welches von 0 bis 180 Grad 
durchfährt. Ich beobachte nun zwei Dinge:
1) Der Servo läuft ruckelig, teilweise mittendrin auch kurz rückwärts 
(!)
2) Der Servo zieht auch ohne Last bei diesem Programm sehr viel Strom 
(>1,5A, Strombegrenzung des Labornetzteils blinkt kurzzeitig)

Ich bin unsicher, ob beides zusammenhängt, könnte mir aber vorstellen, 
dass ein unsauberes PWM-Signal dazu führen könnte: Einmal ruckelt der 
Servo / läuft rückwärts, bzw. die schnellen Bewegungen führen zu einem 
hohen Strom.

Ich muss leider Servo und µC aus gleicher Quelle versorgen. Ohne es 
quantifizieren zu können hat aber (gefühlt?) eine Erhöhung der ATTiny 
Taktfrequenz von 1 MHz auf 8 MHz für Besserung gesorgt.

Hat jemand eine Idee, wie ich mehr Laufruhe bekomme und ggf. weniger 
Stromspitzen? Als Idee, was ich mich noch nicht getraut habe zu 
versuchen, ist, einen externen Quartz zu verwenden mit 20 MHz. Laut 
Datenblatt kann entweder ein "Crystal Oscillator" oder "Ceramic 
Resonator" verwendet werden - kann ich beides mit der Einstellung 
"external" verwenden? Ist es möglich, dass dies etwas bringt? Sonst? 
Noch größeren Elko? Schmidt-Trigger zwischen Servo und PWM?

Vielen Dank für euer Hilfe,
Christian
Gast #6865922
Lesenswert?

Christian S. schrieb:

> dies sind wohl mehrere Fragen in einer und ich hoffe, hier einen
> Lösungsansatz zu bekommen.

Zeig' deine Schaltung und deinen Code. Dann reden wir weiter.

> Ohne es
> quantifizieren zu können hat aber (gefühlt?) eine Erhöhung der ATTiny
> Taktfrequenz von 1 MHz auf 8 MHz für Besserung gesorgt.

Sehr wahrscheinlich eher ein Zufall. Der Tiny84 ist absolut in der Lage, 
auch bei nur 1MHz Systemtakt ein absolut sauberes Servosignal zu 
liefern. Wenn er halt richtig programmiert ist und hardwaretechnisch 
korrekt laufen kann.

> Als Idee, was ich mich noch nicht getraut habe zu
> versuchen, ist, einen externen Quartz zu verwenden mit 20 MHz.

Das löst das Problem mit Sicherheit nicht.
Gast #6865930
Lesenswert?

Zuerst brauchst du eine ausreichend starke Stromversorgung. Sie muss den 
Anlaufstrom des Servos liefern können, das ist typischerweise 5x bis 10x 
so viel wie der maximale Nennstrom.

Solange das nicht in Ordnung ist, sind alle anderen Maßnahmen sinnlos.

Christian S. schrieb:
> Laut Datenblatt kann entweder ein "Crystal Oscillator"
> oder "Ceramic Resonator" verwendet werden - kann ich
> beides mit der Einstellung "external" verwenden?

Die Frage ist zu ungenau formuliert. Nenne die exakte Kombiniation von 
Fuses als hexadezimal-Zahl, nur dann ist es eindeutig. Diese Seite 
könnte dabei hilfreich sein: https://www.engbedded.com/fusecalc/
#6865935
Lesenswert?

Sorry, wollet das Forum nicht mit Democode von Arduino zumüllen - hier 
das Beispiel-Programm "Sweep" aus der Arduino-IDE:
1
/* Sweep
2
 by BARRAGAN <http://barraganstudio.com>
3
 This example code is in the public domain.
4

5
 modified 8 Nov 2013
6
 by Scott Fitzgerald
7
 http://www.arduino.cc/en/Tutorial/Sweep
8
*/
9

10
#include <Servo.h>
11

12
Servo myservo;  // create servo object to control a servo
13
// twelve servo objects can be created on most boards
14

15
int pos = 0;    // variable to store the servo position
16

17
void setup() {
18
  myservo.attach(7);  // attaches the servo on pin 9 to the servo object
19
}
20

21
void loop() {
22
  for (pos = 0; pos <= 90; pos += 1) { // goes from 0 degrees to 90 degrees
23
    // in steps of 1 degree
24
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
25
    delay(60);                       // waits 15ms for the servo to reach the position
26
  }
27
  for (pos = 90; pos >= 0; pos -= 1) { // goes from 90 degrees to 0 degrees
28
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
29
    delay(60);                       // waits 15ms for the servo to reach the position
30
  }
31
}

Die Schaltung ist angehängt - später soll der Servo über ein MOSFET 
schaltbar sein, das ist aber aktuell noch nicht integriert - somit geht 
der Pol des Servo direkt auf GND.

Danke und Grüße
Christian
Angehängte Dateien:
Gast #6865936
Lesenswert?

Christian S. schrieb:
> später soll der Servo über ein MOSFET schaltbar sein

Wozu? Servos Motoren schalten sich von alleine in Standby wenn sie kein 
Signal mehr bekommen. Bedenke dass der Servo ohne Versorgungsspannung 
auch keine Spannung an seinem Signal-Eingang "sehen" darf (aus seiner 
Sicht!).

Ohne Pull-Down Widerstand wird Q1 beim Einschalten bis zur 
Initialisierung des I/O Pins einen zufälligen Zustand haben: an, aus 
oder auch nur halb an, mit entsprechender Wärmeentwicklung.

In deinem Code fehlt die Initialisierung on PA3 komplett. Eventuell ist 
der Transistor schon kaputt.
#6865943
Lesenswert?

Stefan ⛄ F. schrieb:
> Die Frage ist zu ungenau formuliert. Nenne die exakte Kombiniation von
> Fuses als hexadezimal-Zahl, nur dann ist es eindeutig. Diese Seite
> könnte dabei hilfreich sein: https://www.engbedded.com/fusecalc/

Danke für die Seite, kannte ich nicht! Dann Frage anders formuliert ;-): 
Ich nutze die Arduino IDE, um Fuses zu setzen - dort gibt es die 
Möglichkeit, die Clock auf 20 MHz external zu setzen. Wie finde ich 
heraus, welche Fuses in diesem Fall gesetzt werden - und dementsprechend 
auch die Schaltung, die ich benötige? Siehe angehängtes Bild...

Stefan ⛄ F. schrieb:
> Wozu? Servos Motoren schalten sich von alleine in Standby wenn sie kein
> Signal mehr bekommen. Bedenke dass der Servo ohne Versorgungsspannung
> auch keine Spannung an seinem Signal-Eingang "sehen" darf (aus seiner
> Sicht!).
>
> Ohne Pull-Down Widerstand wird Q1 beim Einschalten bis zur
> Initialisierung des I/O Pins einen zufälligen Zustand haben: an, aus
> oder auch nur halb an, mit entsprechender Wärmeentwicklung.

Ich hatte Angst vor einem Wackeln des Servos - ich wollte sichergehen 
ihn komplett abschalten zu können. Aber wahrscheinlich nicht 
notwendig... Pulldown ist natürlich richtig, der fehlt! Danke...
Angehängte Dateien:
Gast #6865946
Lesenswert?

Christian S. schrieb:
> dort gibt es die
> Möglichkeit, die Clock auf 20 MHz external zu setzen. Wie finde ich
> heraus, welche Fuses in diesem Fall gesetzt werden

Das müsste in irgendeiner Konfigurationsdatei stehen die zu deinem 
Arduino Plugin gehört. Vermutlich eine board.txt. Darin Einträge die 
"low_fuses" und "high_fuses" oder so ähnlich heissen.
Gast #6865950
Lesenswert?

Christian S. schrieb:
> Mit der Arduino IDE habe ich unter den Beispielen bei
> Servo das Programm "Sweep" hochgeladen, welches von 0 bis 180 Grad
> durchfährt.

Also weißt du gar nicht, was du da tust. Und ob ein Servo 180° kann, 
hängt vom Servo ab und nicht von der Ansteuerung.

Christian S. schrieb:
> Ist es möglich, dass dies etwas bringt?

Ja klar bringt das was. Aber dazu müsstest du wissen, was du da tust. Da 
das aber nicht der Fall ist, bringt das für dich gar nichts. Weißt du 
überhaupt, wie eine Servosteuerung funktioniert? Irgendwann müssen Maker 
auch mal was wissen.
Gast #6865955
Lesenswert?

Der Widerstand vor dem Gate sollte kleiner sein, wenn schnell geschaltet 
wird.
Vorschlag: 220 Ohm

Zum Testen die Pause zwischen den Schritten auf 1 Sekunde erhöhen.

Hast du ein Scope?
Dann mal die Schaltimpulse genauer untersuchen.
Gast #6865957
Lesenswert?

Widerstand schrieb:
> Der Widerstand vor dem Gate sollte kleiner sein, wenn schnell
> geschaltet wird.
> Vorschlag: 220 Ohm

Schnell Schalten macht an der Stelle keinen Sinn. Ganz im Gegenteil: Im 
Servo befindet sich ein IC und ein Kondensator. Ich würde da gar nicht 
schalten.

Und wenn doch, dann mit einem High-Side Switch der zugleich den 
Einschaltstrom passend zum Netzteil begrenzt. Sonst bricht die 
Versorgungsspannung bei jedem Einschalten zusammen.
#6866020
Lesenswert?

Liebe alle,

danke für die vielen Anregungen - wie oben mehrfach geschrieben habe ich 
den MOSFET noch nicht integriert (und werde es wohl auch nicht mehr 
tun). Ich werde bei einem Bekannten mal schauen, ob ich mir das 
PWM-Signal auf einem Oszi anschauen kann und dann versuchen, Servo und 
ATTiny spannungstechnisch besser zu trennen...

Viele Grüße
Christian
Gast #6866141
Lesenswert?

Stefan ⛄ F. schrieb:
In Betrieb
> halten die Servos ihre Position indem sie externen Kräften entgegen
> steuern.

Ja, und zwar mit so viel Kraft, dass sie über dem Zielpunkt 
drüberschwingen. Um anschließend wieder mit voller Kraft 
zurückzusteuern, nur um wieder drüberzuschwingen.

Wenn da genügend Masse am Servoarm hängt, ist das das Todesurteil für 
den Servo. Der zittert sich tot.
Selbst schon erlebt.

Ein stromloser Zustand verhindert das.
Gast #6866248
Lesenswert?

Du schreibst von einem Breadboardaufbau. Dann achte zumindest darauf das 
uC und Servo jeweils mit separaten Kabeln DIREKT am Netzteil 
angeschlossen sind. Der Servo wird beim Anlauf schnell viel Strom 
ziehen, und wenn die Zuleitung auch nur den Hauch eines Widerstands hat 
bricht die Spannung ein.

LG, Sebastian
#6866273
Lesenswert?

Peter D. schrieb:
> Ganz böses Foul, dem Servo den GND zu klauen. Im günstigsten Fall geht
> alles in Rauch auf.

Kannst du mir das näher erklären? Jeden Motor kann ich doch über MOSFET 
steuern - es geht ja "nur" um An/Aus (statisch), und nicht um schnelles 
Schalten. Wieso geht da was in Rauch auf? Am Ende hat ein Servo ja sehr 
viel von einem Motor gepaart mit Encoder, Kondensator und 
Steuerelektronik. Daher: Was geht wieso in Rauch auf?

Sebastian schrieb:
> Dann achte zumindest darauf das
> uC und Servo jeweils mit separaten Kabeln DIREKT am Netzteil
> angeschlossen sind.

Gute Idee, werde ich machen! Und ein Elko vorm µC schadet bestimmt auch 
nicht - aktuell nur ein kleiner 100n...
#6866291
Lesenswert?

Christian S. schrieb:
> Was geht wieso in Rauch auf?

Könnte passieren.
Der Servo wird versuchen, über den Steuereingang seinen fehlenden 
GND-Strom zu ziehen.
In der Regel betrifft das alle Leistungsteile, die Steuersignale vom und 
zum MC benötigen. Deshalb schaltet niemand diesen den GND weg!
Man kann das nur machen, wenn man die Steuersignale z.B. über 
Optokoppler galvanisch mit abtrennt.
Oder es steht explizit im Datenblatt drin, daß der Steuereingang 
mindestens 5V negativer als GND sein darf.
Gast #6866372
Lesenswert?

Seppelpeter schrieb:
> Ja, und zwar mit so viel Kraft, dass sie über dem Zielpunkt
> drüberschwingen. Um anschließend wieder mit voller Kraft
> zurückzusteuern, nur um wieder drüberzuschwingen.
> Der zittert sich tot.

Das wäre eine Fehlkonstruktion im Servo, und ein guter Grund für einen 
Umtausch.
Gast #6866386
Lesenswert?

Christian S. schrieb:
> Kannst du mir das näher erklären?

Im Servo befindet sich nicht nur ein Motor, sondern auch ein Mikrochip.

Bis auf ganz seltene Ausnahmen gilt für alle Mikrochips die regel, dass 
an keinem Pin mehr als VCC und weniger als GND anliegen darf.

Wenn du ihm die Masse weg schaltest, hast du folgende Situation:
1
                              Servo
2
         +5V o-----------------o VCC
3

4
 Arduino D7  o-----------------o Signal
5

6
                               o GND

Da der GND Pin in der Luft hängt, hat der Servo keine Stromversorgung. 
Am GND Pin wird sich annähernd die gleiche Spannung einstellen, wie am 
VCC Pin.

Das Signal muss also zwischen VCC und VCC liegen (kein Spielraum). Wenn 
der Arduino hingegen einen LOW Pegel ausgibt, ist diese Bedingung nicht 
mehr erfüllt. Aus Sicht des Servos hat das Signal dann eine negative 
Spannung von -5V! Was dann passiert, steht in den Sternen. Der Servo 
kann kaputt gehen, oder der Arduino. Oder du hast Glück dass nichts 
schlimmes passiert.

Wahrscheinlich gehen dabei mindestens die ESD Schutzdioden im Servo-Chip 
kaputt, so dass dieser bei der nächsten Elektrostatischen Entladung 
(z.B. durch Anfassen) ganz kaputt geht.
#6866457
Lesenswert?

Stefan ⛄ F. schrieb:
> Da der GND Pin in der Luft hängt, hat der Servo keine Stromversorgung.
> Am GND Pin wird sich annähernd die gleiche Spannung einstellen, wie am
> VCC Pin.

Ah, ok....das verstehe ich! Danke für die Erklärung. Heißt aber: Wenn 
ich den Servo schon schalten will, dann am Besten die 
Versorgungsspannung wegnehmen und den MOSFET in Richtung 5V schalten - 
richtig?
Gast #6866465
Lesenswert?

Christian S. schrieb:
> Heißt aber: Wenn ich den Servo schon schalten will,
> dann am Besten die Versorgungsspannung wegnehmen

Ja.

Und das Signal auf LOW halten. Denn HIGH ist in diesem Zustand aus dem 
selben Grund nicht erlaubt.

Dir wurde ein Widerstand in der Signal-Leitung empfohlen. So ein 
Widerstand wird dich davor bewahren, die Bauteile bei falscher 
Programmierung (bzw. Fehlfunktion) kaputt zu machen.

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