Picproje Elektronik Sitesi

ENDÜSTRiYEL OTOMASYON => Proses Kontrol Sistemleri => Konuyu başlatan: Analyzer - 07 Mayıs 2006, 08:05:47

Başlık: PID Kontrol?
Gönderen: Analyzer - 07 Mayıs 2006, 08:05:47
Selam,

PID kontrol işlemini bir Windows programı yazarak simule etmek istiyorum. Bu sebeple pid kontrolün mantığını arıyorum. Konu hakkında bilgisi olan var mı acaba?

Teşekkürler,

Analyzer
Başlık: PID Kontrol?
Gönderen: conavar - 07 Mayıs 2006, 11:15:30
bilmiyorum bu kısa acaklama size yeter mi
PID (Proportional-Integral-Derivative) günümüzde en çok kullanılan kontrol yöntemidir.
Endüstrideki uygulamaların bir çoğunda rahatca uygulanabilir. Çok geniş bir uygulama alanının olmasına rağmen PID uygulamaları için standart bir tanımlama yoktur.
Karl Astrom'a göre PID algoritması aşağıdaki gibidir:
Burada u(t) kontrol değişkeni, e(t) toplama noktası, y(t) çıkıştan ölçülen değerle aynıdır.
K, Ti, Td PID parametreleridir.
P: Oransal I: İntegral D:Türevsel

sadece P kontrolde kalıcı etki olmkta sistemde kalıcı hata meydana gelmektedir...
P+I kontrolde sistem referans sinyaline daha cabuk adepte olur ancak hızı ve oturma seyiyesi yeterli deildir...Ayrıca sönumli osilasyon yapar.
en iyisi(her yerde deil) P+I+D kontroldur....sonumlu osilasyonu yok eder ve sistem daha karalı calışır.....

(http://i17.photobucket.com/albums/b98/conavar/PID.jpg)

(http://i64.photobucket.com/albums/h162/GTP-USB/PID.jpg)

özet:
yani referans sinyali ile iş sahasından gelen değişkenin integral ve türevlerini alarak hata katsayısı işe çarpıp çıkısa verir.....
kolay gelsin
Başlık: PID Kontrol?
Gönderen: CoşkuN - 07 Mayıs 2006, 11:23:09
http://picproje.org/index.php/topic,4386
Başlık: PID Kontrol?
Gönderen: Ziya - 15 Ağustos 2007, 11:48:38
/***************************************************************************\
  PID Function

Author : Greg Young, Z-World.

The PID (Proportional Integral Derivative) function is used in mainly
control applications. PIDCalc performs one iteration of the PID
algorithm.

While the PID function works, main is just a dummy program showing
a typical usage.
\***************************************************************************/

typedef struct PID {
double SetPoint;         // Desired Value

double Proportion; // Proportional Const
double Integral; // Integral Const
double Derivative; // Derivative Const

double LastError; // Error[-1]
double PrevError; // Error[-2]
double SumError; // Sums of Errors
} PID;

/*=========================================================================*\
  Perform One PID Iteration
\*=========================================================================*/

double
PIDCalc (  PID *pp,
double NextPoint
        )

{ double dError,
Error;

pp->SumError += (Error = pp->SetPoint - NextPoint);
dError = pp->LastError - pp->PrevError;
pp->PrevError = pp->LastError;
pp->LastError = Error;
return   (  pp->Proportion * Error
              +  pp->Integral * pp->SumError
              +  pp->Derivative * dError
              );
}

/*=========================================================================*\
  Initialize PID Structure
\*=========================================================================*/

void
PIDInit  (  PID      *pp
        )

{     memset ( pp,0,sizeof(PID) );
}

/***************************************************************************\
Main Program
\***************************************************************************/

double
sensor ( void // Dummy Sensor Function
)

{ return 100.0;
}

void
actuator ( double rDelta // Dummy Actuator Function
)

{}

void
main ( void
)

{ PID sPID; // PID Control Structure
double rOut; // PID Response (Output)
double rIn; // PID Feedback (Input)

PIDInit ( &sPID ); // Initialize Structure
sPID.Proportion = 0.5; // Set PID Coefficients
sPID.Integral = 0.5;
sPID.Derivative = 0.0;
sPID.SetPoint     = 100.0; // Set PID Setpoint

for (;;) { // Mock Up of PID Processing
rIn = sensor (); // Read Input
rOut = PIDCalc ( &sPID,rIn ); // Perform PID Interation
actuator ( rOut ); // Effect Needed Changes
}
}
Arkadaşlar, bu kod ile ilgili bir kaç şey soracağım.

Derivative hesabında neden en yeni örneklemeden elde edilen error'u kullanmıyor da bir ve iki önceki örneklemeden elde edilen erroru kullanıyor?

Bir başka soru da türev ve integral alırken delta t zamanı neden kullanmıyor? Çünkü pid de oransal kısımda delta t yok, türevde bölüm, integralde de çarpan olarak gelmeyecek mi? Eğer örnek değerini alan olarak alıyorsa o zaman oransal kısım da sanki integral gibi olmuyor mu?
Başlık: PID Kontrol?
Gönderen: z - 15 Ağustos 2007, 18:18:09
Sinyal frekansi dusukse yada sensor detayli bilgi vermiyorsa turev alirken iki komsu siralamadaki hatalarin farki cok kucuk olacagindan turev doyurucu bilgi icermez. Bu nedenle 2,3, hatta 100 geriden bile turev hesaplanir.

DT neden hesaplarda gorulmuyor.

Integral=DT* Sum_of_err*KI olsun

KI'=DT*KI dersek

Integral=KI'* Sum_of_err olur. Burada DT gizli kalmistir.
Başlık: PID Kontrol?
Gönderen: picusta - 15 Ağustos 2007, 18:32:17
Ziya hocam, o kod örnek olarak verilmis, gerçekte çalismasi için birkaç ilave yapmak gerekir.

Endüstride kullanilan PID'lerin hepsi PIDf 'tir aslinda. Yani Türev kismi filtrelenerek kullanilir. Bunun nedeni sensörlerdeki gürültüdür, iki sensör ölçümü arasindaki fark hesaplanirsa, degisim olmazsa bile gürültü yüzünden yok sayilmayacak bir degerin çikacagidir.
Orada yapilmak istenilen hatanin türevinin ortalamasini hesaplamaktir. moving average veya 1. filtre konmak istenmistir.
Fark ettiginiz gibi pek basarili olmamistir.

Ayrica fark ettiginiz gibi örnekleme zamani kaale alinmamistir.
     for (;;) {                        //   Mock Up of PID Processing
        rIn = sensor ();                  //   Read Input
        rOut = PIDCalc ( &sPID,rIn );      //   Perform PID Interation
        actuator ( rOut );               //   Effect Needed Changes
     }

Bu döngüye zamani eklemek gerekir.
Başlık: PID Kontrol?
Gönderen: Ziya - 15 Ağustos 2007, 20:07:20
Alıntı yapılan: "bunalmis"Sinyal frekansi dusukse yada sensor detayli bilgi vermiyorsa turev alirken iki komsu siralamadaki hatalarin farki cok kucuk olacagindan turev doyurucu bilgi icermez. Bu nedenle 2,3, hatta 100 geriden bile turev hesaplanir.

DT neden hesaplarda gorulmuyor.

Integral=DT* Sum_of_err*KI olsun

KI'=DT*KI dersek

Integral=KI'* Sum_of_err olur. Burada DT gizli kalmistir.
İlk kısım tamam. Yalnız DT gizli kalmamalı. İntegralde çarpan ama türevde bölen olarak girip toplanacak. Eğer DT'yi katsayılarda dikkate aldılarsa, yani kodda kullanılan Kd aslında Kd(set edilen)/DT ise, Ki de Ki(set edilen)*DT ise sorun kalmıyor. Ama öyle değilse kod hatalı.
Başlık: PID Kontrol?
Gönderen: Ziya - 15 Ağustos 2007, 20:19:48
picusta, zaten sensörden alınan örneklerin filtrelenmiş olduğunu varsaymış olması gerekir değil mi? Zamanın eklenmesi gerektiği konusunda hemfikiriz :)

Eğer zaman katsayılarda gizli ise, ARM7'lerin Multiply Accumulate unitesi kullanılarak üç değerin katsayılarla çarpılması yeterli olacak (toplama otomatik yapılıyor) değil mi?

Yukarıdaki örnek kodda integralde de bir sorun görünüyor mu sizce?
Başlık: PID Kontrol?
Gönderen: z - 15 Ağustos 2007, 20:58:08
Alıntı Yapİlk kısım tamam. Yalnız DT gizli kalmamalı. İntegralde çarpan ama türevde bölen olarak girip toplanacak. Eğer DT'yi katsayılarda dikkate aldılarsa, yani kodda kullanılan Kd aslında Kd(set edilen)/DT ise, Ki de Ki(set edilen)*DT ise sorun kalmıyor. Ama öyle değilse kod hatalı.

Aynen oyle. Turevde de DT gizli bolen olarak KD ye dahil edilir.

Islemciyi KD/DT islemi ile yada KI*DT islemi ile neden yorasin. KD' ve KI' nu bir kere hesaplarsin artik islemci sadece bunlari kullanir.

Bu tur hiz kazandiran islemler ozellikle kritik kucuk sureli PID dongulerinde cok onemlidir.
Başlık: PID Kontrol?
Gönderen: Ziya - 15 Ağustos 2007, 22:01:04
Alıntı yapılan: "bunalmis"Aynen oyle. Turevde de DT gizli bolen olarak KD ye dahil edilir.

Islemciyi KD/DT islemi ile yada KI*DT islemi ile neden yorasin. KD' ve KI' nu bir kere hesaplarsin artik islemci sadece bunlari kullanir.

Bu tur hiz kazandiran islemler ozellikle kritik kucuk sureli PID dongulerinde cok onemlidir.
Kodu yazan kişi bundan bahsetmemiş. Neyse herkesin anlayacağını düşünmüş belki.

Hız dediniz de, bu işlemler integer aritmetiği ile yapılsa işlem daha hızlı olmaz mı?
Başlık: PID Kontrol?
Gönderen: z - 15 Ağustos 2007, 22:24:31
Integer aritmetikte elbet hizli olur ancak program buradaki gibi basit olmaz.
Bu durumda kesirli sayilar uzerine islem yapmak gerekecek. Ancak gercekten hiz gerekiyorsa kesirli sayilarla islemler cok cambazlik gerektirir.
(Surekli olarak tam ve kesirli kisma atanan bitlerin sayisi ile oynanir.)
Başlık: PID Kontrol?
Gönderen: picusta - 15 Ağustos 2007, 22:50:26
Evet ARM'lerin bazilarinda bu komut seti var:
Multiply And aCcumulate (MAC) ve long MAC.
dsPIC'lerde de var ama çarpanlar 16bit accumulator 40bit.
iyi bir noktaya parmak bastiniz, eger hiz araniyorsa islmeler floating point değil, fixed point yapilmali (islemcinin floating point co-process. yoksa), böylece donanim en iyi sekilde kullanilir.
float'tan fixed point'a dönüsüm yaparken en iyi erim/hassasiyet elde edilen dönüsüm yapilmalidir.
örnek olarak basit oransal kontrol alalim : 1V hata ölçüyorsunuz, bunu 12bit ADC'nin yazmacinda 1024 olarak okuyorsunuz. Katsayimiz 2 olsun.
Demek 1024'ü 2 ile çarpip çikisa verecegiz (çikistada A/D ile ayni D/A çevirim katsayisi oldugunu farz edersek).
Ama simdi diyelim katsayimizi 2.1 yapmak istiyoruz nasil olacak? 100 yapmak istesek?

Tahminimce ADuC ARM7'de bir PID 100kHz'den hizli örnekleme yapabilir (A/D çevrim, interrupt latency, hesaplama, çikis ). Kodu RAM'de çalistirmakta fayda var, yoksa hiz yari yariya iner. Zaten PID analog kontrolün taklidi oldugu için prosesin hizindan 20 kat hizli örnekleme yapmakta fayda var.

Bir yarisma açalim :
Kim daha hizli PID yapar diye, ARM,DSP, FPGA, PLC, Op-amp ? Herkes kendi sistemini çuvallamadan maksimum hizda çalistirmali.
Kurallar:
- Mikrodenetleyiciler polling kullanmamali, timer kesmesini kullanmali.
- En kötü süre hesaba alinmali.
- vs..
Başlık: PID Kontrol?
Gönderen: z - 15 Ağustos 2007, 23:06:23
Ben opamp ile yarismaya katilmaya hazirim.

Kim ne ile cikacak karsima?
Başlık: PID Kontrol?
Gönderen: Ziya - 15 Ağustos 2007, 23:06:33
Jal kullandığım yıllarda sht11 için bir arkadaş integer aritmetiği kullanarak hesaplamalari yaptirmişti ve gerçekten hayran kalmistim.

Integer aritmetiği kullanılırken işlemlerde kullanılan parametreler ve ölçümler baştan 10 veya 100 ile çarpıldıktan sonra işlem yapılsa ve en son sonuç çıktığında ilk başta çarptığımız rakama bölsek ondalık kısımlarını (en azından bir veya iki dijit) dikkate almış oluruz.

Yarışma konusu çok iyi olur da standart bir problem ile olsa çok daha iyi olur. Kuralların sınırlamaların detaylandırılması gerekir.
Başlık: PID Kontrol?
Gönderen: picusta - 15 Ağustos 2007, 23:47:40
Yarismadan çok bir benchmark yapsak?
Her kim bir sisteme PID uyguladi ise ulasabilecegi maks. hizi, hesap süresi, hassasiyet gibi teknik detaylari paylassin.
Op-Amp'tan op-amp'a fark var tabii. Piyasada bulunan orta boy bir FPGA ile  10MHz'lik bant genisligine sahip bir op-amp'tan daha fazla islem gücü çikar. Tabii o hizda çalisan A/D ve D/A katlarini ilave etmek gerekir.
Ben en son kontrolör yaptigimda ayni bu sorun ile karsi karsiya gelmistim.
Yanlis hatirlamiyorsam ilk basta PID algoritmasinin disinda katsayiyi oranliyordum (32 bitin tamamini kullanmak için).
ölçülen degeri de x bit sola shift ediyordum (o mikrodenetleyicide (Renesas) çarpmaktan daha hizli ) sonra oranlanmis katsayi ile çarpim çikista saga shift ile bölme ( çikis katindaki D/A katsayisi hesaba katilarak).
Bütün bunlari yaparken accumulator'ün overflow yapmamasina dikkat etmek gerekir tabii.
Başlık: PID Kontrol?
Gönderen: z - 15 Ağustos 2007, 23:55:44
Benchmark sonuclari belli değilmi?

Siralama

Opamp, ASIC, FPGA, DSP, ve digerleri
Başlık: PID Kontrol?
Gönderen: picusta - 16 Ağustos 2007, 17:26:33
Peki ARM'mi DSP'mi ? fiyat/performans?

Bence ADuC'un ARM7'si gayet güzel bir seçenek, içindeki hizli 12bit ADC ve DAC,3 faz PWM, islem gücü, genel olarak dsPIC'lerden daha iyi diyebilirmiyiz?
Başlık: PID Kontrol?
Gönderen: Analyzer - 16 Ağustos 2007, 19:44:02
Selam,

Benim plc'lerde kullandığım, PID testi için çok basit bir sistemim var. Bir kutu içerisinde bir adet 220V/100W lamba, bir J type termokupl ve lambayı kontrol eden 5-10A bir SSR. Benchmark yapmak için böyle bir düzenek oluşturulup; farklı tipte ortamlarda (Op-amp, fpga, dspic, arm vs..) test edilebilir. Formül ve anlatımdan öte; mcu ile PID kontrol yapmak isteyenlere somut bir başlangıç noktası oluşturulabilir.

Analyzer
Başlık: PID Kontrol?
Gönderen: Analyzer - 17 Ağustos 2007, 17:42:45
Selam,

Bu arada Fatek'in el kitabını karıştırırken bir not buldum :

Digitized PID expression is as follows:
Mn = [Kc×En]+ Σ0n[Kc×Ti×Ts×En]−[Kc×Td×(PVn−PVn-1)/Ts]

Where,
Mn: Output at time "n".
Kc: Gain (Range: 1~9999;Pb=100(%) / Kc)
Ti: Integral tuning constant (Range:0~9999, equivalent to 0.00~99.99 Repeat/Minute)
Td: Derivative tuning constant (Range:0~9999, equivalent to 0.00~99.99 Minute)
PVn : Process variable at time "n"
PVn_1: Process variable when loop was last solved
En: Error at time "n" ; E= SP – PVn
Ts: Solution interval for PID calculation (Valid value are 10, 20, 40, 80,160, 320; the unit is in 0.1Sec)

PID Parameter Adjustment Guide
�� As the gain (Kc) adjustment getting larger, the larger the proportional contribution to the output. This can
obtain a sensitive and rapid control reaction. However, when the gain is too large, it may cause oscillation.
Do the best to adjust "Kc" larger (but not to the extent of making oscillation), which could increase the
process reaction and reduce the steady state error.
�� Integral item may be used to eliminate the steady state error. The larger the number (Ti, integral tuning
constant), the larger the integral contribution to the output. When there is steady state error, adjust the "Ti"
larger to decrease the error.
When the "Ti" = 0, the integral item makes no contribution to the output.
For exam. , if the reset time is 6 minutes, Ti=100/6=17;if the integral time is 5 minutes, Ti=100/5=20.
�� Derivative item may be used to make the process smoother and not too over shoot. The larger the number
(Td, derivative tuning constant), the larger the derivative contribution to the output. When there is too over
shoot, adjust the "Td" larger to decrease the amount of over shoot.
When the "Td" = 0, the derivative item makes no contribution to the output.
For exa, if the rate time is 1 minute, then the Td = 100; if the differential time is 2 minute, then the Td = 200.
�� Properly adjust the PID parameters can obtain an excellent result for temperature control.
�� The default solution interval for PID calculation is 4 seconds (Ts=40)
�� The default of gain value (Kc) is 110, where Pb=1000/110×0.1%≒0.91%; the system full range is 1638°, it
means 1638×0.91≒14.8°to enter proportional band control.
�� The default of integral tuning constant is 17, it means the reset time is 6 minutes (Ti=100/6=17).
�� The default of derivative tuning constant is 50, it means the rate time is 0.5 minutes (Td=50).
�� When changing the PID solution interval, it may tune the parameters Kc, Ti, Td again.


Analyzer