Ana sayfa | Hakkımda | İletişim | Sosyal platform | Bloğum
PIC CCS C & ASM / Uygulamalar
Timer 1 ile servo motor sürme

Bu uygulamada 4 adet servo motoru aşağıdaki senaryoya göre sürmekteyiz.

Bütün servo motorlar yaklaşık 10'ar derece hareket etmektedir.

1. servo her saniyede, 2. servo iki saniyede, 3. servo üç saniyede, 4. servo dört saniyede bir dönecektir ve son dereceye ulaştığında aynı senaryo geriye doğru işleyecektir. Bu işlem sürekli devam edecektir.

Uygulamada timer1 zamanlayıcısı kullanılmıştır.

Kontrol etmeniz gerekenler;

  1. 16f877A PIC mikrodenetleyicisinin çalışma frekansını 40MHz yapınız.
  2. Servo motorların minimum açı değerini 1m, maksimum açı değerini 2.8m yapınız.
  3. Dönme hızını 120 yapınız.

İlgili denetleyici ile pratikte 40MHz kullanılarak yapılan bu uygulamanın çalışma garantisi yoktur. İlgili mikrodenetleyici datasheetinde maksimum 20MHz kullanılması önerilmiştir. Ben açı değerini olabildiğince düzgün gösterebilmek için 40MHz olarak kullandım. 40MHz kullanılmayarak yapılabilecek yollarda mevcuttur. Bu uygulamadaki amaç öğrenciye kontrol mekanizmasının nasıl düşünüleceğine dair fikir vermektir.

Uygulamayı buraya tıklayarak indirebilirsiniz.

Arşiv parolası isterse: elektrocavus.com

NOT: İndirme bağlantısına tıkladıktan sonra tarayıcınızda beliren pop-up engeline izin veriniz. Yoksa indirme yapamazsınız.


  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
101
102
103
104
105
106
107
108
109
110
#include <16f877a.h>
#fuses HS, NOWDT, BROWNOUT
#use   delay(clock=40M)
#use   fast_io(b)

#define servo_1 pin_b0
#define servo_2 pin_b1
#define servo_3 pin_b2
#define servo_4 pin_b3

unsigned int16 derece_sayac[4]={0};
unsigned int8  dereceler[4]={0};
unsigned int8  yon[4]={0};
unsigned int8  i=0;


unsigned int16 servo_periyot[4]={0};
unsigned int16 servo_sure[4]={10000, 20000, 30000, 40000};

/*
servo1_sure  10000  // 1 / 0.0001 --- Bir saniye için
servo2_sure  20000  // 2 / 0.0001 --- İki saniye için
servo3_sure  30000  // 3 / 0.0001 --- Üç saniye için
servo4_sure  40000  // 4 / 0.0001 --- Dört saniye için
*/

#int_timer1
Void timer1_kesmesi()
{
   set_timer1(64535);   // 100us

   for(i=0;i<4;i++)
   {
      servo_periyot[i]++;
      derece_sayac[i]++;
   }
   
   for(i=0;i<4;i++)
   {
      if(servo_periyot[i]==servo_sure[i])
      {
         servo_periyot[i]=0;
         
         if(dereceler[i]!=18 && yon[i]==0) 
            dereceler[i]++;
         else if (dereceler[i]==18 && yon[i]==0)
            yon[i]=1;
            
         if(dereceler[i]!=0 && yon[i]==1)
               dereceler[i]--;
         else if(dereceler[i]==0 && yon[i]==1)
            yon[i]=0;
   
      }
   }
   
   //1ms = 10
   for(i=0;i<4;i++)
   {
      if(derece_sayac[i]<dereceler[i]+10)
      {
         if(i==0)
            output_high(servo_1);
         if(i==1)
            output_high(servo_2);
         if(i==2)
            output_high(servo_3);
         if(i==3)
            output_high(servo_4);
      }
      else
      {
         if(i==0)
            output_low(servo_1);
         if(i==1)
            output_low(servo_2);
         if(i==2)
            output_low(servo_3);
         if(i==3)
            output_low(servo_4);
       
       if(derece_sayac[i]==200)
            derece_sayac[i]=0;
      }
   }
      
}


Void main()
{  
   set_tris_b(0);
   SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_1);
   /*
   Simülasyondaki servo motorlarımız 1-2.8ms arasındaki lojik 1 ile çalışır. 
   Periyodumuz 20ms olacak. 
   180 derecelik açının 10'ar dereceye tekabül ettiği süre: 1800us / 18 = 100
   Ben 100us'lik bir kesme süresi oluşturacağım. 
   Sonraki işlemler için değişlenleri kullanacağım.
   fs/4 = 10M
   1/10M = 0.0000001sn
   0.0001/0.0000001 = 1000 
   65535-1000 = 64535
   */
   set_timer1(64535);
   enable_interrupts(int_timer1);
   enable_interrupts(GLOBAL);
   while(1);
}
ELEKTRO ÇAVUŞ
Ana sayfa | Hakkımda | İletişim | Sosyal platform | Bloğum | Android market | Tişört market
ELEKTRO ÇAVUŞ2012 | elektrocavus.com