Hallo zusammen, als neues Hobby habe ich mich den Mikrocontrollern zugewandt. Und natürlich muß sich da auch was bewegen, nicht nur LEDs flackern. Also habe ich folgendes geschrieben, um ein Servo zu steuern. Habe einige Beispiele gesehen, die zwei Timer/Counter verwenden und habe mir überlegt, wie man sich einen sparen kann. Funktionieren tut es, aber erstmal die Frage an die Experten: Verbesserungsvorschläge? Bei der Stromversorgung habe ich das Problem, daß mein Servo offenbar so viel Strom zieht, daß der ATMega resettet. Ich habe das Servo mit an den TS7805 gehängt, beides an ein uraltes Steckernetzteil, das 3-12 Volt bringt. Mein Elko hat 22µF. Größerer Elko oder Servo vor den 7805er? Zum Programm: Ich nutze Counter0 mit /64-Prescaler @8MHz um Signale mit 1-2 ms Länge zu produzieren. Die Zahl der dann nötigen Counter-Schritte passt schön in ein Byte: 125*1/8000*64=1ms, 250*1/8000000*64=2ms, Das anzusteuernde Servo wähle ich durch left shift aus. Danach lade ich den Timer vor und setze den Port für das Servo high. Beim nächsten Timer-Event wird der Port 0 gesetzt, dann über einen left shift das nächste Servo gewählt u.s.w. Wie könnte ich elegant Stellwerte für die Servos aus dem RAM holen? ; Servosteuerung 1 .DEF servo1 = r17; .include "m8def.inc" rjmp RESET .org 0x09 rjmp TIMER .org 0x15 RESET: ; Stackpointer initialisieren ldi r16, LOW(RAMEND) out SPL, r16 ldi r16, HIGH(RAMEND) out SPH, r16 ; Prescaler clock/64 ldi r16,0b00000011 out TCCR0,r16 ; TOIE0 setzen = Freigabe der Timers ldi r16,0b00000001 out TIMSK,r16 ; PORTB für Ausgabe konfigurieren. ldi r16,0b00111111 out DDRB,r16 ; PORTD für Eingabe konfigurieren. ldi r16,0b00000000 out DDRD,r16 sei ;interrupts enabled ldi servo1,127; Default-Stellung ; im Loop 3 Knöpfe abfragen, die wen gedrückt die Pins auf GND ziehen. loop: sbis PIND,PIND5; ldi servo1,80; sbis PIND,PIND6; ldi servo1,180; sbis PIND,PIND0; ldi servo1,0;; rjmp loop TIMER: in r19,SREG ; push r19; SREG retten ldi r19,0x00000000; out PORTB,r19; (Alles auf 0) ; Nächster Überlauf soll nach 255-[servo1] Cyclen, ; zu je 0,008 ms kommen: out TCNT0, servo1; lsl r20; ; wenn das Carry-Bit nicht gesetzt ist, 0-Setzung überspringen brhc SKIPNULLING ldi r20,0x00000001; Wenn Carry, dann waren alle 8 Servos dran SKIPNULLING: out PORTB,r20;Gewähltes Servo auf high bis nächster TIMER pop r19; out SREG, r19; RSREG wieder herstellen reti Michael
Hi, also meine Servo's hängen auch am 7805 dran mit der üblichen oder unüblichen Verdrahtung mit 100µ davor und dahinter und den 100nF Kondensatoren. Ich würde mal mit meinem Schätzeisen schätzen, daß eventuell Dein Steckernetzteil nicht genug liefert. Ich benutze meine Servos zur Steurung von Effekten bei meiner Modelleisenbahn und die Trafos dort sind reichlich dick und brechen auch nicht übermäßig ein, ist ja auch kein Wunder bei 52 Watt und 20 Volt. Aber ich hatte schon Steckernetzteil, die für meine Propelleruhr mit Lufttransformator um einiges unter Last eingebrochen sind und ich mich dann nach dem Fehler totgesucht habe. Dann habe ich mir einfach alte Laptop-Netzteile bei ebay ergattert und siehe da, es funktioniert jetzt. Geht halt nix über ein Schaltnetzteil, welches auch seine Spannung einigermaßen hält.
Hi Michael, das sieht doch schon mal gut aus. Ich beschäftige mich auch seit einiger Zeit mit der Servoansteuerung. Als Stromversorgung verwende ich immer einen Modellbau-Akku mit 4 Zellen. Wenn der mal etwas mehr als 5 Volt hat, ist der ATMega auch nicht böse. Auf diese Weise hatte ich noch nie Probleme mit der Spannung oder irgendwelchen Reglern. Aber das hängt natürlich vom Einsatzgebiet ab. In der Software verwende ich den 16-Bit Timer. Der Prescaler ist so dimensioniert, dass ein Takt genau einer Mikrosekunde entspricht. Lädt man dann 1500 in den Timer, entspricht das der Mittelstellung des Servos. Die Servowerte halte ich im RAM in einer Tabelle (Array), welche durch indirekte Addressierung mittels eines Index-Registers erreichbar sind. Die Servoleitung wird genau wie bei Dir per shift geschaltet. Kannst ja mal mein Projekt anschauen. Vielleicht findest Du in der Software ja noch Verbesserungsbedarf: http://www.voidpointer.de/servoswitch Achim.
Hi. Ich habe soeben das gleiche Problem. ATMega8515 Teilweise wenn ich meine Schaltung in betrieb nehmen hört der AVR nicht mehr auf zu resetten. Nur wenn ich kurz den Servo per Finger bewege hört das Reseten auf und die Schaltung funktioniert soweit gut. Dann nach einer Zeit fängt das Ding wieder zum resetten an. Ich habe ein Netzteil das 3 Amp liefert also daran kann es nicht liegen. Ich habe den die Impulsleitung des Servos direkt an den AVR gehängt. Ausserdem habe ich einen PNP Transistor zum testen dazwischen geschalten und es bringt mir auch nichts. Der Fehler ist immer noch da. Also seid ihr sicher das dieses Resetten dadurch zu stande kommt das der Servo offenbar zu viel Strom zieht? Wird es was bringen wenn ich zwischen µC und Servo einen Optokoppler hänge damit ich sicher gehen kann das wirklich nicht viel Strom über meinen µC fliest?
ein 1A regler reicht da meistens ned... servor ziehen zurz über 2A und das lässt sich nur mit einem dicken elko mit diode überbrücken. Dann noch n STABILISIERTES NETZTEIL drann und das sollte laufen... gute nacht
http://www.mikrocontroller.net/forum/list-1-1.html?filter=servo Ihr könnt mal nachsehen, ob es hier was gibt, was evtl. weiterhilft die eigentliche Jilfe ist ja wohl "augelagert" VlG AxelR.
http://www.mikrocontroller.net/forum/forum.php?query=%2Bmodellbau+%2Bservo&forums%5B%5D=4&forums%5B%5D=1&number=100&action=sendsearch http://www.mikrocontroller.net/forum/forum.php?query=servo&forums%5B%5D=4&forums%5B%5D=1&number=100&action=sendsearch @Axel: Die Suche geht schon, aber derzeit nur für "privilegierte" Teilnehmer... Loch dich ein, dann geht das... ;-) Gruß aus dem Westen des Ostens... ...HanneS...
Achso kurz noch mein Aufbau. Also ich habe keinen 7805. Also direkt das Netzgerät an den AVR und an den Servo angeschlossen. Und ja es ist ein Stabilisiertes Netzteil das 3A liefern kann. Ich hab mir hier bereits viele Beiträge durchgelesen (also im Forum unter Servo gesucht). Kondensator hab ich im Moment noch keinen zwischen GND und Reset Pin geschalten. Meint ihr das es das wirklich bringt? Weil ich überlege mir das so. Was bringt mir der Kondenstator dort, wenn (vielleicht) der Servo mir eventuell die ganze Spannung zammbrechen lässt. Ich denke ja nicht das sich der Ground und der Reset pin verbinden. Mit Pull up wiederstand am Reset Pin geht es auch nicht. Komisch ist nur das wenn ich die Schaltung in Betrieb hab und alles zuverlässig läuft, ich dann beim Reset pin einen Draht (am Steckbrett) einstecke fängt der an zu resetten obwohl das andere Ende des Drahtes nirgends drinnsteckt (länge ca 3cm).
Der interne Reset-PullUp ist zu hochohmig, um störungsfreien Betrieb zu gewährleisten. Deshalb haben meine AVR-Schaltungen immer einen Widerstand (3k3) von Reset nach Vcc. Dein Draht wirkt hier als Antenne. Ein befreundeter Modellbauer hat in Eigenbau-Schaltungen meist einen Widerstand von 100..220 Ohm in der Impulsleitung, ein Optokoppler muss daher nicht sein. AVRs vom Leistungs-Stromkreis zu versorgen ist keine gute Idee. Entkopple doch einfach die Betriebsspannungen von Servo und AVR. Geht (bei Netzbetrieb) am einfachsten mit getrennten Spannungsreglern. Einen 78S05 (2A) für das Servo, einen separaten 78L05 für den AVR. Vielleicht auch hinter der Graetzbrücke einen eigenen Lade-Elko (mit Diode entkoppelt) für den 78L05/AVR. Dann dürften keine Störungen mehr auftreten. ...
den elko würde ich an den SERVO bauen. Und an RESET würde ich immer einen pullup hängen sonst kakt deine ganze schaltung regeläßig ab.
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.