- PWM (Điều chế độ rộng xung)
- Các chân PWM trong ARM7-LPC2148
- Đăng ký PWM trong ARM7-LPC2148
- Thành phần bắt buộc
- Sơ đồ mạch và kết nối
- Lập trình ARM7-LPC2148 cho PWM
- Các bước liên quan đến lập trình LPC2148 cho PWM & ADC
Như chúng ta đã biết vi điều khiển lấy đầu vào tương tự từ các cảm biến tương tự và sử dụng bộ chuyển đổi ADC (Analog to Digital) để xử lý các tín hiệu đó. Nhưng điều gì sẽ xảy ra nếu một bộ vi điều khiển muốn tạo ra một tín hiệu tương tự để điều khiển các thiết bị hoạt động tương tự như động cơ Servo, động cơ DC, v.v.? Các bộ vi điều khiển không tạo ra điện áp đầu ra như 1V, 5V thay vào đó chúng sử dụng một kỹ thuật gọi là PWM để vận hành các thiết bị tương tự. Một ví dụ về PWM là quạt làm mát (động cơ DC) của máy tính xách tay của chúng tôi cần được điều khiển tốc độ theo nhiệt độ và điều tương tự cũng được thực hiện bằng cách sử dụng kỹ thuật Điều chế độ rộng xung (PWM) trong bo mạch chủ.
Trong hướng dẫn này, chúng ta sẽ điều khiển độ sáng của đèn LED bằng PWM trong vi điều khiển ARM7-LPC2148.
PWM (Điều chế độ rộng xung)
PWM là một cách tốt để điều khiển các thiết bị tương tự bằng cách sử dụng giá trị kỹ thuật số như điều khiển tốc độ của động cơ, độ sáng của đèn LED, v.v. Mặc dù PWM không cung cấp đầu ra tương tự thuần túy, nhưng nó tạo ra các xung tương tự phù hợp để điều khiển Thiết bị Analog. PWM thực sự điều chỉnh độ rộng của sóng xung hình chữ nhật để có được sự thay đổi trong giá trị trung bình của sóng kết quả.
Chu kỳ hoạt động của PWM
Phần trăm thời gian mà tín hiệu PWM vẫn ở mức CAO (đúng giờ) được gọi là chu kỳ nhiệm vụ. Nếu tín hiệu luôn BẬT, nó đang ở trong chu kỳ làm việc 100% và nếu nó luôn tắt thì đó là chu kỳ làm việc 0%.
Chu kỳ làm việc = Thời gian BẬT / (Thời gian BẬT + Thời gian TẮT)
Các chân PWM trong ARM7-LPC2148
Hình ảnh bên dưới chỉ ra các chân đầu ra PWM của ARM7-LPC2148. Có tổng cộng sáu chân cho PWM.
Kênh PWM |
Chân cổng LPC2148 |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
Đăng ký PWM trong ARM7-LPC2148
Trước khi tham gia vào dự án của mình, chúng ta cần biết về các thanh ghi PWM trong LPC2148.
Đây là danh sách các thanh ghi được sử dụng trong LPC2148 cho PWM
1. PWMPR: Đăng ký tỷ lệ PWM
Sử dụng: Đó là một thanh ghi 32-Bit. Nó chứa số lần (trừ đi 1) PCLK phải quay vòng trước khi tăng Bộ đếm thời gian PWM (Nó thực sự giữ giá trị lớn nhất của bộ đếm tỷ lệ đặt trước).
2. PWMPC: Bộ đếm PWM Prescaler
Sử dụng: Nó là một thanh ghi 32-bit . Nó chứa giá trị bộ đếm tăng dần. Khi giá trị này bằng giá trị PR cộng với 1, Bộ đếm hẹn giờ PWM (TC) được tăng lên.
3. PWMTCR: Thanh ghi điều khiển hẹn giờ PWM
Sử dụng: Nó chứa các bit điều khiển Kích hoạt Bộ đếm, Thiết lập lại Bộ đếm và PWM Enable. Nó là một thanh ghi 8-Bit.
7: 4 |
3 |
2 |
1 |
0 |
KÍN ĐÁO |
PWM BẬT |
KÍN ĐÁO |
THIẾT LẬP LẠI BỘ ĐẾM |
BẬT BỘ ĐẾM |
- Kích hoạt PWM: (Bit-3)
0-
Đã tắt PWM 1- Đã bật PWM
- Kích hoạt bộ đếm: (Bit-0)
0- Tắt bộ đếm
1- Bật bộ đếm
- Đặt lại bộ đếm: (Bit-1)
0- Không làm gì cả.
1- Đặt lại PWMTC & PWMPC trên cạnh tích cực của PCLK.
4. PWMTC: Bộ đếm hẹn giờ PWM
Sử dụng: Đó là một thanh ghi 32-Bit. Nó chứa giá trị hiện tại của Bộ hẹn giờ PWM tăng dần. Khi Bộ đếm Prescaler (PC) đạt đến giá trị Thanh ghi Prescaler (PR) cộng với 1, bộ đếm này sẽ tăng lên.
5. PWMIR: Thanh ghi ngắt PWM
Sử dụng: Đó là một thanh ghi 16-bit. Nó chứa các cờ ngắt cho các kênh đối sánh PWM 0-6. Cờ ngắt được thiết lập khi xảy ra ngắt cho kênh đó (Ngắt MRx) trong đó X là số kênh (0 đến 6).
6. PWMMR0-PWMMR6: Đăng ký đối sánh PWM
Sử dụng: Đó là một thanh ghi 32-Bit . Trên thực tế, nhóm Match Channel cho phép thiết lập 6 đầu ra PWM được điều khiển một cạnh hoặc 3 đầu ra PWM được điều khiển hai cạnh. Bạn có thể sửa đổi bảy Kênh đối sánh để định cấu hình các đầu ra PWM này cho phù hợp với yêu cầu của bạn trong PWMPCR.
7. PWMMCR: Thanh ghi điều khiển đối sánh PWM
Sử dụng: Đó là một thanh ghi 32-Bit. Nó chứa các bit Ngắt, Đặt lại và Dừng điều khiển Kênh đối sánh đã chọn. Một trận đấu xảy ra giữa các thanh ghi đối sánh PWM và bộ đếm Bộ hẹn giờ PWM.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
KÍN ĐÁO |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Ở đây x là từ 0 đến 6
- PWMMRxI (Bit-0)
BẬT HOẶC TẮT ngắt PWM
0- Tắt ngắt PWM Match.
1- Kích hoạt ngắt PWM Match.
- PWMMRxR: (Bit-1)
ĐẶT LẠI PWMTC - Giá trị bộ đếm hẹn giờ bất cứ khi nào nó khớp với PWMRx
0- Không làm gì cả.
1- Đặt lại PWMTC.
- PWMMRxS: (Bit 2)
DỪNG PWMTC & PWMPC khi PWMTC đạt đến giá trị thanh ghi Khớp
0- Tắt tính năng dừng PWM.
1- Bật tính năng Dừng PWM.
8. PWMPCR: Thanh ghi điều khiển PWM
Sử dụng: Đó là một thanh ghi 16-Bit. Nó chứa các bit cho phép đầu ra PWM 0-6 và chọn điều khiển cạnh đơn hoặc cạnh kép cho mỗi đầu ra.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
CHƯA CÓ |
PWMENA6-PWMENA1 |
CHƯA CÓ |
PWMSEL6-PWMSEL2 |
CHƯA CÓ |
- PWMSELx (x: 2 đến 6)
- Chế độ một cạnh cho PWMx
- 1- Chế độ hai cạnh cho PWMx.
- PWMENAx (x: 1 đến 6)
- PWMx Tắt.
- 1- Đã bật PWMx.
9. PWMLER: PWM Latch Enable Register
Sử dụng: Đó là một Đăng ký 8-Bit. Nó chứa các bit Khớp x Chốt cho mỗi Kênh Đối sánh.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
CHƯA CÓ |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 đến 6):
0- Vô hiệu hóa việc tải các Giá trị Khớp mới
1- Tải các giá trị Khớp mới từ (PWMMRx) PWMMatch Register khi bộ hẹn giờ được đặt lại.
Bây giờ chúng ta hãy bắt đầu xây dựng thiết lập phần cứng để chứng minh Điều chế độ rộng xung trong vi điều khiển ARM.
Thành phần bắt buộc
Phần cứng
- Vi điều khiển ARM7-LPC2148
- IC điều chỉnh điện áp 3.3V
- Chiết áp 10k
- LED (Bất kỳ màu nào)
- Mô-đun hiển thị LCD (16x2)
- Breadboard
- Kết nối dây
Phần mềm
- Keil uVision5
- Flash Magic Tool
Sơ đồ mạch và kết nối
Kết nối giữa LCD và ARM7-LPC2148
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Đăng ký Chọn) |
P0.6 |
E (Bật) |
P0.12 |
D4 (Chân dữ liệu 4) |
P0.13 |
D5 (Chân dữ liệu 5) |
P0.14 |
D6 (Chân dữ liệu 6) |
P0.15 |
D7 (Chân dữ liệu 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Kết nối giữa LED & ARM7-LPC2148
ANODE của LED được kết nối với đầu ra PWM (P0.0) của LPC2148, trong khi chân CATHODE của LED được kết nối với chân GND của LPC2148.
Kết nối giữa ARM7-LPC2148 và chiết áp có bộ điều chỉnh điện áp 3.3V
IC điều chỉnh điện áp 3.3V |
Chức năng ghim |
ARM-7 LPC2148 Pin |
1. pin bên trái |
- Ve từ GND |
GND pin |
2.Centre Pin |
Đầu ra + 3.3V quy định |
Để chiết áp Đầu vào và đầu ra của chiết áp tới P0.28 của LPC2148 |
3. pin bên phải |
+ Ve từ 5V ĐẦU VÀO |
+ 5V |
Những điểm cần lưu ý
1. Một bộ điều chỉnh điện áp 3.3V được sử dụng ở đây để cung cấp giá trị đầu vào tương tự cho chân ADC (P0.28) của LPC2148 và bởi vì chúng tôi đang sử dụng nguồn 5V nên chúng tôi cần điều chỉnh điện áp với bộ điều chỉnh điện áp 3.3V.
2. Một chiết áp được sử dụng để thay đổi điện áp giữa (0V đến 3,3V) để cung cấp đầu vào tương tự (ADC) đến chân LPC2148 P0.28
Lập trình ARM7-LPC2148 cho PWM
Để lập trình ARM7-LPC2148, chúng ta cần công cụ keil uVision & Flash Magic. Chúng tôi đang sử dụng Cáp USB để lập trình Thanh ARM7 qua cổng micro USB. Chúng tôi viết mã bằng Keil và tạo một tệp hex và sau đó tệp HEX được chuyển sang thanh ARM7 bằng Flash Magic. Để biết thêm về cách cài đặt keil uVision và Flash Magic cũng như cách sử dụng chúng, hãy truy cập liên kết Bắt đầu với Vi điều khiển ARM7 LPC2148 và Lập trình bằng Keil uVision.
Trong hướng dẫn này, chúng tôi sẽ sử dụng kỹ thuật ADC và PWM để điều khiển độ sáng của đèn LED. Ở đây LPC2148 được cấp đầu vào tương tự (0 đến 3.3V) thông qua chân đầu vào ADC P0.28, sau đó đầu vào tương tự này được chuyển đổi thành giá trị số (0 đến 1023). Sau đó, giá trị này một lần nữa được chuyển đổi thành giá trị kỹ thuật số (0 - 255) vì đầu ra PWM của LPC2148 chỉ có độ phân giải 8 bit (2 8). Đèn LED được kết nối với chân PWM P0.0 và độ sáng của đèn LED có thể được điều khiển bằng chiết áp. Để biết thêm về ADC trong ARM7-LPC2148, hãy làm theo liên kết.
Các bước liên quan đến lập trình LPC2148 cho PWM & ADC
Bước 1: - Điều đầu tiên là cấu hình PLL để tạo xung nhịp vì nó đặt xung nhịp hệ thống và đồng hồ ngoại vi của LPC2148 theo nhu cầu của người lập trình. Tần số xung nhịp tối đa cho LPC2148 là 60Mhz. Các dòng sau được sử dụng để cấu hình tạo xung nhịp PLL.
void startlizePLL (void) // Hàm sử dụng PLL để tạo xung nhịp { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; while (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Bước 2: - Tiếp theo là chọn các chân PWM và chức năng PWM của LPC2148 bằng thanh ghi PINSEL. Chúng tôi sử dụng PINSEL0 vì chúng tôi sử dụng P0.0 cho đầu ra PWM của LPC2148.
PINSEL0 = 0x00000002; // Cài đặt chân P0.0 cho đầu ra PWM
Bước 3: - Tiếp theo chúng ta cần ĐẶT LẠI bộ định thời bằng PWMTCR (Timer Control Register).
PWMTCR = (1 << 1); // Đặt thanh ghi điều khiển bộ định thời PWM làm bộ đếm
Và sau đó, đặt giá trị tỷ lệ đặt trước quyết định độ phân giải của PWM. Tôi đang đặt nó thành 0
PWMPR = 0X00; // Đặt giá trị tỷ lệ đặt trước PWM
Bước 4: - Tiếp theo chúng ta cần thiết lập PWMMCR (PWM match control register) vì nó thiết lập hoạt động như reset, ngắt cho PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // Đặt đăng ký kiểm soát đối sánh PWM
Bước 5: - Khoảng thời gian tối đa của kênh PWM được đặt bằng PWMMR.
PWMMR0 = PWMvalue; // Đưa ra giá trị PWM Giá trị lớn nhất
Trong trường hợp của chúng tôi, giá trị tối đa là 255 (Đối với độ sáng tối đa)
Bước 6: - Tiếp theo chúng ta cần thiết lập Latch Enable cho các thanh ghi đối sánh tương ứng bằng PWMLER
PWMLER = (1 << 0); // Chốt Enalbe PWM
(Chúng tôi sử dụng PWMMR0) Vì vậy, hãy bật bit tương ứng bằng cách đặt 1 trong PWMLER
Bước 7: - Để kích hoạt đầu ra PWM đến chân, chúng ta cần sử dụng PWMTCR để kích hoạt bộ đếm PWM Timer và chế độ PWM.
PWMTCR = (1 << 0) - (1 << 3); // Bật PWM và bộ đếm PWM
Bước 8: - Bây giờ chúng ta cần lấy các giá trị chiết áp để thiết lập chu kỳ nhiệm vụ của PWM từ chân ADC P0.28. Vì vậy, chúng tôi sử dụng mô-đun ADC trong LPC2148 để chuyển đổi đầu vào tương tự chiết áp (0 đến 3,3V) thành các giá trị ADC (0 đến 1023).
Ở đây chúng tôi đang chuyển đổi các giá trị từ 0-1023 thành 0-255 bằng cách chia nó cho 4 vì PWM của LPC2148 có độ phân giải 8-Bit (2 8).
Bước 9: - Để chọn chân ADC P0.28 trong LPC2148, chúng tôi sử dụng
PINSEL1 = 0x01000000; // Đặt P0.28 là ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Đặt xung nhịp và PDN cho Chuyển đổi A / D
Các dòng sau đây ghi lại đầu vào Analog (0 đến 3,3V) và chuyển nó thành giá trị kỹ thuật số (0 đến 1023). Và sau đó các giá trị kỹ thuật số này được chia cho 4 để chuyển đổi chúng thành (0 đến 255) và cuối cùng được đưa vào dưới dạng đầu ra PWM trong chân P0.0 của LPC2148 mà đèn LED được kết nối.
AD0CR - = (1 << 1); // Chọn kênh AD0.1 trong thanh ghi ADC delaytime (10); AD0CR - = (1 << 24); // Bắt đầu chuyển đổi A / D while ((AD0DR1 & (1 << 31)) == 0); // Kiểm tra bit DONE trong thanh ghi dữ liệu ADC adcvalue = (AD0DR1 >> 6) & 0x3ff; // Lấy KẾT QUẢ từ thanh ghi dữ liệu ADC dutycycle = adcvalue / 4; // công thức lấy giá trị của dutycycle từ (0 đến 255) PWMMR1 = dutycycle; // thiết lập giá trị của dutycycle thành thanh ghi đối sánh PWM PWMLER - = (1 << 1); // Bật đầu ra PWM với giá trị vòng tròn
Bước 10: - Tiếp theo chúng ta hiển thị các giá trị đó trong module Hiển thị LCD (16X2). Vì vậy, chúng tôi thêm các dòng sau để khởi tạo mô-đun màn hình LCD
Void LCD_INITILIZE (void) // Hàm chuẩn bị sẵn sàng màn hình LCD { IO0DIR = 0x0000FFF0; // Đặt chân P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 làm thời gian trễ OUTPUT (20); LCD_SEND (0x02); // Khởi tạo lcd ở chế độ hoạt động 4 bit LCD_SEND (0x28); // 2 dòng (16X2) LCD_SEND (0x0C); // Hiển thị trên con trỏ tắt LCD_SEND (0x06); // Con trỏ tăng tự động LCD_SEND (0x01); // Hiển thị rõ ràng LCD_SEND (0x80); // Dòng đầu tiên vị trí đầu tiên }
Khi chúng tôi kết nối LCD ở chế độ 4-Bit với LPC2148, chúng tôi cần gửi các giá trị để được hiển thị dưới dạng nibble bằng nibble (Upper Nibble & Lower Nibble). Vì vậy, các dòng sau được sử dụng.
void LCD_DISPLAY (char * msg) // Hàm in các ký tự được gửi lần lượt { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Gửi phần trên IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH để in dữ liệu IO0CLR = 0x00000020; // RW LOW Thời gian trễ chế độ ghi (2); IO0CLR = 0x00000040; // EN = 0, RS và RW không đổi (tức là RS = 1, RW = 0) thời gian trễ (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Gửi Lower nibble IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; thời gian trễ (2); IO0CLR = 0x00000040; thời gian trễ (5); i ++; } }
Để hiển thị các giá trị ADC & PWM đó, chúng ta sử dụng các dòng sau trong hàm int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // Hiển thị giá trị ADC (0 đến 1023) LCD_SEND (0xC0); sprintf (ledoutput, "PWM OP =%. 2f", độ sáng); LCD_DISPLAY (ledoutput); // Hiển thị các giá trị vòng tròn nhiệm vụ từ (0 đến 255)
Mã hoàn chỉnh và mô tả video của hướng dẫn được đưa ra bên dưới.