LPC176X 4 Kanal Capture Kodu

Başlatan mistek, 03 Ocak 2014, 09:29:51

mistek

LPC176X içinde her timer'a bağlı 2 adet Capture Birimi bulunuyor.

Kod parçası Timer 2 ve Timer 3 içindir.

PWM sinyali okumak için yazmıştım. Capture birimi her yükselen ve düşen kenarda Sayıcı değerini yakalayıp iki kenar arasındaki farkı alarak Duty_Cycle değerini oluşturmaktadır.

void capture_init(uint8_t bolme_orani)
{
		LPC_SC -> PCONP |= 1 << 22;		//Timer2 aktif
		LPC_SC -> PCONP |= 1 << 23;		//Timer3 aktif

LPC_SC -> PCLKSEL1  &= (~(3 << 12));	//Timer2 clock = PCLK=CCLK/4
LPC_SC -> PCLKSEL1  &= (~(3 << 14));	//Timer3 clock = PCLK=CCLK/4
		
		
LPC_PINCON -> PINSEL0 |= 3 << 8;	// P0.4  pini CAP2.0 için ayarli
LPC_PINCON -> PINSEL0 |= 3 << 10;	// P0.5  pini CAP2.1 için ayarli
LPC_PINCON -> PINSEL1 |= 3 << 14;   // P0.23 pini CAP3.0 için ayarli
LPC_PINCON -> PINSEL1 |= 3 << 16;   // P0.24 pini CAP3.1 için ayarli 

		/*PINMODE AYARI GEREKEBILIR ÇALISMAZSA GÖZDEN GEÇIR*/
		/*
		LPC_PINCON -> PINMODE0 |= 1 << 9;
	        LPC_PINCON -> PINMODE0 |= 1 << 11;
		LPC_PINCON -> PINMODE0 |= 1 << 31;
		LPC_PINCON -> PINMODE1 |= 1 << 1;
		*/

		LPC_TIM2 -> PR = bolme_orani;		// Timer2 Prescaler
		LPC_TIM3 -> PR = bolme_orani;	    // Timer3 Prescaler

LPC_TIM2 -> IR  |= 0xFF;	//Interrupt Register 2(Flag) Reset
LPC_TIM3 -> IR  |= 0xFF;	//Interrupt Register 3(Flag) Reset

		LPC_TIM2 -> CTCR &= 0x00;   // Counter/Timer mode: TC yi her PCLK darbesinde arttýr 

		LPC_TIM2 ->	CCR |= 1 << 0;	// CAP2.0 Yükselen kenarda TC yi CR0 a yükle CR0=TC
		LPC_TIM2 -> CCR |= 1 << 1;	// CAP2.0 Düþen kenarda TC yi CR0 a yükle CR0=TC
		LPC_TIM2 -> CCR |= 1 << 2;	// CR0 a herhangi bir yükleme yapýlýrsa kesme oluþtur
		LPC_TIM2 -> CCR |= 1 << 3;	// CAP2.1 Yükselen kenarda TC yi CR1 a yükle CR0=TC
		LPC_TIM2 -> CCR |= 1 << 4;	// CAP2.1 Düþen kenarda TC yi CR1 e yükle CR0=TC
		LPC_TIM2 -> CCR |= 1 << 5;	// CR1 a herhangi bir yükleme yapýlýrsa kesme oluþtur

		LPC_TIM3 ->	CCR |= 1 << 0;	// CAP3.0 Yükselen kenarda TC yi CR0 a yükle CR0=TC
		LPC_TIM3 -> CCR |= 1 << 1;	// CAP3.0 Düþen kenarda TC yi CR0 a yükle CR0=TC
		LPC_TIM3 -> CCR |= 1 << 2;	// CR0 a herhangi bir yükleme yapýlýrsa kesme oluþtur
		LPC_TIM3 -> CCR |= 1 << 3;	// CAP3.1 Yükselen kenarda TC yi CR1 a yükle CR0=TC
		LPC_TIM3 -> CCR |= 1 << 4;	// CAP3.1 Düþen kenarda TC yi CR1 a yükle CR0=TC
		LPC_TIM3 -> CCR |= 1 << 5;	// CR1 a herhangi bir yükleme yapýlýrsa kesme oluþtur	

NVIC_EnableIRQ(TIMER2_IRQn); 	// Timer2 kesmesini aç 	(Kesme adresini yükle)
LPC_TIM2 -> TCR &= (1 << 1); 	// Sayiciyi sifirla durdur.   

NVIC_EnableIRQ(TIMER3_IRQn); 	// Timer3 kesmesini aç 	(Kesme adresini yükle)
LPC_TIM3 -> TCR &= (1 << 1); 	// Sayiciyi sifirla durdur.
    
		LPC_TIM2 -> TCR |= 1 << 0; 		// Timer2 baþlasýn.
		LPC_TIM3 -> TCR |= 1 << 0; 		// Timer3 baþlasýn.
		return;
}


Timer2 Kesmesi Fonksiyonu data1 ve data2 global değişkendir.
void TIMER2_IRQHandler(void)
{
static uint32_t timer2_cr0[2]={0, 0};   //Timer 2 Capture Register 0 
static uint32_t timer2_cr1[2]={0, 0};   //Timer 2 Capture Register 1
static uint8_t t2cr0=0;
static uint8_t t2cr1=0;   


      if(LPC_TIM2 -> IR & (1 << 4)){   
            timer2_cr0[t2cr0] = LPC_TIM2 -> CR0;
            LPC_TIM2 -> IR |= 1 << 4;
      }
   
      if(LPC_TIM2 -> IR & (1 << 5)){
            timer2_cr1[t2cr1] = LPC_TIM2 -> CR1;
            LPC_TIM2 -> IR |= 1 << 5;
      }   

      t2cr0++;
      t2cr1++;

      if(t2cr0 == 2){
        Data1 = timer2_cr0[1] - timer2_cr0[0];
            t2cr0 = 0;
            LPC_TIM2 -> TCR |= (1 << 1);    // Sayıcıyı syfyrla durdur.
            LPC_TIM2 -> TCR &= 0;
            LPC_TIM2 -> TCR |= 1 << 0;       // Timer2 baslasın.
      }
   
      if(t2cr1 == 2){
           data2 = timer2_cr1[1] - timer2_cr1[0];
            t2cr1 = 0;
            LPC_TIM2 -> TCR |= (1 << 1);    // Sayycyyy syfyrla durdur.
            LPC_TIM2 -> TCR &= 0;
            LPC_TIM2 -> TCR |= 1 << 0;       // Timer2 ba?lasyn.
      }
}




Timer3 Kesmesi Fonksiyonu data3 ve data 4 global değişkendir.
void TIMER3_IRQHandler(void)
{
static uint32_t timer3_cr0[2]={0, 0};   //Timer 2 Capture Register 0 
static uint32_t timer3_cr1[2]={0, 0};   //Timer 2 Capture Register 1
static uint8_t t3cr0=0;
static uint8_t t3cr1=0;

      if(LPC_TIM3 -> IR & (1 << 4)){   
            timer3_cr0[t3cr0] = LPC_TIM3 -> CR0;
            LPC_TIM3 -> IR |= 1 << 4;
      }
   
      if(LPC_TIM3 -> IR & (1 << 5)){
            timer3_cr1[t3cr1] = LPC_TIM3 -> CR1;
            LPC_TIM3 -> IR |= 1 << 5;
      }

      t3cr0++;
      t3cr1++;
   
      if(t3cr0 == 2){
           data3 = timer3_cr0[1] - timer3_cr0[0];
            t3cr0=0;
            LPC_TIM3 -> TCR |= (1 << 1);    // Sayycyyy syfyrla durdur.
            LPC_TIM3 -> TCR &= 0;
            LPC_TIM3 -> TCR |= 1 << 0;       // Timer3 ba?lasyn.
      }
   
      if(t3cr1 == 2){
           data4 = timer3_cr1[1] - timer3_cr1[0];
            t3cr1=0;
            LPC_TIM3 -> TCR |= (1 << 1);    // Sayycyyy syfyrla durdur.
            LPC_TIM3 -> TCR &= 0;
            LPC_TIM3 -> TCR |= 1 << 0;       // Timer3 ba?lasyn.
      }   
}


Sistem frekansı(CCLK) 100MHz olsun. Timer2 ve Timer3 PCLK=CCLK/4

Örnek Kullanım
int16_t data1=0;
int16_t data2=0;
int16_t data3=0;
int16_t data4=0;

//Fonksiyon Prototipleri
int main(void)
{
     capture_init(9); //PCLK=CCLK/4 -----> Timer sayma Frekansı=25MHz/(9+1)

    //İlgili pinlere sinyal geldiğinde data1,data2,data3,data4 hazır.

}


Not: Bu konunun anlatımına görsel eklenecek.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R