Hallo, leider habe ich folgendes Problem: ich steuere über einen
AtMega328 zwei Servos an. In Nullage halten die Servos ihre Position
egal wie sehr ich auch dagegendrücke, sobald aber der eingestellte Wert
angefahren wird (dabei spielt es keine Rolle welche Gradzahl) fahren die
Servos in ihre Position entwerder ruckelfrei oder schaukeln sich kurz
auf bis sie dann am eingestellten wert stehen bleiben.Wenn ich jetzt z.B
bei 180 Grad nur minimal Druck ausübe zittern sie wie verückt bis sie
irgendwann wieder bei den 180 Grad stehen bleiben. das geht solange
weiter bis ich wieder auf Nullage fahre dann ist wieder alles ok. Zu den
Servod ich habe Analoge und Digitale versucht alle zeigen das selbe
Problem. Es kann also nicht an den Servos liegen. Die Spannung beträgt
5V bei Spannungsänderung giebt es keine Veränderung.kann es an den
Ansteuerzeiten 20µs liegen? Hier mein Code:
1
//Stellt mittels zwei Taster (Taster 1 und Taster 2) jeweils einen Servo (Servo1 oder Servo 2) an.
2
//Somit können zwei Servos unabhängig voneinander geschaltet werden. Parogramm läuft auf ATmega328 //(stand alone).
3
// Markus Radtke 14.03.2019 servo_328.ino
4
5
6
7
#include<Servo.h> // zugriff auf Servo Bibliothek
8
constintBUTTON1=2;// Pushbutton Pin auf dem Board (2)
9
constintBUTTON2=4;// Pushbutton Pin auf dem Board (4)
10
intvala=0;// speichert den Zustand des Tasters 1
11
intold_vala=0;// speichert den vorherigen wert von vala taster 1
12
intvalb=0;// speichert den Zustand des Tasters 2
13
intold_valb=0;// speichert den vorherigen wert von valb von taster 2
14
intstatea=0;// 0 = Servo Position eins 1 = Servo Position zwei
15
intstateb=0;// 0 = Servo Position eins 1 = Servo Position zwei
16
Servoservo1;// deklariert den Namen des ersten Servos
17
Servoservo2;// deklariert den Namen des zweiten Servos
18
voidsetup(){
19
pinMode(BUTTON1,INPUT_PULLUP);// Gibt an dass Buttom ein Input ist
20
pinMode(BUTTON2,INPUT_PULLUP);// Gibt an dass Buttom ein Input ist
21
servo1.attach(9);// gibt an auf welchem Pin der Servo mit dem steuerkabel anliegt
22
servo1.write(0);// gibt die Grundstellung des Servo beim start an
23
servo2.attach(10);// gibt an auf welchem Pin der Servo mit dem steuerkabel anliegt
24
servo2.write(0);// gibt die Grundstellung des Servo beim start an
25
}
26
27
voidloop()
28
{vala=digitalRead(BUTTON1);// liest den Input aus und cheked ob er gedrückt ist.
29
if((vala==LOW)&&(old_vala==HIGH)){
30
statea=1-statea;
31
delay(50);
32
}
33
valb=digitalRead(BUTTON2);// liest den Input aus und cheked ob er gedrückt ist.
Dann gehe ich davon aus, dass es nicht an deinem Programm liegt, sondern
an den Servos selbst.
Zur Probe kannst du so ein PWM Signal mal "zu Fuß" in einer
Endlosschleife erzeugen. Etwa so:
ok er fähert die Mitte an zuckt aber ungleichmäßig hin und her, wenn ich
den servohelbel etwas drücke wirds schlimmer. Er versucht aller 2Sek.
wieder seine eingestellte Pos. zu finden an was kann das liegen?
Ist deine Stromversorgung halbwegs stabil und die Masseführung korrekt?
Zeige mal ein Foto vom Aufbau, ich möchte vor allem den Verlauf der
Kabel vom Servo zum µC und zur Stromversorgung sehen.
Markus R. schrieb:> wenn ich den Wert Microsecondes auf 3000 erhöhe ist es viel besser
Das ist sicher kein gültiger Wert. Normal sind gültige Werte zwischen
1000 und 2000µs.
Könnte es eventuell sein, dass die Taktfrequenz deines Mikrocontrollers
falsch ist? Lass mal eine LED im Sekundentakt blinken und kontrolliere
mit einer Uhr, ob das wirklich 1-Sekunden Intervalle sind.
Markus R. schrieb:> kann es an den Ansteuerzeiten 20µs liegen?
Servos, bei denen irgendwo 20µs im Timing vor kommt, sind ausgesprochene
Exoten. Hast du mal in dein zugehöriges Datenblatt geguckt?
Stefanus F. schrieb:> Lass mal eine LED im Sekundentakt blinken und kontrolliere> mit einer Uhr, ob das wirklich 1-Sekunden Intervalle sind.
ja mit dem Blinksketch ist sie 1 Sek an un eine Sek. aus ürfte also
funktionieren.
Die beiden Bauteile im TO220 Gehäuse, sind das Spannungsregler? Wenn ja,
welche? Wie sind diese mit Servo und µC verbunden? Zeige deinen
Schaltplan.
Das Ding im TO92 Gehäuse, was ist das?
Was hast du da als Stromversorgung? Ein Netzteil, ein Akku? Welche
Bauart, wie viel Strom liefert das und wie viel Spannung?
Hast du Fuses des Mikrocontroller für den Quarz richtig eingestellt,
oder läuft der eventuell noch mit seinem internen R/C Oszillator auf
halber Taktfrequenz? Ich sehe keine Kondensatoren (ca. 22pF) am Quarz.
Ich sehe keine Abblock-Kondensatoren (ca. 100nF) um die Spannungsregler
und am Mikrocontroller.
> ja mit dem Blinksketch ist sie 1 Sek an un eine Sek. aus> dürfte also funktionieren.
Dann verstehe ich nicht, warum deine Servos mit 3000µs Impulsen gut
funktionieren. Zeige mal das Datenblatt der Servos.
Markus R. schrieb:> #include <Servo.h> // zugriff auf Servo Bibliothek
Du verwendest eine, wie heute in den Zeiten der
Homöopatie-Bedienungsanleitungen üblich, nur oberflächlich dokumentierte
Servo-Bibliothek.
Das erste was man also probiert: Man programmiert ein Example nach.
https://www.arduino.cc/en/Tutorial/Knob
Das zweite was man probiert: Stimmt 180 als Maximalwert oder sind es
doch bloss 179.
Das dritte:
Was soll delay(50) in einer loop nur und genau im Moment wo eine
niedergedrückte Taste erkannt wird ?
Es gehört ein delay in die loop, damit jede loop ungefähr gleich lang
und auf jeden Fall länger als die Prellzeit der Taster dauert.
Ausserdem findest du in den Servo-Beispielsprogramm zumindest ein
delay(15) nach Verändern der Servoposition.
Bau also zumindest:
1
voidloop()
2
{
3
// ja, er liest den denglischen Input (ist es nicht doch ein Taster, man sollte schreiben ob mach Masse oder plus) aus, aber einen check macht die Zeile nicht sondern erst die nächste
4
vala=digitalRead(BUTTON1);// liest den Input aus und cheked ob er gedrückt ist.
5
if((vala==LOW)&&(old_vala==HIGH))
6
{
7
statea=!statea;
8
if(statea)
9
{
10
// wie immer: Dreckskommentare die nicht zum Programm passen, solchen Unsinn einfach WEGLASSEN, ein falscher Kommentar ist schlimmer als gar keiner
11
servo1.write(180);// Stelle servo auf 150 grad
12
}
13
else
14
{
15
servo1.write(0);// stelle servo auf startposition
16
}
17
}
18
old_vala=vala;// aktueller val wird zu val alt
19
valb=digitalRead(BUTTON2);// liest den Input aus und cheked ob er gedrückt ist.
Die Servos sind von EMAX ES09MD 15 Euro/Stck. die Analogen sind SG90
Microservo von CF Sunbird (China) 10stck. 10 Euro. Die
Festspannungsregler sind L7805CV an einer 12V Gelbatterie. Unabhängig ob
ich mein Standalone Board nehme oder die Schaltung auf dem Arduino
Experimentierboard aufbaue sind immer die gleichen Symptome. am Oszi
gemessen sieht die PWM sauber aus.
Markus R. schrieb:> Festspannungsregler sind L7805CV an einer 12V Gelbatterie.
Ohne Kühlkörper können die Spannungsregler maximal 1 Watt abführen. Das
wären 7V * 150mA - viel zu wenig für Servos. Da solltest du eher zehnmal
so viel einplanen, daher wohl eher auf einen Schaltregler umsatteln oder
direkt eine 6V Batterie verwenden und den Mikrocontroller mit 3,3V
Regler betreiben.
Du hast einige meiner Fragen/Anmerkungen noch offen gelassen. Bitte gehe
auch darauf ein, damit ich Dir weiter helfen kann.
Michael B. schrieb:> Was soll delay(50) in einer loop nur und genau im Moment wo eine> niedergedrückte Taste erkannt wird ?
die bewirken eine Tasterentprellung damit das Programm wartet damit
nicht sofort wieder auf nullstellung gefahren wird wenn es mal zwei
impulse hintereinander gibt. Ist das nicht korrekt so?
Stefanus F. schrieb:> Hast du Fuses des Mikrocontroller für den Quarz richtig eingestellt,> oder läuft der eventuell noch mit seinem internen R/C Oszillator auf> halber Taktfrequenz? Ich sehe keine Kondensatoren (ca. 22pF) am Quarz.>> Ich sehe keine Abblock-Kondensatoren (ca. 100nF) um die Spannungsregler> und am Mikrocontroller.
Die von dir Beschriebenen C´s sind auf der Unterseite in SMD ausführung
Unterseite der Standaloneschaltung aber abgesehen davon funktioniert ja
nur der angefahrene Aktionsschritt nicht wenn man den Servo belastet
dann kommen ja erst die Fehler.
Markus R. schrieb:> Stefanus F. schrieb:> Hast du Fuses des Mikrocontroller für den Quarz richtig eingestellt,> oder läuft der eventuell noch mit seinem internen R/C Oszillator auf> halber Taktfrequenz? Ich sehe keine Kondensatoren (ca. 22pF) am Quarz.> Ich sehe keine Abblock-Kondensatoren (ca. 100nF) um die Spannungsregler> und am Mikrocontroller.>> Die von dir Beschriebenen C´s sind auf der Unterseite in SMD ausführung
Wie kann ich das überprüfen ob die fuses stimmen mfg
Zeigst du absichtlich maximal 50% der Platine?
Was ist das für ein Bauteil im TO92 Gehäuse?
Hast du ein Oszilloskop, um die Versorgungsspannungen zu prüfen?
Hast du die GND-Verbindungen korrigiert?
Wenn du ernsthaft Hilfe suchst, musst du und mit möglichst viele Infos
versorgen und vor allem die Rückfragen beantworten und die Vermutungen
überprüfen.
> Wie kann ich das überprüfen ob die fuses stimmen
Indem du eine LED blinken lässt. Wenn du 1s an und 1s aus programmierst,
muss sie dann in diesem Intervall blinken. Und nicht etwa halb so
schnell.
> abgesehen davon funktioniert ja nur der angefahrene> Aktionsschritt nicht wenn man den Servo belastet
Was dabei überlastet sein dürfte, habe ich bereits geschrieben.
Also wie beschrieben 1s an 1s aus. das sollte funktionieren.
Die Masse ist jetzt direkt an dem GND Pin angeschlossen.
Das Bauteil im TO92 Gehäuse ist der 78L05 für den ATMEGA328U mit SMD
Kondensatoren 100nf
Stefanus F. schrieb:> Was dabei überlastet sein dürfte, habe ich bereits geschrieben.
ja aber die Nullstellung geht ja auch unter Belastung ist der Servo
nicht von der Stelle zu bewegen
Normalerweise werden Servos mit einer PWM mit 50Hz (20ms Periode)
angesteuert. Dabei soll der Puls zwischen 1ms und 2ms lang sein. 1,5ms
ist also die Mitte. Viele Servos können noch etwas weiter drehen als
180°, und den Bereich kann man z. B. mit 0,9ms oder 2,1ms erreichen. Das
ist dann „nicht spezifiziert“.
Die 20ms Periodendauer ist nicht kritisch, du kannst gerne einfach die
Lücke immer gleich 10ms...18ms lang machen, wie im zweiten Beitrag von
Stefanus.
Markus R. schrieb:> ok Bilder kommen gleich, wenn ich den Wert Microsecondes auf 3000 erhöhe> ist es viel besser
Wenn du 3ms-Pulse sendest, fährt der Servo vermutlich kraftvoll an den
oberen Anschlag und zittert deswegen nicht.
Bei manchen Servos ist es sogar normal, dass sie zittern (aber nur
leicht). Haben deine Servos evtl. viel Spiel im Getriebe? (Kannst du
nachfühlen, wenn der Strom aus ist.) Welche Erfahrungen hast du mit
Servos?
Also servo habe ich schon einige verbaut und eingestellt aber immer im
Modell mit Graupner Ecu und Passenden Komponenten. Ich wollte nur für
ein Bastelprojekt einen Servo per Knopfdruck hin und her schalten und
dafür keine Unsummen ausgeben, deshalb die Variante mit dem AtMega zur
Stromaufnahme kann ich nichts sagen ich schalte ja ich nur fast im
Leerlauf hin und her da benötige ich keinen Kühlkörper. Die Servo sind
neu und haben kein Spiel sie sind Stromlos 360 grad drehbar. Es gibt
also keinen Anschlag da es Digitalservos sind.
Die mir bekannten 360° Servos drehen sich endlos links oder rechts
herum, wenn Impulse ungleich 1500µs sendet. Man kann sie gar nicht an
eine bestimmte Position fahren.
Wie deine Servos funktionieren und welches Signal sie erwarten, ist mir
völlig unklar.
Wie dem auch sei, die Spannungsregler sind so oder so zu schwach
dimensioniert. Ich denke, du unterschätzt die Stromaufnahme von Motoren
beim Anlaufen. Jede normale R/C Anlage liefert mindestens 2A für den
Lenkservo (und kurzfristig deutlich mehr).
Wenn du die Spannung mit einem Oszilloskop überprüfen würdest, könntest
du da ganz schnell Klarheit schaffen. Falls du dir so ein Gerät nicht
leisten kannst, google mal nach DSO-138. Das ist eher ein Spielzeug,
aber für diese Aufgabe ausreichend und in jedem Fall besser als gar
keins.
Wo die Servo's hinfahren sollen und was sie machen sollen steht ja im
Programm. Dann beantworte mir dich einfach mal die Frage warum es in der
0 Position funktioniert.
Markus R. schrieb:> Dann beantworte mir dich einfach mal die Frage warum es in der> 0 Position funktioniert.
Dazu habe ich zu wenig Infos vorliegen. Meine Vermutung bezüglich der
Stromversorgung habe ich bereits geäußert. Du hast sie noch nicht
überprüft, mach das mal. Kaufe Dir ggf. das nötige Messgerät (DSO) dazu.
Dem Quelltext von Arduino konnte ich entnehmen, dass die Werte 0 bis 180
zu Impulsen von 544µs bis 2400µs führen. Dieser Bereich entspricht nicht
dem mir normal gültigen Bereich (1000µs bis 2000µs, siehe
https://de.wikipedia.org/wiki/Servo).
Alternativ zum Winkel kannst du die Servo Funktion auch mit einer µs
Zahl aufrufen, die muss dann im Bereich zwischen 544 und 2400 liegen.
Diese min und max Werte kannst du mit einer erweiterten attach()
Funktion ändern.
Guten Morgen an alle,
heute morgen habe ich meinen obigen original Sketch nochmal hochgeladen,
und mir die Signalkurve nochmal am Oszi angesehen. Alles sah super aus
also beschloss ich anstelle des L7805 mein Labornetzteil anzuschliesen
und auf 5,5V 10A begrenzung eingestellt. Siehe da auf einmal waren ALLE!
Probleme weg!!! die Stromaufnahme liegt bei 100mA im leerlauf. Vorher am
L7805 lag diese auch bei 100mA wo kann der Fehler sich versteckt
haben??? Ich habe auch die Spannungskurve auf dem Oszi angesehen diese
schwangt mit dem L7805 um 0,5V bei belastung (Leerlauf). bringt es mir
was einen großen Cap hinter den L7805 zu schalten 4400µF? oder hat
jemand eine andere idee wie ich aus 12V eine passende
Versorgungsspannung erzeugen kann? Ich habe hier noch einen 3A
Schaltregler 10-30V Eingang ausgang 5V 3A. würde der Passen?? Oder
könnte ich zwei L7805 Parallel schalten?
Markus R. schrieb:> wo kann der Fehler sich versteckt habenStefanus F. schrieb:> Ich denke, du unterschätzt die Stromaufnahme von Motoren> beim Anlaufen.> bringt es mir was einen großen Cap hinter den L7805 zu schalten 4400µF?
Nein
Stefanus F. schrieb:> Da solltest du eher zehnmal> so viel einplanen, daher wohl eher auf einen Schaltregler umsatteln oder> direkt eine 6V Batterie verwenden und den Mikrocontroller mit 3,3V> Regler betreiben.
Wer Ratschläge nicht nur lesen kann, sondern es tut, ist klar im
Vorteil.
Ja bei soviel Ratschlägen ist es schwer alle auf einmal zu probieren.
Ich habe zwei 78L05 parallel geschaltet und jetzt ist alles perfekt.
Vielen Dank nochmal an alle!
Markus R. schrieb:> Ich habe zwei 78L05 parallel geschaltet und jetzt ist alles perfekt.
wird unter Belastung nicht reichen.
Der 78L05 kann nur 140mA peak.
So ein kleines Servo zieht peak auch mal 500mA.
Markus R. schrieb:> Ich habe zwei 78L05 parallel geschaltet und jetzt ist alles perfekt.
wo bitte lernt man den so einen Mist?
Viel Glück bei Deinen zukünftigen Experimenten.....
Chris
Markus R. schrieb:> Ich habe zwei 78L05 parallel geschaltet und jetzt ist alles perfekt.
Perfekt ist daran gar nichts, es sei denn Du meinst die Heizleistung
deiner Schaltung, die den Inhalt deiner Batterie zu 7/12 verheizt. Der
Einzige, der bei dieser "perfekten" Lösung glücklich wird ist dein
Akkulieferant, welcher dir einen doppelt so großen Akku als nötig
vertickern kann.
Weiter ist das Parallelschalten von Linearreglern kompletter Unfug. Wie
schon jemand anders geschrieben hat trägt immer einer der beiden Regler
die Hauptlast.
Weiterhin leben wir im Jahre 2019 wo man dein Problem mit so einem
DCDC-Wandler löst:
https://www.conrad.biz/de/gaptec-lc78-05-05-dcdc-wandler-print-12-vdc-5-vdc-500-ma-25-w-anzahl-ausgaenge-1-x-1603619.html
Hallo
"Die Stromaufnahme liegt bei 100mA im Leerlauf"
Leider ziehen E-Motoren beim anlaufen und Blockieren einen deutlich
höheren Strom als den Nennstrom und natürlich auch mehr als der
Leerlaufstrom (Der mir recht hoch vorkommt).
Ansonsten das beachten was in den letzten vier Beiträgen, teilweise
leider recht frech formuliert, geschrieben wurde.
Die Zeiten wo es "nur" Linearregler vom Typ 78(L)XX gab und die für
alles gut waren sind zum Glück schon lange vorbei, und um aus diesen
mehr Leistung heraus zu holen muss man ganz anders vorgehen (siehe die
diversen Datenblätter).
Irgendwie habe ich das Gefühl als wenn man die Leistungsaufnahme deiner
Schaltung noch deutlich optimieren könnte - falls über Akkus betrieben
würde ich mich darüber informieren...
Jemand