- PWM (Modulasi Lebar Nadi)
- Pin PWM di ARM7-LPC2148
- Daftar PWM di ARM7-LPC2148
- Komponen Diperlukan
- Diagram dan Sambungan Litar
- Pengaturcaraan ARM7-LPC2148 untuk PWM
- Langkah-langkah yang terlibat dalam pengaturcaraan LPC2148 untuk PWM & ADC
Seperti yang kita ketahui mikrokontroler mengambil input analog dari sensor analog dan menggunakan ADC (Analog to Digital converter) untuk memproses isyarat tersebut. Tetapi bagaimana jika mikrokontroler ingin menghasilkan isyarat analog untuk mengawal peranti yang dikendalikan analog seperti motor Servo, motor DC dll? Pengawal mikro tidak menghasilkan voltan keluaran seperti 1V, 5V sebaliknya mereka menggunakan teknik yang dipanggil PWM untuk mengendalikan peranti analog. Contoh PWM adalah kipas penyejuk komputer riba (motor DC) yang perlu dikawal dengan pantas mengikut suhu, dan yang sama dilaksanakan dengan menggunakan teknik Pulse Width Modulation (PWM) pada motherboard.
Dalam tutorial ini kita akan mengawal kecerahan LED menggunakan PWM dalam mikrokontroler ARM7-LPC2148.
PWM (Modulasi Lebar Nadi)
PWM adalah kaedah yang baik untuk mengawal peranti analog dengan menggunakan nilai digital seperti mengawal kelajuan motor, kecerahan LED dan lain-lain. Walaupun PWM tidak memberikan output analog tulen, tetapi menghasilkan denyut analog yang baik untuk mengawal Peranti Analog. PWM sebenarnya memodulasi lebar gelombang denyut segi empat tepat untuk mendapatkan variasi dalam nilai purata gelombang yang dihasilkan.
Kitaran tugas PWM
Peratusan masa di mana isyarat PWM kekal TINGGI (tepat pada waktunya) disebut sebagai kitaran tugas. Sekiranya isyarat sentiasa AKTIF, ia berada dalam kitaran tugas 100% dan jika sentiasa mati, ia adalah kitaran tugas 0%.
Duty Cycle = Hidupkan waktu / (Hidupkan waktu + Matikan masa)
Pin PWM di ARM7-LPC2148
Gambar di bawah menunjukkan pin output PWM ARM7-LPC2148. Terdapat enam pin untuk PWM.
Saluran PWM |
Pin Pelabuhan LPC2148 |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
Daftar PWM di ARM7-LPC2148
Sebelum masuk ke projek kami, kami perlu mengetahui mengenai daftar PWM di LPC2148.
Berikut adalah senarai daftar yang digunakan dalam LPC2148 untuk PWM
1. PWMPR: Daftar Prescale PWM
Gunakan: Ini daftar 32-Bit. Ini mengandungi berapa kali (tolak 1) PCLK mesti dikitar sebelum menaikkan PWM Timer Counter (Ia sebenarnya mempunyai nilai maksimum prescale counter).
2. PWMPC: Kaunter PWM Prescaler
Gunakan: Ini daftar 32-bit . Ia mengandungi nilai pembilang yang meningkat. Apabila nilai ini sama dengan nilai PR ditambah 1, PWM Timer Counter (TC) akan bertambah.
3. PWMTCR: Daftar Kawalan Pemasa PWM
Gunakan: Ia mengandungi Counter Enable, Counter Reset dan PWM Enable bit bit. Ini adalah daftar 8-Bit.
7: 4 |
3 |
2 |
1 |
0 |
TEMPAHAN |
PWM DIAMBIL |
TEMPAHAN |
RESET KAUNTER |
KAUNTER DIAMBIL |
- Aktifkan PWM: (Bit-3)
0- PWM Dinyahdayakan
1- PWM Diaktifkan
- Dayakan Kaunter: (Bit-0)
0- Lumpuhkan Kaunter
1- Aktifkan Kaunter
- Set semula kaunter: (Bit-1)
0- Jangan Buat Apa-apa
1- Menetapkan semula PWMTC & PWMPC pada kelebihan positif PCLK.
4. PWMTC: Pembilang Pemasa PWM
Gunakan: Ini daftar 32-Bit. Ia mengandungi nilai semasa Pemasa PWM yang meningkat. Apabila Prescaler Counter (PC) mencapai nilai Prescaler Register (PR) plus 1, counter ini akan bertambah
5. PWMIR: Daftar Ganggu PWM
Gunakan: Ini Daftar 16-Bit. Ini mengandungi bendera interrupt untuk PWM Match Channels 0-6. Bendera interrupt ditetapkan apabila gangguan berlaku untuk saluran tersebut (MRx Interrupt) di mana X adalah nombor saluran (0 hingga 6).
6. PWMMR0-PWMMR6: Daftar Pertandingan PWM
Gunakan: Ini daftar 32-Bit . Sebenarnya kumpulan Match Channel membenarkan penetapan 6 output PWM terkawal single-edge atau 3 double-edge. Anda boleh mengubah tujuh Match Match untuk mengkonfigurasi output PWM ini agar sesuai dengan keperluan anda dalam PWMPCR.
7. PWMMCR: Daftar Kawalan Pertandingan PWM
Gunakan: Ini daftar 32-Bit. Ia mengandungi bit Interrupt, Reset dan Stop yang mengawal Match Channel yang dipilih. Pertandingan berlaku antara daftar perlawanan PWM dan kaunter Pemasa PWM.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
TEMPAHAN |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Di sini x adalah dari 0 hingga 6
- PWMMRxI (Bit-0)
AKTIFKAN ATAU MATI PWM mengganggu
0- Lumpuhkan gangguan PWM Match.
1- Aktifkan gangguan PWM Match.
- PWMMRxR: (Bit-1)
RESET PWMTC - Nilai pembilang pemasa setiap kali sepadan dengan PWMRx
0- Jangan buat apa-apa.
1- Tetapkan semula PWMTC.
- PWMMRxS: (Bit 2)
HENTIKAN PWMTC & PWMPC apabila PWMTC mencapai nilai register Match
0- Lumpuhkan ciri berhenti PWM.
1- Aktifkan ciri PWM Stop.
8. PWMPCR: Daftar Kawalan PWM
Gunakan: Ini daftar 16-Bit. Ia mengandungi bit yang membolehkan output PWM 0-6 dan memilih kawalan satu sisi atau dua sisi untuk setiap output.
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)
- Mod Tepi Tunggal untuk PWMx
- 1- Mod Double Edge untuk PWMx.
- PWMENAx (x: 1 hingga 6)
- PWMx Lumpuhkan.
- 1- PWMx Diaktifkan.
9. PWMLER: PWM Latch Enable Register
Gunakan: Ini adalah Daftar 8-Bit. Ia mengandungi 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- Lumpuhkan pemuatan Nilai Padan baru
1- Muatkan nilai Padan baru dari (PWMMRx) Daftar PWMMatch semasa pemasa diset semula.
Sekarang mari mula membina persediaan perkakasan untuk menunjukkan Modulasi Lebar Pulse dalam mikrokontroler ARM.
Komponen Diperlukan
Perkakasan
- Mikrokontroler ARM7-LPC2148
- IC Pengatur Voltan 3.3V
- Potensiometer 10k
- LED (Sebarang warna)
- Modul Paparan LCD (16x2)
- Papan roti
- Wayar Penyambung
Perisian
- Keil uVision5
- Alat Sihir Kilat
Diagram dan Sambungan Litar
Sambungan 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 |
Sambungan antara LED & ARM7-LPC2148
LED ANODE disambungkan ke output PWM (P0.0) LPC2148, sementara pin CATHODE LED disambungkan ke pin GND LPC2148.
Sambungan antara ARM7-LPC2148 dan 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 dan 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
Pengaturcaraan ARM7-LPC2148 untuk PWM
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.
Dalam tutorial ini kita akan menggunakan teknik ADC dan PWM untuk mengawal kecerahan LED. Di sini LPC2148 diberi input analog (0 hingga 3.3V) melalui pin input ADC P0.28, maka input analog ini diubah menjadi nilai digital (0 hingga 1023). Kemudian nilai ini kembali ditukar menjadi nilai digital (0 - 255) kerana output PWM LPC2148 hanya mempunyai resolusi 8-bit (2 8). LED disambungkan ke pin PWM P0.0 dan kecerahan LED dapat dikawal menggunakan potensiometer. Untuk mengetahui lebih lanjut mengenai ADC di ARM7-LPC2148 ikuti pautan.
Langkah-langkah yang terlibat dalam pengaturcaraan LPC2148 untuk PWM & ADC
Langkah 1: - Perkara pertama adalah mengkonfigurasi PLL untuk penjanaan jam kerana ia menetapkan jam sistem dan jam persisian 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 2: - Perkara seterusnya adalah memilih pin PWM dan fungsi PWM LPC2148 dengan menggunakan register PINSEL. Kami menggunakan PINSEL0 seperti yang kami gunakan P0.0 untuk output PWM LPC2148.
PINSEL0 = 0x00000002; // Menetapkan pin P0.0 untuk output PWM
Langkah 3: - Seterusnya kita perlu MENYESAL semula pemasa menggunakan PWMTCR (Timer Control Register).
PWMTCR = (1 << 1); // Menetapkan PWM Timer Control Register sebagai penghitung semula
Dan kemudian, tetapkan nilai preskala yang menentukan resolusi PWM. Saya menetapkannya kepada sifar
PWMPR = 0X00; // Menetapkan nilai preskala PWM
Langkah 4: - Seterusnya kita perlu menetapkan PWMMCR (PWM match control register) kerana ia menetapkan operasi seperti reset, mengganggu untuk PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // Menetapkan Daftar Kawalan Pertandingan PWM
Langkah 5: - Tempoh maksimum saluran PWM ditetapkan menggunakan PWMMR.
PWMMR0 = Nilai PWM; // Memberi nilai PWM Nilai maksimum
Dalam kes kami nilai maksimum adalah 255 (Untuk kecerahan maksimum)
Langkah 6: - Seterusnya kita perlu menetapkan Latch Enable ke daftar padanan yang sesuai menggunakan PWMLER
PWMLER = (1 << 0); // Selak PWM Enalbe
(Kami menggunakan PWMMR0) Oleh itu, aktifkan bit yang sesuai dengan menetapkan 1 dalam PWMLER
Langkah 7: - Untuk mengaktifkan output PWM ke pin, kita perlu menggunakan PWMTCR untuk mengaktifkan kaunter PWM Timer dan mod PWM.
PWMTCR = (1 << 0) - (1 << 3); // Mengaktifkan kaunter PWM dan PWM
Langkah 8: - 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).
Di sini kita menukar nilai dari 0-1023 hingga 0-255 dengan membaginya dengan 4 kerana PWM LPC2148 mempunyai resolusi 8-Bit (2 8).
Langkah 9: - 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.0 LPC2148 di mana LED disambungkan.
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 10: - 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", adcvalue); LCD_DISPLAY (displayadc); // Paparkan nilai ADC (0 hingga 1023) LCD_SEND (0xC0); sprintf (ledoutput, "PWM OP =%. 2f", kecerahan); LCD_DISPLAY (ledoutput); // Paparkan nilai dutycycle dari (0 hingga 255)
Kod lengkap dan keterangan video tutorial diberikan di bawah.