Ana Sayfa PIC Assembly - PIC C PIC16F84A ile DC Motor İleri-Geri Kontrolü

PIC16F84A ile DC Motor İleri-Geri Kontrolü

3 min read
20
0
8,454

DC motorlar uçlarına uygulanan DC gerilim ile çalışır. Genellikle besleme gerilimi motor gövdesinde yazar. Uygulanan gerilimin değeri değiştirilerek motorun hızı ve kutupları değiştirilerek motorun yönü ayarlanır.Şekilde motorun yön kontrolü gösterilmiştir. DC motorların yönü anahtarlama ile değiştirilir.Motorun yön kontrolünün bağlantı şeması gösterilmiştir.

z

İlk şekilde motor boştadır. Devrede tüm anahtarlar açık olduğundan motor besleme gerilimi almaz.

İkinci şekilde S1 ve S4 anahtarları kapalı konumdadır. Bu durumda motor saat yönünde döner.

Üçüncü şekilde S2 ve S3 anahtarları kapalı olduğundan motor saatin tersi yönünde döner.

Dördüncüde S2 ve S4 anahtarları kapalı konumdadır. Bu durumda motor her iki yönden şase potansiyeli aldığından motor durur. Bu durum çalışan motoru bulunduğu konumda tutmak için kullanılır.

Devrenin Malzemeleri

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

DEVRENİN ASSEMBLY PROGRAMI


LIST P=16F84A
INCLUDE "P16F84A.INC"
CALL PORT_KUR ;PORT_KUR alt programına git
TUS_ARA
BTFSS PORTB,0 ;DUR butonuna basılı mı?
CALL DUR ;evet DUR alt programına git
BTFSS PORTB,1 ;GERI butonuna basılı mı?
CALL GERI ;evet GERI alt programına git
BTFSS PORTB,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ç
CLRF TRISA ;PortA çıkış
MOVLW H'FF'
MOVWF TRISB ;PortB giriş
BCF STATUS,5 ;Bank 0’a geç
RETURN
DUR ;==========================================================

BSF PORTA,0                ;PortA.0 = “1”
BSF PORTA,1                 ;PortA.1= “1”
RETURN
GERI ;===========================================================

BCF PORTA,0                 ;PortA.0= “0”
BSF PORTA,1                  ;PortA.1= “1”
RETURN
ILERI ;===========================================================

BSF PORTA,0                  ;PortA.0=”1”
BCF PORTA,1                  ;PortA.1=”0”
RETURN
END

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

20 Yorumlar

  1. Sümeyye

    19 Aralık 2015 at 10:33

    .coff dosyası istiyor yardımcı olur musunuz

    Reply

    • Bilal Kaya

      Bilal Kaya

      19 Aralık 2015 at 12:33

      Merhabalar,
      Eğer yukarıdaki kodları yazdığınızda programınız çalışması gerekiyor..coff için farklı nedenler olabilir.
      Projenizi assembly ile programlamak zorunda mısınız yoksa c ile de programlayabiliyor musunuz?

      Reply

      • Sümeyye

        19 Aralık 2015 at 16:19

        Merhaba, kodun aynısını yazdım fakat hata verdi. Farklı nedenler dediğiniz nedir, nasıl çözüm bulabilirim? Programlama dili ikisi de olabilir.

        Reply

  2. Bilge

    23 Aralık 2015 at 14:39

    Devreyi 16F877A ile ve ccs c kodu ile yaptım. Proteusta çalıştırınca hiçbir hata vermemesine rağmen devreyi kurunca motorlar dönmüyor. İki motor arası gerilim alamıyorum. Ancak proteusta alabildim. Nedenini biliyorsanız yardımcı olabilir misiniz? Teşekkürler

    Reply

  3. Bilge

    23 Aralık 2015 at 14:41

    iki motor arası derken motorun iki ucu arasını kastettim. Devreyi tek motorla çalıştırıyorum.

    Reply

    • Bilal Kaya

      Bilal Kaya

      23 Aralık 2015 at 15:02

      16f877a da 12-31 no’lu pinler birleştirilip topraga verilmesi lazım.Ayrıca 11-32 no’lu pinler de birleştirilip +5 volta bağladınız mı?

      Reply

  4. Bilge

    25 Aralık 2015 at 16:11

    Teşekkür ederim butonlu devreyi çalıştırabildim. Ben çizgi izleyen robot yapıyorum şuanda 877A ile. CCS C ile yazıyorum kodunu. Devrem çok sağlıklı çalışmıyor. Acaba elinizde CCS C ile çizgi izleyen robot kodu varsa yardımcı olabilir misiniz ?

    Reply

  5. Çağla

    26 Aralık 2015 at 22:12

    Merhaba, ben ultrasonik sensörle Dc motor kontrolü yapıyorum. Sensörle mesafeyi okuyup lcd ye yazdırabiliyorum. Sensör kullanmadan 16F877A dan gelen bilgiyle motoru döndürebiliyorum. Fakat ikisini birleştirdiğimde motor dönmüyor. Nasıl bir yol izleyebilirim fikriniz varsa yardımcı olabilir misiniz?

    Reply

    • Burak Ablay

      Burak Ablay

      27 Aralık 2015 at 00:06

      Bunun hakkında siz hangi yolu izliyorsunuz bu önemli motor sabit bir sekildemi dönecek yoksa hızınımı değiştirmek istiyorsunuz ve okuduğunuz ultrasonic sinyali motorla nasıl etkinleştrmek istiyorsunuz ilk olarak bunların cevabını bulmanız gerekli..

      Reply

      • Çağla

        27 Aralık 2015 at 10:53

        Motorun hızı sabit olacak, hızını değiştirmek istemiyorum şuanda. Ultrasonik sensör mesafeyi algıladıktan sonra mesafe 5cm’den büyükse motor ileri yönde dönsün,5cm’den küçükse motor dursun istiyorum. Bunun için kodları yazdım fakat yazdığım kodlarla motor dönmüyor, nerede hata yaptığımı bulamıyorum.

        Reply

        • Burak Ablay

          Burak Ablay

          27 Aralık 2015 at 15:42

          İzlemeniz gereken yolu size ifade etmeye çalışayım.ultrasonic sensör yollanan ses dalgalarının geri gelme süresiyle ses dalga hızını çarparak konuma ulaşabilirsin.İlk olarak pic ile bu değeri algılayabilmeniz gerekmektedir. Algıladıktan sonra bu değer cm cinsine çevirerek if komutunu kullanarak programı dallandırmalısınız. Yani if(eğer) 5 cm den küçükse dc motorun + ucunun bulunduğu pine enerji vereceksiniz.if komutu ” c ” kodu için geçerlidir tabiki asemblyde yapıyorsanız c kodunu gömebilir yada if in karşılığını assembly de bulmanız gerekmektedir.

          Reply

  6. Çağla

    27 Aralık 2015 at 15:56

    Dediğiniz gibi if komutu kullanarak programı dallandırdım.Yazdığım kodu aşağıda paylaşıyorum.Nerede hata yaptığımı bilmiyorum istediğim gibi çalışmıyor kodlar.
    #include
    #fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
    #use delay (clock=8000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

    #define trig pin_a0
    #define echo pin_a1
    #define input1 pin_b0
    #define input2 pin_b1
    #define enable_1 pin_b2
    #define enable_2 pin_b3
    int16 mesafe;
    float sure;
    void main()
    {
    setup_psp(PSP_DISABLED); // PSP birimi devre dışı
    setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
    setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
    setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
    setup_adc(ADC_OFF); // ADC birimi devre dışı
    setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
    setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

    output_high(enable_1); // Köprü A seçili
    output_low(enable_2); // Köprü B pasif
    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);

    for(;;){ //trig pinine 15us lojik 1 yapılıyor
    output_high(trig); // trig pini 20 us açılıp
    delay_us(15); //kapatılıyor
    output_low(trig);

    while(!input(ECHO)) //echo pini bekle
    {}
    set_timer1(0); //echo pini 1 se timeri 0 la ve saymaya başla

    while(input(ECHO))
    {}
    sure=get_timer1(); //echo pini 0 olunca timer değerini süreye eşitle
    mesafe=(sure*0.0172)*4.2; //mesafe santimetre cinsinden hesaplanıyor
    if(mesafe==0)
    mesafe=0;
    if (mesafe>5)
    {
    output_high(input1); // L293 Input1 girişi lojik-1
    output_low(input2); // L293 Input2 girişi lojik-0
    }
    else
    {
    output_low(input1); // L293 Input1 girişi lojik-0
    output_low(input2); // L293 Input2 girişi lojik-0

    delay_ms(100);
    }
    }
    }

    Reply

    • Burak Ablay

      Burak Ablay

      27 Aralık 2015 at 16:43

      İf(mesafe==0)
      Mesafe=0 ı anlamadım onları ordan alıp deneyebilirsin, başka bir hata göremiyorum.

      Reply

  7. Çağla

    29 Aralık 2015 at 23:49

    İyi akşamlar, biz şuanda motorları döndürüyoruz sensörden gelen bilgiyle. Sorunsuz çalışıyor. Tek bir sorunumuz var,devreye güç verdiğimiz gibi çalışmıyor .Çalışması için PIC’in 1.bacağı olan MCLR’ ye herhangi bir kabloyla dokunmamız gerekiyor. O picin reset bacağı olduğundan onu uyarmak için böyle bişey yapmamız gerekiyo sanırım ama hoş durmuyor onun bir çözümü var mıdır acaba. Nasıl bir çözüm üretebiliriz yardımcı olursanız seviniriz .

    Reply

  8. Burak Ablay

    Burak Ablay

    2 Ocak 2016 at 00:29

    Böyle bir sorunla daha önce hiç karşılaşmadım. MCLR ucu +5 V ta sabit olarak kalmalıdır. Devre bağlantılarını ve kullandığınız boardu yada plaketi değiştirerek tekrar denemenizi öneririm. İyi çalışmalar dilerim..

    Reply

  9. Çağla

    21 Ocak 2016 at 20:05

    Merhaba iyi akşamlar biz ultrasonik sensörle dc motor kontrolü yapıyoruz.mesafe 5 cm den büyükse ileri gitsin 5cmden küçükse sağa dönsün istiyoruz.fakat keskin dönüş yaptıramıyoruz.pwm kullanmayı bilmediğimiz için delay komutuyla yapmaya çalıştık.yazdığımız kodlar aşağıdadır.bilginiz varsa yardımcı olur musunuz.kolay gelsin.
    #include
    #FUSES NOWDT, HS, NOPUT, PROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
    #use delay(clock=4000000)
    #define trig pin_b0
    #define echo pin_b1
    #define input1 pin_b6
    #define input2 pin_b7
    #define input3 pin_b2
    #define input4 pin_b3
    #define enable_1 pin_b4
    #define enable_2 pin_b5

    float sure;
    int mesafe ;
    void main()
    {
    setup_psp(PSP_DISABLED); // PSP birimi devre dışı
    //setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
    setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
    setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
    setup_adc(ADC_OFF); // ADC birimi devre dışı
    setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
    setup_CCP2(CCP_OFF);

    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); // initiating timer

    set_tris_b(0b00000000); //
    set_tris_a(0x00);
    output_a(0x00);
    //set_tris_b(0x00);
    output_b(0x00);

    //Example blinking LED program
    while(true)
    {
    output_high(trig);
    delay_us(15);
    output_low(trig);

    while(!input(echo))
    {}

    set_timer1(0);

    while(input(echo))
    {}

    sure=get_timer1();
    mesafe=sure*4/27;
    output_high(enable_1); // Köprü A seçili
    output_high(enable_2); // Köprü B pasif
    if(mesafe>5)
    { //Distance değerine göre (cm cinsinden) burda işlem yapabilirsiniz .
    output_high(pin_b6);
    output_low(pin_b7);
    output_high(pin_b2);
    output_low(pin_b3);
    }
    else
    {
    output_high(pin_b6);
    output_low(pin_b7);

    output_low(pin_b3);
    output_high(pin_b2);
    delay_ms(3);

    output_low(pin_b2);
    output_low(pin_b3);
    delay_ms(3);

    //delay_ms(100);
    }

    }

    }

    Reply

  10. Furkan

    2 Mart 2018 at 21:52

    Merhaba 😄 Ben lise öğrencisiyim bu devrenin protonda If komutu ile yazılmış hali nasıl oluyor perf. Ödevi de yardımcı olursanız sevinirm.😊

    Reply

  11. UMUT MUSLU

    4 Nisan 2018 at 19:53

    Merhabalar şematiği isiste deneme amaçlı kuracaktım fakat soldaki transistörlerin arasındaki yuvarlak devre elemanının ne olduğunu ve malzemele listenizdeki 1Klık dirençleri koymuş olduğunuz şematik üzerinde göremediğim için devreyi bitiremedim yardımcı olabilir misiniz?

    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…