mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SERVO und PWM


Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Bernd Rüter (Firma: Promaxx.net) (bigwumpus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nei Habs probiert mit 24.5 Hz  (mit warteschleifen generiert) spinnt der 
Servo

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
:-)

Autor: Michael Frangenberg (startrekmichi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Denke daran, dass die PWM im Bereich von 1ms...2ms noch wenigstens 8Bit 
Auflösung braucht, sonst kannst Du das Servo nicht ausreichend fein 
ansteuern.

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab mal das Probiert.


Da ist der Servo voll durgedreht. Das geht nur mit exakt 50Hz.
.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, 50
out ocr0, r16
ldi r16,(1<<CS01) |(1<<cs00) | (1<<WGM00) | (1<<COM01)
out tccr0, r16
s:rjmp s

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich das mit warteschleifen mache.

Dann mache ich für Mittelstellung 18ms low und 2ms high


Gruß M.H.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?
:-)

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der servo  fährt bei 1ms - 3ms immer an den rechtsanschlag.
Ja hab n Oszi

Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieses Programm fährt den servo exakt in mittelstellung:
s:
sbi portb,3
; ============================= 
;   Warteschleifen-Generator 
;     9600 Zyklen:
; ----------------------------- 
; warte 9594 Zyklen:
          ldi  R17, $0D
WGLOOP0:  ldi  R18, $F5
WGLOOP1:  dec  R18
          brne WGLOOP1
          dec  R17
          brne WGLOOP0
; ----------------------------- 
; warte 6 Zyklen:
          ldi  R17, $02
WGLOOP2:  dec  R17
          brne WGLOOP2
; ============================= 
cbi portb, 3
; ============================= 
;   Warteschleifen-Generator 
;     144000 Zyklen:
; ----------------------------- 
; warte 143994 Zyklen:
          ldi  R17, $CE
WGLOOP0s:  ldi  R18, $E8
WGLOOP1s:  dec  R18
          brne WGLOOP1s
          dec  R17
          brne WGLOOP0s
; ----------------------------- 
; warte 6 Zyklen:
          ldi  R17, $02
WGLOOP2s:  dec  R17
          brne WGLOOP2s
; ============================= 


rjmp s


Autor: M. H. (bambel2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.