- Motor servo
- Mengontrol Motor Servo menggunakan LPC2148 PWM & ADC
- Pin PWM & ADC di ARM7-LPC2148
- Komponen Diperlukan
- Diagram Sirkuit dan Koneksi
- Pemrograman ARM7-LPC2148 untuk Kontrol Motor Servo
Dalam tutorial kami sebelumnya, kami telah menghubungkan motor stepper dengan ARM7-LPC2148. Dalam tutorial ini, kita akan mengontrol Servo Motor dengan ARM7-LPC2148. Motor servo memiliki keunggulan konsumsi daya yang rendah dibandingkan motor stepper. Motor servo menghentikan konsumsi dayanya ketika posisi yang diinginkan tercapai tetapi motor stepper terus menerus mengkonsumsi daya untuk mengunci poros pada posisi yang diinginkan. Motor servo banyak digunakan dalam Proyek Robotika karena keakuratan dan penanganannya yang mudah.
Dalam tutorial ini kita akan belajar tentang Servo Motor dan Bagaimana menghubungkan Servo dengan ARM7-LPC2148. Potensiometer juga dihubungkan untuk memvariasikan posisi poros motor servo, dan LCD untuk menampilkan nilai sudut.
Motor servo
Motor Servo adalah kombinasi dari motor DC, sistem kendali posisi dan roda gigi. Rotasi motor servo dikontrol dengan menerapkan sinyal PWM padanya, lebar sinyal PWM menentukan sudut dan arah putaran motor. Di sini kita akan menggunakan SG90 Servo Motor dalam tutorial ini, ini adalah salah satu yang populer dan termurah. SG90 adalah servo 180 derajat. Jadi dengan servo ini kita bisa memposisikan sumbu dari 0-180 derajat:
- Tegangan Operasi: + 5V
- Jenis Roda Gigi: Plastik
- Sudut Rotasi: 0 hingga 180 derajat
- Berat: 9gm
- Torsi: 2.5kg / cm
Sebelum kita dapat memulai pemrograman untuk motor Servo, kita harus mengetahui jenis sinyal yang akan dikirim untuk mengendalikan motor Servo. Kita harus memprogram MCU untuk mengirim sinyal PWM ke kabel sinyal motor Servo. Terdapat rangkaian kontrol di dalam motor servo yang membaca duty cycle dari sinyal PWM dan memposisikan poros motor servo di tempatnya masing-masing seperti yang ditunjukkan pada gambar di bawah ini.
Untuk setiap 20 milidetik motor Servo memeriksa denyut nadi. Jadi, sesuaikan lebar pulsa sinyal untuk memutar poros motor.
- Lebar pulsa 1 ms (1 milidetik) untuk rotasi servo ke 0 derajat
- Lebar pulsa 1,5ms untuk rotasi hingga 90 derajat (posisi netral)
- Lebar pulsa 2 ms untuk rotasi servo hingga 180 derajat.
Sebelum Menghubungkan Servo ke ARM7-LPC2148, Anda dapat menguji servo Anda dengan bantuan Rangkaian Penguji Motor Servo ini. Juga periksa bagaimana motor servo dapat dihubungkan dengan Mikrokontroler lain:
- Kontrol Motor Servo menggunakan Arduino
- Antarmuka Motor Servo dengan Mikrokontroler 8051
- Kontrol Motor Servo menggunakan MATLAB
- Kontrol Motor Servo dengan Raspberry Pi
- Interfacing Servo Motor dengan MSP430G2
- Interfacing Servo Motor dengan STM32F103C8
Mengontrol Motor Servo menggunakan LPC2148 PWM & ADC
Motor Servo dapat dikontrol oleh LPC2148 menggunakan PWM. Dengan memberikan sinyal PWM ke pin PWM SERVO dengan periode 20ms dan frekuensi 50Hz kita dapat memposisikan poros motor servo sekitar 180 derajat (-90 hingga +90).
Potensiometer digunakan untuk memvariasikan duty cycle dari sinyal PWM dan memutar poros motor servo, metode ini diimplementasikan dengan menggunakan modul ADC pada LPC2148. Jadi kita membutuhkan konsep PWM dan ADC untuk diimplementasikan dalam tutorial ini. Jadi silakan lihat tutorial kami sebelumnya untuk mempelajari PWM dan ADC di ARM7-LPC2148.
- Cara menggunakan PWM di ARM7-LPC2148
- Cara menggunakan ADC di ARM-LPLC2148
Pin PWM & ADC di ARM7-LPC2148
Gambar di bawah ini menunjukkan pin PWM dan ADC di LPC2148. Kotak kuning menunjukkan pin (6) PWM dan kotak hitam menunjukkan (14) pin ADC.
Komponen Diperlukan
Perangkat keras
- ARM7-LPC2148
- Modul Tampilan LCD (16x2)
- Motor Servo (SG-90)
- Pengatur tegangan 3.3V
- Potensiometer 10k (2 Nos)
- Papan tempat memotong roti
- Menghubungkan Kabel
Perangkat lunak
- Keil uVision5
- Alat Ajaib Flash
Diagram Sirkuit dan Koneksi
Tabel di bawah ini menunjukkan Koneksi antara Servo Motor & ARM7-LPC2148:
PIN SERVO |
ARM7-LPC2148 |
MERAH (+ 5V) |
+ 5V |
COKLAT (GND) |
GND |
ORANGE (PWM) |
P0.1 |
Pin P0.1 adalah output PWM dari LPC2148.
Tabel di bawah ini menunjukkan koneksi sirkuit antara LCD & ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Pilih Daftar) |
P0.6 |
E (Aktifkan) |
P0.12 |
D4 (Data pin 4) |
P0.13 |
D5 (Data pin 5) |
P0.14 |
D6 (Data pin 6) |
P0.15 |
D7 (Data pin 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Tabel di bawah ini menunjukkan koneksi antara ARM7 LPC2148 & potensiometer dengan pengatur tegangan 3.3V.
IC Regulator Tegangan 3.3V |
Fungsi pin |
ARM-7 LPC2148 Pin |
1. Pin Kiri |
- Ve dari GND |
Pin GND |
2. Pin Pusat |
Diatur + Output 3.3V |
Untuk Potensiometer Input dan output potensiometer ke P0.28 dari LPC2148 |
3. Pin Kanan |
+ Ve dari 5V MEMASUKKAN |
+ 5V |
Poin yang Perlu Dicatat
1. Pengatur tegangan 3.3V digunakan di sini untuk memberikan nilai input analog ke pin ADC (P0.28) LPC2148. Karena kami menggunakan daya 5V, kami perlu mengatur tegangan dengan regulator tegangan 3,3V.
2. Potensiometer digunakan untuk memvariasikan tegangan antara (0V ke 3.3V) untuk memberikan input analog (ADC) ke LPC2148 pin P0.28
3. Pin P0.1 dari LPC2148 menyediakan output PWM ke motor servo untuk mengontrol posisi motor.
4. Menurut nilai analog input (ADC) posisi motor servo berubah dari (0 ke 180 derajat) melalui pin keluaran PWM pada P0.1 dari LPC2148.
Pemrograman ARM7-LPC2148 untuk Kontrol Motor Servo
Untuk memprogram ARM7-LPC2148 kita membutuhkan alat keil uVision & Flash Magic. Kami menggunakan Kabel USB untuk memprogram ARM7 Stick melalui port micro USB. Kami menulis kode menggunakan Keil dan membuat file hex dan kemudian file HEX di-flash ke tongkat ARM7 menggunakan Flash Magic. Untuk mengetahui lebih lanjut tentang menginstal keil uVision dan Flash Magic dan bagaimana menggunakannya ikuti link Memulai Dengan Mikrokontroler ARM7 LPC2148 dan Program itu menggunakan Keil uVision.
Langkah-langkah yang terlibat dalam mengkonfigurasi LPC2148 untuk PWM & ADC untuk mengontrol Motor Servo
Langkah 1: - Sertakan file header yang diperlukan untuk pengkodean LPC2148
#include
Langkah 2: - Selanjutnya adalah mengkonfigurasi PLL untuk pembuatan jam karena ia menetapkan jam sistem dan jam periferal LPC2148 sesuai kebutuhan pemrogram. Frekuensi clock maksimum untuk LPC2148 adalah 60Mhz. Baris berikut digunakan untuk mengkonfigurasi pembuatan jam PLL.
void initilizePLL (void) // Berfungsi menggunakan PLL untuk pembuatan jam { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; while (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Langkah 3: - Selanjutnya yang harus dilakukan adalah memilih pin PWM dan fungsi PWM LPC2148 dengan menggunakan register PINSEL. Kami menggunakan PINSEL0 karena kami menggunakan P0.1 untuk output PWM dari LPC2148.
PINSEL0 - = 0x00000008; // Pengaturan pin P0.1 dari LPC2148 sebagai PWM3
Langkah 4: - Selanjutnya, kita perlu RESET timer menggunakan PWMTCR (Timer Control Register).
PWMTCR = 0x02; // Setel ulang dan nonaktifkan penghitung untuk PWM
Dan kemudian mengatur nilai prescale yang menentukan resolusi PWM diatur.
PWMPR = 0x1D; // Nilai Register pra-skala
Langkah 5: - Selanjutnya, atur PWMMCR (register kontrol pencocokan PWM) saat mengatur operasi seperti reset, interupsi untuk PWMMR0 dan PWMMR3.
PWMMCR = 0x00000203; // Reset dan interupsi pada pertandingan MR0, interupsi pada pertandingan MR3
Langkah 6: - Periode maksimum saluran PWM diatur menggunakan PWMMR0 dan Ton siklus kerja PWM awalnya diatur ke 0,65mdetik
PWMMR0 = 20000; // Periode waktu gelombang PWM, 20msec PWMMR3 = 650; // Ton gelombang PWM 0,65 msec
Langkah 7: - Selanjutnya, kita perlu mengatur Latch Enable ke register pertandingan yang sesuai menggunakan PWMLER
PWMLER = 0x09; // Aktifkan kancing untuk PWM3 dan PWM0
(Kami menggunakan PWMMR0 & PWMMR3) Jadi aktifkan bit yang sesuai dengan menyetel 1 di PWMLER
Langkah 8: - Untuk mengaktifkan keluaran PWM ke pin, kita perlu menggunakan PWMTCR untuk mengaktifkan penghitung Timer PWM dan mode PWM.
PWMPCR = 0x0800; // Aktifkan PWM3 dan PWM 0, PWM PWMTCR = 0x09 yang dikontrol satu sisi ; // Aktifkan PWM dan penghitung
Langkah 9: - Sekarang kita perlu mendapatkan nilai potensiometer untuk mengatur siklus kerja PWM dari pin ADC P0.28. Jadi, kami menggunakan modul ADC di LPC2148 untuk mengubah input analog potensiometer (0 ke 3.3V) menjadi nilai ADC (0 hingga 1023).
Langkah 10: - Untuk memilih pin ADC P0.28 di LPC2148, kami menggunakan
PINSEL1 = 0x01000000; // Menetapkan P0.28 sebagai ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Mengatur jam dan PDN untuk Konversi A / D
Baris berikut menangkap input Analog (0 hingga 3,3V) dan mengubahnya menjadi nilai digital (0 hingga 1023). Dan kemudian nilai digital ini dibagi 4 untuk mengubahnya menjadi (0 hingga 255) dan akhirnya diumpankan sebagai output PWM di pin P0.1 dari LPC2148. Di sini kami mengubah nilai dari 0-1023 menjadi 0-255 dengan membaginya dengan 4 karena PWM LPC2148 memiliki resolusi 8-Bit (28).
AD0CR - = (1 << 1); // Pilih saluran AD0.1 di waktu tunda register ADC (10); AD0CR - = (1 << 24); // Mulai konversi A / D sementara ((AD0DR1 & (1 << 31)) == 0); // Periksa bit SELESAI di ADC Data register adcvalue = (AD0DR1 >> 6) & 0x3ff; // Dapatkan HASIL dari register data ADC dutycycle = adcvalue / 4; // rumus untuk mendapatkan nilai dutycycle dari (0 sampai 255) PWMMR1 = dutycycle; // setel nilai dutycycle ke register pencocokan PWM PWMLER - = (1 << 1); // Aktifkan keluaran PWM dengan nilai dutycycle
Langkah 11: - Selanjutnya, kami menampilkan nilai-nilai tersebut di modul Display LCD (16X2). Jadi kami menambahkan baris berikut untuk menginisialisasi modul layar LCD
Void LCD_INITILIZE (void) // Berfungsi untuk menyiapkan LCD { IO0DIR = 0x0000FFF0; // Mengatur pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 sebagai waktu tunda OUTPUT (20); LCD_SEND (0x02); // Inisialisasi lcd dalam mode operasi 4-bit LCD_SEND (0x28); // 2 baris (16X2) LCD_SEND (0x0C); // Menampilkan kursor pada LCD_SEND (0x06); // Kursor kenaikan otomatis LCD_SEND (0x01); // Tampilkan LCD_SEND yang jelas (0x80); // baris pertama posisi pertama }
Saat kita menghubungkan LCD dalam mode 4-Bit dengan LPC2148 kita perlu mengirim nilai untuk ditampilkan sebagai nibble by nibble (Upper Nibble & Lower Nibble). Jadi baris berikut digunakan.
void LCD_DISPLAY (char * msg) // Berfungsi untuk mencetak karakter yang dikirim satu persatu { uint8_t i = 0; sementara (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Mengirimkan nibble IO0SET = 0x00000050; // RS TINGGI & AKTIFKAN TINGGI untuk mencetak data IO0CLR = 0x00000020; // RW LOW Waktu tunda mode tulis (2); IO0CLR = 0x00000040; // EN = 0, RS dan RW tidak berubah (yaitu RS = 1, RW = 0) delaytime (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Mengirimkan nibble IO0SET = 0x00000050 lebih rendah; // RS & EN TINGGI IO0CLR = 0x00000020; waktu tunda (2); IO0CLR = 0x00000040; waktu tunda (5); i ++; } }
Untuk menampilkan nilai ADC & PWM tersebut kita menggunakan baris berikut dalam fungsi int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", dutycycle); LCD_DISPLAY (displayadc); // Tampilkan nilai ADC (0 hingga 1023) angle = (adcvalue / 5.7); // Rumus untuk mengubah nilai ADC menjadi sudut (o hingga 180 derajat) LCD_SEND (0xC0); sprintf (nilai sudut, "ANGLE =%. 2f deg", sudut); LCD_DISPLAY (nilai sudut);
Kode lengkap dan deskripsi video dari tutorial diberikan di bawah ini