//============================================ // Ovladani serva pomoci napetoveho vstupu // verze 1 // (20.3.2016) //============================================ // // // Zapojeni: //============= // ATtiny13 // +-\_/-+ // (RESET) - PB5 1| |8 Vcc // - PB3 2| |7 PB2 ADC1 - vstupni napeti pro ovladani serva // - PB4 3| |6 PB1 // GND 4| |5 PB0 ovladani ridiciho pinu serva // +-----+ // //============================================================================================================= #define F_CPU 9600000 // nastaveni vnitrni frekvence procesoru na 9.6 MHz int mikropauza; // delka trvani logicke "1" v PWM signalu do serva v mikrosekundach // cteni analogove hodnoty z nastaveneho A/D prevodniku byte adc_read (byte kanal) { ADMUX = 0b00100000 | kanal; // zakladni nastaveni A/D prevodniku - ADLAR na "1" (=nejvyssich 8 bitu je pohromade) a nastaveni prislusneho vstupu ADCSRA |= 0b01000000; // Start bit se nastavi do "1" while (ADCSRA & 0b01000000); // cekani na ukonceni prevodu (bit ADSC v registru ADSRA padne do "0") return ADCH; // V ADCH je 8 nejvyssich bitu z namerene hodnoty } void setup (void) { DDRB = 0b00000001; // nastaveni smeru signalu na portu B ("1"=vystup ; "0"=vstup) - PB0=PWM rizeni serva PORTB = 0b00000000; // PWM vystup se nastavi do "0" ADCSRA = 0b10000111; // ADC enable bit na "1" a nastaveni delice frekvence pro ADC na 1:128 (=75kHz) } void loop() { mikropauza = (adc_read(1) * 9) + 400; // vypocet mikropauzy 400 az 2695 mikrosekund pro krajni polohy //mikropauza = 3000 - mikropauza; // pripadne otoceni smeru pohybu serva PORTB |= 0b00000001; // PWM vystup na PB0 do HIGH, ostatni bity beze zmeny delayMicroseconds(mikropauza); PORTB &= 0b11111110; // PWM vystup na PB0 do LOW, ostatni bity beze zmeny delayMicroseconds(20000 - mikropauza); // pauza pro nastaveni frekvence PWM (asi 50Hz) }