PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Gelöst: Servo zittert an AtMega8



DEC
21.03.2008, 03:56
Hallo,
ich habe versucht, ein Servo (Graupner C 577) mittels eines Atmega8 in Betrieb zu setzen. Das Servo stellt sich auch, aber leider zittert es dann immernoch, zieht dabei 0,5A und die Position stimmt nicht.

Geschrieben wurde das Ganze in Assember, Takt des AtMega8 ist 2MHz, verwendet wurde (noch recht umständlich) der Counter0 ohne Prescaler.
Der Zeitraum zwischen den Overflows ist also 0,128ms.

Hardwareseitig hängt die orangene PWM Leitung an PC0, das Servo hat eine eigene Batterie, welche aber mit dem GND des µCs verbunden ist.

.include "m8def.inc"

.def temp = r16
.def tan = r17
.def taus = r18





.org 0x000
rjmp main
.org OVF0addr
rjmp ovf0

main: ldi temp, Low(Ramend)
out SPL, temp
ldi temp, High(Ramend)
out SPH, temp
ldi temp, 0b00000001
out TCCR0, temp
ldi temp, 1 << TOIE0
out TIMSK, temp
ldi temp, 1
out DDRC, temp
ldi taus, 156
ldi tan, 12

sei

loop: rjmp loop

ovf0: sbic PINC, 0
rjmp vgl

cpi taus, 0
breq sein
dec taus
reti

sein: sbi PortC, 0
ldi taus, 156
dec tan
reti

vgl: cpi tan, 0
breq saus
dec tan
reti

saus: cbi PortC, 0
ldi tan, 12
dec taus
reti

Nach meinen Berechnungen sowie nach der Simulation im AVR Studio liegen die Zeiten: ca 20ms AUS - 1,5ms AN - 20ms AUS....

Aber es gibt 2 Probleme:
1. Das Servo zittert auch im eigentlichen Ruhezustand noch
2. Die Position (1,5ms AN müsste ca 50% sein) stimmt bei Weitem nicht, liegt so ungefähr bei 20%.


Danke schon Mal im Vorraus für eure Mühe.

Gruß

ACDC
21.03.2008, 08:25
Hallo,
ich habe versucht, ein Servo (Graupner C 577) mittels eines Atmega8 in Betrieb zu setzenIch meine mich aus meinen Fernsteuer-Zeiten daran zu erinnern, dass Graupner eine "negative Ansteuerung" verwendet hat, wohingegen alle anderen Hersteller (damals z.B. Multiplex) eine "positive Ansteuerung" bevorzugten.
Für Dich heißt das, mal zu versuchen, die PWM probehalber so umzuprogrammieren, dass alle Pegel, die jetzt LOW sind HIGH werden und andersrum.
Wie gesagt, ist nur eine Erinnerung, ich kann damit auch falsch liegen.

Das Zittern kann nur kommen, wenn das Servo dauernd am Positionieren bleibt, weil z.B. Dein Programm eine ständig (leicht) wechselnde PWM herausgibt. Das lässt sich am einfachsten mit einem Oszilloskop kontrollieren.

Gruß, Andreas

Ceos
21.03.2008, 11:06
ausserdem sollten zwischen 2 impulsen unbedingt 10-20ms pause sein, das ist unter garantie die ursache fürs zittern also impuls von länge 1-2ms mit abstand von 10ms, das hat bei mir das zittern behoben

DEC
21.03.2008, 13:51
Hallo,
danke schon mal für die Antworten!

Weiß jemand ob das C577 eine negative oder positive Ansteuerung hat?

Eigentlich sollte das Programm ja immer ca 1,5ms Impuls und dann wieder 20ms Pause bringen. Die Pause hatte ich auch schon mal auf 12ms verringert, das brachte keine Verbesserung. Eventuell könnte einfach der AtMega8 keine gleichmäßigen Impulse bringen aber um das zu überprüfen sollte ich n Oszi haben und das hab ich leider keines.


Gruß

DEC
21.03.2008, 15:09
Hallo,
so hab das Problem gefunden!
Ich hatte einen extremen Anfängerfehler beim setzen der Fuses gemacht, naja es waren in meinem Übersichtsblatt halt zwei Fuses verdreht. Seit dem ich die Fuses richtig gesetzt habe käuft die ganze Sache problemlos!

Das Graupne Servo C 577 besitzt allderings schon eine positive Ansteuer-Logik!!

Der oben gepostete Quelltext passt, das Servo stellst sich genau auf 50%.


Gruß

Tungsten
22.03.2008, 21:33
Hallo DEC,

kannst du noch sagen was du mit den Fuses falsch gemacht hast? Würde mich noch interessieren.

Danke Tungsten

DEC
23.03.2008, 02:23
Servus,
ja klar kein Problem!
Das ganze Projekt ist ja für einen AtMega8 @ 2MHz ausgelegt.
So hab ich in einer Zusammenfassung, die ich irgendwann einmal im Internet gefunden habe, nach den Fuse-Bits für 2MHz geschaut.
Da stand dann drin, dass man die Fuse-Bits 0; 1; 3 setzen muss.
Leider ist da dem Verfasser wohl ein Fehler unterlaufen, da man für 2MHz beim AtMega8 die Fuse-Bits 0;2;3 setzen muss.

Somit ist der AtMega wohl in irgend einem Takt gewesen der halt einfach nicht gepasst hat, zumindest wollte das Servo diesen nicht akzeptieren.


Gruß