Hallo.
Habe folgendes Problem:
ich will einen Servo mit PWM ansteuern.
Dazu benötige ich ein PWM Signal mit 50Hz.
Habe mir folgende Formel ausgedacht:
Frequenz = Systemtakt / (Teiler * 510)
Habe alles versucht. Bekomme aber nie 50Hz hin. Da ich sonst Quarze mit
völlig abnormalen Frequenzen bräuchte. Hoffe ihr könnt mir helfen.
Benutze einen ATMEGA16.
P.S.: An den Externen Takteingang habe ich auch gedacht. Allerdings
bräuchte ich dann einen kleinen avr, der die Frequenz erzeugt.
Danke im Voraus.
Gruß M.H.
Wahrscheinlich sprichst Du von einem RC-Servo.
Du brauchst keinen 50Hz-Takt, es geht auch quasi jede andere Zykluszeit.
Selbst der ATMEGA16 wird doch irgendwie einen ca. 20ms-Timer
hinbekommen, um die Zykluszeit abzuwarten und dann einen passenden Puls
zu timen.
M. H. schrieb:> Nei Habs probiert mit 24.5 Hz (mit warteschleifen generiert) spinnt der> Servo
klar, die Servos wollen immer spätestens nach 20 ms einen Impuls.
Mit 24.5 Hz ist das aber nicht der Fall und das Servo weis nicht wohin.
Allerdings brauchst du hier eine PWM.
Periodendauer irgendwas zwischen 3 und 20 ms, On-Zeit zwischen 1 und 2
ms, die Onzeit betimmt dabei die Stellung des Servos.
:-)
Die Zauberabkürzung heißt CTC (siehe Datenblatt). Damit kannst du den
Timer beliebig einstellen, weil er nicht mehr bis 255/65535 zählt,
sondern bis zu einem beliebigen Wert.
Wenn du die Ansteuerung komplett in Hardware machen willst, nimm den
Timer1 im FastPWM-Modus. In OCR1A kommt der berechnete Maximalwert und
in OCR1B der Wert für die Pulslänge (du willst den Servo ja in
verschiedene Positionen fahren können). Der Servo kommt an den OC1B-Pin.
Im Betrieb musst du dann nur noch den OCR1B-Wert ändern.
Oder du stellst einen Timer per CTC auf ein Vielfaches der 50Hz ein und
zählst dann per software durch.
M. H. schrieb:> Dann mache ich für Mittelstellung 18ms low und 2ms high
Was hast du für Servos? Normal ist das nicht, außer du hast falsch
gemessen :-)
Hast du ein Oszi?
:-)
.include <m16def.inc>
.cseg
.org $00
ldi r16, low(RAMEND)
ldi r17, high(RAMEND)
out spl, r16
out sph, r17
ldi r16, (1<<3)
out ddrb, r16
ldi r16, 0
out portb, r16
ldi r16, 100
out ocr0, r16
ldi r16,(1<<CS01) |(1<<cs00) | (1<<WGM00) | (1<<COM01)
out tccr0, r16
s:
rjmp s
Das hier lässt ihn auch an einen punkt fahren. aber er zittert so und
sobald ich das Taktsignal wegnehme verstellt er sich ein bisschen.