PIC Lesson: DC Motor


DC Motor adalah motor elektrik yang menggunakan arus terus (DC – Direct Current). DC Motor mempunyai dua terminal sahaja. Motor akan berpusing apabila dua terminal tersebut diberikan voltan mengikut keperluannya misalnya 12V. Arah pusingannya pula bergantung kepada polarity bekalan.

Bagi mengawal DC Motor menggunakan microcontroller, H-bridge driver digunakan. H-bridge driver contohnya L293 atau L298. L298 adalah untuk kegunaan arus motor yang lebih tinggi. Dengan driver ini, terdapat dua input yang membolehkan mengawal arah pusingan motor sama ada pusingan jam ataupun lawan pusingan jam. Juga terdapat input enable yang membolehkan mengawal kelajuan motor dengan memberikan PWM kepada pin tersebut. Di bawah adalah litar DC Motor menggunakan L298.

Kelajuan motor diukur dalam revolutions perminute (rpm) ataupun bilangan pusingan dalam satu minit. Bagi mengira pusingan per minit, encoder bersama dengan infrared sensor digunakan. Encoder adalah plate yang mempunyai bilah yang diletakkan supaya berpusing bersama shaft motor. Infrared akan membaca bilah-bilah tersebut untuk menghasilkan pulse. Ianya bergantung kepada bilangan bilah encoder tersebut.

Misalnya, saya menggunakan encoder yang mempunyai 8 bilah. Oleh itu, 1 pusingan motor akan menghasilkan 8 pulse. Bagaimana ingin menukarkan kepada unit rpm.

Di dalam program PIC, tetapkan jangka masa untuk mengira bilangan pulse. Misalnya dalam jangka masa 0.5 saat. Di dalam masa 0.5s, apabila motor berpusing akan menghasilkan x bilangan pulse. Pengiraan rpm adalah seperti rumus di bawah.

Berikut adalah videonya.

PIC Source Code

Sertai Telegram Group bagi dapatkan source code


82 responses to “PIC Lesson: DC Motor”

  1. salam,
    Cik Shahrul bagaimana kalau saya mggunakan motor AC yang voltan 12V untuk mengawal speed motor…?? kalau motor AC tidak boleh guna motor apakah yang sesuai yang mempunyai daya kilas yang kuat dan RPM laju…?? sbb saya hndak menggunakan motor tersebut sebagai pemotong ubi….

    • Ada ke motor AC 12V? Motor AC biasanya rating power tinggi dan nak mengawalnya biasa control frequency. Nak cari motor yg tinggi tork dan rpm, boleh cari DC motor je. Tp, agak susah la coz hanya salah satu je tinggi atau ambil pertengahan je.

      • 1. saya pakai motor air cond untuk kereta…sbnrnya saya pun x tahu sama ada motor itu AC atau DC. tp saya ada tanya pnsyarah saya dia kta mungkin motor itu AC katanya..
        2. pastu sekarang projek saya ni mggunakan satu motor power window, saya nk prgramkan ia bergerak ulang alik. Dan motor air cond yang satu lagi saya hendak motor tersebut dikawal dengan litar ‘speed motor controler’ dan sekarang saya menggunakan PIC16F877…soalan saya apabila saya menggunakan ‘bridge driver L298’ adakah saya tidak perlu guna litar ‘ulang alik’ dan adakah L298 tersebut sesuai dengan kedua-dua arus motor yang saya pakai?? dan sbnarnya setakat manakah arus yang boleh masuk bridge tersebut…??

  2. salam en shah, saya nk tnya..dalam projek saya, saya menggunakan motor driver md30b dari cytron..

    masalah saya sekarang adalah utntk menggerakkan motor dc fwd n rev…

    coding yg saya belajar menggunakan l239d…

    bole tak en shah sharekan mcm mana nk wat connection utk motor driver tuh..saya kurang faham…

  3. salam nizam,

    saya nak tanya.. saya guna driver motor md30b, saya connect pwm pada rc2, pastu rd1-ccw and rd0-cw..

    codingnye seperti kat bawah ni

    #include
    #include

    //define pins
    #define RUN1 PORTDbits.RD1
    #define CCW1 PORTDbits.RD0
    #define PWM1 CCPR1L //PIN RC2

    //brushless motor subroutine
    void setup(void);
    void setup_pwm (void);
    void motors (unsigned char, unsigned char, char, char);
    void brake (void);
    void turnleft (void);
    void turnright (void);

    //setup brushless motors subroutine
    void setup (void)
    {
    TRISBbits.TRISB3 = 0; //PWM2
    TRISCbits.TRISC2 = 0; //PWM1
    TRISDbits.TRISD0 = 0; //CCW1
    TRISDbits.TRISD1 = 0; //RUN1
    TRISDbits.TRISD2 = 0; //RUN2
    TRISDbits.TRISD3 = 0; //CCW2

    RUN1 = 1; //break motor 1
    CCW1 = 1; //motor1 rotate in countclockwise
    PWM1 = 0; //clear motor 1 PWM

    RUN2 = 1; //break motor 2
    CCW2 = 0; //motor2 rotate in clockwise
    PWM2 = 0; //clear motor 2 PWM
    }

    //setup pwm (pulse width modulation) for brushless motors
    void setup_pwm (void)
    { //find 100 PR2, decimal = 100: hex = 0x64
    PR2 = 0x64; //20.2 usec (20MHz osc) 49.5kHz (1 int period(4 cycle of clock) > calc 256 period > freq of 256 period)
    CCP1CON = 0x0C; //b’00001100′ PWM1 activated
    CCP2CON = 0x0C; //PWM2 activated
    T2CON = 0x04; //b’00000100; TMR2 ON, Postscale 1:1, Prescaler = 1
    }

    //brushless motors control subroutine
    void motors (unsigned char speed1, unsigned char speed2, char direction1, char direction2)
    { //motor 1 = left motor :: motor 2 = right motor
    //examples : motors (200,200,1,1); move robot forward
    // motors (200,200,0,0); move robot backward

    //declare motor speed
    PWM1 = speed1;
    PWM2 = speed2;

    //declare motors rotate direction
    if (direction1 == 0) //setup motor1 direction
    CCW1 = 0;
    else
    CCW1 = 1;

    if (direction2 == 0) //setup motor2 direction
    CCW2 = 1;
    else
    CCW2 = 0;

    RUN1 = 0; //run motor1
    RUN2 = 0; //run motor2
    }

    //brake brushless motors subroutine
    void brake (void) //brake both brushless motors
    {
    //brake oriental motors instatenously
    //example : brake();
    RUN1 = 1;
    RUN2 = 1;
    Delay10KTCYx(9); //delay 10 ms for next command
    }

    //robot self turn left using sensor feedback subroutine
    void turnleft (void)
    {
    motors (100,100,0,1);

    }

    //robot self turn right using sensor feedback subroutine
    void turnright (void)
    {
    motors (100,100,1,0);
    }

    tapi motor tu just gerak pada arah cw je.. ccw tak gerak..

    thanks 🙂

  4. salam en. shah, saya menggunakan litar diatas bersama pic16f877..mslhya saya x jumpa kmponen yang bridge kbp306g tu…. saya cari beberapa buah negeri tapi tetap jumpa.. adakah en.shah ada jual komponen tersebut atau saya blh mggunakan yang lain…model yang manakah sesuai….

  5. salam en shah.. dimane sy bleh bendapatkan circuit scematic dan component2 yang digunakan dalam project ini?.. sy menggunakan sensor yang sama dengan en shah iaitu optical copper..dan menggunakan dc motor. tapi project saya memerlukan penggunaan RF module. bahagian transmitter dan reciver telah siap dan berfungsi.. sy sekarang ingin menggabungkan bahagian rf dan pwm motorcontroller saya bersame lcd.. sebarang petolonggan amat sy hargai..sbb dah pening mencari coding yang sesuai.. fikir nak tambah 1 lagi circuit seperti en shah buat nie kepada rf part saya.

    pic:16f876a

  6. tatic void interrupt isr(void)
    {
    if(TMR0IF==1){
    TMR0IF=0;
    counter[0]++;
    if(counter[0]>=4883){
    counter[0]=0;
    rpm=(int)(15*counter[1]);
    counter[1]=0;}
    }
    if(INTF==1){
    INTF=0;
    counter[1]++;}

    code ni utk kira optical copper ke?.. and camner nak set pic utk kira 0.5saat tu..da teliti 1 coding en shah..xdpt carik.. and ape gune
    if(counter[0]>=4883)
    4883 tu utk ape?.
    maaf la jika banyak bertanya..sebarang bantuan amat dihargai

    • counter[0] sebanyak 4883 untuk set timer 0.5s.
      frequency = Crystal_freq/(4x256xPreescalexCounter) = 20000000/(4x256x2x4883)=2Hz (T=0.5s)

      counter[1] untuk kira bilangan pulse encoder

  7. sy ada buat final projek pasal fish tank dan nk gna motor DC untuk pum air..so sy nk tya motor DC ni dia ada byk jenis ke?ataupun nk bg cdgn lain untuk sy pakai motor jenis lain selain DC untuk pump tekanan air…

  8. salam…

    sy nk tnye..

    1]cmne nk tau encoder yg sy pkai tu ade brp bilah?

    2]kalo sy xpkai PIC, cmne sy nk tetapkn brp jgka msa yg sy nk guna?

    3]ape fungsi bnde hitam yg ada kat shaf dc motor dlm video tu? utk kira bilah ke?

    • ws, yana
      1) Kalau bilah terdedah boleh kira. Kalau encoder yg guna hall effect, baca datasheet bilangan pulse/rotation nya
      2) Boleh tetapkan masa ikut sesuai dgn bilangan pulse/rotation. Jika bilangan pulse/rotation besar, boleh kurangkan masa.
      3) Itu bahagian encoder.

  9. kalo pulse/rotation tuk encoder ialah 500,mse yg sesuai tuk sy gune brpe? sbb sy guna simulation time dlm matlab.jd motor akn run ikut stoptime yg sy set dlm matlab.

  10. so overall eq rev/min=1.2 x pulse. ok itu sy phm.tp pulse tu sy nk amik dr nilai mne? sbb yg 500 tu sy da gne dlm psm kn.

  11. moto driver ape yg boleh keluarkan output lebih dri 4Ampere?…

    sbb sy guna moto driver L293d utk run kan moto power window…power supply sy guna laptop adaptor laptop(output:18v,3.5A)

    sy guna moto driver L293d xboleh sbb L293d hanya kuarkan output 600mA per channel

  12. erk..sy dh tgok moto driver yg cytron jual..mahalnya…
    huu..actually nak cari moto driver yg leh support current smpi 4A..

    soalan:moto driver L298 bleh support x..sy baca datasheet dia kata leh support “up to 4A dc curent”..apa maksudnya..minta maaf kalu byk byk bertanya..basic knowledge xmantap…

  13. Salam Shahrul,

    Saya sedang mengusahakan/membuat/menjual kuih tiram untuk bekalan kedai2/perseorangan dan untuk tempahan raya.

    Saya memerlukan bantuan/khidmat nasihat dan tunjuk ajar bagi mengubah mesin penggelek kuih kayuhan manual kepada automation putaran menggunakan AC atau DC motor yang sesuai.

    Persoalan :

    1. Motor type manakah perlu saya gunakan AC or DC
    2. Berapa watt or terque yang diperlukan
    3. Bagaimana untuk mengawal kelajuan / on / off
    4. Bagaimana mengawal kepanasan motor DC/AC
    5. Apakan komponan2 yang diperlukan
    6. Berapakan anggaran kos

    Saya memerlukan automation ini bagi memudahkan/mempercepatkan process pembuatan bagi tempahan saya.

    Saya amat berharap Shahrul dapat membantu saya dengan kepakaran serta pengalam mendalam didalam bidang teknologi dan kejuruteraan ini.

    Terima Kasih.

    Mazlan Arik
    NIlai, NS
    012 – 6303798

    • ws, Mazlan.
      Sumber bekalan yg mudah diperolehi adalah AC berbanding DC. Kalau DC, perlu guna AC-DC converter.
      Jadi, saya rasa sesuai guna Motor AC. Motor AC mesti dijual berserta motor driver nya untuk mengawal kelajuan.
      Anggaran kos, saya x tahu sebab belum pernah guna Motor AC. Mungkin boleh tanya Zull Design, beliau buat rekacipta untuk IKS. Laman webnya http://www.zulldesign.com.my

  14. Dalam industri, iks dan automasi biasa juga kita guna
    jenis pengawal motor AC atau DC seperti jenama oriantal motor lihat http://www.orientalmotor.com/ setiap motor boleh disesuikan bersama pilihan gear, driver contoller yang sesuai untuk torque tertentu, dan mudah digunakan. Kat malaysia terdapat ramai juga supplier motor jenis brand ni.

  15. assalam saudara shahrul…saya ingin bertanya bagaiamana cara menggunakan software HI-TECH C Compiler V9.82..sbb sebelum ini saya menggunakan HITECH C COMPILER UTK PIC 18…Tp build not success sbb driver utk pic 18 x de…lg satu software HI-TECH C Compiler V9.82 boleh d download secara free ke? boleh kah saudara bg linknya…

  16. Assalam en shahrul…saya menghadapi masalah dengan software simulation cicuit ini,sy menggunakan proteus tp x dpt output yg diharapkn…motor bergerak tapi tiada display pd lcd…sy kurang fhm dengan connection pd
    #define LCD_PULSE() ((LCD_EN=1),(LCD_EN=0))….lcd pulse ini perlu disambung pada kaki mana pada pic?

  17. Salam,En.Shahrul. Info yg diberikan sgt berguna. Saya akan memanfaatkannya sebaik mungkin. But I want to ask sumthing here. Sy meggunakan rotary encoder produk dr Cytron dan telahpun sambungkn encoder ini pada PIC. tetapi saya xdapat generated pulses yg sebetulnya. Blh bantu saya dalam masalah ini? saya meggunakan software MicroC.

  18. slm…selepas da kira pwm iaitu freq n duty cyclenya, mcm mane plak nak hantar signal pwm digital tu ke kaki pic sbg output…output ini saya akan guna untuk on-off mosfet untuk drive on-off solenoid…harap saudara dpt explain ckit…sy x dpt figure persoalan ini kerana x nampak pun dlm source code saudara…klau saudara sudi kongsi, bleh emailkan sy source code(.c; .h) tersebut ke ‘mtaufiq23@gmail.com’

  19. salam en shahrul,kalau sy nak buat mcm project ni,tp guna PIC 16F877A, coding yg digunakan sama x dengan PIC yg en pakai ni ??

  20. Assalam en shahrul,

    Project saya memerlukan pengawalan 2 motor Dc oleh button yang berlainan.
    2 LCD juga digunakan untuk paparan putaran / hasil keluaran setiap motor Dc.

    Soalan saya,

    Boleh xprogram yang en sertakan diatas dimasukkan dalam program pic saya ini?

  21. Salam. Nak tnya, kena dc motor backward xfunction bila sambung menggunakan timer relay. example timer relay jenama anv-h3m-c. dc motor hnya boleh forward, tetapi bila timing foward habis, dc motor xboleh backward. dc motor repeat forward.

  22. assalamualaikum, saya nak tanya, en shah pndai tak nak olah sesuatu benda?contohnya car alarm system? saya nak mintak bantuan

  23. assalammualaikum abang shah sy pelajar tahun akhir sebuah university di malaysia, boleh x klo saya nak tgk cooding pic untuk project pic dc motor abg ini serta schematic project ini sebb project sy ad related dengan project ini cume bezanya sy mengunakan can-bus network untuk menghantar maklumat tentang kelajuan speed motor ini… jika ad abg ad kenakan bayaran saya snggup bayar yang termampu..

  24. abg shah saya nak tanye soalan boleh x kelajuan speed motor tu diadjust semula sebagai contoh apabila pemberat diletakkan di encoder n menyebabkan kelajuan motor berkurang, so saya nak speed selepas pemberat diletak mantain mengikut speed asal sama sebelum pemberat diletakkan.. arap abang shah dapat bantu.

  25. okey abang sharul terima kasih, saya ada satu lagi soalan macam mana abang bt lcd dispaly baca speed dc mator adakah bardasarkan rumus rpm yang abang bg kt pic lesson ini.

  26. salam…nk tnye…formula ni boleh gune dlm arduino x??kalo leh cmne care nk tulis dlm program jz utk rumus shj

  27. salam..nak tanya mcm mana kalau kita nak buat motor tu dlm putaran 90° ulang alik dlm progamming tu kena tambah apa and sya guna pic18

Leave a Reply

Your email address will not be published. Required fields are marked *