Forum: Mikrocontroller und Digitale Elektronik Servo mit xMega


von David .. (david1)


Lesenswert?

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

von Michael A. (Gast)


Lesenswert?

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?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
}

von David .. (david1)


Lesenswert?

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!

von Wolfgang (Gast)


Lesenswert?

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/

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
Noch kein Account? Hier anmelden.