Operácie

Kráčajúci mobilný robot

Zo stránky SensorWiki

Verzia z 17:11, 15. december 2008, ktorú vytvoril Balogh (diskusia | príspevky) (Nová stránka: == 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 mom...)
(rozdiel) ← Staršia verzia | Aktuálna úprava (rozdiel) | Novšia verzia → (rozdiel)

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.

Obr. 1. Pohľad na modelárske servo

Obr.2. Bloková schéma vnútornej elektroniky


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)







.