This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:examples:motor:dc [2015/11/11 10:40] – Parandatud sõna loogikaviga heikopikner | et:examples:motor:dc [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | < | ||
| + | ====== Alalisvoolumootor ====== | ||
| + | //Vajalikud teadmised: | ||
| + | [HW] [[et: | ||
| + | [AVR] [[et: | ||
| + | [LIB] [[et: | ||
| + | |||
| + | ===== Teooria ===== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Püsimagnetiga alalisvoolumootorid on laialt levinud erinevates rakendustes, | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Püsimagnetiga alalisvoolumootorid on lihtsa ehitusega ja elementaarse juhtimisega mootorid. Kuigi juhtimine on lihtne, ei ole nende pöörlemiskiirus üldjuhul täpselt juhtsignaaliga määratletav, | ||
| + | |||
| + | Harjadega alalisvoolumootorid töötavad alalispingel ning põhimõtteliselt ei vaja eraldi juhtelektroonikat, | ||
| + | |||
| + | H-sillas tüürivad mootori pöörlemiseks vajalikku voolu neli transistori (või nende gruppi). H-silla elektriskeem meenutab H-tähte - sellest ka nimi. H-silla eripära seisneb mootorile mõlemat pidi polaarsuse rakendamise võimaluses. Kõrvaloleval pildil on toodud H-silla põhimõtteskeem lülitite näitel. Kui selles skeemis sulgeda kaks diagonaalis asetsevat lülitit, hakkab mootor tööle. Mootori pöörlemissuund sõltub aga sellest, kummas diagonaalis lülitid suletakse. Reaalses H-sillas on lülitite asemel muidugi transistorid, | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | H-sillaga saab peale pöörlemissuuna muuta ka mootori pöörlemiskiirust. Väiksemate voolude juhtimiseks leiab H-sildu integreeritud komponendina ehk ajurina, suuremate voolude jaoks kasutatakse spetsiaalseid võimsustransistore (//Power MOSFET//). H-silda koos sinna kuuluva elektroonikaga nimetatakse ka mootorikontrolleriks. | ||
| + | |||
| + | Kuigi alalisvoolumootori kiirust on lihtne juhtida, siis puudub garantii, et soovitud kiirus siiski saavutatakse. Tegelik kiirus sõltub paljudest faktoritest, | ||
| + | |||
| + | Alalisvoolu mootorit saab juhtida nii analoog kui digitaal signaalidega. | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Tavaliselt on mootori kiirus sõltuvuses mootor klemmidele antavast pingest. Kui mootorit toita nominaalpingega, | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Robootikas juhitakse alalisvoolumootoreid mikrokontrolleritega ning kuna need on digitaalsed seadmed, siis on mõistlik ka mootoreid digitaalselt juhtida. See saavutatakse pulsilaiusmodulatsiooni (inglise keeles //Pulse With Modulation//, | ||
| + | |||
| + | Digitaalsel juhtimisel on võrreldes analoogjuhtimisega mitmed eelised. Peamine eelis mikrokontrolleriga juhitavate süsteemide puhul on see, et vaja on vaid ühte digitaalväljundit ning puudub vajadus keerulise digitaal-analoog muunduri järele. Samuti on digitaalne juhtimine efektiivsem, | ||
| + | |||
| + | Lihtsustatud juhtimisskeem on näidatud kõrvalasuval joonisel. | ||
| + | Juhtpinge Vc tuleb mikrokontrolleri väljundviigult ning lülitab transistori Q sisse-välja umbes 20 kHz sagedusel. Kui transistor Q on sisse lülitatud, liigub kogu vool I läbi mootori M. Sellisel juhul käitub transistor kui suletud lüliti ja pingelang Vq on 0-i lähedane ning mootorile jääb kogu sisendpinge Vdd. | ||
| + | < | ||
| + | Transistori läbiva koguvõimsuse saab arvutada valemiga: | ||
| + | |||
| + | P = I * V | ||
| + | |||
| + | P = I * Vq, ja kui Vq ~ 0, siis P ~ 0 W | ||
| + | |||
| + | See tähendab, et transistor ei kuluta avatud olekus peaaegu üldse energiat. Sarnane situatsioon on ka juhul, kui transistor on suletud olekus. Sellisel juhul ei liigu läbi transistori ega mootori vool. Arvutades transistori läbiva võimsuse: | ||
| + | |||
| + | P = I * Vq, ja kui I = 0, siis P = 0 W | ||
| + | |||
| + | Kokkuvõttes võime öelda, kui transistor on skeemis lülitava elemendina, siis süsteemi efektiivsus on väga kõrge ning transistori kasutatav võimsus on väga madal. Võrreldes lineaarse (analoog) süsteemiga, | ||
| + | |||
| + | ===== Praktika ===== | ||
| + | |||
| + | Kodulaboris kasutatakse alalisvoolumootorite juhtimiseks kombineeritud kiipi, mis sisaldab endas kahte integreeritud H-silda ja kaitsedioode. Mootorit juhitakse kolme digitaalse signaaliga, millest üks on üldine tööd lubav signaal (inglise keeles // | ||
| + | |||
| + | Kodulabori Kombomoodulil on võimalus kuni nelja alalisvoolumootori ühendamiseks. Sisuliselt on iga mootori jaoks H-sild, mida juhitakse kahe mikrokontrolleri digitaalse väljundviiguga, | ||
| + | |||
| + | ^ Sisend A ^ Sisend B ^ Väljund A ^ Väljund B ^ Tulemus | ||
| + | | 0 | ||
| + | | 1 | ||
| + | | 1 | ||
| + | | 0 | ||
| + | |||
| + | |||
| + | Iga mootorit, mis on ühendatud H-silla külge juhitakse kahe mikrokontrolleri digitaalväljundiga. Mootori kiirust juhitakse taimeritega, | ||
| + | |||
| + | < | ||
| + | <code c> | ||
| + | // Mootorite ühendusviigud | ||
| + | static pin dcmotor_pins[4][2] = | ||
| + | { | ||
| + | { PIN(B, 7), PIN(B, 4) }, | ||
| + | { PIN(D, 1), PIN(D, 0) }, | ||
| + | { PIN(D, 7), PIN(D, 6) }, | ||
| + | { PIN(D, 5), PIN(D, 4) } | ||
| + | }; | ||
| + | static int motorindex[4][2] = | ||
| + | { | ||
| + | { 0, 1 }, | ||
| + | { 2, 3 }, | ||
| + | { 4, 5 }, | ||
| + | { 6, 7 } | ||
| + | }; | ||
| + | // PWM-i käivitamine valitud mootori jaoks | ||
| + | void dcmotor_drive_pwm_init(unsigned char index, timer2_prescale prescaler) | ||
| + | { | ||
| + | unsigned char i, pwm; | ||
| + | |||
| + | pin_setup_output(dcmotor_pins[index][0]); | ||
| + | pin_setup_output(dcmotor_pins[index][1]); | ||
| + | |||
| + | motor[index] = 1; | ||
| + | pwm = PWMDEFAULT; | ||
| + | |||
| + | // Kõigi kanalite käivitamine | ||
| + | for(i=0 ; i<CHMAX ; i++) | ||
| + | { | ||
| + | // PWM-i algväärtustamine | ||
| + | compare[i] = pwm; | ||
| + | compbuff[i] = pwm; | ||
| + | } | ||
| + | |||
| + | // Timer 2 normaalrežiimis käivitamine | ||
| + | timer2_init_normal(prescaler); | ||
| + | // Timer 2 katkestuste lubamine | ||
| + | timer2_overflow_interrupt_enable(true); | ||
| + | |||
| + | // Globaalsete katkestuste lubamine | ||
| + | sei(); | ||
| + | } | ||
| + | // PWM-i genereerimine valitud mootorile | ||
| + | void dcmotor_drive_pwm(unsigned char index, signed char direction, | ||
| + | unsigned char speed) | ||
| + | { | ||
| + | if(direction == -1) | ||
| + | { | ||
| + | compbuff[motorindex[index][0]] = 0x00; | ||
| + | compbuff[motorindex[index][1]] = speed; | ||
| + | } | ||
| + | if(direction == 1) | ||
| + | { | ||
| + | compbuff[motorindex[index][0]] = speed; | ||
| + | compbuff[motorindex[index][1]] = 0x00; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Mootorite teegi maatriksis // | ||
| + | |||
| + | Mootorite kiiruse juhtimiseks kasutatakse funktsiooni // | ||
| + | |||
| + | Järgnevalt on toodud näiteprogramm, | ||
| + | |||
| + | <code c> | ||
| + | // Kodulabori mootori juhtimise näidisprogramm | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Põhiprogramm | ||
| + | int main(void) | ||
| + | { | ||
| + | // Kiiruse hoidmise muutuja | ||
| + | int speed; | ||
| + | |||
| + | // Analoog-digitaalmuunduri käivitamine | ||
| + | adc_init(ADC_REF_AVCC, | ||
| + | |||
| + | // Mootorite DC1 ja DC2 eelseadistamine (ilma taimeri jagurita) | ||
| + | // Kodulabor II | ||
| + | // | ||
| + | // | ||
| + | // Kodulabor III | ||
| + | dcmotor_drive_pwm_init(1, | ||
| + | dcmotor_drive_pwm_init(2, | ||
| + | |||
| + | // Lõputu tsükkel | ||
| + | while (1) | ||
| + | { | ||
| + | // Potentsiomeetri 4 keskmise lugemi võtmine ja salvestamine muutujasse | ||
| + | |||
| + | // Kodulabor II | ||
| + | // Kuna potentsiomeetri väärtus on 10-bitine kuid DC mootori | ||
| + | // funktsioon on 8-bitine, tuleb ADC väärtus muundada 8-bitiseks | ||
| + | // jagades ADC väärtus neljaga või nihutades bitinihutustehtega | ||
| + | // ADC väärtust paremale 2 kohta (>>2) | ||
| + | // speed = adc_get_average_value(3, | ||
| + | |||
| + | // Kodulabor III | ||
| + | // Kuna potentsiomeetri väärtus on 12-bitine kuid DC mootori | ||
| + | // funktsioon on 8-bitine, tuleb ADC väärtus muundada 8-bitiseks | ||
| + | // jagades ADC väärtus kaheksaga või nihutades bitinihutustehtega | ||
| + | // ADC väärtust paremale 3 kohta (>>3) | ||
| + | speed = adc_get_average_value(15, | ||
| + | |||
| + | //DC mootori juhtimine saadud potentsiomeetri väärtuse kaudu | ||
| + | | ||
| + | | ||
| + | } | ||
| + | } | ||
| + | </ | ||