Forum: Mikrocontroller und Digitale Elektronik Servo und ATTiny Frequenz


von Christian S. (christian_s123)


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

von Harald W. (wilhelms)


Lesenswert?

Christian S. schrieb:

> 1) Der Servo läuft ruckelig, teilweise mittendrin auch kurz rückwärts

Mit ziemlicher Sicherheit erzeugt das Servo Störungen, die Deinen µC
beeinflussen. Du musst Dich also um Entstörung kümmern. Da wir Deinen
Aufbau nicht kennen, kann man da auch nur wenig empfehlen. Ein 470µF
ist da jenfalls nicht hilfreich.

von c-hater (Gast)


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.

von Stefan F. (Gast)


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/

von Christian S. (christian_s123)


Angehängte Dateien:

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

von Stefan F. (Gast)


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.

von Christian S. (christian_s123)


Angehängte Dateien:

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

von Christian S. (christian_s123)


Lesenswert?

Stefan ⛄ F. schrieb:
> In deinem Code fehlt die Initialisierung on PA3 komplett. Eventuell ist
> der Transistor schon kaputt.

Wie geschrieben: Aktuell habe ich den MOSFET noch nicht integriert...bin 
noch am Testaufbau auf einem Breadboard, daher ist auch keine 
Initialisierung vorhanden.

von Stefan F. (Gast)


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.

von Stefan F. (Gast)


Lesenswert?

Christian S. schrieb:
> Ich hatte Angst vor einem Wackeln des Servos - ich wollte sichergehen
> ihn komplett abschalten zu können.

Damit wirst du kein "Wackeln" verhindern, ganz im Gegenteil. In Betrieb 
halten die Servos ihre Position indem sie externen Kräften entgegen 
steuern.

von Stefan F. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Vermutlich eine board.txt

Sorry: boards.txt mit "s"

von Dyson (Gast)


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.

von Widerstand (Gast)


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.

von Stefan F. (Gast)


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.

von Widerstand (Gast)


Lesenswert?

Auf
http://www.arduino.cc/en/Tutorial/Sweep
sehe ich, dass der Servo dauerhaft mit + und GND versorgt werden muss.

Das ist in deiner Schaltung nicht so.

von Christian S. (christian_s123)


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

von Wolfgang (Gast)


Lesenswert?

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

Der FET ist gar nicht drin und soll nur statische Schaltvorgänge 
ausführen.
Vergiss es also.

Christian S. schrieb:
> Wie geschrieben: Aktuell habe ich den MOSFET noch nicht integriert..

von Seppelpeter (Gast)


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.

von Peter D. (peda)


Lesenswert?

Christian S. schrieb:
> Die Schaltung ist angehängt

Ganz böses Foul, dem Servo den GND zu klauen. Im günstigsten Fall geht 
alles in Rauch auf.
Der Servo muß direkt an GND!
Ein 1k Schutzwiderstand im Signal kann nicht schaden. Er vermeidet 
Rückströme in den MC.

von Peter D. (peda)


Lesenswert?

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

Dann liegt ein Konstruktionsfehler vor. Der Servo muß bei konstanter PWM 
an der erlaubten maximalen Schwungmasse immer einschwingen.

von Sebastian (Gast)


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

von Christian S. (christian_s123)


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

von Peter D. (peda)


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.

von Stefan F. (Gast)


Lesenswert?

Christian S. schrieb:
> Ich werde bei einem Bekannten mal schauen, ob ich mir das
> PWM-Signal auf einem Oszi anschauen kann

Für solche Zwecke eignen sich auch gut die "Spielzeug" Oszilloskope 
DSO-150 für ca 30 Euro. Oder "8ch Logic Analyzer" für 10 Euro.

von Stefan F. (Gast)


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.

von Stefan F. (Gast)


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.

von Christian S. (christian_s123)


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?

von Stefan F. (Gast)


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.

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.