PID kontrol yardım

Başlatan magnetron, 04 Ocak 2024, 17:42:56

magnetron

merhaba forum,

PID kontrol yapmaya çalışıyorum

P ve I kısmını yaptım

hata = (set değer - ölçülen değer) olarak alıyorum

D kısmında kafam karıştı

şimdi ( hata - bir önceki hata )yı * Kd katsayısı ile çarpıyorum

bunu kontrol çıkışına topluycam mı çıkarıcam mı ?

yani kontrol çıkış = Kp * hata + Kı * integral ( hata )  + Kd ( hata - bir önceki hata )

böyle mi olucak yoksa

kontrol çıkış = Kp * hata + Kı * integral ( hata )  - Kd ( hata - bir önceki hata )

böyle mi?

teşekkür

SB7

Merhaba, şu şekilde olacak.
Alıntı yapılan: magnetron - 04 Ocak 2024, 17:42:56kontrol çıkış = Kp * hata + Kı * integral ( hata )  + Kd (( hata - bir önceki hata ) / dt) (örnekleme frekansı)
-SB7

magnetron

hocam merhaba şu konuda yardım eder misiniz

konuyu kafamda netleştiremedim

hata diyelim ki 60 önceki hata 50 olsun fark = 10

yani hata artıyor bu durumda derivativ elemanını kontrol çıkışına toplarsam hatanın daha da artmasına sebep olmaz mı

teşekkür

SB7

PID kontrolde 1 iterasyonda sonucun düzeltilmesi amaçlanmıyor hocam, hata büyüdüğünde uygulanan çıkış da ona göre değişecek ve kararlı bir sistem oluşturulmaya çalışılacak. 1 adım sonrasını düşünmeyin yani, Parametreleri doğru seçtiyseniz geribeslemelerle hata 0 olana kadar çıkış değişkenlik gösterecektir.
-SB7

alikeskinkilic

#4
Alıntı yapılan: magnetron - 04 Ocak 2024, 19:42:28hocam merhaba şu konuda yardım eder misiniz

konuyu kafamda netleştiremedim

hata diyelim ki 60 önceki hata 50 olsun fark = 10

yani hata artıyor bu durumda derivativ elemanını kontrol çıkışına toplarsam hatanın daha da artmasına sebep olmaz mı

teşekkür
ısıttığın suya buz düştüyse yani hata büyüyorsa PID nin D kısmı zaten hatanın ne yöne ve nekadar hızlı değiştiğini ölçüyor . olması  gereken de zaten hatanın büyümesi sonucu çıkışın büyümesi yani daha fazla enerji verilerek o anlık hatanın bir an önce toparlanması ::ok
        Hata dediğimiz şey aslında çıkış gücümüz . diyelim su 10 derece biz istiyoruz 60 olsun hata büyük ise ilk başlangıçta 50 katkı veriyorsa çıkışa 20 derece olduğunda 40 katkı vermeye başlar çıkışa yani enerjiyi kısmaya  pwm e verdiğimiz değere ekleniyor yani bizim ısıtıcıyı ayarladığımız gücün kontrolunü o hata yapıyor
Hep meraktan

magnetron

hocam cevaplar için teşekkür,

bir yerde daha takıldım

P I D komponentlerini toplayıp kontrol çıkışı oluşturuyorum

burda kontrolçıkış (-) ve (+) değerler alabiliyor ve bu durumda aşağıdakini yapıyorum

    if (kontrolçıkış < -1000 ) kontrolçıkış = -1000; if ( kontrolçıkış > 1000 ) kontrolçıkış = 1000;

ama fiziksel sistem de aktuatör (-) değerler almıyor

ben de -1000 / 1000 aralığını 0 / 1000 aralığına aşağıdaki formülle taşıyorum

aktuatör = kontrolçıkış * 0.5 + 500

ama Ki ve Kd sıfırlarsam yani sadece proporsiyonal'da aktüatör değeri 500 etrafında oynuyor ( yani set değer ve ölçülen değer eşitse )

yani aktüatör set değer ve ölçülen değer eşitse yarım yol çıkış veriyor

bu normal mi ?


Firzen

Alıntı yapılan: magnetron - 06 Ocak 2024, 22:10:19if (kontrolçıkış < -1000 ) kontrolçıkış = -1000; if ( kontrolçıkış > 1000 ) kontrolçıkış = 1000;


Öncelikle yukarıdaki formul bir threshold diye geçiyor yani giriş çıkış işaretini sınırlama. Bu genelde bütün kontrol yapılarında olan bir durum.


Alıntı yapılan: magnetron - 06 Ocak 2024, 22:10:19aktuatör = kontrolçıkış * 0.5 + 500


Burada ise iler besleme çıkış kontrol işaretine bir daha P uyglamış gibi olmuşsun. 500 değeri ise feedforward yani ileri besleme olmuş.

Senin yapman gereken öncelikle sistem modelini çıkarmak, yada giriş çıkış işaretlerini toplayıp bir model çıkarmak. Ardından çıkan model ile bir N.dereceden bir model uydurmak ve devamında bu modele karşılık gelen kontrol işaretini belirlemek.

İlk soruna gelecek olursakta:

P I D katsayılarının tanımlamaları konusunda yorum yapmayacağım yok D overshoot u engelliyor I steadystate engelliyor vs. Discrete (Ayrık) time 'da PID kodunu C'de mi nerede yazmak istiyorsun?

örnek olarak vermek gerekirse ve parallel form PID olduğunu düşünürsek:

Kp, Ki, Kd (kastsayılar verilmiş ve tune edilmiş diyelim)

error_P = Reference - Actual
error_I = error + error * Sampling_Time
error_D = (error - Previous_error)/Sampling_Time

U = ( Kp * error_P ) + ( Ki * error_I ) + ( Kd * error_D )


Bunu yazarken Tusting Integrator ve Euler Differention olarak düşün diğer türlü discrete time da kontrol parametleri formul yeniden revize edilmeli.


Kararsız...

alikeskinkilic

#7
"aktuatör = kontrolçıkış * 0.5 + 500

ama Ki ve Kd sıfırlarsam yani sadece proporsiyonal'da aktüatör değeri 500 etrafında oynuyor ( yani set değer ve ölçülen değer eşitse )

yani aktüatör set değer ve ölçülen değer eşitse yarım yol çıkış veriyor

bu normal mi ?"
sebebini formülünde yazmışsın zaten 0.5 değerin Kp ise diyelim set değerine ulaştınız "I"ve "D" yi de kapattım demişsiniz dolayısı ile  kontrol çıkışınız hata*Kp oldu  formülde yerine koyarsak (0*0.5)+500=500 çıkışını almanız normal değilmisizcede 500 ü siz eklemişsiniz havadan zaten
Hep meraktan

magnetron

#8
sayın hocam bu aşağıda yapılan doğru mu ?

    if (kontrolçıkış < -1000 ) kontrolçıkış = -1000; if ( kontrolçıkış > 1000 ) kontrolçıkış = 1000;

benim kafamı karıştıran ,her PID komponent eksi değerler alabiliyor , o yüzden -1000 ile sınırladım

yoksa böyle mi yapıcam

    if (kontrolçıkış < 0 ) kontrolçıkış = 0; if ( kontrolçıkış > 1000 ) kontrolçıkış = 1000;

aktuatör bir manyetik fren kontrol çıkışını aktuatör çıkışına lineer şekilde taşıyorum

C ' de yazıyorum  manyetik frenle gergi kontrol yapmak istiyorum

teşekkür

alikeskinkilic

Çıkışın sınırlandırılması mantıklıdır tabi zaten gereklidirde örnek verecek olursak pwm çıkışı için 0-255 arası bir değer gerekli bu pwm ile bir ısıtıcı kontrol ediyorsak sizin pid çıkışınız o andaki değerin nerede olduğuna bağlı olarak 255 in çok üstünde olabilir.bu çıkışa 255 ten fazla bir şey veremez zaten pid çıkışının limit değerin üstünde olmasının nedeni ise hatanın limite yaklaştıkça çok küçülmesi sonucu çıkışa katkı sağlayamaz olmaması istendiğinden bu yüzden de işlem sonucu limit değerini bir miktar geçtikten sonra pid değeri hızla düşerek normal değerlere süreç içinde geri döner.fakat kontrol ettiğiniz ısı değil de bir motorun pozisyonu ise o zaman da pid nin limiti geçtikten sonra negatif değer üretmesi gerekirki limit değere pozisyonun geri dönmesi sağlansın kısacası pid kullandığın yere göre sınırlandırma ayarlanır.yani çıkış değeri <0 ise çıkış değeri =0 olayı ısıtıcıda işlerken motor kontrolünde işlemez 
Hep meraktan

Firzen

Alıntı yapılan: magnetron - 07 Ocak 2024, 13:12:51sayın hocam bu aşağıda yapılan doğru mu ?

    if (kontrolçıkış < -1000 ) kontrolçıkış = -1000; if ( kontrolçıkış > 1000 ) kontrolçıkış = 1000;

benim kafamı karıştıran ,her PID komponent eksi değerler alabiliyor , o yüzden -1000 ile sınırladım

yoksa böyle mi yapıcam

    if (kontrolçıkış < 0 ) kontrolçıkış = 0; if ( kontrolçıkış > 1000 ) kontrolçıkış = 1000;

aktuatör bir manyetik fren kontrol çıkışını aktuatör çıkışına lineer şekilde taşıyorum

C ' de yazıyorum  manyetik frenle gergi kontrol yapmak istiyorum

teşekkür

Anladım elinde ikinci derece bir sistem var. Kontrol işaretinin çıkışını negative set etmene gerek yok. Örneğin 0-1000 threshold yapabilirsin. Yukarıdaki vermiş olduğum kodu C subfunction'a çevirip kullanabilirsin.
Kararsız...

sedronjames

çevrim frekansın yüksekse pid katsayılarını düşük tutmanda fayda var. yüksekten kastım 10khz falan. düşükten kastım da 0.000001 falan.
 zamanında motor kontrolü için pid yazdım. 20 khz döngü frekansım vardı. modelleme yapmadım. pid katsayılarını default bi değerden başlattım. katsayıları artırıp azaltarak sisteme etkisini gördüm. zaten kapalı çevrimin kendisi ve pid kontrolör çok güzel bir metodoloji olduğu için çok absürt değerler yoksa sistemi stabil kontrol ediyor. firzen hocanın dediği gibi sınır değerleri önemli. aktüatörünün giriş maks değeri neyse pid çıkışı maks o değeri alabilir. bir de başlangıçta Derivative kullanma . PI ile başla sistemi kontrol et. daha sonra geçici hal yanıtlarını düzeltmek istersen Derivative koyarsın. ölçümünde gürültü falan varsa derivative hiç koyma derim ben.

Firzen

Alıntı yapılan: sedronjames - 08 Ocak 2024, 15:50:21çevrim frekansın yüksekse pid katsayılarını düşük tutmanda fayda var. yüksekten kastım 10khz falan. düşükten kastım da 0.000001 falan.
 zamanında motor kontrolü için pid yazdım. 20 khz döngü frekansım vardı. modelleme yapmadım. pid katsayılarını default bi değerden başlattım. katsayıları artırıp azaltarak sisteme etkisini gördüm. zaten kapalı çevrimin kendisi ve pid kontrolör çok güzel bir metodoloji olduğu için çok absürt değerler yoksa sistemi stabil kontrol ediyor. firzen hocanın dediği gibi sınır değerleri önemli. aktüatörünün giriş maks değeri neyse pid çıkışı maks o değeri alabilir. bir de başlangıçta Derivative kullanma . PI ile başla sistemi kontrol et. daha sonra geçici hal yanıtlarını düzeltmek istersen Derivative koyarsın. ölçümünde gürültü falan varsa derivative hiç koyma derim ben.


Sizin anlattığınız problem sanki PID den çok Shannon-Nyquist'e göre örnekleme ile ilgili gibi duruyor. System'e gönderilen kontrol işaretlerinin sanki aliasing oluyor ve system bunu yakalayamıyor gibi duruyor. Bu durumda rate transition ile buffer yapıp paketler halinde de gönderebilirsin. Ya da tüm system'e aynı Zero-Order-Hold ile sabitleyebilirsin.
Kararsız...

sedronjames

Alıntı yapılan: Firzen - 09 Ocak 2024, 02:13:53Sizin anlattığınız problem sanki PID den çok Shannon-Nyquist'e göre örnekleme ile ilgili gibi duruyor. System'e gönderilen kontrol işaretlerinin sanki aliasing oluyor ve system bunu yakalayamıyor gibi duruyor. Bu durumda rate transition ile buffer yapıp paketler halinde de gönderebilirsin. Ya da tüm system'e aynı Zero-Order-Hold ile sabitleyebilirsin.
tam anlamadım abi ama sen diyorsan doğrudur :) iyi forumlar.

alikeskinkilic

#14
Alıntı yapılan: sedronjames - 09 Ocak 2024, 12:52:59tam anlamadım abi ama sen diyorsan doğrudur :) iyi forumlar.
;D  ;D bende anlamadım kötü hissetme kendini MIT bilgisayar mühendisliğinin yayınlanan videolarında da arkadaşın anlattığı gibi anlatıyorlar pid yi. bazen üst seviye arkadaşlar buranın bir forum olduğunu herkesin kendileri kadar iyi bilemeyebileceğini ve konuşulan bu plaza diline benzer yarı Türkçe yarı ingilizce dilin çevirisini yapamayacaklarını unutuyorlar mazur görün lütfen.
Hep meraktan