pi kontrol ile dc motor hız kontrolü(geri besleme çalışmıyor)

Başlatan cripple, 18 Mayıs 2013, 17:04:48

cripple

sayac aldığı bilgiyi referans değer ile karşılaştırmıyor
(hata=420 - devir;) şu satırda çıkışta okunan değer ile referans değeri yani 420 karşılaştırıp işlem yapması gerekiyo ama arabanın tekerleğinin yavaşlattığımda hiçbir tepki yok sorun ne olabilir acaba?
//PID kontrol uygulaması 


#include <16f877a.h>
#device adc=10
#device *=16
#fuses xt,nowrt,nowdt,nodebug,nobrownout,nolvp,nocpd,noput,noprotect
#use delay (clock=4M) //4mhz kristal 
#use fast_io(e)
#use fast_io(c)
#use fast_io(b)

#define LCD_RS_PIN      PIN_B1
#define LCD_RW_PIN      PIN_B2
#define LCD_ENABLE_PIN  PIN_B3 
#define LCD_DATA4       PIN_B4 
#define LCD_DATA5       PIN_B5 
#define LCD_DATA6       PIN_B6 
#define LCD_DATA7       PIN_B7
#include <lcd.c>

unsigned int16 devir;
unsigned int8 cx=0,pop;
int1 hesapla_flag=0;

int eski_hata = 0; 
int hata;
float PI, P, I; 
int I_hata = 0; 
int cikis;



#define Kp 0.05
#define Ki 0.009
#define dt 0.5 

#int_timer1
void timer1_kesmesi()
{
   set_timer1(15535);//50ms 4mhz icin
   cx++;
   if(cx>=2)//50ms
   {
      cx=0;
      pop=get_timer0();
      set_timer0(0);
      hesapla_flag=1;
   }
  output_toggle(pin_d0);
}

void main()
{




setup_CCP1(CCP_PWM);
setup_CCP2(CCP_OFF);
setup_timer_0(RTCC_EXT_L_TO_H | RTCC_DIV_1); 
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); 
 setup_timer_2(T2_DIV_BY_16,250,1);
 
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   

set_tris_a(0b00010000); 
lcd_init();  
   lcd_gotoxy( 1,  1); 
   lcd_putc("Devir olcer");
   delay_ms(50);
   set_timer0(0);
   set_timer1(0);
   
set_tris_c(0x00); //c portu çıkış
set_tris_e(0xFF); // e portu giriş 
set_tris_b(0x00); //b portu çıkış
output_c(0x00); // pinler temizlendi


while(1)
{ 
  

   if(hesapla_flag)
   {
      hesapla_flag=0;
      devir=(unsigned int16)pop*6;
        lcd_gotoxy( 1,  1); 
printf(lcd_putc "Devir:%04lu D/D  ",devir); 
delay_ms(50);
   } 
      

set_timer2(0);



hata=420 - devir;

P=Kp*hata;

I_hata=I_hata + (hata*dt);

I=Ki * I_hata; 

PI = P+I;

eski_hata=hata;

cikis=200+PI;

output_high(pin_c3);
output_low(pin_c4);



if(PI >125)
    {
        PI=125;
    }
    else if(PI < 0)
    {
        PI= 0;
    }





set_pwm1_duty(cikis);
// pwm doluluk oranı hesabı 
//mesela setup timer ın içindeki değerin yarısı kadar olursa pwm 
//doluluk oranı %50 olur
{ 


  


}
}

}

JKramer

int = int8. Her birini kaç bit'lik gerekiyorsa öyle yazın; int16, int32 gibi.

pisayisi

Normalde araç %50 duty ile çalışırken aracı frenlemeye zorladığınızda pi algoritması içinde duty oranı artarak hızı referans değere yaklaştırması gerekir. İnt lerde sıkıntı yoksa algoritma doğru gibi görünüyor Ki ve Kp parametrelerinin tayinini simulasyonunu neye göre yaptığınız bu kısım önemli?
Murat

cripple

katsayılar çok net değil, sistem zaten hiç geri besleme yapmıyor h21a1 optointerrupter ile deviri saydım devir değişkenine atadım fakat hata değeri bulmak için devir değişkenini işleme soktugumda işleme almıyor anladıgım kadarıyla değişken olarak int16  diğer hata değeri tanımını da int 16 mı yapmam gerekiyor (yardımlarınız için teşekkürler)

Goo

İntegral'i ve çıkış değerinizi en yüksek ve en alçak seviyeler belirleyip, o değerleri aşmasını engellemek gerekebilir. Bazen integralin yüksek olması, sistem cevabını tersi yönde değişimlerde yavaşlatabiliyor.

Önce yalnızca P kontrolü tek başına test edin, eğer problem yoksa PI uygularsınız.