Forum: Compiler & IDEs AVR Studio und PWM Mode


von Ben J. (robojuice)


Angehängte Dateien:

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Ist das ein Fehler im Simulator
> oder hab ich was falsch gemacht.

Wenn's auf dem Board funktioniert und im Simulator nicht, dann
ist die Sache doch eindeutig, nicht wahr?

Es muss auch irgendwo (in der Windows-Hilfe?) ein Dokument geben,
das die "known limitations" der AVR-Studio-Simulation beschreibt.

von Ben J. (robojuice)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> (das
> Interrupt Handling soll sowie so recht anfällig sein.

So?  Was für ein interrupt handling?  Die Hardware-PWM heißt
Hardware-PWM, weil die Hardware sie macht.  Da braucht man gar
keine Interrupts (zwingend), insbesondere keine zeitkritischen.

von Ben J. (robojuice)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.