AVR Studio und PWM Mode

OP #421801
Lesenswert?

Hey Leute,
ich hab mal versuch mich als Neuling an die AVR Programmierung zu
machen. Bevor ich mir das Dev. Board rn-controll 1.4 mit Mega32 geholt
habe, wollt ich erst Vercuhe mit AVR-Studio und den Simulator machen.
Konkret will ich R/C Servos mit dem Controller steuern. Nun einen Tag
mit der Simulation verbracht und immer wieder am PWM Mode der Timer
gescheitert. Beim runterzählen und erreichen von BOTTOM wird das TOVx
Flag nicht gesetzt. Das gleiche Programm auf dem Board ausprobiert und
hier klappt es (LED am PORTC blinken). Ist das ein Fehler im Simulator
oder hab ich was falsch gemacht.

Grüße
Robojuice
Angehängte Dateien:
OP #421803
Lesenswert?

Okay danke,
dort hab ich aber auch schon geschaut und nichts gefunden. Aber das
Problem hat sich in soweit gelöst als das ich gar nicht kontinuierlich
PWM-signale an den (Digital-!!) Servo schicken muss. D.h. ich schick 2
Pulse (mit ~20ms Abstand) die die Zielposition des Servos angeben, der
speichert sie intern (hält entsprechend auch die Position bis neue
Impulse kommen), und dann (oder auch zwischen den Impulsen) kann ich
den Controller machen lassen was ich will.
Also ist für mich das Thema Hardware PWM erstmal gestorben (das
Interrupt Handling soll sowie so recht anfällig sein.

Robojuice

P.S.:
Digitalservos von Hitec: HSR-5995 (Robot-Servo) High Torque
OP #421805
Lesenswert?

Naja,
um ne Periode (von 20ms) mit gut aufgelösten Pulsen (wenns geht 1µs)zu
bekommen und man nur einen 16 bit Timer hat, aber dann ebend 6 Servos
an einem Mega32 steuern will wird das recht schwer ohne Interrupts.
Ein Beispiel:
-8bit Timer 16Mhz f_CPU Puls generien
-Prescaler64
-Pulsebreite in das Outputcomare Register
-Timeroverflow nach 2048µs->Interrupt annehmen
-im TOVx Interrupt selben Timer auf Prescaler1024 Preload (-25)
-bei 17952µs nächster Overflow
-(dort wieder Prescaler auf 8 und Timer 0 setzen)
---> so hat man auf jeden 8bit Timer einen Hardware PWM für RCServos
mit ner Pulsbreiten-Auflösung von 4µsec und ner exakten Periode von
20ms
Moderator Persönliche Seite #421806
Lesenswert?

Ach so, darauf willst du hinaus.

Trotzdem verstehe ich deinen Aufwand nicht.  Erstens ist, soweit
ich weiß, die gesamte Periodendauer in der RC-PWM ziemlich schnuppe.
Sie soll ungefähr bei 20 ms liegen, aber die Servos speichern sich
ja den aktuellen Wert sowieso zwischen.

Ich mag dir jetzt nicht all die Arbeit abnehmen, aber folgendes
müsste doch gehen:

. CPU-Frequenz 8 MHz
. Timer 1 mit prescaler 8 -> 1 µs Auflösung
. fast PWM (mode 14) mit ICR1 als TOP, ICR1 auf 2500 gesetzt,
  ergibt einen Umlauf pro 2,5 ms; mit 6 Kanälen kommst du also
  auf 15 ms aktiven Teil, danach 2 inaktive Umläufe für die
  Synchronisation
. OCR1A kann Werte zwischen 920 und 2120 annehmen, umd die
  Pulsbreite zu steuern
. da OCR1A doppelt gepuffert ist, kann man nach dem Beginn einer
  jeden Periode bereits den Wert für die nächste Periode
  eintragen; damit braucht man natürlich Interrupts, hat aber
  vergleichsweise viel Zeit, diese zu bearbeiten (man bereitet
  während des jeweils aktiven Impulses eines Kanals bereits den
  nächsten vor)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren