- Motor Servo
- Mengendalikan Servo Motor menggunakan LPC2148 PWM & ADC
- Pin PWM & ADC di ARM7-LPC2148
- Komponen Diperlukan
- Diagram dan Sambungan Litar
- Pengaturcaraan ARM7-LPC2148 untuk Kawalan Motor Servo
Dalam tutorial sebelumnya, kami telah menghubungkan motor stepper dengan ARM7-LPC2148. Dalam tutorial ini, kita akan mengawal Servo Motor dengan ARM7-LPC2148. Motor servo mempunyai kelebihan penggunaan kuasa yang rendah berbanding motor stepper. Motor servo menghentikan penggunaan kuasanya apabila kedudukan yang diinginkan dicapai tetapi motor stepper terus menggunakan kuasa untuk mengunci poros pada kedudukan yang diinginkan. Motor servo kebanyakannya digunakan dalam Projek Robotik kerana ketepatan dan pengendaliannya yang mudah.
Dalam tutorial ini kita akan belajar mengenai Servo Motor dan Bagaimana untuk menghubungkan Servo dengan ARM7-LPC2148. Potensiometer juga dihubungkan untuk mengubah posisi poros motor servo, dan LCD untuk menampilkan nilai sudut.
Motor Servo
Servo Motor adalah gabungan motor DC, sistem kawalan kedudukan dan gear. Putaran motor servo dikawal dengan menerapkan isyarat PWM padanya, lebar isyarat PWM menentukan sudut putaran dan arah motor. Di sini kita akan menggunakan SG90 Servo Motor dalam tutorial ini, ia adalah salah satu yang popular dan paling murah. SG90 adalah servo 180 darjah. Oleh itu dengan servo ini kita dapat meletakkan paksi dari 0-180 darjah:
- Voltan Operasi: + 5V
- Jenis Gear: Plastik
- Sudut Putaran: 0 hingga 180 darjah
- Berat: 9gm
- Tork: 2.5kg / cm
Sebelum kita dapat memulakan pengaturcaraan untuk motor Servo kita harus tahu jenis isyarat apa yang akan dihantar untuk mengendalikan motor Servo. Kita harus memprogram MCU untuk menghantar isyarat PWM ke wayar isyarat motor Servo. Terdapat litar kawalan di dalam motor servo yang membaca kitaran tugas isyarat PWM dan meletakkan poros motor servo di tempat masing-masing seperti yang ditunjukkan dalam gambar di bawah
Untuk setiap 20 milisaat Servo motor memeriksa nadi. Oleh itu, sesuaikan lebar denyut isyarat untuk memutar batang motor.
- Lebar nadi 1 ms (1 milisaat) untuk putaran servo hingga 0 darjah
- Lebar nadi 1.5ms untuk putaran hingga 90 darjah (kedudukan neutral)
- Lebar nadi 2 ms untuk putaran servo hingga 180 darjah.
Sebelum Menyambungkan Servo ke ARM7-LPC2148, anda boleh menguji servo anda dengan bantuan Litar Penguji Motor Servo ini. Juga periksa bagaimana motor servo dapat dihubungkan dengan Pengawal Mikro lain:
- Servo Motor Control menggunakan Arduino
- Servo Motor Interfacing dengan Mikrokontroler 8051
- Servo Motor Control menggunakan MATLAB
- Kawalan Motor Servo dengan Raspberry Pi
- Interfacing Servo Motor dengan MSP430G2
- Interfacing Servo Motor dengan STM32F103C8
Mengendalikan Servo Motor menggunakan LPC2148 PWM & ADC
Motor Servo dapat dikendalikan oleh LPC2148 menggunakan PWM. Dengan memberikan isyarat PWM ke pin PWM SERVO dengan jangka masa 20ms dan frekuensi 50Hz kita dapat meletakkan poros motor servo sekitar 180 darjah (-90 hingga +90).
Potentiometer digunakan untuk mengubah siklus tugas isyarat PWM dan memutar poros motor servo, kaedah ini dilaksanakan dengan menggunakan modul ADC di LPC2148. Oleh itu, kita memerlukan kedua-dua konsep PWM dan ADC untuk dilaksanakan dalam tutorial ini. Oleh itu, sila rujuk 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 menunjukkan pin PWM dan ADC di LPC2148. Kotak kuning menunjukkan (6) pin PWM dan kotak hitam menunjukkan (14) pin ADC.
Komponen Diperlukan
Perkakasan
- ARM7-LPC2148
- Modul Paparan LCD (16x2)
- Motor Servo (SG-90)
- Pengatur voltan 3.3V
- Potensiometer 10k (2 Nos)
- Papan roti
- Wayar Penyambung
Perisian
- Keil uVision5
- Alat Sihir Kilat
Diagram dan Sambungan Litar
Jadual di bawah menunjukkan Sambungan antara Servo Motor & ARM7-LPC2148:
PIN SERVO |
ARM7-LPC2148 |
MERAH (+ 5V) |
+ 5V |
BROWN (GND) |
GND |
ORANGE (PWM) |
P0.1 |
Pin P0.1 adalah output PWM LPC2148.
Jadual di bawah menunjukkan sambungan litar antara LCD & ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Pilih Pilih) |
P0.6 |
E (Aktifkan) |
P0.12 |
D4 (Pin data 4) |
P0.13 |
D5 (Pin data 5) |
P0.14 |
D6 (Pin data 6) |
P0.15 |
D7 (Pin data 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Jadual di bawah menunjukkan hubungan antara ARM7 LPC2148 & potensiometer dengan pengatur voltan 3.3V.
IC Pengatur Voltan 3.3V |
Fungsi pin |
Pin ARM-7 LPC2148 |
1. Pin Kiri |
- Ve dari GND |
Pin GND |
2. Pin Pusat |
Keluaran + 3.3V Teratur |
Ke input Potensiometer dan output potensiometer ke P0.28 dari LPC2148 |
3. Pin Kanan |
+ Ve dari 5V INPUT |
+ 5V |
Perkara yang perlu diberi perhatian
1. Pengatur voltan 3.3V digunakan di sini untuk memberikan nilai input analog ke pin ADC (P0.28) LPC2148. Oleh kerana kita menggunakan kuasa 5V, kita perlu mengatur voltan dengan pengatur voltan 3.3V.
2. Potensiometer digunakan untuk mengubah voltan antara (0V hingga 3.3V) untuk memberikan input analog (ADC) ke pin LPC2148 P0.28
3. Pin P0.1 dari LPC2148 memberikan output PWM ke motor servo untuk mengawal kedudukan motor.
4. Menurut nilai input analog (ADC) kedudukan motor servo berubah dari (0 hingga 180 darjah) melalui pin output PWM pada P0.1 dari LPC2148.
Pengaturcaraan ARM7-LPC2148 untuk Kawalan Motor Servo
Untuk Program ARM7-LPC2148, kami memerlukan alat keil uVision & Flash Magic. Kami menggunakan Kabel USB untuk memprogram ARM7 Stick melalui port USB mikro. Kami menulis kod menggunakan Keil dan membuat fail hex dan kemudian fail HEX diturunkan ke tongkat ARM7 menggunakan Flash Magic. Untuk mengetahui lebih lanjut mengenai memasang keil uVision dan Flash Magic dan cara menggunakannya, ikuti pautan Memulakan Dengan Mikrokontroler ARM7 LPC2148 dan Program dengan menggunakan Keil uVision.
Langkah-langkah yang terlibat dalam mengkonfigurasi LPC2148 untuk PWM & ADC untuk mengawal Motor Servo
Langkah 1: - Sertakan fail header yang diperlukan untuk pengekodan LPC2148
#sertakan
Langkah 2: - Perkara seterusnya adalah mengkonfigurasi PLL untuk penjanaan jam kerana ia menetapkan jam sistem dan jam periferal LPC2148 mengikut keperluan pengaturcara. Frekuensi jam maksimum untuk LPC2148 ialah 60Mhz. Garis berikut digunakan untuk mengkonfigurasi penjanaan jam PLL.
void initilizePLL (void) // Fungsi menggunakan PLL untuk penjanaan jam { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; sementara (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Langkah 3: - Perkara seterusnya yang perlu dilakukan ialah memilih pin PWM dan fungsi PWM LPC2148 dengan menggunakan register PINSEL. Kami menggunakan PINSEL0 seperti yang kami gunakan P0.1 untuk output PWM LPC2148.
PINSEL0 - = 0x00000008; // Menetapkan pin P0.1 dari LPC2148 sebagai PWM3
Langkah 4: - Seterusnya, kita perlu MENYESAL semula pemasa menggunakan PWMTCR (Timer Control Register).
PWMTCR = 0x02; // Tetapkan semula dan matikan kaunter untuk PWM
Dan kemudian tetapkan nilai prescale yang menentukan resolusi PWM ditetapkan.
PWMPR = 0x1D; // Nilai Daftar Prescale
Langkah 5: - Seterusnya, tetapkan PWMMCR (daftar kawalan pertandingan PWM) kerana ia menetapkan operasi seperti tetapan semula, gangguan untuk PWMMR0 dan PWMMR3.
PWMMCR = 0x00000203; // Tetapkan semula dan hentikan pertandingan MR0, hentikan perlawanan MR3
Langkah 6: - Tempoh maksimum saluran PWM ditetapkan menggunakan PWMMR0 dan Ton kitaran tugas PWM pada mulanya ditetapkan ke 0,65msec
PWMMR0 = 20000; // Tempoh masa gelombang PWM, 20msec PWMMR3 = 650; // Ton gelombang PWM 0.65 msec
Langkah 7: - Seterusnya, kita perlu menetapkan Latch Enable ke daftar padanan yang sesuai menggunakan PWMLER
PWMLER = 0x09; // Latch memungkinkan untuk PWM3 dan PWM0
(Kami menggunakan PWMMR0 & PWMMR3) Oleh itu, aktifkan bit yang sesuai dengan menetapkan 1 dalam PWMLER
Langkah 8: - Untuk mengaktifkan output PWM ke pin, kita perlu menggunakan PWMTCR untuk mengaktifkan kaunter PWM Timer dan mod PWM.
PWMPCR = 0x0800; // Dayakan PWM3 dan PWM 0, PWM dikawal tepi tunggal PWMTCR = 0x09; // Dayakan PWM dan kaunter
Langkah 9: - Sekarang kita perlu mendapatkan nilai potensiometer untuk menetapkan kitaran tugas PWM dari pin ADC P0.28. Oleh itu, kami menggunakan modul ADC di LPC2148 untuk menukar input analog potensiometer (0 hingga 3.3V) ke nilai ADC (0 hingga 1023).
Langkah 10: - Untuk memilih pin ADC P0.28 di LPC2148, kami gunakan
PINSEL1 = 0x01000000; // Menetapkan P0.28 sebagai ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Menetapkan jam dan PDN untuk Penukaran A / D
Garis berikut menangkap input Analog (0 hingga 3.3V) dan mengubahnya menjadi nilai digital (0 hingga 1023). Dan kemudian nilai digital ini dibahagi dengan 4 untuk mengubahnya menjadi (0 hingga 255) dan akhirnya diberi sebagai output PWM dalam pin P0.1 dari LPC2148. Di sini kita menukar nilai dari 0-1023 ke 0-255 dengan membaginya dengan 4 kerana PWM LPC2148 mempunyai resolusi 8-Bit (28).
AD0CR - = (1 << 1); // Pilih saluran AD0.1 dalam masa tunda pendaftaran ADC (10); AD0CR - = (1 << 24); // Mulakan penukaran A / D sementara ((AD0DR1 & (1 << 31)) == 0); // Periksa bit SELESAI dalam daftar Data ADC adcvalue = (AD0DR1 >> 6) & 0x3ff; // Dapatkan KEPUTUSAN dari daftar data ADC dutycycle = adcvalue / 4; // formula untuk mendapatkan nilai dutycycle dari (0 hingga 255) PWMMR1 = dutycycle; // tetapkan nilai dutycycle ke PWM register register PWMLER - = (1 << 1); // Aktifkan output PWM dengan nilai dutycycle
Langkah 11: - Seterusnya, kami memaparkan nilai-nilai tersebut dalam modul Paparan LCD (16X2). Oleh itu, kami menambah baris berikut untuk memulakan modul paparan LCD
Void LCD_INITILIZE (void) // Fungsi untuk menyiapkan LCD { IO0DIR = 0x0000FFF0; // Menetapkan pin P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 sebagai masa kelewatan OUTPUT (20); LCD_SEND (0x02); // Permulaan lcd dalam mod operasi 4-bit LCD_SEND (0x28); // 2 baris (16X2) LCD_SEND (0x0C); // Paparan pada kursor mati LCD_SEND (0x06); // Kursor kenaikan automatik LCD_SEND (0x01); // Paparkan jelas LCD_SEND (0x80); // Kedudukan pertama barisan pertama }
Semasa kami menyambungkan LCD dalam mod 4-Bit dengan LPC2148, kami perlu menghantar nilai untuk ditampilkan sebagai nibble by nibble (Upper Nibble & Lower Nibble). Oleh itu, baris berikut digunakan.
batal LCD_DISPLAY (char * msg) // Fungsi untuk mencetak watak yang dihantar satu persatu { uint8_t i = 0; sementara (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Menghantar Gigitan Atas IO0SET = 0x00000050; // RS TINGGI & BOLEH TINGGI untuk mencetak data IO0CLR = 0x00000020; // Waktu tunda mod Tulis RW RENDAH (2); IO0CLR = 0x00000040; // EN = 0, RS dan RW tidak berubah (iaitu RS = 1, RW = 0) waktu tunda (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Menghantar gumpalan bawah IO0SET = 0x00000050; // RS & EN TINGGI IO0CLR = 0x00000020; masa kelewatan (2); IO0CLR = 0x00000040; masa kelewatan (5); saya ++; } }
Untuk memaparkan nilai ADC & PWM, kami menggunakan baris berikut dalam fungsi int utama () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", dutycycle); LCD_DISPLAY (displayadc); // Paparkan nilai ADC (0 hingga 1023) sudut = (nilai iklan / 5.7); // Formula untuk menukar nilai ADC menjadi sudut (o hingga 180 deg) LCD_SEND (0xC0); sprintf (nilai sudut, "ANGLE =%. 2f deg", sudut); LCD_DISPLAY (nilai sudut);
Kod lengkap dan keterangan video tutorial diberikan di bawah