This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:examples:motor:servo [2015/02/26 15:52] – raivo.sell | et:examples:motor:servo [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | < | ||
| + | ====== Servomootor ====== | ||
| + | //Vajalikud teadmised: | ||
| + | [HW] [[et: | ||
| + | [AVR] [[et: | ||
| + | [LIB] [[et: | ||
| + | |||
| + | ===== Teooria ===== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | RC (inglise keeles // | ||
| + | |||
| + | Servomootori juhtsignaaliks on spetsiifiline pulsilaiusmodulatsiooni (PWM) signaal, kus pulsi laius määrab ära rootori asendi. Signaali perioodiks on 20 ms (sagedus 50 Hz) ja kõrge poolperioodi laiuseks 1-2 ms. 1 ms tähistab rootori üht äärmist asendit ja 2 ms teist rootori äärmist asendit. 1,5 ms tähistab rootori keskasendit. | ||
| + | |||
| + | Traditsiooniline RC servomootor kannab ka analoog-servomootori nime. Põhjus on selles, et viimasel kümnendil tekkisid ka nii-öelda digitaalsed servomootorid. Nende kahe vahe seisneb selles, et analoog-servomootoris juhitakse mootorit sellesama 50 Hz PWM sisendsignaaliga, | ||
| + | |||
| + | ===== Praktika ===== | ||
| + | |||
| + | Kodulabori Kombomoodulil on kaks või neli pistikut RC servomootorite ühendamiseks. Pistikute PWM signaali otsad on ühendatud mikrokontrolleri viikudega, millel on taimeri funktsioon. Taimer on võimeline raudvaraliselt tekitama PWM signaali ja seetõttu on mootorite juhtimine programmis väga lihtne. Keerulisem on ainult taimeri seadistamine. | ||
| + | |||
| + | Taimer tuleb seadistada PWM signaali tekitamise režiimi, kus taimeri maksimaalne väärtus on määratud ICR registriga. Taimeri taktijaguri ja programmis muudetava maksimaalse väärtusega saab täpselt ära määrata servomootori juhtimiseks vajaliku PWM signaali sageduse. Taimeri võrdlusregistriga saab määrata kummagi PWM signaali kõrge poolperioodi pikkuse. Taimeritel on nimelt spetsiaalsed võrdlusüksused, | ||
| + | |||
| + | <code c> | ||
| + | // Taimeri väärtus PWM täisperioodi (20 ms) saavutamiseks | ||
| + | // F_CPU on mikrokontrolleri taktsagedus, | ||
| + | #define PWM_PERIOD | ||
| + | |||
| + | // PWM servo keskasend (1,5 ms / 20 ms) | ||
| + | // Keskasend saadakse täisperioodist 15/200 võtmisega | ||
| + | #define PWM_MIDDLE_POS | ||
| + | |||
| + | // Kordamistegur, | ||
| + | // +1 liidetakse selleks, et poolperiood kindlasti ulatuks 1 ja 2 ms | ||
| + | // piiridesse või siis natuke üle | ||
| + | #define PWM_RATIO | ||
| + | |||
| + | // Viikude seadistamine | ||
| + | static pin servo_pins[2] = | ||
| + | { | ||
| + | PIN(B, 5), PIN(B, 6) | ||
| + | }; | ||
| + | |||
| + | // Määratud servomootori algseadistamine | ||
| + | void servomotor_init(unsigned char index) | ||
| + | { | ||
| + | // PWM signaali viigu väljundiks määramine | ||
| + | pin_setup_output(servo_pins[index]); | ||
| + | |||
| + | |||
| + | // Taimer 1 seadistamine | ||
| + | // Taktijagur 8 | ||
| + | // Kiire PWM režiim kus TOP = ICR | ||
| + | // OUTA ja OUTB võrdusel madalaks | ||
| + | timer1_init_fast_pwm( | ||
| + | TIMER1_PRESCALE_8, | ||
| + | TIMER1_FAST_PWM_TOP_ICR, | ||
| + | TIMER1_FAST_PWM_OUTPUT_CLEAR_ON_MATCH, | ||
| + | TIMER1_FAST_PWM_OUTPUT_CLEAR_ON_MATCH, | ||
| + | TIMER1_FAST_PWM_OUTPUT_DISABLE); | ||
| + | |||
| + | // Perioodi määramine maksimaalse väärtuse kaudu | ||
| + | timer1_set_input_capture_value(PWM_PERIOD); | ||
| + | } | ||
| + | |||
| + | // Servomootori positsiooni määramine | ||
| + | // Positsiooni parameeter on -100 kuni 100 % | ||
| + | void servomotor_position(unsigned char index, signed short position) | ||
| + | { | ||
| + | switch (index) | ||
| + | { | ||
| + | case 0: | ||
| + | timer1_set_compare_match_unitA_value( | ||
| + | PWM_MIDDLE_POS + position * PWM_RATIO); | ||
| + | break; | ||
| + | |||
| + | case 1: | ||
| + | timer1_set_compare_match_unitB_value( | ||
| + | PWM_MIDDLE_POS + position * PWM_RATIO); | ||
| + | break; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Näiteprogramm kasutab kirjeldatud Kodulabori teegi funktsioone. Programmi alguses pannakse esimese servomootori PWM signaali genereeriv taimer tööle // | ||
| + | |||
| + | <code c> | ||
| + | // Kodulabori mootorite mooduli servomootori näidisprogramm | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Põhiprogramm | ||
| + | int main(void) | ||
| + | { | ||
| + | short position; | ||
| + | |||
| + | // ADC seadistamine | ||
| + | adc_init(ADC_REF_AVCC, | ||
| + | |||
| + | // Mootori seadistamine | ||
| + | servomotor_init(1); | ||
| + | |||
| + | // Lõputu tsükkel | ||
| + | while (1) | ||
| + | { | ||
| + | // Potentsiomeetrist positsiooni lugemine ja servomootori | ||
| + | // piirkonda teisendamine | ||
| + | // Kodulabor II puhul tuleb lugeda vastavat ADC kanalit ning kasutada | ||
| + | // järgmist valemit: | ||
| + | // position = ((short)adc_get_value(3) - (short)512) / (short)5; | ||
| + | | ||
| + | |||
| + | // Servomootori positsiooni määramine | ||
| + | | ||
| + | } | ||
| + | } | ||
| + | </ | ||