- PWM (Modulasi Lebar Pulsa)
- Pin PWM di ARM7-LPC2148
- Register PWM di ARM7-LPC2148
- Komponen Diperlukan
- Diagram Sirkuit dan Koneksi
- Pemrograman ARM7-LPC2148 untuk PWM
- Langkah-langkah yang terlibat dalam pemrograman LPC2148 untuk PWM & ADC
Seperti kita ketahui mikrokontroler mengambil input analog dari sensor analog dan menggunakan ADC (Analog to Digital converter) untuk memproses sinyal tersebut. Tetapi bagaimana jika mikrokontroler ingin menghasilkan sinyal analog untuk mengontrol perangkat yang dioperasikan analog seperti motor Servo, motor DC dll? Mikrokontroler tidak menghasilkan tegangan keluaran seperti 1V, 5V, melainkan menggunakan teknik yang disebut PWM untuk mengoperasikan perangkat analog. Contoh PWM adalah kipas pendingin laptop kita (motor DC) yang perlu diatur kecepatannya sesuai suhu, dan hal yang sama diimplementasikan dengan menggunakan teknik Pulse Width Modulation (PWM) pada motherboard.
Dalam tutorial ini kita akan mengontrol kecerahan LED menggunakan PWM pada mikrokontroler ARM7-LPC2148.
PWM (Modulasi Lebar Pulsa)
PWM adalah cara yang baik untuk mengontrol perangkat analog menggunakan nilai digital seperti mengontrol kecepatan motor, kecerahan led, dll. Meskipun PWM tidak memberikan output analog murni, tetapi PWM menghasilkan pulsa analog yang layak untuk mengontrol Perangkat Analog. PWM sebenarnya memodulasi lebar gelombang pulsa persegi untuk mendapatkan variasi nilai rata-rata gelombang yang dihasilkan.
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)
Pin PWM di ARM7-LPC2148
Gambar di bawah ini menunjukkan pin keluaran PWM dari ARM7-LPC2148. Total ada enam pin untuk PWM.
Saluran PWM |
Pin Port LPC2148 |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
Register PWM di ARM7-LPC2148
Sebelum masuk ke proyek kita, kita perlu tahu tentang register PWM di LPC2148.
Berikut adalah daftar register yang digunakan di LPC2148 untuk PWM
1. PWMPR: PWM Prescale Register
Penggunaan: Ini adalah register 32-Bit. Ini berisi berapa kali (minus 1) PCLK harus berputar sebelum menaikkan Penghitung Timer PWM (Ini benar-benar memegang nilai maksimum penghitung prescale).
2. PWMPC: Penghitung Prescaler PWM
Gunakan: Ini adalah register 32-bit . Ini berisi nilai penghitung yang bertambah. Ketika nilai ini sama dengan nilai PR ditambah 1, Penghitung Timer PWM (TC) bertambah.
3. PWMTCR: Register Kontrol Pengatur Waktu PWM
Kegunaan: Berisi Counter Enable, Counter Reset dan bit kontrol PWM Enable. Ini adalah register 8-Bit.
7: 4 |
3 |
2 |
1 |
0 |
PENDIAM |
AKTIFKAN PWM |
PENDIAM |
SETEL ULANG COUNTER |
COUNTER AKTIFKAN |
- PWM Aktifkan: (Bit-3)
0- PWM Dinonaktifkan
1- PWM Diaktifkan
- Penghitung Aktifkan: (Bit-0)
0- Nonaktifkan Penghitung
1- Aktifkan Penghitung
- Counter reset: (Bit-1)
0- Do Nothing.
1- Mereset PWMTC & PWMPC pada sisi positif PCLK.
4. PWMTC: Penghitung Timer PWM
Penggunaan: Ini adalah register 32-Bit. Ini berisi nilai saat ini dari PWM Timer yang bertambah. Saat Penghitung Prescaler (PC) mencapai nilai Prescaler Register (PR) plus 1, penghitung ini bertambah.
5. PWMIR: Register Interupsi PWM
Penggunaan: Ini adalah Register 16-Bit. Ini berisi bendera interupsi untuk Saluran Pertandingan PWM 0-6. Bendera interupsi ditetapkan ketika interupsi terjadi untuk saluran itu (MRx Interrupt) di mana X adalah nomor saluran (0 hingga 6).
6. PWMMR0-PWMMR6: Daftar Pertandingan PWM
Penggunaan: Ini adalah register 32-Bit . Sebenarnya grup Saluran Pencocokan memungkinkan pengaturan 6 keluaran PWM terkontrol tepi tunggal atau 3 tepi ganda. Anda dapat memodifikasi tujuh Saluran Pencocokan untuk mengkonfigurasi keluaran PWM ini agar sesuai dengan kebutuhan Anda di PWMPCR.
7. PWMMCR: Daftar Kontrol Pertandingan PWM
Penggunaan: Ini adalah register 32-Bit. Ini berisi bit Interrupt, Reset dan Stop yang mengontrol Match Channel yang dipilih. Terjadi kecocokan antara register pencocokan PWM dan penghitung Timer PWM.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
PENDIAM |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Di sini x adalah dari 0 hingga 6
- PWMMRxI (Bit-0)
AKTIFKAN ATAU NONAKTIFKAN interupsi PWM
0- Nonaktifkan interupsi Pertandingan PWM.
1- Aktifkan interupsi Pertandingan PWM.
- PWMMRxR: (Bit-1)
RESET PWMTC - Nilai penghitung timer setiap kali cocok dengan PWMRx
0- Tidak melakukan apa pun.
1- Mereset PWMTC.
- PWMMRxS: (Bit 2)
HENTIKAN PWMTC & PWMPC saat PWMTC mencapai nilai register Pertandingan
0- Nonaktifkan fitur penghentian PWM.
1- Aktifkan fitur Berhenti PWM.
8. PWMPCR: Daftar Kontrol PWM
Penggunaan: Ini adalah register 16-Bit. Ini berisi bit yang memungkinkan keluaran PWM 0-6 dan pilih kontrol tepi tunggal atau tepi ganda untuk setiap keluaran.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
TIDAK DIGUNAKAN |
PWMENA6-PWMENA1 |
TIDAK DIGUNAKAN |
PWMSEL6-PWMSEL2 |
TIDAK DIGUNAKAN |
- PWMSELx (x: 2 hingga 6)
- Mode Tepi Tunggal untuk PWMx
- 1- Mode Tepi Ganda untuk PWMx.
- PWMENAx (x: 1 sampai 6)
- PWMx Nonaktifkan.
- 1- PWMx Diaktifkan.
9. PWMLER: PWM Latch Enable Register
Penggunaan: Ini adalah Register 8-Bit. Ini berisi bit Match x Latch untuk setiap Match Channel.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
TIDAK DIGUNAKAN |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 hingga 6):
0- Nonaktifkan pemuatan Nilai Pertandingan baru
1- Muat nilai Pertandingan baru dari (PWMMRx) PWMMatch Register saat timer disetel ulang.
Sekarang mari kita mulai membuat pengaturan perangkat keras untuk mendemonstrasikan Modulasi Lebar Pulsa di mikrokontroler ARM.
Komponen Diperlukan
Perangkat keras
- Mikrokontroler ARM7-LPC2148
- IC Regulator Tegangan 3.3V
- Potensiometer 10k
- LED (Warna apa saja)
- Modul Tampilan LCD (16x2)
- Papan tempat memotong roti
- Menghubungkan Kabel
Perangkat lunak
- Keil uVision5
- Alat Ajaib Flash
Diagram Sirkuit dan Koneksi
Koneksi 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 |
Koneksi antara LED & ARM7-LPC2148
ANODE LED terhubung ke output PWM (P0.0) LPC2148, sedangkan pin CATHODE LED terhubung ke pin GND LPC2148.
Koneksi antara ARM7-LPC2148 dan 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 diperhatikan
1. Pengatur tegangan 3.3V digunakan di sini untuk memberikan nilai input analog ke pin ADC (P0.28) dari LPC2148 dan karena kita menggunakan daya 5V kita perlu mengatur tegangan dengan pengatur tegangan 3.3V.
2. Potensiometer digunakan untuk memvariasikan tegangan antara (0V ke 3.3V) untuk memberikan input analog (ADC) ke LPC2148 pin P0.28
Pemrograman ARM7-LPC2148 untuk PWM
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.
Dalam tutorial ini kita akan menggunakan teknik ADC dan PWM untuk mengontrol kecerahan LED. Disini LPC2148 diberikan masukan analog (0 sampai 3.3V) melalui pin masukan ADC P0.28, kemudian masukan analog ini diubah menjadi nilai digital (0 sampai 1023). Kemudian nilai ini diubah lagi menjadi nilai digital (0 - 255) karena keluaran PWM LPC2148 hanya memiliki resolusi 8-bit (2 8). LED terhubung ke pin PWM P0.0 dan kecerahan LED dapat dikontrol menggunakan potensiometer. Untuk mengetahui lebih lanjut tentang ADC di ARM7-LPC2148 ikuti tautannya.
Langkah-langkah yang terlibat dalam pemrograman LPC2148 untuk PWM & ADC
Langkah 1: - Hal pertama 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 2: - Selanjutnya adalah memilih pin PWM dan fungsi PWM LPC2148 dengan menggunakan register PINSEL. Kami menggunakan PINSEL0 karena kami menggunakan P0.0 untuk output PWM dari LPC2148.
PINSEL0 = 0x00000002; // Pengaturan pin P0.0 untuk keluaran PWM
Langkah 3: - Selanjutnya kita perlu RESET timer menggunakan PWMTCR (Timer Control Register).
PWMTCR = (1 << 1); // Mengatur Kontrol Pengatur Waktu PWM Daftarkan sebagai reset penghitung
Dan kemudian, atur nilai prescale yang menentukan resolusi PWM. Saya mengaturnya ke nol
PWMPR = 0X00; // Mengatur nilai prescale PWM
Langkah 4: - Selanjutnya kita perlu mengatur PWMMCR (register kontrol pertandingan PWM) karena mengatur operasi seperti reset, interupsi untuk PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // Mengatur Daftar Kontrol Pertandingan PWM
Langkah 5: - Periode maksimum saluran PWM diatur menggunakan PWMMR.
PWMMR0 = Nilai PWM; // Memberikan nilai PWM Nilai maksimum
Dalam kasus kami, nilai maksimumnya adalah 255 (Untuk kecerahan maksimum)
Langkah 6: - Selanjutnya kita perlu mengatur Latch Enable ke register pertandingan yang sesuai menggunakan PWMLER
PWMLER = (1 << 0); // Aktifkan pengunci PWM
(Kami menggunakan PWMMR0) Jadi aktifkan bit yang sesuai dengan menyetel 1 di PWMLER
Langkah 7: - Untuk mengaktifkan keluaran PWM ke pin, kita perlu menggunakan PWMTCR untuk mengaktifkan penghitung Timer PWM dan mode PWM.
PWMTCR = (1 << 0) - (1 << 3); // Mengaktifkan penghitung PWM dan PWM
Langkah 8: - 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).
Di sini kami mengubah nilai dari 0-1023 menjadi 0-255 dengan membaginya dengan 4 karena PWM LPC2148 memiliki resolusi 8-Bit (2 8).
Langkah 9: - 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.0 LPC2148 di mana LED dihubungkan.
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 10: - Selanjutnya kita menampilkan nilai-nilai tersebut pada 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", adcvalue); LCD_DISPLAY (displayadc); // Menampilkan nilai ADC (0 hingga 1023) LCD_SEND (0xC0); sprintf (output keluaran, "PWM OP =%. 2f", kecerahan); LCD_DISPLAY (ledoutput); // Tampilkan nilai dutycycle dari (0 hingga 255)
Kode lengkap dan deskripsi video dari tutorial diberikan di bawah ini.