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
> 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.
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
> (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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.