24 Ocak 2014 Cuma

ARM-STM32F4 DISCOVERY İLE DİJİTAL KRONOMETRE

   Merhaba arkadaşlar yeni bir projemizi daha sizlerle paylaşıyorum.Bu projeyi Miraç Aydoğan ile birlikte gerçekleştirdik.Proje çalışması sırasında yardım ve desteklerini esirgemeyen sayın Ömer Faruk Özgüven Hocama teşekkür ederiz.
    Bu projede STM32F4 discovery geliştirme kiti ile dört displayi dinamik sürerek bir kronometre yapacağız.Önce STM32F4 discovery kitini biraz inceleyelim.STM32F4 discovery ST firması tarafından üretilmiş ve üzerinde ARM Cortex M4 tabanlı mikrodenetleyici (STM32F407VG) barındıran bir geliştirme kitidir.STM32F407VG mikrodenetleyicisi 168MHz'e kadar çalışma frekansı sağlamaktadır.

 
STM32F4 Discovery


   Kit üzeride 2 adet buton ve 4 adet led yer almaktadır.Bu ledler ve butonlar bazı projelerde kullanıcıya kolaylık sağlamaktadır.Mavi buton  kullanıcıya bırakılmış (user butonu ) butondur.User butonu  PA0 pinine bağlıdır.Siyah buton ise reset butonudur.Dört tane  ledimiz de D portunun 12,13,14 ve 15. pinlerine bağlıdır. Bağlantıları ise  şu şekildedir;   PD12-YEŞİL LED PD13-TURUNCU LED , PD14-KIRMIZI LED , PD15-MAVİ LED .
    


  STM32F4 discovery için genel bilgiler bu kadar ayrıntılı bilgiye bu linkten ulaşabilirsiniz. http://miracaydogan.com/2013/12/22/stm32f4-discovery/
  STM32F407VG mikrodenetleyicisini programlamak için mikroC PRO for ARM derleyicisini tercih ettik.MikroC derleyisini bu linkten indirebilirsiniz. http://www.mikroe.com/mikroc/arm/ 
   Şimdi kronometremizi nasıl yapacağımızı açıklayalım  ardındanda devremizi ve programımızı inceleyelim.Kronometremizde 4 adet ortak anot display yer alacak.Bu 4 displayin  a-b-c-d-e-f-g ayaklarını birbirine bağlayıp sonra 74LS47 ortak anot display sürücü entegre ile displayleri süreceğiz. Yani displayleri dinamik olarak süreceğiz bunun için transistörlerin anahtarlama özelliğinden yararlanarak displayleri tek tek tarayacağız.Tabi bunu yazdığımız program ile sağlayacağız.
      Şimdi ortak anot displayi ve ardındanda 74LS47 entegrsini inceleyelim.



  Ortak anotlu displayde herhangi bir segmentin yanmasını istiyorsak o segmentin katodunu 100-330 ohm'luk direnç üzerinden toprağa bağlamamız gerekir.
   74LS47 entegresi ile ortak anot displayimizi süreceğiz.


    Şimdi de devremizi incelersek daha iyi anlayacaksınız.



   Devremizden de görüldüğü üzere arm işlemcimizin  D portunun PD12,PD13,PD14 ve PD15 pinleri  üzerinden sayma işlemi gerçekleştirilip 74LS47 entegresinin A,B,C,D girişlerine bağlanmıştır. 74LS47 entegresinin  a,b,c,d,e,f,g çıkışlarına displaylerin ayakları doğru bir şekilde bağlanmıştır. B portunun PB0,PB1,PB2 ve PB3 pinleri üzerinden ise displayler taranmıştır.Tarama işemi için displaylerin ortak anot  noktalarına (+5V besleme noktası) BC109 npn transistörlerinin emiterleri bağlanmıştır. Transistörlerin kollektörleri ise +5V'a bağlanmıştır.Ve daha sonra transistörlerin beyzinden anahtarlama yapılarak displaylerin taranması sağlanmıştır.
  Şimdi mikroC derleyicisinde yazdığımız programımızı inceleyelim.
//////

void display_tara();
 int sn1[]={0x0000,0x1000,0x2000,0x3000,0x4000,0x5000,0x6000,0x7000,0x8000,0x9000};
 int sn2[]={0x0000,0x1000,0x2000,0x3000,0x4000,0x5000};
 int dk1[]={0x0000,0x1000,0x2000,0x3000,0x4000,0x5000,0x6000,0x7000,0x8000,0x9000};
 int dk2[]={0x0000,0x1000,0x2000,0x3000,0x4000,0x5000};
 int i=0,j=0,k=0,l=0, y;
void Timer2_interrupt() iv IVT_INT_TIM2 {
  TIM2_SR.UIF = 0;

     i++;
     if(i==10){ i=0;   j++;}
     if(j==6) {j=0;    k++;}
     if(k==10){k=0; l++;}
     if(l==6)  l=0;
}

void main() {
  GPIO_Digital_Input(&GPIOA_IDR, _GPIO_PINMASK_0);
  GPIO_Digital_Output(&GPIOD_ODR, _GPIO_PINMASK_ALL);
  GPIO_Digital_Output(&GPIOB_ODR, _GPIO_PINMASK_ALL);
  GPIOD_ODR=0;
  GPIOB_ODR=0;


  RCC_APB1ENR.TIM2EN = 1;       // Enable clock gating for timer module 2
  TIM2_CR1.CEN = 0;             // Disable timer
  TIM2_PSC = 248;               // set timer prescaler
  TIM2_ARR = 63999;
  NVIC_IntEnable(IVT_INT_TIM2); // Enable timer interrupt
  TIM2_DIER.UIE = 1;            // Update interrupt enable
  TIM2_CR1.CEN = 1;             // Enable timer

  while(1){
           display_tara();
          
        if(GPIOA_IDR.f0==1){ 
           TIM2_CR1.CEN = 0;
          delay_ms(50);
         y=1;
         while(GPIOA_IDR.f0);
         delay_ms(50);
         while(y){
         
            display_tara();
         
          if(GPIOA_IDR.f0==1){
           TIM2_CR1.CEN = 1;
           y=0;
           delay_ms(50);
           while(GPIOA_IDR.f0);
          delay_ms(50);
          }
         }
      }
  }
}
void display_tara(){
          GPIOB_ODR.f0=1;
          GPIOB_ODR.f1=0;
          GPIOB_ODR.f2=0;
          GPIOB_ODR.f3=0;
          GPIOD_ODR=sn1[i];
          delay_us(100);
          GPIOB_ODR.f0=0;
          GPIOB_ODR.f1=1;
          GPIOB_ODR.f2=0;
          GPIOB_ODR.f3=0;
          GPIOD_ODR=sn2[j];
          delay_us(100);
          GPIOB_ODR.f0=0;
          GPIOB_ODR.f1=0;
          GPIOB_ODR.f2=1;
          GPIOB_ODR.f3=0;
          GPIOD_ODR=dk1[k];
          delay_us(100);
          GPIOB_ODR.f0=0;
          GPIOB_ODR.f1=0;
          GPIOB_ODR.f2=0;
          GPIOB_ODR.f3=1;
          GPIOD_ODR=dk2[l];
          delay_us(100);
}

//////
   Programda STM32F407VG mikrodenetleyicisini seçtik ve 16MHz clock freakansına ayarladık. Programımızda timer2 kullandık.Timer2'nin 1sn'yede bir gelmesini sağladık.Timer içinde i,j,k ve l değişkenlerini artırdık ve belirli koşullarda bu değişkenleri sıfırladık.Ana programımız içinde ise buton kontrolü ile birlikte  alt program olarak yazdığımız void display_tara() fonksiyonunu çağırıp displaylerin taranma işlemini sağladık.Butona basıldığında veya basılı tutulduğunda timer2'yi devre dışı (disable ettik) bıraktık.Ve  "y" değişkenimize '1' atadık.Böylece while(y) sonsuz döngü içine girmiş olduk ve bu sonsuz döngü içerisinde tarama işlemimiz hala devam etmektedir.Butona tekrar basıldığında veya basılı tutulduğunda ise timer2'yi tekrar aktif (enable) ettik ardından da "y" değişkenimize '0' atadık ve while(y) döngüsünden çıktık.Bu şekilde buton kontrolünü sağlamış olduk ve aynı zamanda tarama işleminin butona basıldığında da devam etmesini sağladık.
   Programımızıda anlattık yine eğer programda sorun yaşadığınız yer olursa yardımcı olmaya çalışırım.
 Artık projemizin son halini görebiliriz.


            


 

 

 

 

 

 

   Bir projenin daha sonuna geldik.Farklı  projelerde görüşmek dileğiyle. İlgilenen arkadaşlara kolay gelsin.Başarılar dilerim hepinize...












1 yorum:

  1. Merhaba bu proje ile ilgili sizden bilgi almak istiyorum. Nasıl ulaşabilirim ?

    YanıtlaSil