Marlin ile PID autotune

Ben PID autotune işini 250 derece için yaptım. Bakalım şimdi 210 derece için deneyeceğim.
 
Yine havyadan örnek vereceğim, 15V le çok stabil çalışan pid değerleri, 24V beslemede osilasyona giriyordu.

Bu cok dogal. Senin Kp, Ki, Kd katsayilarin cikis voltajin olan 15 ile carpilip pwm sinyale donusuyordu.

24V uygulayinca tum katsayilarin 24/15=1.6 ile carpilmis oldu.

Eger 15v da duzgun calisan sistem 24v'da da ayni duzgunlukte calissin dersen Kp, Ki, Kd degerlerini 1.6'ya bolmen gerekir.
 
Katsayılardaki değişim çok az.

C++:
// Biqu H2
#define DEFAULT_Kp 14.96
#define DEFAULT_Ki 0.87
#define DEFAULT_Kd 64.62

Sonuç da çok az. 8 derece olan overshoot oldu 7 derece.
 
Alet nasıl yapıyor incelemedim ama bu tür sistemlerde okumada gecikme olacağı şart. Ama sistem aslında basit bir ısıtıcı ve termal kütleden oluştuğu için bunlara first order plus dead time(FOPDT) denen bir model uydurularak tanımlanabiliyor. Sonrasında istenen overshoot değerine göre tune edilebilir. Yalnız gerçekte sistem nonlineer olduğu için bu yapılan teorik hesap birebir tutmaz. Örneğin sıcaklık arttıkça radyasyon ile kaybedilen ısı lineer olmayacak şekilde artacak. Smith predictor denen bir teknikle sanki gecikme yokmuşcasına kontrol denenebilir, aslında bu termal sistemler çeşitli kontrol tekniklerini denemek için güzel sistemler.
 
Bu cok dogal. Senin Kp, Ki, Kd katsayilarin cikis voltajin olan 15 ile carpilip pwm sinyale donusuyordu.

24V uygulayinca tum katsayilarin 24/15=1.6 ile carpilmis oldu.

Eger 15v da duzgun calisan sistem 24v'da da ayni duzgunlukte calissin dersen Kp, Ki, Kd degerlerini 1.6'ya bolmen gerekir.
Aslında belli pid değerleri ve hedef sıcaklık için voltajın(gücün) yükselip yükün değişmemesi ile yükün düşüp voltajın değilmemesinin etkisi aynı olmaz mı?
 
Aslında belli pid değerleri ve hedef sıcaklık için voltajın(gücün) yükselip yükün değişmemesi ile yükün düşüp voltajın değilmemesinin etkisi aynı olmaz mı?
Olmaz bence. Çıkış sıcaklığından feedback alınıp ona göre actuate ettiğin için çıkış yükünedeki değişimlere güzel tepki vermeli kontrolcü, tabiki belli limitler dahilinde. Ama voltaj değişiminde bir ölçüm almadığı için olmaz. Bence şöyle yapsaydınız dediğiniz sıkıntıyı hiç yaşamayabilirdiniz, ucun akımını kontrol eden bir akım kontrolcü, o akım kontrolcüye referans akım değeri veren sıcaklık kontrolcü. Ama benzer şekilde sıcaklık kontrolcü çıkışının voltaj ile bölünmüş hali kullanılarak tek kontrolcü yapılsa da olabilir belki, bu iki sistemi karşılaştırmak lazım.
 
Havya için örnek verecek olursam daha düşük hedef sıcaklıkta termal yük ve güç ihtiyacı daha düşük oluyor.

Her bir pid çevrimini göz önüne alırsak ölçümlar arasında max gücün 2 kat yüksek olmasıyla, yükün yarı yarıya düşük olmasının iki ölçüm arasındaki değişim bakımından etkisi aynı olur diye düşünüyorum.
 
Havya için örnek verecek olursam daha düşük hedef sıcaklıkta termal yük ve güç ihtiyacı daha düşük oluyor.

Her bir pid çevrimini göz önüne alırsak ölçümlar arasında max gücün 2 kat yüksek olmasıyla, yükün yarı yarıya düşük olmasının iki ölçüm arasındaki değişim bakımından etkisi aynı olur diye düşünüyorum.
Bunun için yaptığım deneylerde yüksek ve düşük sıcaklıklarda serbest havada, pasif soğuyan bakır soğutucu, aktif soğutulan Bakır soğutucuyla birkaç deney yapmıştım.

Düşük yük, yüksek güç (voltaj) durumunda osilasyonu önlemek çok zor oluyordu.

@clc bahsettiğiniz gibi termal kütle, ısı kaynağı ve ölçüm noktası arasındaki farklardan dolayı da bir gecikme oluyor. Bunun telafisi ile ilgili hiç uğraşmadım, malumatım da vaktim de yetişmedi.
 
Termal macunun faydas oldu, overshoot 10 den 8 lere düştü ...

C++:
// Biqu H2
#define DEFAULT_Kp 14.36
#define DEFAULT_Ki 0.80
#define DEFAULT_Kd 64.64
Hocam birde kılıfın ve sensör ucunun ısınma süresi var o da biraz etkileyebilir. Rezistansın ısıl kapasitesi de, rezistans ve sensörün dış kılıfının ısıl iletkenliği de etkiler diye düşünüyorum. İlk ısınmada ısıtıcı gücünü düşünürseniz aşma 8 derecenin de altına inecektir kanaatindeyim.
 
Hocam birde kılıfın ve sensör ucunun ısınma süresi var o da biraz etkileyebilir. Rezistansın ısıl kapasitesi de, rezistans ve sensörün dış kılıfının ısıl iletkenliği de etkiler diye düşünüyorum. İlk ısınmada ısıtıcı gücünü düşünürseniz aşma 8 derecenin de altına inecektir kanaatindeyim.

Şimdi bunu denedim. Daha önce tam güç veriyordu ısıtıcı elemente (PWM=255),

C++:
#define PID_MAX    255    // Limit hotend current while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current

Ama ısının sensöre ulaşması gecikiyordu. Şimdi PWM=150 yaptım, hiç overshoot yok. Ama ısınma süresi tabi uzadı :) Şimdi değişik deneyler yapıp şöyle 4 derece overshoot elde edip orada bırakacağım.

1724347766153.png
 
Ben hep böyle elektrikle sürülen termal bir sistemin olabilecek en basit kapalı döngü kontrol sistemi olduğunu düşünüyordum. Ama gerçek dünyada her zaman seni gafil avlayan ayrıntılar oluyor böyle. Bir ara MATLAB simullink'de bu tip sistemlerin simulasyonunu yapmak istiyorum. Yani bir rezistans modeli, kapalı döngü kontrol ve parametreleri süpürüp nasıl bir etki yapıyor performansa gözlemlemek.
 
Şu anda PWM=200 ve maksimum 2.5 ℃ overshoot var. Isınma süresi bir dakika gibi.

1724350081002.png
 
Bu arada şimdi baktım da, Marlin içerisinde PID den tamamen farklı bir kontrol döngüsü algoritması daha varmış. Ve bunda PID deki sorunların hiç birisi yokmuş.

Model Predictive Temperature Control​

 
Şimdi bunu denedim. Daha önce tam güç veriyordu ısıtıcı elemente (PWM=255),

C++:
#define PID_MAX    255    // Limit hotend current while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current

Ama ısının sensöre ulaşması gecikiyordu. Şimdi PWM=150 yaptım, hiç overshoot yok. Ama ısınma süresi tabi uzadı :) Şimdi değişik deneyler yapıp şöyle 4 derece overshoot elde edip orada bırakacağım.

35634 eklentisine bak
Düzelmesine sevindim Hocam.
 
Şunu uygulayabilme şansınız varmı.
Diyelim hedefiniz 200 derece;190 dereceye kadar hızlı yükselten PID katsayıları;190 dereceden sonra daha farklı PID katsayıları.
Çünki ne kadar hızlı hedefe ulaşsın derseniz; taşma o oranda fazla olacaktır.
Ben bu tarz bir sorunla karşılaşmıştım.Bir sensorden gelen tur süresi bilgisi ile başka bir motoru senkronize çalıştırmam gerekiyordu.
Standart PID formülünü kullanmadan kendim bir yazılım yazmak zorunda kaldım.
Sabit katsayılar ile yaptıgımda senkronizasyon sürelerinde taşma veya gecikmeler oluyordu.Katsayıları aktif degiştirerek sorunu çözmüştüm.
Yani hedefe yaklaştıkca hızlanma hızını azaltarak(bu da herhalde PID katsayılarını degiştirmeye tekabul ediyor) sorunu çözmüştüm.
 
Marlin'deki uygulama şu: PID_FUNCTIONAL_RANGE diye bir makro var, varsayılan değeri 10. Eğer hedef sıcaklık ile güncel sıcaklık arasındaki fark bu değerden fazla ise, o zaman Marlin PID yapmıyor, ya tam güç veriyor ısıtıcıya yada gücü tamamen kesiyor. Sıcaklık farkı PID_FUNCTIONAL_RANGE aralığına girdiği anda PID devreye sokuluyor.

Zaten benim overshoot yaşamamın da büyük ölçüde sebebi buydu. Mesela 210 dereceye ayarlıyorum, TAM GÜÇLE 200 dereceye kadar geliyor, sonra PID yapmaya başlıyor, ama o anda ısıtıcının etrafındaki yüksek sıcaklık daha yeni yeni nüfuz ediyor sensöre.
 

Forum istatistikleri

Konular
6,538
Mesajlar
111,156
Üyeler
2,685
Son üye
Metalech

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top