Ana sayfa | Hakkımda | İletişim | Sosyal platform
PIC CCS C & ASM / Uygulamalar
Step motor hız kontrol uygulaması

Bu uygulamamızda bipolar step motorun hızını ayarlayacağız. Tam adım olarak kutuplarını enerjilendireceğiz. Ek olarak LCD üzerinde step motorun hızı ve hızı ile orantılı olarak bar göstergesi bulunmaktadır. Step motorumuzu gerçek zamanlı olarak sürmekteyiz. Bunun için timer0 sayacını kullandık.

Timer 0 ayarları

4MHz kristal için bölme oranını 1 seçtik. Her 200 mikro-saniyede bir kesme oluşturduk. Her kesmeye gittiğimizde ise kesme sayacını bir arttırdık ve kesme sayacımız 4 olduğunda 1 mili-saniye elde ettik.

Sonra oluşturduğumuz bu mili-saniye sayacını butonlar ile arttırma ve azaltma yaptığımız buton_deger değişkenimiz ile karşılaştırdık ve adımlar arası süreyi bu şekilde oluşturmuş olduk.

Bar göstergesi için buton_deger değişkeninin maksimum değerini 16'ya bölüp 0.16 katsayısı ile çarparak doldurulacak lcd sütun değerlerini belirledik. Aşağıda kodu inceleyebilirsiniz.

Tam adım port çıkış değerleri sırası ile; 5, 6, 10, 9

NOT: Projeyi bilgisayarınızda derlemek için arşivden çıkarttığınız klasörde yer alan lcd.c sürücüsünün bilgisayarınızdaki adresini yazılım dosyasındaki uzantı ile değiştiriniz.

Uygulamayı indirmek için buraya tıklayınız.

Arşiv parolası: elektrocavus.com


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
#include <16f628a.h>
#use delay(clock=4M)
#fuses XT, NOWDT  
#use fast_io(b)  // B portu için port yönlendirme aktif

unsigned int8 tam_adim[4]={5, 6, 10, 9};
unsigned int8 i=0, j=0, buton_deger=51;
unsigned int16 mikro_saniye=0;
unsigned int8  mili_saniye=0;
float hiz=0;

#define LCD_DATA_PORT getenv("SFR:PORTB")
//Dosyayı arşivden çıkardıktan sonra klasör içerisindeki lcd.c dosyasının
//bilgisayarınızdaki dizin adresini aşağıya yapıştırın. 
//Yoksa hata alırsınız. 
#include <\c:\users\_sistem\desktop\step_uyg\lcd.c>

#define arti   input(pin_b2)
#define eksi   input(pin_b3)
#int_rtcc
Void timer0_kesmesi()
{
   set_timer0(55);  // Bir sonraki kesme için başlangıç değeri belirlendi.
   if(mikro_saniye!=4)
      mikro_saniye++;
   else
   {
      mikro_saniye=0;
      if(buton_deger>mili_saniye)
         mili_saniye++;
      else
      {
         mili_saniye=0;
         output_a(tam_adim[i]);
         if(i!=3)
            i++;
         else
            i=0;
            
      }
   }
   
}

Void bar_cubuk_hiz()
{
   
   for(j=0;j<16-(buton_deger*0.16);j++)
   {
      lcd_gotoxy(j+1,1);
      printf(lcd_putc,"%c",255);
   }   
   for(j=1;j<(buton_deger*0.16);j++)
   {
      lcd_gotoxy(17-j,1);
      printf(lcd_putc," ");
   }
   
   hiz=300/(1.0*buton_deger);  // Hız formülü
   lcd_gotoxy(6,2);
   printf(lcd_putc,"%5.1f rpm",hiz);
}

Void main()
{
   output_b(0);
   set_tris_b(0b00001100); 
   
   SETUP_TIMER_0(RTCC_INTERNAL | RTCC_DIV_1);
   set_timer0(55); // yaklaşık 10ms de bir kesme

   lcd_init();
   printf(lcd_putc,"\fElektro CAVUS\n");
   delay_ms(500);
   printf(lcd_putc,"\fBipolar step\n motor uyg.");
   delay_ms(500);
   printf(lcd_putc,"\f\nHIZ:");
   
   bar_cubuk_hiz();
   
   enable_interrupts(int_timer0); // timer 0 kesmesi aktifleştirildi.
   enable_interrupts(global);     // Bütün kesmelere izin verildi. 
   for(;;)
   {
      
         if(arti)
         {
            delay_ms(10);
            if(buton_deger!=1)
               buton_deger--;
            bar_cubuk_hiz();
         }
         
         if(eksi)
         {
            delay_ms(10);
            if(buton_deger!=101)
               buton_deger++;    
            bar_cubuk_hiz();
         }               
              
   }
}
ELEKTRO ÇAVUŞ
Ana sayfa | Hakkımda | İletişim | Sosyal platform | Android market | Tişört market
ELEKTRO ÇAVUŞ2012 | elektrocavus.com