- Apa itu Sinyal PWM?
- Pemrograman PIC untuk menghasilkan PWM pada Pin GPIO
- Diagram Sirkuit
- Simulasi
- Pengaturan Perangkat Keras untuk mengendalikan Motor Servo menggunakan Mikrokontroler PIC
Pembangkitan sinyal PWM adalah alat vital di setiap persenjataan insinyur yang tertanam, mereka sangat berguna untuk banyak aplikasi seperti mengendalikan posisi motor servo, mengganti beberapa IC elektronik daya di konverter / inverter dan bahkan untuk kontrol kecerahan LED sederhana. Dalam mikrokontroler PIC, sinyal PWM dapat dihasilkan menggunakan modul Compare, Capture and PWM (CCP) dengan mengatur Register yang diperlukan, kita telah belajar bagaimana melakukannya di tutorial PIC PWM. Tetapi ada satu kelemahan besar dengan metode itu.
The PIC16F877A dapat menghasilkan sinyal PWM hanya pada pin RC1 dan RC2, jika kita menggunakan modul PKC. Tetapi kami mungkin menghadapi situasi, di mana kami membutuhkan lebih banyak pin untuk memiliki fungsionalitas PWM. Misalnya dalam kasus saya, saya ingin mengontrol 6 motor servo RC untuk proyek lengan robotik saya yang modul PKCnya tidak ada harapan. Dalam skenario ini kita dapat memprogram pin GPIO untuk menghasilkan sinyal PWM menggunakan modul pengatur waktu. Dengan cara ini kami dapat menghasilkan sinyal PWM sebanyak mungkin dengan pin yang diperlukan. Ada juga peretasan perangkat keras lain seperti menggunakan IC multiplexer, tetapi mengapa berinvestasi pada perangkat keras ketika hal yang sama dapat dicapai melalui pemrograman. Jadi pada tutorial kali ini kita akan belajar bagaimana cara merubah pin PIC GPIO menjadi pin PWM dan untuk mengujinya kita akan mensimulasikannya pada proteus dengan osiloskop digital dan jugamengontrol posisi motor Servo menggunakan sinyal PWM dan mengubah siklus kerjanya dengan memvariasikan potensiometer.
Apa itu Sinyal PWM?
Sebelum kita masuk ke detailnya, mari kita sedikit memoles apa itu Sinyal PWM. Pulse Width Modulation (PWM) adalah sinyal digital yang paling umum digunakan dalam rangkaian kontrol. Sinyal ini disetel tinggi (5v) dan rendah (0v) dalam waktu dan kecepatan yang telah ditentukan. Waktu di mana sinyal tetap tinggi disebut "waktu hidup" dan waktu di mana sinyal tetap rendah disebut "waktu mati". Ada dua parameter penting untuk PWM seperti yang dibahas di bawah ini:
Siklus kerja PWM
Persentase waktu di mana sinyal PWM tetap TINGGI (tepat waktu) disebut siklus kerja. Jika sinyal selalu ON maka dalam siklus kerja 100% dan jika selalu mati itu adalah siklus kerja 0%.
Duty Cycle = Turn ON time / (Turn ON time + Turn OFF time)
Nama Variabel |
Mengacu pada |
PWM_Frequency |
Frekuensi Sinyal PWM |
T_TOTAL |
Total waktu yang dibutuhkan untuk satu siklus PWM lengkap |
TON |
Tepat waktu sinyal PWM |
PESOLEK |
Waktu off dari sinyal PWM |
Siklus |
Siklus kerja sinyal PWM |
Jadi sekarang, mari kita hitung.
Ini adalah rumus standar di mana frekuensi hanyalah kebalikan dari waktu. Nilai frekuensi harus ditentukan dan ditetapkan oleh pengguna berdasarkan kebutuhan aplikasinya.
T_TOTAL = (1 / PWM_Frequency)
Ketika pengguna mengubah nilai siklus tugas, program kami harus secara otomatis menyesuaikan waktu T_ON dan waktu T_OFF sesuai dengan itu. Sehingga rumus diatas dapat digunakan untuk menghitung T_ON berdasarkan nilai Duty_Cycle dan T_TOTAL.
T_ON = (Duty_Cycle * T_TOTAL) / 100
Karena Total waktu sinyal PWM untuk satu siklus penuh akan menjadi jumlah waktu hidup dan mati. Kita dapat menghitung waktu off T_OFF seperti gambar di atas.
T_OFF = T_TOTAL - T_ON
Dengan rumus ini, kita dapat mulai memprogram mikrokontroler PIC. Program ini melibatkan PIC Timer Module dan PIC ADC Module untuk membuat sinyal PWM berdasarkan Duty cycle yang bervariasi sesuai dengan nilai ADC dari POT. Jika Anda baru menggunakan modul ini, maka sangat disarankan untuk membaca tutorial yang sesuai dengan mengklik hyperlink.
Pemrograman PIC untuk menghasilkan PWM pada Pin GPIO
Program lengkap untuk tutorial ini dapat ditemukan di bagian bawah situs web seperti biasa. Pada bagian ini mari kita pahami bagaimana program sebenarnya ditulis. Seperti semua program, kita mulai dengan mengatur bit konfigurasi. Saya telah menggunakan opsi tampilan memori untuk mengaturnya untuk saya.
// CONFIG #pragma config FOSC = HS // Bit pilihan osilator (osilator HS) #pragma config WDTE = OFF // Watchdog Timer Aktifkan bit (WDT dinonaktifkan) #pragma config PWRTE = OFF // Power-up Timer Aktifkan bit (PWRT dinonaktifkan) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Tegangan Rendah (Pasokan Tunggal) In-Circuit Serial Programming Enable bit (RB3 adalah digital I / O, HV pada MCLR harus digunakan untuk pemrograman) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Perlindungan kode EEPROM Data mati) #pragma config WRT = OFF // Flash Program Memory Write Aktifkan bit (Perlindungan tulis mati; semua memori program dapat ditulis oleh kontrol EECON) #pragma config CP = OFF // Bit Perlindungan Kode Memori Program Flash (Perlindungan kode tidak aktif) // Pernyataan konfigurasi #pragma harus mendahului file proyek yang disertakan. // Gunakan enum proyek daripada #define untuk ON dan OFF. #include
Kemudian kami menyebutkan frekuensi clock yang digunakan di perangkat keras, di sini perangkat keras saya menggunakan kristal 20MHz, Anda dapat memasukkan nilai berdasarkan perangkat keras Anda. Diikuti oleh nilai frekuensi dari sinyal PWM. Karena tujuan saya di sini untuk mengontrol hobi motor servo RC yang membutuhkan frekuensi PWM 50Hz, saya telah menetapkan 0,05KHz sebagai nilai Frekuensi, Anda juga dapat mengubahnya berdasarkan persyaratan aplikasi Anda.
#define _XTAL_FREQ 20000000 #define PWM_Frequency 0,05 // dalam KHz (50Hz)
Sekarang, setelah kita memiliki nilai Frekuensi, kita dapat menghitung T_TOTAL menggunakan rumus yang telah dibahas di atas. Hasilnya dibelah 10 untuk mendapatkan nilai waktu dalam mili detik. Dalam kasus saya, nilai T_TOTAL adalah 2 mili detik.
int T_TOTAL = (1 / PWM_Frequency) / 10; // hitung Total Waktu dari frekuensi (dalam mili detik)) // 2msec
Diikuti dengan itu, kami menginisialisasi modul ADC untuk membaca posisi Potensiometer seperti yang dibahas dalam tutorial ADC PIC kami. Selanjutnya kita memiliki rutinitas layanan Interupsi yang akan dipanggil setiap kali, pengatur waktu meluap kita akan kembali ke ini nanti, untuk sekarang mari kita periksa fungsi utama.
Di dalam fungsi utama kami mengkonfigurasi modul timer. Di sini saya telah mengonfigurasi modul Timer agar meluap untuk setiap 0,1ms. Nilai waktu dapat dihitung dengan menggunakan rumus di bawah ini
RegValue = 256 - ((Delay * Fosc) / (Prescalar * 4)) penundaan dalam detik dan Fosc dalam hz
Dalam kasus saya untuk penundaan 0,0001 detik (0,1ms) dengan prescalar 64 dan Fosc 20MHz nilai register saya (TMR0) harus 248. Jadi konfigurasinya terlihat seperti ini
/ ***** Konfigurasi Port untuk Timer ****** / OPTION_REG = 0b00000101; // Timer0 dengan freq eksternal dan 64 sebagai prescalar // Juga Mengaktifkan PULL UPs TMR0 = 248; // Muat nilai waktu untuk 0,0001s; delayValue bisa antara 0-256 hanya TMR0IE = 1; // Aktifkan bit interupsi pengatur waktu di register PIE1 GIE = 1; // Aktifkan Global Interrupt PEIE = 1; // Aktifkan Interupsi Periferal / *********** ______ *********** /
Kemudian kita harus mengatur konfigurasi Input dan Output. Di sini kita menggunakan pin AN0 untuk membaca nilai ADC dan pin PORTD untuk mengeluarkan sinyal PWM. Jadi mulailah mereka sebagai pin keluaran dan buat mereka rendah dengan menggunakan baris kode di bawah ini.
/ ***** Konfigurasi Port untuk I / O ****** / TRISD = 0x00; // Perintahkan MCU bahwa semua pin pada PORT D adalah keluaran PORTD = 0x00; // Inisialisasi semua pin ke 0 / *********** ______ *********** /
Di dalam loop while tak terbatas, kita harus menghitung nilai on time (T_ON) dari duty cycle. The tepat waktu dan tugas siklus bervariasi berdasarkan posisi POT jadi kami melakukannya berulang-ulang di dalam sementara lingkaran seperti yang ditunjukkan di bawah ini. 0,0976 adalah nilai yang harus dikalikan dengan 1024 untuk mendapatkan 100 dan untuk menghitung T_ON kita mengalikannya dengan 10 untuk mendapatkan nilai dalam mili detik.
sementara (1) { POT_val = (ADC_Read (0)); // Membaca nilai POT menggunakan ADC Duty_cycle = (POT_val * 0.0976); // Petakan 0 hingga 1024 hingga 0 hingga 100 T_ON = ((Duty_cycle * T_TOTAL) * 10/100); // Hitung Tepat Waktu menggunakan unit rumus dalam mili detik __delay_ms (100); }
Karena pengatur waktu disetel ke aliran berlebih untuk setiap 0,1 md, ISR rutin layanan interupsi pengatur waktu akan dipanggil untuk setiap 0,1 md. Di dalam rutinitas layanan kami menggunakan variabel yang disebut count dan increment untuk setiap 0.1ms. Dengan cara ini kita dapat melacak waktu. Untuk mempelajari lebih lanjut tentang Interupsi di mikrokontroler PIC, ikuti tautannya
if (TMR0IF == 1) // Flag timer telah dipicu karena timer overflow -> disetel ke overflow untuk setiap 0.1ms { TMR0 = 248; // Muat Nilai timer TMR0IF = 0; // Hapus penghitung waktu bendera interupsi ++; // Hitung kenaikan untuk setiap 0,1 md -> hitung / 10 akan memberikan nilai hitungan dalam md }
Akhirnya saatnya untuk mengaktifkan pin GPIO berdasarkan nilai T_ON dan T_OFF. Kami memiliki variabel hitungan yang melacak waktu dalam mili detik. Jadi kami menggunakan variabel itu untuk memeriksa apakah waktu kurang dari tepat waktu , jika ya maka kami tetap mengaktifkan pin GPIO atau kami mematikannya dan tetap mematikannya sampai siklus baru dimulai. Ini dapat dilakukan dengan membandingkannya dengan total waktu satu siklus PWM. Kode untuk melakukan hal yang sama ditunjukkan di bawah ini
if (count <= (T_ON)) // Jika waktu kurang dari waktu RD1 = 1; // Nyalakan GPIO else RD1 = 0; // Jika tidak, matikan GPIO if (count> = (T_TOTAL * 10)) // Tetap nonaktifkan hingga siklus baru mulai menghitung = 0;
Diagram Sirkuit
Diagram rangkaian pembangkit PWM dengan pin GPIO mikrokontroler PIC sangat sederhana, cukup nyalakan PIC dengan osilator dan sambungkan potensiometer ke pin AN0 dan Servo Motor ke pin RD1, kita bisa menggunakan pin GPIO untuk mendapatkan sinyal PWM, sudah saya pilih RD1 hanya keluar secara acak. Baik Potensiometer dan motor Servo didukung oleh 5V yang diatur dari 7805 seperti yang ditunjukkan di bawah ini dalam diagram sirkuit.
Simulasi
Untuk mensimulasikan proyek saya menggunakan perangkat lunak proteus saya. Bangun sirkuit yang ditunjukkan di bawah ini dan tautkan kode ke simulasi Anda dan jalankan. Anda harus mendapatkan sinyal PWM pada pin RD1 GPIO sesuai program kami dan siklus kerja PWM harus dikontrol berdasarkan posisi potensiometer. GIF di bawah ini menunjukkan bagaimana sinyal PWM dan motor servo merespons ketika nilai ADC diubah melalui potensiometer.
Pengaturan Perangkat Keras untuk mengendalikan Motor Servo menggunakan Mikrokontroler PIC
Pengaturan perangkat keras lengkap saya ditunjukkan di bawah ini, untuk orang-orang yang mengikuti tutorial saya, papan ini akan terlihat familier, ini adalah papan yang sama yang telah saya gunakan di semua tutorial saya sejauh ini. Anda dapat merujuk tutorial LED Berkedip jika Anda tertarik untuk mengetahui bagaimana saya membuatnya. Jika tidak, ikuti saja diagram rangkaian di atas dan semua akan berfungsi dengan baik.
Unggah program dan variasikan potensiometer dan Anda akan melihat servo mengubah posisi berdasarkan posisi potensiometer. Pekerjaan lengkap dari proyek ini ditampilkan dalam video yang diberikan di akhir halaman ini. Harap Anda memahami proyek ini dan menikmati membangun, jika Anda memiliki pertanyaan, silakan posting di forum dan saya akan mencoba yang terbaik dalam menjawab.
Saya berencana untuk mengambil proyek ini ke depan dengan menambahkan opsi untuk mengontrol beberapa motor servo dan dengan demikian membangun lengan robot darinya, mirip dengan Arduino Robotic Arm yang sudah kami buat. Jadi sampai jumpa lagi !!