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.
Code:
.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ß