Ana Sayfa PIC Assembly - PIC C PIC16F877A ile DC Motor PWM Hız Kontrolü

PIC16F877A ile DC Motor PWM Hız Kontrolü

6 min read
41
0
9,714

 

Merhaba arkadaşlar bu çalışmamız bir önceki çalışmamızın devamı niteliğinde olacaktır.Bir önceki çalışmada DC motoru ileri-geri hareket ettirmiştik.DC motor ve yön konularında bilgiler verilmişti bu sebeple bu çalışma PWM ile bilgiler verilerek başlanılacaktır.

DC MOTOR HIZ KONTROL TEKNİKLERİ

DC motorun hız kontrolünde DC motorun hız kontrolünde iki yöntem kullanılır. Birincisi gerilim kontrolü, ikincisi ise faz kontrolüdür. Gerilim kontrolü şekilde gösterildiği gibi mikrodenetleyiciye ihtiyaç duyulmadan ayarlı bir güç kaynağı ile yapılmaktadır.

İkinci yöntemde PWM sinyal kullanılır. Bu uygulama devresinde 16F877 entegresi kullanılacaktır. Çünkü bu mikrodenetleyicinin CCP1 (RC1) ve CCP2 (RC2) bacakları PWM çıkış üretir. Üretilen PWM sinyalin periyodu sabit fakat darbe genişliği değişebilen bir kare dalga sinyaldir. Kare dalga sinyalin darbe genişliği (duty saykılı) azalırsa ortalama gerilim azalır ve motorun hızı düşer. Sinyalin darbe genişliği artarsa motorun hızı artar. Şekil 2.7’de kare dalga sinyal gösterilmiştir.

pwm
pwm


 DEVRENİN ŞEMASI

Devre Şeması
Devre Şeması

 

DEVRENİN MALZEMELERİ

  • PİC 16F877A 4 Mhz mikrodenetleyici
  • X1= 4Mhz kristal
  • C1 = C2 = 22pf
  • R1=R2=R3=R4= 10K, R5=R6=R7=1K
  • DC motor, buton
  • RV1= 1K potansiyometre
  • Q1=Q2= BD 135
  • Q3=Q4= BD140, Q5= BC237,

 

DEVRENİN ASSEMBLY KODU

 

; ====MOTOR HIZ VE YÖN KONTROL UYGULAMA PROGRAMI=========
LIST P=16F877

INCLUDE "P16F877.INC"

CALL PORT_KUR                    ;PORT_KUR alt programına git

CALL ANALOG_KUR              ;ANALOG_KUR alt programına git

CALL PWM_KUR                      ;PWM_KUR alt programına git

BSF ADCON0,GO                      ;A/D çevrimi başlat

DON

BTFSS PIR1,ADIF                     ;A/D çevrim bitti mi?

GOTO DON                                ;Hayır geri dön

MOVF ADRESH,W                  ;Evet sayıyı W’ye aktar

MOVWF CCPR1L                    ;PWM darbeyi üret

TUS_ARA

BTFSS PORTD,0                      ;DUR butonuna basılı mı?

CALL DUR                              ;evet DUR alt programına git

BTFSS PORTD,1                     ;GERI butonuna basılı mı?

CALL GERI                             ;evet GERI alt programına git

BTFSS PORTD,2                    ;ILERI butonuna basılı mı?

CALL ILERI                           ;evet ILERI alt programına git

GOTO TUS_ARA                  ;Hayır tuş ara

PORT_KUR       ;===================================================

BSF STATUS,5                     ;Bank 1’e geç

MOVLW H'01'

MOVWF TRISA                    ;PortA 0.bit giriş

CLRF TRISB                         ;PortB çıkış

CLRF TRISC                        ;PortC çıkış

MOVLW H'FF'

MOVWF TRISD                   ;PortD giriş

BCF STATUS,5                  ;Bank 0’a geç

RETURN

ANALOG_KUR     ;=================================================

MOVLW B'10000001'         ;A/D çevrimi aktif

MOVWF ADCON0            ;Kanal 0 aktif

BSF STATUS,5                  ;Bank 1’e geç

MOVLW B'00001110'         ;Sayıyı sola kaydır

MOVWF ADCON1             ;ADRESH’a yükle

BCF STATUS,5                   ;Bank 0’a geç

RETURN

PWM_KUR   ;=====================================================

CLRF TMR2                 ;TMR2 temizle

CLRF CCPR1L             ;CCPR1L temizle

BSF STATUS,5             ;Bank 1 e geç

MOVLW D'255'            ;PR2 registerine 255 sayısını yükle

MOVWF PR2                    ;Peryod=1638.4μs

BCF STATUS,5                     ;Bank 0 a geç

MOVLW B'00001100'             ;Pst=1:1 TMR2=ON Pre=1:16

MOVWF T2CON                    ;T2CON registerini kur

MOVLW B'00001100'            ;CCP1XY=0 CCP1M=1100(PWM)

MOVWF CCP1CON              ;CCP1CON registerini kur

RETURN

DUR          ;==========================================================

BSF PORTB,0                       ;PortB.0 = “1”

BSF PORTB,1                      ;PortB.1= “1”

RETURN

GERI       ;===========================================================

BCF PORTB,0               ;PortB.0= “0”

BSF PORTB,                           ;PortB.1= “1”

RETURN

ILERI        ;===========================================================

BSF PORTB,0                       ;PortB.0=”1”

BCF PORTB,1                       ;PortB.1=”0”

RETURN
END

HEX Dosyasını BURADAN indirebilirsiniz..

Devrenin videosunu aşağıda bulabilirsiniz…

Buna Benzer Yazılar Göster !
Daha Fazlasını Yükle - Burak Ablay
Daha Fazla Göster -  PIC Assembly - PIC C

41 Yorumlar

  1. Sercan

    3 Aralık 2015 at 20:36

    Elinize sağlık güzel bir anlatım olmuş. Ben de ısı sensörü ile pwm üretip motor sürmeye çalışıyorum kod konusunda yardımcı olabilir misiniz?

    Reply

  2. Burak Ablay

    Burak Ablay

    8 Aralık 2015 at 18:02

    Bu kodu fazla değiştirmene gerek yok sadece pot yerine sıcaklık sensörünü koyup analog ölçüm yapıcaksın aynı mantık.. İyi çalışmalar..

    Reply

  3. Serhan

    15 Aralık 2015 at 14:13

    Güzel bir anlatım olmuş. Bu devreyi L298 H Bridge kullanarak pot ile yapmak isteseydik kodda ve devrede ne gibi değişiklikler olacaktı, yardımcı olabilir misiniz ?

    Reply

    • Burak Ablay

      Burak Ablay

      15 Aralık 2015 at 15:24

      Kodda bir değişiklik yapmanıza gerek yok. Sadece bu devrede H köprüsü transistörler sağlanmıştır. Siz bunu L298h bridge nin iç yapısına bakarak bu devrede uygulanan bağlantıları doğru şekilde uygularsanız devreniz hiç bir fark olmadan çalışacaktır.

      Reply

  4. […] PWM sinyaliyle olmaktadır. Biz PWM sinyalimizi arduino yardımıyla üretmiş bulunmaktayız. Buradan pwm sinyali hakkında bilgi sahibi olabilirsiniz. Devrenin genel anlatımını bitirdikten sonra […]

    Reply

  5. Onur

    10 Ocak 2016 at 13:52

    Merhaba, bir kaç sorum olacak ve yardımınızı isteyeceğim. 16F877 kullanacağız demişsiniz ama şemada 16F877A var, yanlışmı yazılmış? Bu kodları CCS C içerisine atsam çalışırmı ? Bende breadboard üzerine kurmak istiyorum rica etsem bağlantı şemasını paylaşabilir misiniz?…. ((( Micro sistem tasarımı hakkında hiç bir bilgim yok, yeni yeni öğreniyorum. Anlayışınız için teşekkür ederim )))

    Reply

  6. mehmet

    13 Ocak 2016 at 20:01

    selamın aleyküm breadboard ın tam resmini paylaşabilirmisiniz devrenin kurulumunu tam olarak yapamadım.

    Reply

    • Burak Ablay

      Burak Ablay

      15 Ocak 2016 at 11:47

      Board un resmini paylaşmam yine size yardımcı olmaz o şekilde bir kurulum sağlıklı sonuç vermez. Devrenin şemasından yararlanarak kurulumunu yapmanız gerekmektedir. Transistörlerin uçlarını tespit edip H köprüsünü o şekilde kurmalısınız. Ayrıca devre şemasında gözükmeyen picin besleme uçlarınıda vermeyi unutmayınız. iyi çalışmalar dilerim..

      Reply

  7. Adem Gölcük

    13 Nisan 2016 at 14:45

    Gayet başarılı bir çalışma olmuş. Ra0 daki potansiyometre bread boarddaki devrede PWM ile dc motorun hızını azaltıp arttırıyor ama çalışma prensibini tam olarak anlayamadım assembly kodunda RA0 hiç kullanılmamış orasını açıklarmısınız .
    Simdiden teşekkürler.

    Reply

    • Burak Ablay

      Burak Ablay

      13 Nisan 2016 at 20:58

      Şimdi şöyle oluyor RAO daki değişimin analog olarak algılanması ve bu değişimin direkt olarak ADC(analog digital çevirici) çevrime girmesi için ADCON0 komutu kullanılmaktadır. ADCON0 komutu hangi kanaldan adc çevrim yapılmak istendiği komutunu işlemektedir. ADCON0 ın 3. bitinden itibaren kanalları içermektedir. Yani 10″000″001 tırnak içerisinde bulunan bitler hangi kanaldan adc çevrim yapacağını belirlemeye yaramaktadır. 000 demek AN0 demektir. 001 AN1 , 010 AN2 demek oluyor. Yani AN2 ye potu bağlayıp analog giriş yapmak istiyorsan 010 yapacağız. Ama biz AN0 ı kullanacağımız için 000 oldu. Umarım açıklayıcı olmuştur.
      İyi çalışmalar dilerim..

      Reply

  8. OĞUZHAN

    14 Nisan 2016 at 10:10

    Bu programı micro code studio da nasıl yazabilirim nasıl çevirebilirim?

    Reply

    • Burak Ablay

      Burak Ablay

      14 Nisan 2016 at 16:59

      Oğuzhan bey bu çalışma assembly koduyla programlanmıştır. Bu programı direkt olarak MCS nun algılayabileceği şekilde çevrimini nasıl yapacağınız hakkında bir bilgi veremem ancak bu öneri olarak çalışmayı istediğiniz kod tarzında arattırmalısınız yada MCS algılayabileceği kod assembly ile benzerlik göstermekte kod satırlarının ne iş yaptığını bilip MCS ya çevirmeniz gerekmektedir. MCS ilesayfamızda uğraşan arkadaşlarımız var ordan başlayabilirsiniz.
      İyi çalışmalar…

      Reply

  9. Büsra

    21 Nisan 2016 at 16:59

    Biz bu motorun hizini lcd de gostermek istersek ne yapabiliriz acaba ? Simdiden tsk ederim..

    Reply

    • Burak Ablay

      Burak Ablay

      21 Nisan 2016 at 17:37

      Şimdi şöyle anlatayım : İlk olarak kullanılan motorun tam güçte ne kadar devirde döndüğünü bilmemiz gerekiyor. Bu değer alacağınız motorun kataloğunda yada üzerinde yazacaktır. RPM değeri yazar devir/dak cinsinden verecektir. Siz bu değeri bildiğiniz taktirde burada uygulanan analog giriş değerinin en üst değeri 255 tir. Yani 5 v a 255 digital değeri verilmektedir. Siz ayarladığınız pot değerinin analog okuma yaptırarak tespit edebilirsiniz. Bu tespit ettikten ;

      255 ——- rpm değer(katalogdaki değer)
      pot değeri —— x(şuankihızdeğeri)

      içler dışlar yapıp hesaplattırdığınızda bulacaksınız bunuda LCD ekranda göstermek için LCD ekran kodunu yazıp bunun içine bu değeri gösterebilirsiniz. LCD ekran kodlarıda sitemizde mevcuttur bulabilirsiniz.
      İyi çalışmalar dilerim..

      Reply

  10. büsra

    25 Nisan 2016 at 17:22

    Bizim verilen odevimiz keypadde girilen sayıyı lcd de gösterecek ve ona göre motor donecek bunu nasil yapabiliriz acaba?

    Reply

    • Burak Ablay

      Burak Ablay

      25 Nisan 2016 at 18:36

      İstediğiniz çalışma şuan da bu projeden daha kolay diyebiliriz. Şöyle ki istediğiniz projede bir analog giriş kullanmayıp girişi keypadden yapacaksınız. Bu girdiğiniz değeri direkt olarak PWM üreten komutun içerisine yollayıp onun hangi hızda dönmesi gerektiği göndereceksiniz. Pic ile yapılmış keypad uygulaması bulduktan sonra keypadtan veri almaya çalışın aldıktan sonra izleyeceğiniz yol buradaki analog okuma bölümünü kaldırıp direkt PWM komutunun içerisine keypadtan yolladığınız veriyi atayarak çözebilirsiniz.
      İyi günler , iyi çalışmalar dilerim..

      Reply

      • büsra

        26 Nisan 2016 at 11:11

        keypad ve lcdnin kodlarıyla ilgili de yardım edebilir misiniz? birleştirmesinde sıkıntı yaşıyoruz 🙁

        Reply

        • Burak Ablay

          Burak Ablay

          27 Nisan 2016 at 18:26

          Maalesef yardımcı olamayacağım. Çünkü bu istediğiniz bu yazıdan tamamen farklı bir uygulamaya dönüşmüş oluyor. Size kolayca yardım edebileceğim bir konu olmadığını söyleyebilirim. Sitemizde ilerleyen günlerde belki buna yönelik bir yazı paylaşılabilir takipte kalın.. İyi çalışmalar dilerim..

          Reply

  11. Arif

    1 Mayıs 2016 at 07:05

    Iyi çalışmalar. Ben 30 amper akıma dayanıklı bi motor sürücü yapmak istiyorum ve motorun hızını da pwm ile ayarlamam gerekiyo potansiyometre kullanamam çünkü bluetooth veya alıcı verici ile uzaktan kontrol olacak. Yani pwm yi de uzaktan kontrol etmem gerekiyo. Ne yapmamı önerirsiniz.

    Reply

    • Burak Ablay

      Burak Ablay

      2 Mayıs 2016 at 05:57

      Merhabalar ,
      Potansiyometre kullanmayacaksanız ADC(analog digital çevrim)e gerek yok demektir. Bunun yerine uzaktan haberleşme sistemiyle kontrol etmek istediğiniz veriyi direkt olarak PWM’e göndererek aynı kontrolü yapabilirsiniz. Analog digital çeviricilerin çalışma mantığı mikroişlemcinin bit sayısına göre kontrol aralığının değişmesidir. Pic ADC si 10 bit olduğundan 0-5 V arasını 0-1024 e çevirecektir. Tabiki bu değer binary olarak kaydedilecektir. Bu 0-1024 arasındaki değeri binary olarak PWM komutunun içerisine yolladığınızda PWM sinyalini elde etmiş olacaksınız. Ayrıca 30A kullanmak istiyorsunuz bunun için motor sürücüsü kullanılması gerektiğini tahmin ediyorum. Bunun üzerine araştırma yapmanızı öneririm. İyi günler , iyi çalışmalar..

      Reply

  12. OĞUZHAN

    4 Mayıs 2016 at 22:36

    rica etsem programın hex uzantısını benimle paylaşabilirmisiniz direk pic e yükleyebilmem için şimdiden teşekkür ederim.

    Reply

    • Burak Ablay

      Burak Ablay

      5 Mayıs 2016 at 06:31

      Hex dosyası videonun üstüne eklenmiştir.
      İyi çalışmalar..

      Reply

  13. OĞUZHAN

    11 Mayıs 2016 at 20:54

    Burak bey bu paylaşımınızdan dolayı çok teşekkür ederim bende projenizin birebir aynısını yapıyorum pice ve picin extra besleme bacaklarına +5 volt bağlantısı yaptım ayrı yeten motor sürme kısmınada +12 volt beslemesini ayrı yaptım bağlantılarımı kontrol ettiğimde hiçbir hataya rastlamıyorum sizce sorun neden kaynaklanabilir? İlgilenirseniz çok teşekkür ederim.

    Reply

    • Burak Ablay

      Burak Ablay

      12 Mayıs 2016 at 08:08

      Merhabalar Oğuzhan bey,
      Bu çalışmada kullanılan motor düşük amperli motordur.Çizgi izleyen robotlarında kullanılan motordur.O yüzden kolaylıkla sürebilmiştir.Sizin motorunuz 12v luk bir motor olduğu için çalışmaması normal diyebiliriz. Onu sürebilmek için motor ile şase arasına mosfet kullanarak mosfetin tetik ucundan pwm sinyalini motora da 12 V göndermeniz gerekli diye biliyorum isterseniz bunun üzerine gidebilirsiniz..
      İyi günler iyi çalışmalar dilerim..

      Reply

  14. ali

    29 Mayıs 2016 at 14:45

    Buradaki motor servo mu step mo acaba?

    Reply

    • Bilal Kaya

      Bilal Kaya

      29 Mayıs 2016 at 20:23

      Motor dc motordur.Step veya servo motor değildir.

      Reply

  15. Büsra

    29 Mayıs 2016 at 16:38

    Burak bey , Kullanilan motor servo mu step mi?

    Reply

    • Bilal Kaya

      Bilal Kaya

      29 Mayıs 2016 at 20:24

      Motor dc motordur.Step veya servo motor değildir.

      Reply

    • Burak Ablay

      Burak Ablay

      30 Mayıs 2016 at 08:47

      Motor bilal beyinde söylediği gibi Dc motordur. Motorun gücü düşüktür. Çizgi izleyen robotlarda kullanılan motor olarak piyasada bulabilirsiniz.
      İyi çalışmalar..

      Reply

  16. Aias Marques

    13 Ağustos 2016 at 02:11

    Hi John!
    I just use the .hex file and all worked fine.
    Now I am trying use the the ASM file found on the web page but when I compile to .hex file there is a lot of errors. Please could you send for me the original assemble code or inform what compiler you used? I am using the MPLAB. I will appreciate your help. I am just learn. Thanks.

    Reply

    • Burak Ablay

      Burak Ablay

      13 Ağustos 2016 at 09:02

      Hi ,
      You dont need to open hex.h with MPLAB . You have to use USB programmer for PİC10F/PİC16F… You have to compile the hex file direclty to 16F877A. I am using US-BURN for PİC programming. The file hasn’t a problem. I tried it.

      Reply

  17. Aias Marques

    13 Ağustos 2016 at 16:50

    Ok. I think that I wasn´t understanding. I downloaded the .HEX file from web page and programmed the PIC, worked fine! What I said was that using the code lines showed in the web page when I tried the compilation I got many erros.
    ” ; ====MOTOR HIZ VE YÖN KONTROL UYGULAMA PROGRAMI=========
    LIST P=16F877

    INCLUDE “P16F877.INC”

    CALL PORT_KUR ;PORT_KUR alt programına git

    CALL ANALOG_KUR ;ANALOG_KUR alt programına git

    CALL PWM_KUR ;PWM_KUR alt programına git

    BSF ADCON0,GO ;A/D çevrimi başlat

    DON

    BTFSS PIR1,ADIF ;A/D çevrim bitti mi?

    GOTO DON ;Hayır geri dön

    MOVF ADRESH,W ;Evet sayıyı W’ye aktar

    MOVWF CCPR1L ;PWM darbeyi üret

    TUS_ARA

    BTFSS PORTD,0 ;DUR butonuna basılı mı?

    CALL DUR ;evet DUR alt programına git

    BTFSS PORTD,1 ;GERI butonuna basılı mı?

    CALL GERI ;evet GERI alt programına git

    BTFSS PORTD,2 ;ILERI butonuna basılı mı?

    CALL ILERI ;evet ILERI alt programına git

    GOTO TUS_ARA ;Hayır tuş ara

    …..” That is my problem. I think that the code lines are OK maybe the compiler is wrong.
    Sorry about that! I hope that now the things are more clear. ( My english is not good!!!)
    Thanks for you time.

    Reply

    • Burak Ablay

      Burak Ablay

      13 Ağustos 2016 at 18:53

      I understand you. Your compiler is true. Because I use MPLAB. Have you ever studied with MPLAB before this code? I guess you have to learn MPLAB. I will send a file for help you. There are MPLAB’s file about this code in the file. I guess that helps you. https://yadi.sk/d/vNRG6mHtuC6ZC

      Reply

  18. Aias Marques

    13 Ağustos 2016 at 20:49

    Hi Guys! I don´t know what happened. I use the .asm file sent by you and all worked fine. So I print your file and my file and checked line by line and all are identical, except the line __CONFIG 0X3FF1. I deleted this line from your file and the compilation was OK???? I realy don´t know what happened. Anyway, now is ok. I planed use this code as a base for a project of the a test/simulator of the a TBI Throtle Body Injection tester. I really apprciate your help. Thanks a lot.

    Reply

  19. mert

    12 Mayıs 2017 at 14:11

    Merhaba hocam pwm kontrollu rgb led programi yapicaz sizin projenizi ustunde degisim yaparak yapmayi dusunuyoruz 3 pot kullanarakmi yapmaliyiz yoksa tek pot ile halladebilirmiyiz cikis olarak rgb modulunuz varmi ?

    Reply

    • Burak Ablay

      Burak Ablay

      12 Mayıs 2017 at 23:29

      Tek pot ile gelen degeri göre rgb şefin renklerini değiştirebilirsiniz 3 pota gerek yokmuş gibi duruyo ancak tabiki bu olay sizin tasarımına kalmış bir durum. İyi çalışmalar..

      Reply

      • mert

        13 Mayıs 2017 at 15:44

        merhabalar hocam pottan bılgı alma ıslemı ıcın kaynak varmı acaba yardımlarınız ıcın tesekkurler

        Reply

  20. HD Elektronik

    6 Haziran 2017 at 15:27

    Isis şemasında; H Köprüsündeki transistörler BD Tipi (amperli) , fakat Motoru On/Off yapacak Q1 transistörü BC tipi (amper düşük) seçilmiş.Q1 de aynı şekilde en az BD135 tipinde olmalı.
    ———-
    Motor beslemesi Q1 Kollektörü üzerinden +12V ile beslenmiş (yukarı ok simgesi ile).Yine aynı şekilde PIC ve devresi de yukarı ok simgesi ile + besleme verilmiş , herhangi bir voltaj belirtilmemiş.Bunların da +12V ile besleneceği izlenimi doğmuş.Fakat PIC ve devresi +5V ile beslenmeli (MCLR 1nolu pin , RV1 potu , R4-5-6 Pull Up dirençleri ve şemada görülmeyen PIC’in +Vcc beslemesi).
    Ayrıca PIC’in (-) besleme bağlantısı unutulmamalı.Xtal frekansı belirtilmeli , ………

    Reply

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bak Bakalım ?

Modbus POLL ile Allen Bradley Motor Sürücüsünün Haberleşmesi

Merhabalar arkadaşlar , Bu yazımızda RS485 yada Modbus haberleşmesi ile ilgilenen arkadaşl…