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ß
Lesezeichen