Kontrol PID fader motor

15

Saya mencoba mengendalikan fader bermotor (potensiometer geser linier) menggunakan Arduino.
Kontrol PID memberikan hasil yang baik untuk "melompat" ke posisi target tertentu, tetapi melacak jalur landai adalah masalah, itu tidak mulus sama sekali. Gerakannya sangat tersentak-sentak, apa pun yang saya coba.

Berikut plot posisi referensi, posisi yang diukur dan output motor saat melacak tanjakan: Melacak tanjakan

Dan inilah video dari tes yang sama.

Pada sistem komersial, sepertinya lebih lancar, lihat ini .

Detail :
Motor fader adalah RSA0N11M9A0K Alps . Untuk mengendarainya, saya menggunakan jembatan ST L293D , ditenagai oleh catu daya 10 V DC yang diatur ( XL6009 ).
Pada Arduino UNO (ATmega328P), saya menggunakan pin 9 dan 10, dengan frekuensi PWM 31,372 kHz untuk membuatnya tidak terdengar (Timer1 dengan prescaler 1, TCCR1B = (TCCR1B & 0b11111000) | 0b001).
Potensiometer dihubungkan antara ground dan 5V, dengan wiper menuju ADC0, seperti biasa.

Pengontrol :
Saya menggunakan pengontrol PID sederhana dengan anti-windup, yang diperbarui pada kecepatan 1 kHz (Ts = 1e-3 s):

float update(int16_t input) {
  int16_t error = setpoint - input;
  int16_t newIntegral = integral + error;
  float output = k_p * error 
               + k_i * newIntegral * Ts 
               + k_d * (input - previousInput) / Ts;

  if (output > maxOutput)
    output = maxOutput;
  else if (output < -maxOutput)
    output = -maxOutput;
  else
    integral = newIntegral;

  previousInput = input;
  return output;
}

Output dari controller adalah nilai dari -127 hingga 127. Output PWM dihasilkan sebagai berikut:

const int8_t knee = 48;

uint8_t activation(int8_t val) {
  if (val == 0)
    return 0;
  else {
    return map(val, 0, 127, 2 * knee, 255);
  }
}

void writeMotor(int8_t val) {
  if (val >= 0) {
    analogWrite(forward, activation(val));
    digitalWrite(backward, 0);
  } else {
    analogWrite(backward, activation(-val));
    digitalWrite(forward, 0);
  }
}

Saya menambahkan 48 ke sinyal PWM 7-bit, karena di situlah motor mulai bergerak pada 31 kHz, dan kemudian saya skalakan ke angka 8-bit (karena itulah yang analogWritediharapkan fungsi): Kecepatan PWM

Apa yang saya coba :
Saya sudah mencoba menambahkan filter EMA ke input, ke sinyal kontrol, ke komponen turunan dari kontroler PID, tetapi tidak berhasil. Saya juga mencoba menurunkan resolusi input analog, menggunakan histeresis untuk menghentikannya dari membalik di antara dua nilai ketika stasioner. Ini sepertinya tidak mempengaruhi apa pun. Meningkatkan langkah waktu ke 10 ms sepertinya juga tidak membantu.

Saya juga mencoba melakukan identifikasi sistem di MATLAB, dan mencoba menyetelnya di Simulink (mengikuti seri video ini ). Saya mendapat model dengan kecocokan 91%, tetapi saya tidak tahu bagaimana menangani input dan output non-linearitas dari model MATLAB, bagaimana mereka mempengaruhi penyetelan PID, dan bagaimana mengimplementasikannya pada Arduino.

Hal terakhir yang saya coba adalah membuat dua pengendali yang berbeda: satu untuk lompatan besar di posisi referensi, dan satu untuk kesalahan kecil saat melacak jalan. Ini sepertinya sedikit membantu, karena dengan begitu saya dapat meningkatkan koefisien integral saat melacak, tanpa meningkatkan overshoot saat melompat.
Namun, dengan meningkatkan gain integral (dan proporsional), motor sekarang selalu melakukan sesuatu, bahkan ketika itu harus diam dan referensi tidak berubah. (Ini tidak benar-benar bergerak, tetapi Anda bisa merasakannya bergetar.)
Saya hampir tidak memiliki keuntungan turunan, karena meningkatkannya lebih tinggi dari 1e-4 tampaknya membuatnya lebih brengsek, dan saya tidak benar-benar melihat perbedaan antara 0 dan 1e-4.

Dugaan saya adalah bahwa ia membutuhkan lebih banyak daya untuk mengatasi gesekan statis, maka gesekan dinamis kurang, sehingga melampaui batas, sehingga mendorong motor mundur, menyebabkannya berhenti lagi, maka ia harus mengatasi gesekan statis lagi, ia menembak ke depan lagi , dll.

Bagaimana pengontrol komersial mengatasi masalah ini?

Latar belakang saya :
Saya berada di tahun sarjana ketiga Teknik Elektro, saya telah mengikuti kursus tentang teori kontrol, pemrosesan sinyal digital, kontrol LQR dll. Jadi saya memiliki latar belakang teoretis, tetapi saya mengalami kesulitan menerapkan semua teori tersebut ke sistem dunia nyata ini.


Sunting :
Saya telah menguji pengukuran sensor loop terbuka, seperti yang direkomendasikan laptop2d, dan saya cukup terkejut dengan hasilnya: Pada frekuensi PWM tinggi, ada puncak buruk dalam pembacaan. Pada 490 Hz, tidak ada satu pun.
Dan ini adalah siklus kerja yang konstan, jadi saya tidak bisa membayangkan suara seperti apa yang saya dapatkan ketika motor berbalik arah dengan sangat cepat.

masukkan deskripsi gambar di sini

Jadi saya harus menemukan cara untuk menyaring kebisingan itu sebelum saya mulai bekerja pada controller lagi.

Sunting 2 :
Menggunakan filter rata-rata bergerak eksponensial tidak cukup untuk menyaring kebisingan.

EMA

Saya sudah mencoba dengan kutub di 0,25, 0,50 dan 0,75. Kutub kecil tidak memiliki banyak efek, dan kutub besar menambahkan terlalu banyak latensi, jadi saya harus menurunkan keuntungan agar tetap stabil, sehingga kinerja keseluruhan lebih buruk.

Saya telah menambahkan kapasitor 0,1 μF di seluruh potensiometer (antara penghapus dan tanah), dan yang sepertinya membersihkannya.

Untuk saat ini, ia bekerja dengan cukup baik. Sementara itu, saya membaca makalah yang diposting oleh Tim Wescott .
Terima kasih atas bantuannya.

Tttapa
sumber
Anda dapat mengontrol PWM 31KHz dengan akurat?
Hasan alattar
@Hasanalattar: Tidak, frekuensi yang bisa saya gunakan ada di grafik kedua (prescaler 1, 8, 64, 256, 1024). 4 kHz dan 500 Hz dapat didengar, sehingga menghasilkan suara bip yang mengganggu, yang ingin saya hindari. Itu berarti 31 kHz, 120 Hz dan 30 Hz. Dan dua yang terakhir terlalu lambat, saya pikir. Resolusi PWM adalah 8 bit, tetapi saya menggunakan lebih sedikit, karena sinyal kontrol saya hanya 7 bit, dan saya hanya menggunakan nilai PWM lebih tinggi dari 96.
tttapa
1
H-bridge yang Anda tautkan memiliki di halaman depan lembar data: This device is suitable for use in switching applications at frequencies up to 5 kHz. Tetapi Karakteristik Listrik pada halaman 3 menyarankan maksimum absolut 690 kHz jika Anda menambahkan semua penundaan. (bawah 4 baris) Secara pribadi, saya akan jauh lebih lambat dari itu, tapi saya akan berpikir bahwa 31kHz harus memadai ... jika bukan karena catatan pada halaman 1.
AaronD
Namun, itu mengasumsikan siklus tugas tetap. (atau "tidak peduli" siklus kerja untuk frekuensi maksimum absolut untuk "hanya menggoyangkannya" - Anda akan melihat itu asimetris) Siklus tugas tinggi dan rendah dapat menghasilkan beberapa pulsa yang sangat sempit, jadi seberapa luas mereka dibandingkan dengan bagian bawah halaman 3?
AaronD
1
Tidak yakin apakah itu masalah Anda, tetapi jika stempel waktu dapat bervariasi maka saya pikir Anda harus menambahkan kesalahan * Ts ke integral, bukan hanya kesalahan, dan jangan gandakan integral dengan Ts. (Jika Ts selalu konstan maka itu tidak masalah)
user253751

Jawaban:

9

Sistem kontrol hanya sebagus sensornya, jalankan loop terbuka sensor dan hapus input kontrol. Buat input Anda sendiri ke sensor dan geser perlahan (atau temukan cara untuk geser perlahan andal) saat mengambil data posisi untuk memastikan itu bukan sensor. Jika sensor berisik, maka tingkatkan kinerja sensor dengan mendapatkan sensor baru atau sejajar dengannya, atau dengan memfilter output sensor . Anda mungkin memerlukan sensor dengan resolusi lebih tinggi.

Jika sensor tidak berisik maka Anda harus mendapatkan loop kontrol yang berbeda. PID adalah sistem urutan pertama dan tidak terlalu bagus dalam pengendalian laju.

Lonjakan tegangan
sumber
Terima kasih, memang ada banyak suara dengan frekuensi PWM yang lebih tinggi, jadi saya harus mencari cara untuk memperbaikinya. Apakah Anda memiliki petunjuk tentang cara melakukannya?
tttapa
Gunakan filter, mekanis atau digital. Jika Anda tidak bisa melakukan itu, mereka mungkin menyamakan sensor dengan baik. meta.stackexchange.com/questions/126180/...
Voltage Spike
6

Anda benar bahwa masalahnya adalah dari gesekan, atau mungkin kombinasi dari gesekan dan reaksi balik. Plot kecepatan rata-rata vs siklus tugas untuk berbagai lebar pulsa adalah karakteristik sistem dengan gesekan. Makalah ini menjelaskan apa yang Anda lihat, dan memiliki ringkasan solusi yang telah digunakan sejak lama untuk mengatasi masalah. Anda tidak akan melihatnya dalam kurikulum teknik Anda karena sulit dianalisis; Anda pada dasarnya harus mengutak-atik mereka berdasarkan kasus per kasus untuk membuat mereka bekerja.

Saya tidak tahu apa yang dikontrol pengendali komersial, walaupun saya curiga ada banyak solusi di luar sana. Apa yang telah saya lakukan di masa lalu dengan hal-hal seperti ini adalah ketika sinyal drive motor keluar dari kontroler PID saya jatuh di bawah ambang batas (mungkin 60 hingga 70 hitungan dalam kasus Anda) Saya mulai memutar drive motor pada ambang pintu, dengan sebuah tugas siklus yang membuat drive rata-rata sama dengan output PID. Saya biasanya menggunakan modulator sigma-delta-ish untuk ini karena ini dapat diimplementasikan dalam beberapa baris, tetapi Anda dapat menggunakan apa pun yang sesuai untuk Anda.

TimWescott
sumber
4

Sepertinya sebagian besar kebisingan berasal dari sinyal drive PWM.

Sudahkah Anda mencoba menyinkronkan tangkapan ADC ke siklus PWM? Sebagian besar mikrokontroler memiliki cara untuk memicu penangkapan ADC pada penghitung waktu, sehingga Anda selalu dapat memicu pada titik siklus yang sama.

Untuk kebisingan terendah, posisi pengambilan sampel yang optimal akan tepat sebelum menghidupkan daya ke motor, karena paku memiliki waktu terlama untuk diselesaikan. Tetapi apa pun posisinya, sinkronisasi tangkapan akan mengurangi paku karena jumlah offset akan tetap sama pada titik yang sama dari siklus PWM.

jpa
sumber
3

Jadi saya harus menemukan cara untuk menyaring kebisingan itu sebelum saya mulai bekerja pada controller lagi.

Anda dapat memfilter derau sensor (atau variabel / pengukuran bising lainnya) dalam kode dengan sesuatu seperti ini (penyaringan low pass):

Stersaring[k]=αStersaring[k-1]+(1-α)Smentah[k]

0<<α1

Big6
sumber
Saya sudah mencobanya, tetapi itu tidak cukup untuk menghilangkan puncak, dan itu menambahkan terlalu banyak lag.
tttapa
@tttapa yang saya lihat. Nilai alpha mana yang Anda coba? (0.8.0.9) Ini akan membutuhkan penyetelan, yang mungkin sudah Anda lakukan, hanya ingin tahu.
Big6
Saya memperbarui posting asli saya untuk menambahkan plot filter EMA yang saya coba. Saya sudah mencoba 0,9 juga, dan itu bahkan lebih buruk daripada 0,75, keuntungannya harus jauh lebih rendah karena keterlambatan. Saya pikir saya akan menggunakan EMA terbatas untuk membersihkan suara ADC, tetapi untuk sekarang kapasitor sudah cukup.
tttapa