Elektronik / Mikrodenetleyici Projeleri/

PIC16F877 ile ileri geri step motor sürücü devresi ccs

harmankaya.org sitesinde paylaşılan bir proje “step motor sürücü devre şeması ccs c kodu hex” kontrol pic-16f877 ile sağlanmış ileri geri step-motor kontrolü yapılabiliyor 2×16 lcd ekran üzerinde adım bilgilerini görebiliyorsunuz 12volt sürücü bölümünde bc548 transistörler kullanılmış

ayrıca “Elektronik-PIC” kategorisinde faydalı bilgiler uygulamalar bulunmakta incelemenizi öneririm

ccs-stepmotor

Proje detayları kod ve proteus isis dosyaları : Step-Motor-Sürücü alternatif link: PIC16F877 ile ileri geri step motor sürücü devresi ccs

Dosya indirme LINK listesi (TXT formatında) link-7007.zip şifre-pass: 320volt.com

Yazılım içeriği

/*******************************
      PIC16F877 ile Step Motor Uygulaması
                Erhan HARMANKAYA
              erhan@harmankaya.org
                17 Haziran 2008
*******************************/  

#include <16f877.h>     // Ben 16f877 kullandım siz kendinize göre düzeltebilirsiniz
                        //Not: 16f628 de ADC modülü mevcut DEĞİL!
#device ADC=10  // 10 bitlik ADC kullanılacağız
// ayarlar
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) //Kullandığımız Osilatörün Clock frekansı

#define use_portb_lcd TRUE   // LCD B portunda

#include   //lcd yi kullanacağız

#define buton_ileri pin_c4

#define buton_geri  pin_c5

signed int8  ADIM=0;

int16 Vref,Vcikis;

float filtre;

unsigned int8 sayac;

char durum;


#int_timer1  // Timer1 kesmesi
void  timer1_kesme ()  
{
   set_timer1(63036); 


  switch(durum)
         {
         case 1 :  printf(lcd_putc,"\fADIM=%d %4.1Lu ms\nKonum: -->>", ADIM,Vcikis); break;
         case 2 :  printf(lcd_putc,"\fADIM=%d %4.1Lu ms\nKonum: <<--", ADIM,Vcikis); break;
         case 3 :  printf(lcd_putc,"\fADIM=%d %4.1Lu ms\nKonum: ----", ADIM,Vcikis); break;
         case 4 :  printf(lcd_putc,"\fADIM=%d %4.1Lu ms\nKonum: #HATA#", ADIM,Vcikis); break;
         }
   delay_ms(10);
   
   if(Vcikis<10){ //10ms dweğerinden küçük beklemelerde ikaz ver.! (:
   
         lcd_gotoxy(14,2);
          lcd_putc("-!-");
          delay_ms(5);
   }else{
   delay_ms(6);
   }

}

void main ( )
{
         lcd_init();
         delay_ms(10);
         printf(lcd_putc,"\fCCP-Timer-ADC\n Ayarlaniyor...");
         delay_ms(1500);
         
         setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
         setup_spi(SPI_SS_DISABLED);     // SPI 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_timer_1(T1_INTERNAL | T1_DIV_BY_8);
         set_timer1(63036);  
   
         setup_adc_ports( ALL_ANALOG);
         setup_adc(adc_clock_internal);
         set_adc_channel(2);   
         
         setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
         setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı
         
         printf(lcd_putc,"\fPortD Ayarlaniyor...");
         delay_ms(1500);
         
         output_d(0x00);
         
         printf(lcd_putc,"\fTimer1 Kesmesi\nAyarlaniyor...");
         delay_ms(1500);
         
         enable_interrupts(INT_timer1); // int_timer1 kesmesini aktif yapar
         enable_interrupts(GLOBAL);     // Aktif edilen kesmelere izin ver

         printf(lcd_putc,"\fHazir...");
         delay_ms(5);

   while(1) //herzaman burada kal
   {
   
      set_adc_channel(2);
      Vref = read_adc();  //potansiyometreden alınan gerilim
      delay_us(50);
      Vcikis=Vref/16;
      
      
   
  

      if (input(buton_ileri)) // İLERİ Butonuna basıldı ise
      {
         delay_ms(Vcikis);
         ADIM = ADIM+1;
         if( ADIM == 9)
         {
         ADIM=1;
         durum=1;
         }
      }

      if (input(buton_geri)) // GERİ Butonuna basıldı ise
      {
         delay_ms(Vcikis);
         ADIM = ADIM-1;
         if( ADIM < 1)
         {
         ADIM=8;
//!         printf(lcd_putc,"\fADIM=%d\nKonum: -->>", ADIM);
//!         delay_ms(10);
         durum=2;
         }
      }
      
            if (input(buton_geri)&input(buton_ileri)) // İki butona da basılıyor ise;
      {

         durum=3;
         
      }
      //Bu koşul iki butona da basıldığında HATA durumunun oluşacağını bilgirir.
      
             if (!input(buton_geri)&!input(buton_ileri)) // İki butona da basılmıyor ise;
      {

         durum=4;
         
      }
      delay_ms(Vcikis);
      
      
            switch(ADIM)
         {
         case 1 : output_d(0b00000001); break;
         case 2 : output_d(0b00000011); break;
         case 3 : output_d(0b00000010); break;
         case 4 : output_d(0b00000110); break;
         case 5 : output_d(0b00000100); break;
         case 6 : output_d(0b00001100); break;
         case 7 : output_d(0b00001000); break;
         case 8 : output_d(0b00001001); break;
         }
     
   }
}
  1. altan 2009/07/06
  2. Erhan 2009/11/05
  3. EREN 2011/12/18
  4. özge 2013/09/04

Yorum

Soru: