This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| et:examples:motor:dc_speed [2014/09/29 14:34] – raivo.sell | et:examples:motor:dc_speed [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | < | ||
| + | ====== Alalisvoolu mootori kiirus ====== | ||
| + | //Vajalikud teadmised: [HW] [[et: | ||
| + | |||
| + | |||
| + | ===== Teooria ===== | ||
| + | [{{ : | ||
| + | Püsimagnetiga DC mootorid on väga laialt levinud robootikas ja mehatroonikas. DC mootorite kiirust ja pöörlemissuunda on suhteliselt lihtne juhtida. Mootori pöörlemissuunda muudetakse mootorile antava pinge polaarsusega. Mikrokontrolleriga juhtimisel kasutatakse H-silda. | ||
| + | |||
| + | Kuigi DC mootori kiirust on lihtne juhtida, siis puudub garantii, et soovitud kiirus siiski saavutatakse. Tegelik kiirus sõltub paljudest factoritest, | ||
| + | |||
| + | Alalisvoolu mootorit saab juhtida nii analoog kui digitaal signaalidega. | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Tavaliselt on mootori kiirus sõltuvuses mootor klemmidele antavast pingest. Kui mootorile anda nominaalpinge, | ||
| + | |||
| + | Robootikas juhitakse alalisvoolu mootoreid mikrokontrolleritega ning kuna need on digitaalsed seadmed, siis tuleks ka mootoreid digitaalselt juhtida. Selle saavutamiseks tuleks transistore pidevalt natuke lahti hoidmise asemel lülitada neid kiiresti sisse - välja kasutades pulsilaius modulatsiooni (PWM). Koguenergia, | ||
| + | |||
| + | Robotites kasutatakse ühe transistori asemel tavaliselt H-silda, mis võimaldab lisaks kiiruse muutmisele ka mootorite suunda muuta. | ||
| + | |||
| + | Digitaalsel juhtimisel (nt PWM) on mitmed eelised analoog juhtimise üle. Põhiline eelis mikrokontrolleriga juhitavate süsteemide puhul on see, et vaja on vaid üht digitaalväljundit ning puudub vajaduse keerulisel digitaal - analoog muundiri järele. Lisaks on digitaalne juhtimine effektiivsem (vähem energiat muundatakse lihtsalt soojuseks). | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Lihtsustatud juhtimisskeem on näidatud kõrvalasuval joonisel. | ||
| + | Juhtpinge Vc tuleb mikrokontrolleri väljundviigult ning lülitab transistori Q sisse - välja umbes 20kHz sagedusega. Kui 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 pinge Vdd. | ||
| + | Me saame arvutada ka transistori läbiva koguvõimsuse valemiga P = I * V. | ||
| + | |||
| + | P = I * Vq, ja kui Vq ~ 0, siis P ~ 0W | ||
| + | |||
| + | See tähendab, et transistor ei kuluta peaaegu üldse energiat avatud olekus. 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 = 0W | ||
| + | |||
| + | Kokkuvõttes võime öelda, kui transistor on skeemis lülitava elemendina, siis on süsteemi effektiivsus väga kõrge ning transistori kasutatav võimsus on väga madal. Võrreldes lineaarse (analoog) süsteemiga, | ||
| + | |||
| + | PS: mitte segi ajada RC Servo juhtsignaali PWM signaaliga | ||
| + | |||
| + | ===== Praktika ===== | ||
| + | |||
| + | Kodulabori Mootorimoodul sisaldab Mootori plaati ning DC mootorit ülekande ning koodriga. Mootoriplaadile on võimalik ühendada kuni neli alalisvoolumootorit. Skeemid ja õpetused on vastaval alamlehel " | ||
| + | Iga mootorit, mis on ühendatud H-silla külge juhitakse kahe mikrokontrolleri digitaalväljundiga. Mootori kiirust juhitakse taimeritega, | ||
| + | Mootori kiirust juhtiakse suhteliste väärtustega 0 - 255, kus 0 tähendab seisvat mootorit ning 255 maksimaalsel kiirusel liikuvat mootorit. | ||
| + | |||
| + | <code c> | ||
| + | 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 } | ||
| + | }; | ||
| + | |||
| + | // Käivita PWM 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; | ||
| + | |||
| + | for(i=0 ; i<CHMAX ; i++) // Käivita kõik kanalid | ||
| + | { | ||
| + | compare[i] = pwm; // algväärtusta PWM väärtused | ||
| + | compbuff[i] = pwm; // algväärtusta PWM väärtused | ||
| + | } | ||
| + | |||
| + | // Timer 2 normaal režiimis, sea jagur | ||
| + | timer2_init_normal(prescaler); | ||
| + | // Timer 2 luba katkestused | ||
| + | timer2_overflow_interrupt_enable(true); | ||
| + | |||
| + | // Luba globaalsed katkestused | ||
| + | sei(); | ||
| + | } | ||
| + | |||
| + | 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 dcmotor_pins määratakse ära viigud, kuhu on ühendatud Mootoriplaadi 4 mootori juhtsignaalid. Enne mootori kiiruse juhtimist tuleb välja kutsuda funktsioon dcmotor_drive_pwm_init selle mootori kohta (0-3), mille kiirust on soov juhtima hakata. See seab vastavad viigud väljunditeks. Samuti tuleks seadistada Timer2 jagur // | ||
| + | |||
| + | Mootorite kiiruse juhtimiseks kasutatakse funktsiooni dcmotor_drive_pwm. See funktsioon vajab kolme väärtust: esiteks mootori numbrit, mille kiirust reguleeritakse (0-3), teiseks suunda (-1, 0, +1), kus -1 tähistab pöörlemist ühes suunas, +1 teises ning 0 tähistab seismist, ning kolmandaks kiirust vahemikus 0 - 255. Kiiruse väärtus ei ole seotud mingi kindla pöörlemiskiirusega vaid suhteline väärtus mootori maksimaalse pöörlemiskiiruse ja seisva mootori vahel. Mootori reaalne pöörlemiskiirus sõltub mootorist, toitepingest ning koormusest. Mootori kiiruse täpsus on 8-bitine, mis tähendab, et minimaalne jutimisetäpsus on 1/255 mootori maksimaalsest kiirusest. | ||
| + | |||
| + | Järgnevalt on toodud väiteprogramm, | ||
| + | |||
| + | <code c> | ||
| + | |||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | int main(void) | ||
| + | { | ||
| + | // Eelseadista DC0 mootor, ilma timer2 jagurita | ||
| + | dcmotor_drive_pwm_init(0, | ||
| + | |||
| + | while(1) | ||
| + | { | ||
| + | // Mootorile pool nominaalkiirusest. | ||
| + | dcmotor_drive_pwm(0, | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Teine näiteprogramm juhib esimest DC mootorit (ühendatud DC0 viikudele) potensiomeetriga, | ||
| + | |||
| + | <code c> | ||
| + | |||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | int main(void) | ||
| + | { | ||
| + | int speed; | ||
| + | |||
| + | // Käivita analoog-digitaal muundir | ||
| + | adc_init(ADC_REF_AVCC, | ||
| + | |||
| + | // Eelseadista DC0 mootor, ilma timer2 jagurita | ||
| + | dcmotor_drive_pwm_init(0, | ||
| + | |||
| + | while(1) | ||
| + | { | ||
| + | // Potensiomeeter on ühendatud kanalisse 3 | ||
| + | // Võtame nelja lugemi keskmise väärtuse | ||
| + | speed = adc_get_average_value(3, | ||
| + | |||
| + | // Loeme DC mootori kiiruse potensiomeetrist | ||
| + | // Kuna potensiomeetri 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 adc väärtust paremale | ||
| + | // 2 kohta >>2 | ||
| + | dcmotor_drive_pwm(0, | ||
| + | } | ||
| + | } | ||
| + | </ | ||