dc motor PI kontrol. sorunumu bi türlü çözemedim

Başlatan zamzam23, 13 Eylül 2010, 11:36:29

kanuncan

Alıntı yapılan: zamzam23 - 29 Kasım 2011, 15:03:19
motor için soruyorum

pi döngüsünü timer içerisinde mi kullandınız. sadece pi döngüsü için yazdıgın kodu paylasırmısın.süre hesaplamaları ve katsayılarla birlikte.

benım pi döngüm de katsayılar seninkiler gibi cıkmadı bi yerde hatammı var onu belirlemeye calısıyorum. sistem düzgün calısıyor bende ama.

//-------------------------timer interrupt 10 ms de bir gerceklesiyor--------------------------------------------------------------------------------------------------
   void tmrRB_isr(void)
   {//timer b
   


//---------------- timer b interrupt � her 10/3 ms de gerceklesiyor 10 ms icin 3 kez timer b interrupt � gerceklesmesi gerekiyor--------------------------------          

    PIHizHesabiYap();   
   }//end timer b

//-----------------------------bu rutin timer interrupt icinde ve her 10 ms gerceklesiyor ---------------------------------------------------------------------------------------------------------------------
void PIHizHesabiYap()

      {
            __e=V_Ref-PI_Degiskeni;//hata hesaplaniyor
      
      
      
            __Oransal=Kp*__e;//oransal kazanc hesaplaniyor
            

         
         
//------------------integral aliyorum (hatalar toplami)--------------------------------------------------------------------------------------------------------
         __Integral=__Integral+__e;
      
         __Integral2=__Integral*Ki;
         
//---------------------eksi bir deger pwm kanallarina verilmemeli-----------------------------------------------------------------------------------------------      
      if((__Integral2+__Oransal)<0)
         {
            __Integral2=0;
            __Oransal=0;//burada e =0 yaparsak bir defa da olsa pwm orani olarak eksi deger vermis oluruz ki olumsuz durum icin yeterli olur
            __Integral=0;
         }
         
//---------------------------------------Max Pwm Orani uzerinde bir deger de pwm kanalina verilmiyor

            if((__Integral2+__Oransal)>=__MaxPWM)
         {
            __e=0;//burada e =0 yapilarak mevcut hiz seviyesi korunuyor ancak daha fazla armasi da onleniyor
            
         }      
//----------------------hareket yonu saat yonu ise pi uygulanacak pwm kanali belirleniyor------------------------------------------------------------------------------   
         if(SaatYonu)
   
         {   
           __A_YonPWM=(__Integral2+__Oransal);//V cikis
            
         }
         
         
//----------------hareket yonu Saat yONU tERSİ ise pi uygulanacak kanal belirleniyor--------------------------------------------------------------------------------------   
      else if(SaatYonuTersi)
   
         {
             __B_YonPWM=(__Integral2+__Oransal);//V cikis
         
   
         }


//-------------yeni ornekleme icin encoder saydigi deger  sifirlaniyor----------------------------------------------------------------
   
       PI_Degiskeni=0;
}

//---------------------------------------bu rutin harici interrupt icinde ve encoder her yükeselen kenarında gerceklesiyor--------------------------------------------------


   #pragma INTERRUPT   Int1_isr
//-------- Encoder A kanal Interrupt Rutine -----------------------------------------//
   void Int1_isr(void)
{
     
          PI_Degiskeni++;
}
"Denemedikçe ne yapacağını hiç kimse bilemez"

kanuncan

Alıntı yapılan: zamzam23 - 29 Kasım 2011, 15:03:19
motor için soruyorum

pi döngüsünü timer içerisinde mi kullandınız. sadece pi döngüsü için yazdıgın kodu paylasırmısın.süre hesaplamaları ve katsayılarla birlikte.

benım pi döngüm de katsayılar seninkiler gibi cıkmadı bi yerde hatammı var onu belirlemeye calısıyorum. sistem düzgün calısıyor bende ama.

Ki=4;
Kp=30;
"Denemedikçe ne yapacağını hiç kimse bilemez"

zamzam23

peki değişken tipleri neler? __Integral2+__Oransal degerini pwm e yüklerken
(int8)(__Integral2+__Oransal)
gibi bişi yapıyormusun?

birde
timer b interrupt � her 10/3 ms de gerceklesiyor 10 ms icin 3 kez timer b interrupt � gerceklesmesi gerekiyor

bu acıklamanın oldugu kısmı anlamadım. benım anladıgım her 10ms de bir donguyu kosturup yeni hız değerini belirliyorsun. 3.33 ms de bir ne oluyor neden 10/3 dedin acıklamada?

kanuncan

Alıntı yapılan: zamzam23 - 30 Kasım 2011, 08:56:44
peki değişken tipleri neler? __Integral2+__Oransal degerini pwm e yüklerken
(int8)(__Integral2+__Oransal)
gibi bişi yapıyormusun?

birde
timer b interrupt � her 10/3 ms de gerceklesiyor 10 ms icin 3 kez timer b interrupt � gerceklesmesi gerekiyor

bu acıklamanın oldugu kısmı anlamadım. benım anladıgım her 10ms de bir donguyu kosturup yeni hız değerini belirliyorsun. 3.33 ms de bir ne oluyor neden 10/3 dedin acıklamada?

değişken değerleri int olduğu için sonradan tekrar cash(tip dönüşümü) islemi yapmaya gerek yok,10/3 ms açıklamasını dikkate alma sen timer interruptını 10 ms de bir gerçekleşitr yeterli,onu ben ekstra bir durum için kullanmıştım ve yaklaşık 3 ms de bir yapmam gereken bir başka işlem de vardı bu nedenle pi hesabını interrupt her 3 gerçekleşmede bir yapıyordum o duruma ilişkin kod içerisinde yaptığım bir açılama sana gelmiş.
"Denemedikçe ne yapacağını hiç kimse bilemez"