Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Menguasai Kontrol Motor DC: Tips dan Trik Ahli

Komponen dan Perlengkapan

Arduino Due (atau papan Arduino apa pun), Makeblock Me TFT LCD (opsional), Resistor 4.75k ohm (4 buah), Potensiometer rotary (4 buah, 3 opsional), Transistor PNP Umum (4 buah), Motor DC (1 buah), Saklar Geser (1 buah), Sensor Kecepatan Fotoelektrik HC-020K (1 buah), Papan Roti (1 buah), Kabel Jumper (1 buah).

Aplikasi dan Layanan Online

Arduino IDE

Tentang Proyek Ini

Kontrol Kecepatan dan Arah Motor DC dengan Kontroler PID dan Output PWM

Pendahuluan

Hampir di semua proyek yang tersedia, pencipta ingin mengontrol kecepatan dan arah motor bersama-sama, tetapi mereka terutama lebih suka mengirimkan PWM langsung ke motor DC, bahkan melalui rangkaian kontrol motor. Namun metode seperti ini selalu gagal jika Anda perlu mencocokkan kecepatan persis seperti yang Anda inginkan karena kembar yang disebut “gesekan” dan “inersia”.

(Jangan pernah menyalakan Kembar. Apa pun dan kapan pun Anda ingin melakukan tindakan dengan atau tanpa sesuatu, Kembar segera datang dan mengambil tindakan hanya untuk membantu Anda menjaga semuanya tetap terkendali. Sementara Inersia membiarkan hal-hal untuk “berpikir” sebelum mengambil tindakan, Gesekan membatasi percepatan dan kecepatan mereka. Dan “daya” adalah “tidak ada” jika tidak berada di bawah kendali penuh.)

Jadi, jika Anda mencoba mengontrol kecepatan motor secara langsung dengan mengirim input Anda sebagai sinyal PWM ke output, kecepatan sebenarnya tidak akan pernah bertemu dengan titik set Anda dan akan ada perbedaan yang signifikan (kesalahan), seperti yang dapat dilihat pada gambar di atas. Di sini kita memerlukan cara lain, dan disebut sebagai “kontrol PID”.

Kontroler PID

Apa itu kontrol PID? Bayangkan bagaimana mengemudi mobil Anda: Untuk mulai bergerak dari posisi mati total, Anda harus mendorong pedal gas lebih dari saat berkruising normal. Saat bergerak dengan kecepatan (hampir) konstan, Anda tidak perlu mendorong pedal gas terlalu banyak, tetapi Anda hanya memulihkan kehilangan kecepatan ketika diperlukan. Selain itu, Anda melepaskannya sedikit jika percepatan lebih tinggi dari kebutuhan Anda. Ini juga cara “mengemudi hemat”.

Jadi, kontroler PID melakukan persis hal yang sama: Kontroler membaca selisih “Sinyal Kesalahan (e)” antara titik set dan output aktual. Ini memiliki 3 komponen yang berbeda yang disebut “Proporsional”, “Integral” dan “Turunan”; jadi nama kontroler berasal dari huruf pertama masing-masing. Komponen Proporsional secara sederhana menentukan lereng (percepatan) output kontroler terhadap sinyal kesalahan aktual. Bagian Integral menjumlahkan sinyal kesalahan seiring waktu untuk meminimalkan kesalahan akhir. Dan komponen Turunan memantau percepatan sinyal kesalahan, dan menempatkan “penyesuaian”. Saya tidak akan memberikan detail lebih lanjut di sini, silakan cari di internet jika Anda tertarik.

Dalam program Arduino saya, kontroler PID ditulis sebagai fungsi yang ditunjukkan di bawah:

float controllerPID(float _E, float _Eprev, float _dT, float _Kp, float _Ki, float _Kd) { float P, I, D; /* Base Formula: U = _Kp * ( _E + 0.5*(1/_Ki)*(_E+_Eprev)*_dT + _Kd*(_E-_Eprev)/_dT ); */ P = _Kp * _E; /* Komponen Proporsional */ I = _Kp * 0.5 * _Ki * (_E+_Eprev) * _dT; /* Komponen Integral */ D = _Kp * _Kd * (_E-_Eprev) / _dT; /* Komponen Turunan */ return (P+I+D); } 

Nilai output akhir kemudian ditentukan dengan menambahkan nilai output saat ini dan output kontroler PID. Ini adalah bagian berikutnya dari program utama bersama dengan perhitungan Sinyal Kesalahan dan Output Kontroler PID:

/* Sinyal Kesalahan, Output Kontroler PID dan Output Akhir (PWM) ke Motor */ E = RPMset - RPM; float cPID = controllerPID(E, Eprev, dT, Kp, Ki, Kd); if ( RPMset == 0 ) OutputRPM = 0; else OutputRPM = OutputRPM + cPID; if ( OutputRPM < _minRPM ) OutputRPM = _minRPM; 

Rangkaian Sumber Daya Motor DC

Tentu saja tidak disarankan untuk mengemudi motor DC langsung dari output Arduino atau papan kontrol serupa. Motor DC memerlukan sejumlah arus yang signifikan dibandingkan yang tidak dapat disuplai oleh output papan kontrol. Jadi Anda perlu mengemudi coil relai. Namun di sini masalah lain muncul: Relai memiliki bagian mekanis dan dapat gagal dalam jangka menengah atau panjang. Kami memerlukan komponen lain di sini, transistor.

Sebenarnya motor DC diemdi oleh arus, bukan oleh tegangan. Jadi dengan menggunakan prinsip ini, saya memutuskan untuk menggunakan transistor. Namun Anda harus memilih transistor yang benar yang mampu menahan arus motor. Pertama, jalankan motor secara langsung dengan menghubungkannya ke sumber daya, dan ukur arus pada kondisi operasi maksimum, atau rujuk ke spesifikasi produsen.

Setelah melakukan ini, saya memutuskan untuk menggunakan empat transistor junksi bipolar PNP BC307A pada “jembatan” untuk menentukan arah arus melalui coil motor (sebenarnya set NPN BC337 akan bekerja lebih baik karena kemampuan menahan arus kolektor yang jauh lebih tinggi, tetapi saya tidak memilikinya saat itu).

Karena arus motor harus melewati jalur Emitor-Kolektor transistor, perlu menggunakan transistor dengan Koefisien Arus DC Gain (hfe) yang hampir sama. Untuk memeriksanya, Anda dapat menggunakan rangkaian berikut, dan mengumpulkan transistor yang memberikan pembacaan arus yang hampir sama pada ampermeter. Untuk merancang rangkaian awal ini, Anda harus mempertimbangkan hal-hal berikut:

Sekarang Anda dapat menentukan nilai resistor yang harus terhubung ke Basis: Pertama, Anda harus mempertimbangkan keterbatasan output papan kontrol Anda, dan mencoba menjaga Arus Basis sekecil mungkin (jadi disarankan untuk memilih Arus DC Gain transistor sebesar mungkin. Ambil nilai tegangan output pada papan kontrol sebagai “Tegangan Pemicu” (VT), dan temukan Arus Basis yang Diperlukan (IBreq) dengan membagi Arus Motor (IM) ke Arus DC Gain (hfe) dari transistor: IBreq = IM / hfe.

Kemudian tentukan Tegangan yang harus jatuh di seluruh Resistor (VR), dengan mengurangi Tegangan On Emitor-Basis (VBEon) dari Tegangan Pemicu: VR = VT - VBEon.

Terakhir bagi Tegangan yang harus jatuh di seluruh Resistor (VR) ke Arus Basis yang Diperlukan (IBreq) untuk menemukan Nilai Resistor (R): R = VR / IBreq.

[ Rumus gabungan: R = ( VT - VBEon ) * hfe / IM ]

Dalam kasus saya:

Membalikkan Arah dan Catatan Penting

Untuk membalikkan arah motor DC, cukup untuk membalikkan aliran arus. Untuk melakukannya, kita dapat secara sederhana membuat rangkaian jembatan dengan empat set transistor. Pada skema; Output PWM#2 mengaktifkan T1A dan T1B sementara Output PWM#3 mengaktifkan T2A dan T2B, jadi arus yang melewati motor berubah.

Tetapi di sini kita harus mempertimbangkan masalah lain: Saat baru dimulai, motor listrik menarik arus start-up transien yang jauh lebih tinggi dari arus nominal yang Anda baca selama operasi normal/berkelanjutan (produsen hanya memberikan arus nominal). Arus start-up mungkin sekitar 130% dari arus nominal untuk motor daya kecil, dan meningkat tergantung pada daya motor. Jadi, jika Anda memberi daya motor langsung dari sumber tegangan dan segera membalikkan polaritas selama operasi, motor menarik arus yang ekstrim karena belum berhenti sepenuhnya. Akhirnya ini dapat menghasilkan sumber daya meledak atau membakar gulungan motor. Ini mungkin tidak terlalu penting dan terasa untuk motor daya sangat kecil, tetapi menjadi penting jika level daya yang Anda kerjakan meningkat. Namun jika Anda memberi daya motor melalui transistor atau sekumpulan transistor (seperti Pasangan Darlington), Anda tidak memiliki masalah semacam itu karena transistor sudah membatasi arus.

Bagaimanapun, saya mempertimbangkan rutinitas kecil dalam program: Saat pilihan arah berubah selama berjalan, program mendorong kedua output perintah ke nol terlebih dahulu, dan menunggu motor hingga berhenti sepenuhnya. Kemudian menyelesaikan tugasnya, dan memberikan semua kontrol kembali ke rutinitas utama.

if ( Direction != prevDirection ) { /* Killing both of the PWM outputs to motor */ analogWrite(_chMotorCmdCCW,0); analogWrite(_chMotorCmdCW,0); /* Wait until motor speed decreases */ do { RPM = 60*(float)readFrequency(_chSpeedRead,4)/_DiscSlots; } while ( RPM > _minRPM ); } 

Membaca Kecepatan

Dalam aplikasi saya saya menggunakan sensor kecepatan HC-020K murah. Mengirimkan pulsa pada level tegangan sumber dayanya, dan datasheet mengatakan bahwa tegangan sumber daya adalah 5V. Namun papan saya adalah Arduino Due dan tidak dapat menerimanya. Jadi saya langsung memberi daya dari output 3,3V Due, dan ya, itu bekerja. Dan fungsi berikut ditulis untuk membaca frekuensi dan output HC-020K.

int readFrequency(int _DI_FrequencyCounter_Pin, float _ReadingSpeed) { pinMode(_DI_FrequencyCounter_Pin,INPUT); byte _DigitalRead, _DigitalRead_Previous = 0; unsigned long _Time = 0, _Time_Init; float _Frequency = 0; if ( (_ReadingSpeed<=0) || (_ReadingSpeed>10) ) return (-1); else { _Time_Init = micros(); do { _DigitalRead = digitalRead(_DI_FrequencyCounter_Pin); if ( (_DigitalRead_Previous==1) && (_DigitalRead==0) ) _Frequency++; _DigitalRead_Previous = _DigitalRead; _Time = micros(); } while ( _Time < (_Time_Init + (1000000/_ReadingSpeed)) ); } return (_ReadingSpeed * _Frequency); } 

Perhatikan bahwa roda HC-020K memiliki 20 slot, cukup membaca frekuensi untuk dibagi 20 untuk mendapatkan putaran per detik sebagai frekuensi. Kemudian hasilnya harus dikalikan 60 untuk mendapatkan RPM.

RPM = 60 * (float)readFrequency(_chSpeedRead,4) / _DiscSlots; 

Sentuhan Grafis

Untuk menampilkan input dan hasil, saya menggunakan Layar TFT Makeblock Me dan menulis fungsi CommandToTFT() untuk mengirim perintah ke layar. Sebenarnya alasan fungsi ini hanyalah untuk mengubah titik koneksi serial hanya pada satu baris dalam program, jika diperlukan.

Fungsi Cartesian_Setup(), Cartesian_ClearPlotAreas() dan Cartesian_Line() ditulis untuk menyiapkan area plotting grafik, menghapus area plot saat mencapai akhir sumbu horizontal (di sini adalah “waktu”) dan memplot grafik secara masing-masing. Rujuk ke manual Layar TFT Makeblock Me untuk detail lebih lanjut jika Anda tertarik dengan fungsi grafik di sini, karena saya tidak akan menjelaskannya di sini karena sebenarnya di luar cakupan blog ini.

Akhir

Di sini saya menyalin program dengan dan tanpa fungsi grafis terpisah, jadi Anda dapat meninjau Implementasi Kontrol Kecepatan dan Arah secara mandiri, atau dengan grafik. Selain itu, pada Kode Anda dapat menemukan penjelasan lebih lanjut untuk fungsi yang diprogram.

Akhirnya, biasanya Anda tidak dapat menurunkan kecepatan motor DC di bawah 10-20% dari kecepatan ratednya, bahkan tidak ada beban apa pun. Namun, mungkin untuk menurunkan hingga hampir 5% dengan menggunakan kontrol PID untuk motor DC tanpa beban setelah dinyalakan.

Edit (25.Feb.2018): Jika Anda ingin menggunakan transistor NPN alih-alih PNP, Anda harus mempertimbangkan juga aliran arus terbalik pada kedua jenis. Saat dipicu (dihidupkan) arus mengalir dari Emitor ke Kolektor pada transistor PNP, tetapi terbalik untuk tipe NPN (dari Kolektor ke Emitor). Oleh karena itu transistor PNP difarahkan sebagai E(+) C(-) dan untuk NPN harusnya C(+) E(-).

Kode

Kode dengan Sentuhan Grafis

/* Kode lengkap dengan fungsi grafis Makeblock Me TFT LCD ... */

Kode tanpa Sentuhan Grafis

/* Kode sederhana tanpa fungsi grafis ... */

Skema Rangkaian

Ini adalah prototipe untuk menjelaskan kontrol kecepatan motor DC dengan menggunakan kontroler PID, dan apa yang harus dipertimbangkan untuk membalikkan arah.

Proses manufaktur

  1. Meningkatkan Performa Motor DC dengan Legam Tungsten-Tembaga
  2. Membangun Efek Audio Berbasis Sensor dengan Kit Satellite CCRMA
  3. Kendalikan Dua Motor Stepper dengan Arduino Nano dan Joystick – Tutorial Sederhana
  4. Menguasai Matriks LED 8×8 dengan Arduino Uno: Panduan Langkah demi Langkah
  5. Sistem Pemantauan Suhu Cerdas untuk Sekolah: Akurat, Real-Time, dan Aman
  6. Pustaka Port IO 8-bit Efisien untuk Arduino – Perluas Kontrol Digital
  7. Matriks Keyboard Prototyp 64-Tombol Arduino – Buat Keyboard Custom dengan Shift Register
  8. Layar TFT SPI 2.8 Inch Tinggi Performa untuk Arduino Nano – Tampilan 320×240
  9. Bangun Rangkaian Input Analog Terisolasi untuk Arduino
  10. Kit Robot Navigasi Indoor Cerdas untuk Proyek Arduino