Büyük ve öngörülemeyen anomalileri olan PID Kontrol Döngüler


10

Kısa Soru
Aksi halde tekdüze bir kontrol bölgesinde çok büyük anomalileri (büyüklük sırası) ele almanın yaygın bir yolu var mı?

Arka plan
Bir motoru genel olarak muntazam bir kontrol bölgesinde yönlendiren bir kontrol algoritması üzerinde çalışıyorum. Minimum yükleme olmadan / PID kontrolü harika çalışır (hızlı tepki, çok az veya fazla aşım yok). Karşılaştığım sorun genellikle en az bir yüksek yükleme konumu olacak. Konum, kurulum sırasında kullanıcı tarafından belirlenir, bu nedenle ne zaman / nerede bekleyeceğini bilmem için makul bir yol yoktur.

PID'yi yüksek yük konumunu işleyecek şekilde ayarladığımda, yüklü olmayan alanlarda (tamamen beklediğim) büyük sürgünlere neden olur. Öyle olsa tamam aşım orta yolculuğuna, muhafaza üzerinde hiçbir mekanik sabit durur vardır. Sabit disklerin olmaması, herhangi bir önemli aşımın kontrol kolunun motorla bağlantısının kesilmesine (ölü bir ünite vererek) neden olabileceği / yapabileceği anlamına gelir.

Prototip yaptığım şeyler

  • Yuvalanmış PID'ler (hedeften uzakta çok agresif, yakınlarda muhafazakar)
  • Uzakta sabit kazanç, yakınken PID
  • Muhafazakar PID (yüksüz çalışır) + PID'nin durmak ve ek enerji uygulamak için aşağıdakilerden birine kadar harici bir kontrol: hedefe ulaşılana veya hızlı bir değişim oranı tespit edildi (yani yüksek yük alanından ayrılma)

Sınırlamalar

  • Tam seyahat tanımlandı
  • Hardstops eklenemez (bu noktada)
  • Hata muhtemelen sıfırlanmaz
  • Yüksek yük,% 10'dan daha düşük bir hareketten elde edilebilirdi (yani "çalışma başlangıcı" yok)

Yanıtlar:


2

Hata hesaplamanız, türev terimi ile çalışırken hatayı biriktirmiş gibi görünmüyor ve yalnızca türev terimi süreçteki hızlı değişikliklere tepki verebildiğinden bunu değiştirmek isteyebilirsiniz.

Eğer doğru kodu alırsam

// Determine the error delta
dE = abs(last_error - new_error);
last_error = new_error;

kontrol terimini her zaman geçerli hataya göre hesaplar. I teriminin zaten birikmiş hata ile ilgilenmesi gerektiği için sorun yok.

Ancak, denemek isteyebileceğiniz aşağıdaki fikri ortaya çıkaran bir müşterim vardı. Süreç eğrisinin daha agresif değişikliklere ihtiyaç duyduğu bir kısmına sahip olduğunuz için, D kısmı hatasının bile birikmesine izin verebilirsiniz:

if(TD)                                                 // Calculate D term
{  
   Last_C += (Error - Last_C) / TD;                    // D term simulates
   Dterm = (Error - Last_C) * KD;                      // capacitor discharging
}
else    
   Dterm = 0;                                          // D term is OFF (TD is 0)

Burada dikkat edilmesi gereken iki ilginç nokta var:

  • TD değeri türev kazancı (KD) değil, türev zamanıdır, hatanın birikmesi için zamanı kontrol eden bir kullanıcı sabiti. Sıfıra ayarlanmışsa, ayarlanan KD kazanç değeri dikkate alınmadan PID'nin D kısmı devre dışı bırakılır.

  • Geçerli hatanın D parçası hesaplamasına geçmeden önce Last_C değerini 'şarj etmek' için nasıl kullanıldığına dikkat edin. Last_C değişkeni bir kapasitör gibi davranır, hata büyükken birikir, böylece türev parçanız da hatanın yakın zamanda 'geçmişine' dayalı olarak çalışır ve bundan sonra (hata daha küçük olduğunda) bu 'geçmişi Bir kondansatör gibi deşarj olur.

Tabii ki, toplam çıktıyı muhtemelen zaten yaptığınız şekilde sınırlamalısınız (anti -upup reset, manuel aktarıma çarpma otomatik ve diğer olağan şeyler).

Yararlı bulursanız, PID algoritmamın diğer terimleri hakkında daha fazla ayrıntı gönderebilirim, ancak bunu denemek ve ne olduğunu görmek isteyebilirsiniz. Müşterilerime yıllarca iyi hizmet etti.


Giriş için teşekkürler. Bunu denemem gerekecek. Hızlı bir bakışta mantıklı görünüyor.
Adam Lewis

Görüyorum ki, 'ana' PID'nizde artı durak tespitinin hesaplamaya getirdiği her şeyde bir D terimi katkınız var.
Drazen Cika

1
Bu doğru. Ayarlama sırasında PID'nin Dterm'i çok agresif değildir. Bu sorunu daha da zorlaştıran şey, yükün çok kısa bir sürede serbest kalmasıdır. IE bağlantı kaldırılıyor. Kuvvetin bu aniden çıkarılması, durma kuvvetlerine uygulanan herhangi bir yumuşatma işlevi (toplam) olduğunda büyük aşmalara neden olur.
Adam Lewis

Kötü bir sorun, bazı bulanık mantık algoritmasının bunu ne kadar iyi ele alacağını bilmek ilginç olurdu. En azından standart çözümlerde sınırlı kalmak yerine, problemle ilgili deneyiminizi algoritmaya daha fazla inşa edebilirsiniz. Her neyse, bununla iyi şanslar :-)
Drazen Cika

1

İlk Çözüm

stalled_pwm_output = PWM / | ΔE |

PWM = Maks PWM değeri
ΔE = son hata - new_error

İlk ilişki , motordaki değişiklik eksikliğine bağlı olarak PWM çıkışını başarılı bir şekilde arttırır . Örnek çıktısı için aşağıdaki grafiğe bakın.

Bu yaklaşım, agresif olmayan PID'nin durduğu durumdan bu yana ortaya çıkar. Bununla birlikte, talihsiz PID'nin ayar noktasına erişebildiği ve yavaşlamaya çalıştığı zaman, stalled_pwm_output'un yükseldiği talihsiz (ve bariz) bir sorun vardır. Bu hızlanma, yüksüz bir konuma giderken büyük bir aşırılığa neden olur.

1 / ΔE ve ΔE

Mevcut Çözüm

teori

stalled_pwm_output = (kE * PID_PWM) / | ΔE |

kE = Ölçekleme Sabiti
PID_PWM = Agresif olmayan PID'den mevcut PWM isteği
ΔE = son_hatay - new_error

Mevcut ilişkim hala 1 / conceptE kavramını kullanıyor, ancak stall_pwm_output değerini belirlemek için agresif olmayan PID PWM çıktısını kullanıyor. Bu, PID'nin hedef ayar noktasına yaklaşmaya başladığında stall_pwm_output değerini kısmasına izin verir, ancak durduğunda% 100 PWM çıkışına izin verir. Ölçeklendirme sabiti kE, PWM'nin doyma noktasına girmesini sağlamak için gereklidir (aşağıdaki grafiklerde 10.000'in üzerinde).

Sahte Kod

Cal_stall_pwm sonucunun geçerli kontrol mantığımdaki PID PWM çıkışına eklendiğini unutmayın .

int calc_stall_pwm(int pid_pwm, int new_error)
{
    int ret = 0;
    int dE = 0;
    static int last_error = 0;
    const int kE = 1;

    // Allow the stall_control until the setpoint is achived
    if( FALSE == motor_has_reached_target())
    {
        // Determine the error delta
        dE = abs(last_error - new_error);
        last_error = new_error;

        // Protect from divide by zeros
        dE = (dE == 0) ? 1 : dE;

        // Determine the stall_pwm_output
        ret = (kE * pid_pwm) / dE;
    }

    return ret;
}

Çıktı Verileri

Durmuş PWM Çıkışı Durmuş PWM Çıkışı

Durmuş PWM çıkış grafiğinde, ~ 3400'deki ani PWM düşüşünün, motor belirli bir süre içinde konuma erişemediği için etkinleştirilen yerleşik bir güvenlik özelliği olduğuna dikkat edin.

Yüksüz PWM Çıkışı Yüksüz PWM Çıkışı


1

Ne kontrol ediyorsun demiyorsun ... motor devrini? durum? Ne olursa olsun, ilk adım kabul edilebilir bir hatanın ne olacağını tanımlamak olacaktır. Örneğin, kontrol hız içinse, hedefin% 1'i dahilinde bir maksimum hata ayarlanabilir. Kabul edilebilir hatayı tanımlamaksızın ADC'ler veya PWM sayısı için ne kadar çözünürlüğe ihtiyacınız olduğunu belirleyemezsiniz. Bu olmadan, PID telafisi mükemmel olabilir, ancak yine de sınır döngü salınımları olacaktır.

O zaman açık döngü sisteminin dinamiklerini bilmeniz gerekir. Bu olmadan, döngünün oransal (P), integral (I) ve türev (D) kısımları için hangi kazançların gerekli olduğunu bilemezsiniz. Giriş adımıyla (sürücü seviyesinde veya PWM'de adım değişikliği) veya yükte adım değişiklikleriyle (bunun sizin için önemli olduğu görülüyor) dinamiği ölçebilirsiniz.

PWM değerini değiştirmek için kontrol algo paydasında döngüden döngüye hata değişikliğini kullanmak, döngünün asla yerleşmemesini sağlar. Bu, kontrolde bir sınır döngü salınımı sağlar. Çoğu müşteri buna katlanmaz.

Döngünün P kısmı acil hatayı halleder (bir hataya hemen yanıt verir). Ancak sonlu bir kazanca sahip olacak, bu yüzden bazı hatalar bırakılacak. Döngünün I kısmı, P parçasının bıraktığı hatayı düzeltmek için sonsuz kazanç (sonsuz kazanç için sonsuz zaman) uygulamak için zamanla yavaş reaksiyona girer.

I kısmı yavaş olduğundan, doğru şekilde ayarlanmış olsanız bile hata minimizasyonu için gereken düzeltmeyle fazdan çıkabilir. Böylece iyileşmek uzun zaman alıyor. Ya da P kısmına ters bırakılır.

Rüzgârın üstesinden gelmenin en iyi yolu, entegratördeki maksimum saklanan değeri, en kötü durumda oransal hatayı düzeltmek için gerekenden biraz daha fazla sınırlamaktır. Eğer entegratör faz dışına çıkarsa ve P'ye karşı ise, yapılacak en iyi şey entegratör değerini sıfıra ayarlamaktır. Algo bunu algılayacak ve gerektiğinde entegratörü sıfırlayacak şekilde tasarlanabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.