Forum: Mikrocontroller und Digitale Elektronik Servo-Steuerung ATMega8: Geht - ist sie gut?


von M.Pietsch (Gast)


Lesenswert?

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

von petersch (Gast)


Lesenswert?

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.

von Achim Walther (Gast)


Lesenswert?

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.

von Markus (Gast)


Lesenswert?

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?

von Ludwig W. (lordludwig)


Lesenswert?

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

von Axel Rühl (Gast)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

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

von Axel R. (Gast)


Lesenswert?

aahja!
Danke für den Tip..

von Markus (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Ludwig W. (lordludwig)


Lesenswert?

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
Noch kein Account? Hier anmelden.