Kráčajúci mobilný robot
Zo stránky SensorWiki
Pohonný subsustém
Ako pohonný subsystém som zvolil modelársky servopohon, (ďalej servo) lebo je pomerne lacný a spoľahlivý. Štandardné typy poskytujú krútiaci moment okolo 30Ncm/4,8V prípadne až 40Ncm/6V Servo obsahuje jednosmerný motor prevodovku a z výstupným hriadeľom spriahnutý miniatúrny potenciometer, použitý ako senzor uhlu natočenia, pre regulačný obvod polohy. U menších a lacnejších serv je potenciometer pripojený priamo na výstupný hriadeľ. U serv vyšších kategórii je pripojený cez zvláštny prevod (tzv. nepriamy náhon), ktorý veľmi dobre chráni pred prenosom vibrácii. Požadovaná hodnota natočenia výstupneho hriadeľa je vo forme PWM signálu s úrovňou TTL (pulse wide modulation – puzne šírkova modulácia).
PWM signal je taký, ktorý ma konštantnú amplitúdu a mení sa len šírka impluzu. Na riadenie seva je potrebná perióda 20ms a šírka impluzu v rozpätí od 1 až 2 ms. Šírka impulzu 1ms zodpovedá maximálnemu ľavému natočeniu a 2 ms maximálnemu pravému natočeniu výstupneho hriadeľa. Stredná poloha hriadeľa je pri šírke impulzu 1,5 ms. Rozsah uhlu natočenia býva u väčšiny servomotorov 90°. Poloha výstupného hriadeľa je mimo tento rozsah mechanicky aretovaná v prevodovke. Prevodový pomer určuje pomer medzi rýchlosťou a ťahom serva. Bežné je, že sa serva vyrábajú vo dvojiciach, ktoré majú rovnaký motor a elektroniku, ale líšia sa prevodmi - napr. serva Hitec HS-625 a HS-645 Jedno znich ponúka vyšší krutiaci moment pri nižšej rýchlosti, druhé má zvýšenu rýchlosť na úkor momentu. Prevody sú najčastejšie plastové, pre väčšie zaťaženie a väčšiu spoľahlivosť sa používajú kovové.
Zjednodušené zapojenie vnútornej elektroniky serva je uvedené na obr. 2. Na vstup serva sa periodicky privádza riadiaci implulz, ktorý spustí monostabilný klopný obvod. Ten vygeneruje impulz o dĺžke zodpovedajúcej momentálnej polohe serva, ale opačnej polarity než je vstupný riadiaci impulz. Tieto dva impulzy sa porovnajú a výsledkom je rozdielový impulz, ktorý po zosilnení cez mostíkový snímač spôsobí roztočenie elektromotora jedným alebo druhým smerom. Elektromotor cez prevodovku otáča výstupným hriadeľom a súčasne i potenciometrom, ktorý pôsobí ako spätná väzba polohy do monostabilného klopného obvodu. Smer otáčania je taký, že impulz generovaný monostabilným klopným obvodom sa svojou dĺžkou približuje dĺžke vstupného riadiaceho impulzu, až sú obidva impulzy rovnako dlhé, elektromotor sa zastaví. Servo dosiahlo polohu, ktorá zodpovedá momentálne prijímanému riadiacemu impulzu.
Zdrojový kód:
/*
Microcontroller: ATmega32
XTAL Frequency: 12.00 MHz
program generuje fazovo frekvencne korigovany PWM signal na pinoch PD4 a PD5
vyuziva k tomu timer1 perioda PWM je 20ms (f=50Hz) definovane v registri ICR1
sirka impulzu sa meni od od zavislovi cisla v komparacnych registroch OCR1A/OCR1B
*/
#include <avr/io.h>
#define F_CPU 12E6
#include <util/delay.h>
#define Rmotor OCR1A // vyvod PD5
#define Lmotor OCR1B // vyvod PD4
void nastav_porty(void)
{
PORTA = 0b00000000; //
DDRA = 0b00000000; // "0" is input "1" is output
PORTB = 0b00000000; //
DDRB = 0b00000000; //
PORTC = 0b00000000; //
DDRC = 0b00000000; //
PORTD = 0b00000000; //
DDRD = 0b00110000; //
}
void nastav_timer1(void)
{
TCCR1A = (1<<COM1A1)|(1<<COM1B1); // piny OC1A a OC1B nastavene ako PWM out
TCCR1B = (1<<WGM13)|(1<<CS11); //fazovo a frekvencne kor.PWM; fosc/8;
ICR1H= 0x3a; //nastavenie periody PWM 20ms (50hz) 15000cyklov
ICR1L= 0x98;
}
int main(void)
{
nastav_porty();
nastav_timer1();
Rmotor=750; // sirka impulzu = 1ms
Lmotor=1500; // sirka impulzu = 2ms
while(1)
{
Rmotor=750;
Lmotor=1500;
}
return 0;
}
Priebeh vystupneho napatia na porte PD5(OCR1A)
.