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
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.
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.
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/
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
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.
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...
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.
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.
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.
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.
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.
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.
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.
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
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..
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.
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.
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.
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
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...
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.
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.
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.
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.