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 Macianer - 25.02.2009 17:02)
Als Antwort auf Re: Wie Servo (Modellbau) mit PWM ansteuern? von UlliS - 25.02.2009 15:50
Ich nutze:
C-Control Pro Mega32, CC-Pro 32 Application Board
Hallo,

den Servomotor solltet ihr noch mit einer Freilaufdiode schützen!
Die Servo-Elektronik gibt hier sonst schnell den Geist auf!


GruÃ?
Macianer

> > 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: