Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Wie Servo (Modellbau) mit PWM ansteuern? Kategorie: CC-Pro Unit & Appl.Board (von UlliS - 25.02.2009 15:50)
Als Antwort auf Re: Wie Servo (Modellbau) mit PWM ansteuern? von Macianer - 25.02.2009 15:30
Ich nutze:
C-Control Pro Mega32, C-Control Pro Mega128, CC-Pro 32 Application Board, CC-Pro 128 Application Board, Pro-Bot128
> Hallo,
>
> ich habe die Lösung selbst herausgefunden.Hier die Anleitung und Source-Code dazu.
> Einfach neues Projekt in der IDE anlegen, 'Main.cc' hinzufügen und folgenden Source-Code hineinkopieren.
> Der Servo läuft zuerst in die Mittelstellung dann 90 Grad nach links und anschlie�end um 180 Grad nach rechts.
>
> Viel SpaÃ?.
> Macianer
>
> /*
>
>     SERVO ANSTEUERUNG / Pulsweitenmodulation (PWM)
>
>     //-----------------------
>     void Timer_T1PWM(word period,word PW0,byte PS);
>
>     Diese Funktion initialisiert den Timer1 mit dem angegebenen Vorteiler,
>     Pulsweite und Periodendauer, siehe Tabelle .
>     Die Ausgangssignale erscheinen an Mega32: PortD.4 (PIN18) und PortD.5 (PIN19).
>     Mega128: PortB.5 (X1_3) und PortB.6 (X1_2).
>
>
>     Periode=Period*PS/FOSC (100*64/14,7456MHz=434 µs)
>
>     Period legt die Länge des Signals fest
>     PW0 gibt an wie lange Kanal A,B high ist, rest der Periode ist low
>
>      
>        ___
>       |   |
>       |   |
>      _|   |__________________
>
>     <---Periodenlänge------->
>
>     Ã?ber den Timer Prescaler wird das Teilungsverhältnis (Oszillatorfrequenz/ps)
>     festgelegt. (14,7456MHz/ps)
>
>     'Vorteiler (prescaler)   Zeitbasis (Dauer eines Ticks)
>     'ps_1    (1)   67,8 ns
>     'ps_8    (2)  542,5 ns
>     'ps_64   (3)   4,34 µs
>     'ps_256  (4)  17,36 µs
>     'ps_1024 (5)   69,4 µs
>
>
>     --------------------------------------------------------
>     Gängige Periode Servo: 10 - 20 ms
>     Gängige Impulsbreite am Servo: 0,7 - 2,2 ms
>
>     --------------------------------------------------------
>     Beispiel am Servo: MODELCRAFT TS-11 MG DIGI LINE (Conrad)
>
>     Lagerart:   Gleitlager
>     Abm.: (L x B x H) 19 x 7.5 x 15.6 mm
>     Stecksystem: JR
>     Getriebe: Metall
>     Typ: 6
>     Stell-Zeit bei 4,8 V: 0.12 s / 50 °
>     Stell-Zeit bei 6 V: 0.10 s / 50 °
>     Stell-Moment bei 4,8 V: 10 Ncm
>     Stell-Moment bei 6 V: 12 Ncm
>     Gewicht: 5.5 g
>
>     Stromaufnahme: > 300mA
>
>     -------------------------
>     Anschluss Servo:
>
>     rot     (+)       //eigener Stromkreis (z. B. Netzgerät 4,8 - 6 V Gleichspannung)
>     braun   (-)       //ist mit Ground (GND) am Application Board zu verbinden
>     orange  (puls)    // inkl. Vorwiderstand 1k Ohm an PortD.4 (PIN18) oder PortD.5 des Application Boards verbinden
>
> */
>
> word periode;
> word maxLeftPos;
> word midPos;
> word maxRightPos;
>
> void main(void)
> {
>     Port_DataDirBit(PORT_SW1,PORT_IN);
>     Port_DataDirBit(PORT_LED1,PORT_OUT);
>     Port_DataDirBit(PORT_LED2,PORT_OUT);
>     Port_WriteBit(PORT_LED1,PORT_OFF);
>     Port_WriteBit(PORT_LED2,PORT_OFF);
>
>     // 217 * 69,4 µs = 15.06848 ms
>     periode = 217;
>
>     //7 * 69,4 µs = 0.48608 ms  (-90 Grad)
>     maxLeftPos = 7;
>
>     //19 * 69,4 µs = 1.31936 ms  (0 Grad)
>     midPos = 19;
>
>     //30 * 69,4 µs = 2.0831 ms (+90 Grad);
>     maxRightPos = 30;
>
>     //loop
>     while(1)
>     {
>         // if switch SW1 'on'
>         if( Port_ReadBit(PORT_SW1) == 0 )
>         {
>             move();
>         }
>     }
> }
>
> void move(void)
> {
>
>     //start Timer, move to mid position
>     Timer_T1PWM(periode, midPos, PS0_1024);
>     Port_WriteBit(PORT_LED1,PORT_ON);
>
>     //Short Pause
>     AbsDelay(1500);
>
>     //move to max. left position
>     Timer_T1PWA(maxLeftPos);
>     Port_WriteBit(PORT_LED1, PORT_OFF);
>
>     //Short Pause
>     AbsDelay(1500);
>
>     //move to max. right position
>     Timer_T1PWA(maxRightPos);
>     Port_WriteBit(PORT_LED2, PORT_ON);
>
>     //Short Pause
>     AbsDelay(1500);
>
>     //stop Timer (output)
>     Timer_T1Stop();
>     Port_WriteBit(PORT_LED2, PORT_OFF);
> }
>
>
>
>
>
>
>
> > Hallo,
> >
> > ich versuche einen Servo mittels Pulswellenmodulation anzusteuern.
> >
> > In der IDE-Hilfe habe ich folgendes dazu gefunden:
> > -----------------------------------------------
> > Timer0 (8 Bit):
> > Beispiel: Pulsweitenmodulation mit 138,9 µs Periode und 5,42 µs Pulsweite, geändert auf  10,84 µs Pulsweite
> > //  Puls: 10*542,5 ns = 5,42 µs, Periode: 256*542,5 ns = 138,9 µs
> >
> > Timer_T0PWM(10,PS0_8);  
> > -----------------------------------------
> >
> > Für den Servo ist eine Periode zwischen 10 - 20ms und eine Pulsweite von 1 - 2ms geforderdert.
> > Wie komme ich zu diesen Werten und wie könnte ein Beispielcode in C dafür aussehen.
> >
> > Ein anderes Beispiel hatte ich hier gefunden leider nur in Basic und ohne PWM.
> >
> >
> >

Hallo,

in der nächsten Beta hast du einen Servo Befehl!
Mega32 vorraussichtlich bis zu 4Servos.
Mega128 je nach Pulslänge bis zu 16 Servos.

Vieleicht setzt der Peter die neue Beta die Tage noch auf den Server.

Grü�e Ulli


    Antwort schreiben


Antworten:

Re: Wie Servo (Modellbau) mit PWM ansteuern? (von Macianer - 25.02.2009 17:02)
Re: Wie Servo (Modellbau) mit PWM ansteuern? (von Macianer - 25.02.2009 17:01)