Re: Wie Servo (Modellbau) mit PWM ansteuern? Kategorie: CC-Pro Unit & Appl.Board (von Macianer - 25.02.2009 17:01) | ||
Als Antwort auf Re: Wie Servo (Modellbau) mit PWM ansteuern? von UlliS - 25.02.2009 15:50 | ||
| ||
> > 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 > Hallo Ulli, danke für die Info. zur Zeit arbeite ich noch ohne Beta. Hoffentlich wird daraus demnächst mal eine finale Version! | ||
Antwort schreiben Antworten: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum