PID döngü yaptım calısıyor anck sıkıntı var

Başlatan zamzam23, 24 Haziran 2011, 11:59:45

zamzam23

arkadaşlar PID hız kontrollü motor var. normal çalısıyor motor yüksüzken hızı değiştirdiğimde kısa sürede reff hıza ulaşıor. ancak motora yük bindiğinde o kdr da başarılı calısmıyor. titreme yapıyor sonucta bazen istenen reff hızına oturuyor bazen oturmuyor sapıtıyor. sorun benım PID kodlarımda mı yoksa katsayılarında mı yardımcı olursanız sevınırım.ya da bu konuda ücretli profosyonel yardım da alabılırım.
ccs de yazılmıs PID kodu: kesme 15ms de bir işliyor.P,II ve DD float tipi, hata ve hata3 ise int tipi değişken.

#int_timer0  //15 msn
void  timer0_kesme ()   
    {
     hiz=(pals1<<6)/xx;
     hata=reff-hiz; 
     if(hata>5) hata=5;  if(hata<-5) hata=-5;
     integral=integral+hata;
     if(integral > 150) integral = 150; 
     else if(integral < -150) integral = -150;
     P=3.3*hata;
     II=58.7*((float)integral*0.015628); 
     DD=(float)(gd)*((float)(hata-hata3)/0.015628);
      if(DD > 150) DD = 150; 
     else if(DD < -150) DD = -150;
     yeni=(int8)(P+II+DD); 
    
        if(yeni>200) yeni=0; 
        else if(yeni >150)  yeni = 150;   
       hata3=hata;
         set_pwm1_duty(yeni); 
         pals1=0;set_timer0(63093);

    }

z

Timer rutini içindeki kodların işlenmesi ne kadar zaman alıyor?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

zamzam23

bunu hiç hesaplamadım ama encoderden gelen palsleri duzgun sayıyor.onları sayarkende RB0 kesmesı kullandım

iyildirim

Hesaplanan duty 200 den büyük olduğunda neden bir üst limit tanımlanmıyorda sıfırlanıyor.

PROTECH_

   bide şu şekilde dene
         if(yeni<0)        yeni=0;
	       else if(yeni >255) yeni = 255;
		 
		out=(uint8)yeni;   
		       
		hata3=hata;         
		set_pwm1_duty(out);          
		pals1=0;set_timer0(63093);  
                       
Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN

zamzam23

#5
Alıntı yapılan: PROTECH_ - 24 Haziran 2011, 15:43:41
   bide şu şekilde dene
         if(yeni<0)        yeni=0;
	       else if(yeni >255) yeni = 255;
		 
		out=(uint8)yeni;   
		       
		hata3=hata;         
		set_pwm1_duty(out);          
		pals1=0;set_timer0(63093);  
                       

uint8 nedir ccs de derlenmiyor
Alıntı yapılan: iyildirim - 24 Haziran 2011, 15:22:03
Hesaplanan duty 200 den büyük olduğunda neden bir üst limit tanımlanmıyorda sıfırlanıyor.

üst limit 150. "yeni" değişkeni int bir değişken. dolayısıyla - değer almıyor 0 dan asagı dusunce 255 oluyor. ben de onu sınırlamak ıcın 200den buyukse 0 a esıtle dedım.

JKramer


optimum

sakıncası yoksa bunun devresinide ekliyebilir misiniz?

PROTECH_

Alıntı yapılan: zamzam23 - 24 Haziran 2011, 17:07:34
Alıntı yapılan: PROTECH_ - 24 Haziran 2011, 15:43:41
   bide şu şekilde dene
         if(yeni<0)        yeni=0;
	       else if(yeni >255) yeni = 255;
		 
		out=(uint8)yeni;   
		       
		hata3=hata;         
		set_pwm1_duty(out);          
		pals1=0;set_timer0(63093);  
                       

uint8 nedir ccs de derlenmiyor
Alıntı yapılan: iyildirim - 24 Haziran 2011, 15:22:03
Hesaplanan duty 200 den büyük olduğunda neden bir üst limit tanımlanmıyorda sıfırlanıyor.

üst limit 150. "yeni" değişkeni int bir değişken. dolayısıyla - değer almıyor 0 dan asagı dusunce 255 oluyor. ben de onu sınırlamak ıcın 200den buyukse 0 a esıtle dedım.

"uint8"  i "unsigned char"  olarakda alabilirsin
Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN

zamzam23


fatihinanc

Zaten uint8 8bitlik unsigned integer dır.
Yani bir nevi unsigned char olabilir.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

zamzam23

bir nevisi mi var. değişkene sayı atıyoruz char nasıl oluyor. char da 8 bitlik diye oyle diyorsun belli ki.neyse

fatihinanc

Alıntı yapılan: zamzam23 - 28 Haziran 2011, 09:09:20
bir nevisi mi var. değişkene sayı atıyoruz char nasıl oluyor. char da 8 bitlik diye oyle diyorsun belli ki.neyse
Farketmez ki.
İster char ister uint8 olarak tanımla, bellekte yine 1 byte yer kaplar. Yani char tanımlayınca uint8 e göre farklı biryerde farklı bir adres gösterilmez.
Okuma amacına göre okuduğun değeri karakter veya sayı olarak kullanabilirsin.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

zamzam23

evet öyle. peki saol ama sorun hallolmadı eksik birseyler var yine.

fatihinanc

Alıntı yapılan: zamzam23 - 28 Haziran 2011, 12:54:47
evet öyle. peki sağol ama sorun hallolmadı eksik birseyler var yine.
;)
PID Konusunda çok fazla yorum yapamayacağım, o konuda üstadlar daha iyi yardımcı olacaktır.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)