Saya mencoba menerapkan algoritma PID dasar pada Arduino Leonardo untuk mencampur air keran panas dan dingin menggunakan katup yang dikontrol servo. Tujuannya adalah menahan suhu sedekat mungkin dengan setpoint. Terutama penting adalah mencegah suhu output dari overshooting setpoint untuk melindungi pengguna dari luka bakar. Yang penting kedua adalah mendapatkan suhu di dekat setpoint secepat mungkin.
Untuk perubahan kecil dalam suhu, implementasi standar dari algoritma PID tampaknya berfungsi dengan baik. Tetapi saya tidak tahu bagaimana menghitung keterlambatan lama yang mungkin terjadi ketika menunggu air panas mencapai katup, karena penundaan ini jauh lebih lama daripada penundaan standar setelah mengubah posisi katup.
Jelas tergantung pada panjang saluran air panas dan waktu sejak penggunaan terakhir air panas, perlu beberapa puluh detik agar air panas mencapai katup, sehingga selama waktu ini, suhu air tetap cukup konstan pada suhu rendah. dan katup air panas segera terbuka 100%. Komponen integral mulai mengakumulasi nilai kesalahan besar.
Ketika air panas akhirnya mencapai katup, suhu yang terdeteksi naik dengan sangat cepat ke suhu air panas maks. Karena kesalahan integral yang besar, katup air panas ditahan pada 100% untuk waktu yang lama setelah suhu melebihi setpoint, karena menunggu nilai integral dikurangi menjadi level normal. Dengan demikian hasilnya adalah air bersuhu maksimum selama beberapa (puluhan) detik.
Saya tidak yakin bagaimana menjelaskan kemungkinan keterlambatan yang lama ini. Dalam kasus seperti itu, apakah lebih bijaksana untuk menetapkan batas atas (dan bawah) pada nilai kesalahan integral, untuk membatasi waktu respons maks? Ini tampaknya mengalahkan tujuan komponen integral, dan juga masih akan memaksakan beberapa kelambatan setelah mencapai setpoint.
Atau apakah ada cara yang lebih baik untuk menangani perubahan input cepat setelah penundaan yang lama?
Terima kasih atas sarannya!
sumber
Jawaban:
Masalah Anda disebut Integral Windup , itu masalah kontrol yang umum. Di wilayah non-linier atau berbatasan lain, pengontrol tidak dapat melacak setpoint, dan integral meningkat ke nilai besar. Ini menyebabkan overshoot besar ketika setpoint akhirnya tercapai, yang persisnya yang Anda simpulkan adalah masalahnya.
Solusi paling sederhana adalah membatasi nilai Integrator itu sendiri hingga maksimum yang masuk akal. Membatasi kontribusi integral tidak akan berfungsi juga, karena integrator masih akan mencapai beberapa nilai besar.
Mathworks memiliki halaman dengan beberapa solusi lain untuk windup integral.
Dalam kontroler PID, Anda biasanya ingin istilah integral sesedikit mungkin. Dalam katup kontrol suhu mekanis standar, hanya kontrol proporsional yang digunakan, dan berfungsi dengan baik. Simpan istilah integral sekecil mungkin - pengguna tidak akan melihat kesalahan kecil pada suhu akhir. Anda mungkin menemukan bahwa Anda mendapatkan kinerja yang dapat diterima hanya dengan PD.
Karena ini adalah kasus yang sangat istimewa dan diketahui, Anda mungkin mempertimbangkan memiliki mode yang berbeda untuk pengontrol. Ukur suhu inlet panas, dan saat itu di bawah setpoint, jalankan hot 100%, dingin 20%. Saat memanas, alihkan ke PID, dengan kondisi awal yang baik.
sumber
Kunci untuk mengendalikan proses ini secara efisien adalah menyadari bahwa keran panas dan dingin tidak beroperasi secara simetris, dan algoritma optimal apa pun harus mempertimbangkan hal ini.
Ketika Anda tidak menggunakan air panas untuk sementara waktu, itu akan mendingin di dalam pipa.
Ketika Anda tidak menggunakan air dingin untuk sementara waktu, itu tetap sama seperti sebelumnya (kecuali air dingin berasal dari tangki air dingin dengan chiller, yang akan luar biasa untuk dimiliki pada hari-hari musim panas tetapi saya taruhan sangat jarang terjadi dalam latihan).
Jadi kita berasumsi kita tidak tahu apa yang kita dapatkan dari pipa air panas, tetapi kita dapat bergantung pada pipa air dingin yang cukup konstan selama menjalankan.
Jadi, dari suhu air campuran, dan dari mengetahui pengaturan katup, dan dari perkiraan suhu air dingin, kita dapat memperkirakan seberapa panas air yang berasal dari pipa air panas. Kemudian Anda dapat menyesuaikan katup untuk mendapatkan suhu keluaran yang benar tanpa PID, hanya berdasarkan evaluasi formula termodinamika.
Untuk mendapatkan "perkiraan suhu air dingin" Anda dapat menjalankan air dingin untuk waktu yang singkat (mungkin beberapa detik) di awal siklus dan membaca suhu. Kemudian asumsikan itu tidak akan berubah setelahnya, karena Anda tidak memiliki cukup data untuk menyelesaikan kedua suhu.
Skema ini tidak akan benar-benar akurat, tetapi saya memperkirakan itu akan masuk dengan aman di ballpark tanpa kemungkinan overshooting drastis. Kemudian Anda menjalankan PID di atas skema ini untuk menyempurnakan hasilnya, tetapi batasi perubahan pada pengaturan katup yang PID diizinkan untuk menghasilkan. Dan mungkin mengatur ulang status PID ketika Anda memiliki perubahan signifikan dalam suhu input air panas.
Solusi yang lebih bagus dimungkinkan dengan beberapa sensor suhu.
sumber
Saya hanya ingin menambahkan satu detail pada jawaban-jawaban yang bagus di atas tentang apa yang dilakukan oleh para insinyur kontrol untuk kemungkinan akhir yang integral. Ini juga terjadi dalam banyak proses industri dan ini lebih merupakan seni daripada sains.
Ada tindakan buku teks khas terhadap ini tanpa mengorbankan dari keuntungan integral yang mungkin benar-benar diperlukan untuk spesifikasi kinerja.
Setiap kali Anda melewati level kesalahan nol, Anda mengatur ulang integrator. Ini menjadikan integrator tipe integer on-demand elemen nonlinier alih-alih akumulator buta.
Anda pada dasarnya menghubungkan blok input tindakan integral ke elemen indikatif dalam loop. Ini mungkin merupakan output integrator untuk menilai apakah ia memulai build-up (yang membutuhkan pemahaman proses untuk membuat penilaian menjadi tepat). Atau Anda memeriksa apakah aktuator Anda jenuh atau tidak dan membentuk loop umpan balik berdasarkan informasi itu. Saya baru saja secara acak memilih tautan pertama yang keluar dari google dan di akhir video ini ada penjelasan grafis tentang poin terakhir saya. https://www.youtube.com/watch?v=H4YlL3rZaNw
sumber
Kadang-kadang dapat bermanfaat untuk memiliki beberapa set parameter PID, untuk tahapan kasar dari rentang operasi sistem, yang Anda ubah dengan cepat saat sistem beralih dari satu tahap perilaku ke tahap perilaku lainnya. Misalnya, satu set Kp, Ki, & Kd untuk saat Anda menghidupkan keran panas & hanya mendapatkan air dingin; kemudian setelah Anda mulai melihat suhu naik, beralih ke perangkat Kp, Ki & Kd. Kemudian selaraskan keduanya.
Apakah Anda menggunakan PID Library di Arduino Playground oleh Brett Beauregard? Yang ini cukup bagus. Dan ada contoh 'adaptif' di sini juga.
sumber
Sudahkah Anda memodelkan sistem?
Apakah Anda memiliki beberapa data berbasis waktu yang menunjukkan overshoot - terutama freq
Ini adalah dua pertanyaan yang harus ditanyakan dengan kueri berbasis kontrol.
Dari apa yang telah Anda jelaskan, keuntungan integral Anda terlalu tinggi, jalan menuju tinggi. Ini bisa disebabkan oleh integrator windup: kode yang ditampilkan memiliki beberapa keprihatinan praktis yang salah satunya adalah bukan integrator diskrit terbesar
Bisa juga karena sangat tinggi dan butuh waktu untuk turun.
Jadi ya nilai yang disimpan dalam register I bisa saja mengatakan ... 1000C karena P + I tidak diatur ke respons sistem dan kemudian harus ditutup.
Hal pertama yang akan saya lakukan adalah menangkap data realtime untuk pemrosesan pasca. Selanjutnya saya akan menjalankan P-only dan memastikan perolehan proporsional mencapai HAMPIR suhu yang diinginkan (teori kontrol menyatakan tidak akan). Tergantung pada apakah
Saya akan mulai dengan mengubah kode PID menjadi implementasi yang lebih baik dan kemudian menambahkan sedikit dari saya, hanya untuk membuktikan suatu hal.
Anda benar-benar perlu menentukan apa yang dimaksudkan untuk menentang kenaikan ini. Input adalah suhu, outputnya ... mengalir? jadi harus ada transfer aliran / C dan fungsi transfer Flow / Cs.
sumber
Salah satu cara yang saya sukai untuk menyelesaikan Integral Windup adalah dengan menghentikan akumulasi kesalahan setiap kali output kontrol Anda berada pada defleksi maksimum. . Atau skala dengan seberapa jauh dari defleksi maksimum. Jadi, setiap kali pengontrol Anda menghasilkan "air panas 100%, air dingin 0%", jangan mengakumulasi kesalahan, tetapi jangan mengatur ulang ke nol.
Saya tidak suka membatasi integral ke maksimum karena dengan demikian ada batas kesalahan sistematis yang dapat dikompensasi oleh PID Anda.
Saya juga menyarankan bahwa alih-alih membuat PID "bisu" yang hanya memiliki satu parameter yang coba dikontrol tanpa sepengetahuan sistem yang mendasarinya, Anda menginstal dua sensor suhu ekstra, pada input panas dan dingin. Anda kemudian mencoba untuk menemukan fungsi yang mendekati posisi yang diinginkan berdasarkan pada suhu input, dan Anda hanya menggunakan loop PID untuk menyesuaikan kesalahan. dalam output fungsi ini.
Kesalahannya akan signifikan karena Anda tidak mengukur aliran (yah, kecuali tentu saja Anda lakukan), yang tidak hanya bergantung pada posisi katup (diketahui) tetapi juga pada tekanan air (tidak diketahui).
Namun, ini akan banyak membantu dengan masalah air panas akhirnya mencapai keran karena dalam loop PID yang baik, Anda harus mengandalkan elemen D yang dikalibrasi dengan baik untuk dengan cepat mengurangi aliran panas. Dalam pengalaman saya mendapatkan koefisien turunan yang benar biasanya yang paling sulit. Tetapi jika Anda memiliki dua sensor tambahan, output utama akan berubah persis secepat suhu air input, jadi pada dasarnya instan, tanpa perlu elemen turunan sama sekali.
sumber