Hallo, ich bin gerade dabei ein Projekt mit einem XMega umzusetzen, das ganze soll 4 Servos ansteuern und 6 LEDs (teilweise per PWM). Mit Tinys und Megas hab isch schon Erfahrung (allerdings hauptsächlich mit Bascom, bin jetzt aber auf C umgestiegen). Eine suche nach der Ansteuerung von Modellbau-Servos mit einem XMega liefert irgendwie nich besonders viel, bzw. eigentlich nichts brauchbares. Wenn ich diesen Code http://www.mikrocontroller.net/articles/Modellbauservo_Ansteuerung#Signalerzeugung_f.C3.BCr_1_Servo_mittels_Timer_.28C.29 aus dem Tut "portieren" will stoße ich schon beim einstellen vom Timer an meine Grenzen. Einen CTC-Mode scheint es zumindest unter diesem Namen bei den XMegas nicht zu geben. Daher die Frage, ich kann doch nicht der erste sein der Servos mit einem XMega ansteuern will, habt ihr da vlt. etwas Code? Würd mich wirklich freuen wenn jemand etwas Code bereitstellen würde :) Gruß David
David .. schrieb: > Eine suche nach der Ansteuerung von Modellbau-Servos mit einem XMega > liefert irgendwie nich besonders viel, bzw. eigentlich nichts > brauchbares. Erstmal mußt du dir im klaren werden, was für Signale du erzeugen möchtest. Wie hoch soll die Auflösung sein, wie wichtig ist dir eine genaue Wiederholrate, brauchst du eine Einzelansteuerung oder ein Summensignal?
David .. schrieb: > Einen CTC-Mode scheint es zumindest unter diesem Namen bei den XMegas > nicht zu geben. Deswegen haben die XMega Timer das PERBUF Register, indem du TOP schreibst. Hier mal ein Beispiel für 3 CC Kanäle mit Timer C und Overflow Interrupt. Der Timer zählt bis 0xC0:
1 | static void TimersInit(void) |
2 | {
|
3 | // Set up Timer/Counter 0.
|
4 | TCC0.PERBUF = 0x00c0; // Count to 0xC0 |
5 | TCC0.CCA = 0; |
6 | TCC0.CCB = 0; |
7 | TCC0.CCC = 0; |
8 | |
9 | TCC0.CTRLB = TC_WGMODE_DS_T_gc | (0x07 << 4) ; // enable CCA,CCB,CCC |
10 | TCC0.CTRLA = ( TCC0.CTRLA & ~TC0_CLKSEL_gm ) | TC_CLKSEL_DIV4_gc; // Work from perclk / 4 |
11 | TCC0.INTCTRLA = ( TCC0.INTCTRLA & ~TC0_OVFINTLVL_gm ) | TC_OVFINTLVL_MED_gc; // Enable overflow interrupt.-- |
12 | }
|
WOW, vielen Dank Matthias. Hab den Code gleich ausprobiert, aber so wirklich verstehen tu ich das nicht was du da einstellst. Mit TCC0.CCA = 100; erhalte ich folgenden Signalverlauf: 28µs high, und 22µs low. Mit TCC0.CCA = 150; gibts folgendes: 38µs high und 12µs Aber wie bekomm ich die Schaltung dazu mir ein PWM-Signal für einen Servo auszugeben? Hier ist schön beschrieben wie das Signal aussehen muss. http://www.rn-wissen.de/index.php/Servos#Ansteuerung:_Signalform_und_Schaltung 1500µs high und ein Puls 20ms lang für Mittenstellung. Was machen denn diese Zeilen: TCC0.CTRLB = TC_WGMODE_DS_T_gc | (0x07 << 4) ; // enable CCA,CCB,CCC TCC0.CTRLA = ( TCC0.CTRLA & ~TC0_CLKSEL_gm ) | TC_CLKSEL_DIV4_gc; // Work from perclk / 4 TCC0.INTCTRLA = ( TCC0.INTCTRLA & ~TC0_OVFINTLVL_gm ) | TC_OVFINTLVL_MED_gc; // Enable overflow interrupt.-- Also nicht dass die das machen was in den Kommentaren stehen ist mir klar, aber welche Bits der Register werden damit gesetzt? Das versteh ich mit der Schreibweise einfach nicht: (0x07 << 4) Schonmal danke für die Antworten!
David .. schrieb: > Das versteh ich mit der Schreibweise einfach nicht: (0x07 << 4) Dann solltest du dich vielleicht erstmal mit ein paar Grundlagen von C vertraut machen, insbesondere mit den Operatoren und ein paar LEDs blinken lassen. http://openbook.galileocomputing.de/c_von_a_bis_z/
David .. schrieb: > Das versteh ich mit der Schreibweise einfach nicht: (0x07 << 4) Dann schau dir im Datenblatt mal Register CTRLB an. 7 6 5 4 3 2 1 0 CCDEN CCCEN CCBEN CCAEN - WGMODE[2:0] Die oberen 4 Bits geben die Compare Register frei. Leider gibt es dafür keine BM Gruppe, deswegen die andere Schreibweise. Zur Verdeutlichung mal in binär: 0b00000111 wird um 4 bits nach links geschoben, es ergibt sich 0b01110000. Das ganze verodert mit dem gewünschten WG Modus und ab ins Register. Die Grundfrequenz der PWM stellst du über das PERBUF Register ein, musst mal ein bisschen rechnen und den gewünschten Vorteiler einstellen. Bei mir ist das eine 3 Phasen PWM für einen BLDC, deswegen die hohe PWM Frequenz.
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.