lpc1769 Capture,PWM problem

Başlatan mistek, 20 Ekim 2012, 18:39:49

mistek

Öncelikle merhaba;

Bir süredir LPC1769(LPCXPRESSO) ile uğraşıyorum bitirme projesi olarak quadcopter kontrol kartı yazılımını yapıyorum. RC kumandadan 4 ayrı kanalda gelen 45hz frekanslı 1-2ms duty cycle olan pwm sinyallerini okuyup bunları işlemci içerisinde PID algoritmasından sonra pwm çıkışına verip Brushless Motor kontrolü yapacağım.
Okuma işi için Timer 2 ve Timer 3 ün Capture birimlerini kullanıyorum yükselen düşen kenarda kesme oluşturup CR registerlarının farklarını alıp hangi kanala aitse ona göre bi sayı elde ediyorum yani pwm okumada sorun yok. HyperTerminalden değerleri görüyorum. Ancak işlemci çıkışından pwm alamıyorum yada yanlış pwm alıyorum düzgün çalışmıyor. Okuduğum değeri geçtim programda artan bi değişken tanımlayıp çıkışa onu veriyorum yinede pwm de bir değişiklik olmuyor. Sabit 3.12v gerilim ölçüyorum ve led bağladım parlaklıkta değişmiyor.
i değeri hyperterminalde düzgün bir şekilde artıp sıfırlanıyor ama pwm çıkışı hiç değişmiyor sebebini bir türlü çözemedim yardımcı olursanız memnun olurum. Birde nasıl kod ekleneceğini bilmiyorum direk buraya yazdım kusura bakmayın...

void pwm_init(uint32_t bolme_orani, uint32_t hassasiyet)
{
   LPC_SC -> PCONP    |= 1 << 6;         // PWM aktif
   LPC_SC -> PCLKSEL0  &= (~(3 << 12));   // PWM clock = PCLK=CCLK/4
   
   LPC_PINCON -> PINSEL4 |= 1 << 0;   //P2.0 -> PWM1 kanalı için ayarlı
   LPC_PINCON -> PINSEL4 |= 1 << 2;   //P2.1 -> PWM2 kanalı için ayarlı
   LPC_PINCON -> PINSEL4 |= 1 << 4;    //P2.2 -> PWM3 kanalı için ayarlı
   LPC_PINCON -> PINSEL4 |= 1 << 6;   //P2.3 -> PWM4 kanalı için ayarlı
   LPC_PINCON -> PINSEL4 |= 1 << 8;   //P2.4 -> PWM5 kanalı için ayarlı
   LPC_PINCON -> PINSEL4 |= 1 << 10;   //P2.5 -> PWM6 kanalı için ayarlı

   LPC_PWM1   -> TCR |= 1 << 1;  // Counter RESET   

   LPC_PWM1   -> PR   = bolme_orani;   // PWM frekansı bölme oranı  PWM freq = PCLK/PR+1

   LPC_PWM1   -> MCR    = 1 << 1;   //MR0=TC olduğunda Timer Counterı sıfırla  PWM0 kullanılmıyor 
   
   /*  ÇİFT KENAR KONTROL PWM OLDUĞUNDA KULLANILAN AYARLAR
   LPC_PWM1   -> MCR    = 1 << 4;   //MR1=TC olduğunda Timer Counterı sıfırla
   LPC_PWM1   -> MCR    = 1 << 7;   //MR2=TC olduğunda Timer Counterı sıfırla
   LPC_PWM1   -> MCR    = 1 << 10;   //MR3=TC olduğunda Timer Counterı sıfırla
   LPC_PWM1   -> MCR    = 1 << 13;   //MR4=TC olduğunda Timer Counterı sıfırla
   LPC_PWM1   -> MCR    = 1 << 16;   //MR5=TC olduğunda Timer Counterı sıfırla
   LPC_PWM1   -> MCR    = 1 << 19;   //MR6=TC olduğunda Timer Counterı sıfırla    
   */   
   
   LPC_PWM1   -> PCR &= 0x00;     // Tek kenar kontrollü PWM sinyali üretilecek

   LPC_PWM1   -> PCR |= 1 << 9;   // PWM1 kanalı aktif
   LPC_PWM1   -> PCR |= 1 << 10;  // PWM2 kanalı aktif
   LPC_PWM1   -> PCR |= 1 << 11;  // PWM3 kanalı aktif
   LPC_PWM1   -> PCR |= 1 << 12;  // PWM4 kanalı aktif
   LPC_PWM1   -> PCR |= 1 << 13;  // PWM5 kanalı aktif
   LPC_PWM1   -> PCR |= 1 << 14;  // PWM6 kanalı aktif
   
   LPC_PWM1   -> MR0 = hassasiyet;
   LPC_PWM1   -> MR1 = 0;   //Timer Counter Karşılaştırma değeri
   LPC_PWM1   -> MR2 = 0;   //Timer Counter Karşılaştırma değeri
   LPC_PWM1   -> MR3 = 0;   //Timer Counter Karşılaştırma değeri
   LPC_PWM1   -> MR4 = 0;   //Timer Counter Karşılaştırma değeri
   LPC_PWM1   -> MR5 = 0;   //Timer Counter Karşılaştırma değeri
   LPC_PWM1   -> MR6 = 0;   //Timer Counter Karşılaştırma değeri
      
   LPC_PWM1   -> TCR  = 1 << 3 | 1 << 0 ;   // COUNTER ve PWM aktif

   LPC_PWM1   -> LER |= 1 << 0;   // Yeni yazılan PWM0 Duty Cycle değerini aktifleştir. PWM Rate
   LPC_PWM1   -> LER |= 1 << 1;   // Yeni yazılan PWM1 Duty Cycle değerini aktifleştir
   LPC_PWM1   -> LER |= 1 << 2;   // Yeni yazılan PWM2 Duty Cycle değerini aktifleştir
   LPC_PWM1   -> LER |= 1 << 3;   // Yeni yazılan PWM3 Duty Cycle değerini aktifleştir
   LPC_PWM1   -> LER |= 1 << 4;   // Yeni yazılan PWM4 Duty Cycle değerini aktifleştir
   LPC_PWM1   -> LER |= 1 << 5;   // Yeni yazılan PWM5 Duty Cycle değerini aktifleştir
   LPC_PWM1   -> LER |= 1 << 6;   // Yeni yazılan PWM6 Duty Cycle değerini aktifleştir
   
   

}

void set_pwm1_duty(uint32_t duty_cycle)
{
   LPC_PWM1   -> MR1 = duty_cycle;   //PWM1 duty_cycle değerini yükle
   LPC_PWM1   -> LER = 1 << 1;      //PWM1 duty_cycle değerini aktifleştir   
}


int main (void)
{

   LPC_PINCON -> PINSEL1  &= (~(3 << 12));
   LPC_GPIO0  -> FIODIR    = (1 << 22);   //P0.22 Output pin
      
   active_PLL();    //PLL kur
   UART1_init();    //UART1 ayarla
   //I2C0Init();       //I2C0 birimini ayarla
   //itg3200_init();    //Gyro ayarla
   //bma180_init();    //Ivme sensörü ayarla
   pwm_init(14,5000); //PWM ayarla    250hz olacak
   //interrupt_timer1(400000);  //Timer1 kesmesi kur
   
    /* 
   NVIC_SetPriority(I2C0_IRQn,1);
   NVIC_SetPriority(TIMER2_IRQn,2);
   NVIC_SetPriority(TIMER3_IRQn,3);
   NVIC_SetPriority(TIMER1_IRQn,4);
    */
   capture_init();  //Capture ayarla
   
   
   while(1)   
   {
    
      if(i>=5000){
      LPC_GPIO0 -> FIOPIN ^= 1 << 22; // Toggle LED
      i=0;
      }
      i++;
   
   set_pwm1_duty(i);

     //roll=kalman_hesapla_x(ydeg,90.0-Acix);
   //pitch=kalman_hesapla_y(xdeg,90.0-Aciy);
   
   printf("i=%lu    t=%lu   a=%lu   e=%lu   r=%lu            \r\n",i,thr,aileron,elevator,rudder);

   
   }
}
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R