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 15:30)
Als Antwort auf Wie Servo (Modellbau) mit PWM ansteuern? von macianer - 23.02.2009 0:42
Ich nutze:
C-Control Pro Mega32, CC-Pro 32 Application Board
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.
>
>
>


    Antwort schreiben


Antworten:

Re: Wie Servo (Modellbau) mit PWM ansteuern? (von UlliS - 25.02.2009 15:50)
    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)