- Khái niệm cơ bản về Tín hiệu PWM
- Yêu cầu và thiết lập phần cứng
- Sơ đồ mạch cho đèn LED làm mờ vi điều khiển Nuvoton N76E003
- PWM Pins trên N76E003 Nuvoton Microcontroller
- Chức năng và thanh ghi PWM trong Vi điều khiển Nuvoton N76E003
- Chế độ hoạt động PWM trong Vi điều khiển Nuvoton N6E003
- Lập trình Nuvoton N76E003 cho PWM
- Nhấp nháy mã và kiểm tra đầu ra
Điều chế độ rộng xung (PWM) là một kỹ thuật thường được sử dụng trong vi điều khiển để tạo ra tín hiệu xung liên tục với tần số và chu kỳ nhiệm vụ xác định. Tóm lại, PWM là thay đổi độ rộng của một xung trong khi tần số không đổi.
Tín hiệu PWM chủ yếu được sử dụng để điều khiển động cơ servo hoặc độ sáng của đèn LED. Ngoài ra, vì bộ vi điều khiển chỉ có thể cung cấp Logic 1 (Cao) hoặc Logic 0 (Thấp) trên các chân đầu ra của nó, nó không thể cung cấp điện áp tương tự thay đổi trừ khi sử dụng bộ chuyển đổi DAC hoặc Digital sang Analog. Trong trường hợp như vậy, bộ vi điều khiển có thể được lập trình để xuất ra PWM với chu kỳ nhiệm vụ khác nhau, sau đó có thể chuyển đổi thành điện áp tương tự khác nhau. Trước đây chúng tôi cũng đã sử dụng thiết bị ngoại vi PWM trong nhiều bộ vi điều khiển khác.
- ARM7-LPC2148 PWM Hướng dẫn: Kiểm soát độ sáng của đèn LED
- Điều chế độ rộng xung (PWM) sử dụng MSP430G2: Điều khiển độ sáng của đèn LED
- Tạo PWM bằng Vi điều khiển PIC với MPLAB và XC8
- Điều chế độ rộng xung (PWM) trong STM32F103C8: Điều khiển tốc độ của quạt DC
- Tạo tín hiệu PWM trên các chân GPIO của Vi điều khiển PIC
- Hướng dẫn sử dụng Raspberry Pi PWM
- Hướng dẫn PWM với ESP32
Trong hướng dẫn này, chúng ta sẽ giao diện một đèn LED sẽ được điều khiển bằng tín hiệu PWM này từ bộ vi điều khiển N76E003. Chúng tôi sẽ đánh giá loại thiết lập phần cứng mà chúng tôi yêu cầu và cách chúng tôi nên lập trình bộ vi điều khiển của mình. Trước đó, hãy hiểu một số điều cơ bản về Tín hiệu PWM.
Khái niệm cơ bản về Tín hiệu PWM
Trong hình dưới đây, một tín hiệu PWM không đổi được hiển thị.
Hình ảnh trên không có gì khác ngoài một sóng vuông không đổi với cùng thời gian BẬT và cùng thời gian TẮT. Giả sử, tổng chu kỳ của tín hiệu là 1 Giây. Như vậy thời gian đúng giờ và thời gian tắt là 500ms. Nếu một đèn LED được kết nối qua tín hiệu này, đèn LED sẽ bật trong 500ms và tắt trong 500ms. Do đó, ở chế độ xem phối cảnh, đèn LED sẽ sáng với một nửa độ sáng thực tế nếu nó được bật với tín hiệu 5V trực tiếp mà không có bất kỳ thời gian tắt nào.
Bây giờ như thể hiện trong hình trên, nếu chu kỳ nhiệm vụ được thay đổi, đèn LED sẽ sáng lên với 25% độ sáng thực tế bằng cách sử dụng nguyên tắc tương tự như đã thảo luận trước đó. Nếu bạn muốn biết thêm và tìm hiểu về Điều chế độ rộng xung (PWM), bạn có thể xem bài viết được liên kết.
Yêu cầu và thiết lập phần cứng
Vì yêu cầu của dự án này là điều khiển đèn LED sử dụng PWM. Cần có đèn LED để được giao tiếp với N76E003. Vì một đèn LED có sẵn trong bảng phát triển N76E003, nó sẽ được sử dụng trong dự án này. Không có thành phần nào khác được yêu cầu.
Chưa kể, chúng ta cần board phát triển dựa trên vi điều khiển N76E003 cũng như Nu-Link Programmer. Có thể cần thêm bộ cấp nguồn 5V nếu bộ lập trình không được sử dụng làm nguồn điện.
Sơ đồ mạch cho đèn LED làm mờ vi điều khiển Nuvoton N76E003
Như chúng ta có thể thấy trong sơ đồ bên dưới, đèn LED Kiểm tra có sẵn bên trong bảng phát triển và nó được kết nối trên cổng 1.4. Ở phía bên trái, kết nối giao diện lập trình được hiển thị.
PWM Pins trên N76E003 Nuvoton Microcontroller
N76E003 có 20 chân, trong đó 10 chân có thể được sử dụng như PWM. Các hình ảnh dưới đây cho thấy các chân PWM được đánh dấu trong hộp hình vuông màu đỏ.
Như chúng ta thấy, các chân PWM được đánh dấu cũng có thể được sử dụng cho các mục đích khác. Tuy nhiên, mục đích khác này của các chân sẽ không khả dụng khi các chân được cấu hình cho đầu ra PWM. Chân 1.4 được sử dụng làm chân đầu ra PWM, nó sẽ mất chức năng khác. Tuy nhiên, đó không phải là vấn đề vì một chức năng khác không cần thiết cho dự án này.
Lý do đằng sau việc chọn chân 1.4 làm chân đầu ra là vì đèn LED Kiểm tra có sẵn được kết nối trên chân đó trong bảng phát triển, do đó chúng tôi không yêu cầu đèn LED bên ngoài. Tuy nhiên, trong bộ vi điều khiển này trong số 20 chân, 10 chân có thể được sử dụng làm chân đầu ra PWM và bất kỳ chân PWM nào khác có thể được sử dụng cho các mục đích liên quan đến đầu ra.
Chức năng và thanh ghi PWM trong Vi điều khiển Nuvoton N76E003
N76E003 sử dụng xung nhịp hệ thống hoặc tràn Timer 1 được chia cho đồng hồ PWM với Prescaler có thể chọn từ 1/1 ~ 1/128. Khoảng thời gian PWM có thể được đặt bằng cách sử dụng thanh ghi chu kỳ 16 bit PWMPH và thanh ghi PWMPL.
Bộ vi điều khiển có sáu thanh ghi PWM riêng lẻ tạo ra sáu tín hiệu PWM được gọi là PG0, PG1, PG2, PG3, PG4 và PG5. Tuy nhiên, chu kỳ là như nhau đối với mỗi kênh PWM vì chúng chia sẻ cùng bộ đếm chu kỳ 16 bit nhưng chu kỳ nhiệm vụ của mỗi PWM có thể khác với các kênh khác vì mỗi PWM sử dụng thanh ghi chu kỳ nhiệm vụ 16 bit khác nhau có tên là {PWM0H, PWM0L}, {PWM1H, PWM1L}, {PWM2H, PWM2L}, {PWM3H, PWM3L}, {PWM4H, PWM4L} và {PWM5H, PWM5L}. Do đó, trong N76E003, sáu đầu ra PWM có thể được tạo độc lập với các chu kỳ nhiệm vụ khác nhau.
Không giống như các bộ vi điều khiển khác, việc kích hoạt PWM không tự động đặt các chân I / O vào đầu ra PWM của chúng. Do đó, người dùng cần phải cấu hình chế độ đầu ra I / O.
Vì vậy, bất cứ điều gì được yêu cầu cho ứng dụng, bước đầu tiên là xác định hoặc chọn một hoặc hai hoặc thậm chí nhiều hơn hai chân I / O làm đầu ra PWM. Sau khi chọn một, các chân I / O cần được đặt ở chế độ Đẩy-Kéo hoặc Quasi-hai chiều để tạo tín hiệu PWM. Điều này có thể được chọn bằng cách sử dụng thanh ghi PxM1 và PxM2. Hai thanh ghi này đặt các chế độ I / O trong đó x là viết tắt của số Cổng (Ví dụ: Cổng P1.0 thì thanh ghi sẽ là P1M1 và P1M2, đối với P3.0 sẽ là P3M1 và P3M2, v.v.)
Cấu hình có thể được nhìn thấy trong hình ảnh dưới đây-
Sau đó, bước tiếp theo là bật PWM trong (các) chân I / O cụ thể đó. Để thực hiện việc này, người dùng cần thiết lập các thanh ghi PIOCON0 hoặc PIOCON1. Thanh ghi phụ thuộc vào ánh xạ chân như PIOCON0 và PIOCON1 điều khiển các chân khác nhau phụ thuộc vào tín hiệu PWM. Cấu hình của hai thanh ghi này có thể được nhìn thấy trong hình dưới đây-
Như chúng ta thấy, thanh ghi trên điều khiển 6 cấu hình. Đối với phần còn lại, sử dụng thanh ghi PIOCON1.
Như vậy, thanh ghi trên điều khiển 4 cấu hình còn lại.
Chế độ hoạt động PWM trong Vi điều khiển Nuvoton N6E003
Bước tiếp theo là chọn các chế độ hoạt động PWM. Mỗi PWM hỗ trợ ba chế độ hoạt động - Chế độ bật độc lập, Đồng bộ và Thời gian chết.
Chế độ độc lập cung cấp giải pháp trong đó sáu tín hiệu PWM có thể được tạo độc lập. Đây là yêu cầu tối đa khi cần bật và kiểm soát các hoạt động liên quan đến đèn LED hoặc bộ rung.
Các chế độ đồng bộ bộ các PG1 / 3/5 trong cùng một đầu ra PWM trong pha, giống như PG0 / 2/4, nơi PG0 / 2/4 cung cấp tín hiệu đầu ra PWM độc lập. Điều này chủ yếu được yêu cầu để điều khiển động cơ ba pha.
Các chế độ chèn Chết thời gian là một chút cắn phức tạp và áp dụng trong các ứng dụng cơ giới thực, đặc biệt là trong các ứng dụng công nghiệp. Trong các ứng dụng như vậy, đầu ra PWM bổ sung cần phải được chèn "thời gian chết" để tránh làm hỏng các thiết bị chuyển đổi nguồn như GPIB. Các cấu hình được đặt ở chế độ này theo cách PG0 / 2/4 cung cấp tín hiệu đầu ra PWM giống như chế độ độc lập nhưng PG1 / 3/5 cung cấp đầu ra “tín hiệu PWM ngoài pha” của PG0 / 2/4 tương ứng và bỏ qua PG1 / 3/5 Duty register.
Ba chế độ trên có thể được chọn bằng cách sử dụng cấu hình đăng ký bên dưới-
Cấu hình tiếp theo là lựa chọn các kiểu PWM sử dụng thanh ghi PWMCON1.
Vì vậy, như chúng ta có thể thấy, hai loại PWM có sẵn có thể được chọn bằng cách sử dụng thanh ghi trên. Trong căn chỉnh cạnh, bộ đếm 16 bit sử dụng thao tác dốc đơn bằng cách đếm tăng từ 0000H đến giá trị đặt của {PWMPH, PWMPL}, sau đó bắt đầu từ 0000H. Dạng sóng đầu ra được căn lề trái.
Tuy nhiên, ở chế độ căn giữa, bộ đếm 16 bit sử dụng hoạt động độ dốc kép bằng cách đếm lên từ 0000H đến {PWMPH, PWMPL} và sau đó lại đi từ {PWMPH, PWMPL} đến 0000H bằng cách đếm ngược. Đầu ra được căn giữa và nó hữu ích để tạo các dạng sóng không chồng chéo. Bây giờ cuối cùng các hoạt động điều khiển PWM có thể được kiểm tra trong các thanh ghi bên dưới-
Để đặt nguồn đồng hồ, hãy sử dụng thanh ghi điều khiển đồng hồ CKCON.
Tín hiệu đầu ra PWM cũng có thể được che bằng thanh ghi PMEN. Sử dụng thanh ghi này, người dùng có thể che tín hiệu đầu ra bằng 0 hoặc 1.
Tiếp theo là Thanh ghi điều khiển PWM-
Thanh ghi trên rất hữu ích để chạy PWM, tải giai đoạn mới và tải nhiệm vụ, kiểm soát Cờ PWM và xóa Bộ đếm PWM.
Các cấu hình bit liên quan được hiển thị bên dưới-
Để đặt bộ chia đồng hồ, hãy sử dụng thanh ghi PWMCON1 cho bộ chia đồng hồ PWM. Bit thứ 5 được sử dụng cho PWM nhóm được kích hoạt chế độ Nhóm và cung cấp cùng một chu kỳ nhiệm vụ cho ba cặp PWM đầu tiên.
Lập trình Nuvoton N76E003 cho PWM
Mã hóa rất đơn giản và mã hoàn chỉnh được sử dụng trong hướng dẫn này có thể được tìm thấy ở cuối trang này. Đèn LED được kết nối với chân P1.4. Vì vậy, chân P1.4 là cần thiết để được sử dụng cho đầu ra PWM.
Trong chương trình chính, các cài đặt được thực hiện theo thứ tự tương ứng. Các dòng mã dưới đây đặt PWM và định cấu hình chân P1.4 làm đầu ra PWM.
P14_PushPull_Mode;
Điều này được sử dụng để đặt chân P1.4 ở chế độ kéo-đẩy. Điều này được định nghĩa trong thư viện Function_define.h as-
#define P14_PushPull_Mode P1M1 & = ~ SET_BIT4; P1M2- = SET_BIT4 PWM1_P14_OUTPUT_ENABLE;
Các dòng tiếp theo được sử dụng để bật PWM ở chân P1.4. Điều này cũng được định nghĩa trong thư viện Function_define.h as-
#define PWM1_P14_OUTPUT_ENABLE BIT_TMP = EA; EA = 0; TA = 0xAA; TA = 0x55; SFRS- = 0x01; PIOCON1- = 0x02; TA = 0xAA; TA = 0x55; SFRS & = 0xFE; EA = BIT_TMP //P1.4 như Đầu ra PWM1 cho phép PWM_IMDEPENDENT_MODE;
Đoạn mã dưới đây được sử dụng để đặt PWM ở chế độ độc lập. Trong thư viện Function_define.h , nó được định nghĩa là-
#define PWM_IMDEPENDENT_MODE PWMCON1 & = 0x3F PWM_EDGE_TYPE;
Sau đó, chúng ta phải đặt đầu ra PWM loại EDGE. Trong thư viện Function_define.h , nó được định nghĩa là-
#define PWM_EDGE_TYPE PWMCON1 & = ~ SET_BIT4 set_CLRPWM;
Tiếp theo, chúng ta phải xóa giá trị bộ đếm PWM có sẵn trong thư viện SFR_Macro.h-
#define set_CLRPWM CLRPWM = 1
Sau đó, đồng hồ PWM được chọn làm đồng hồ Fsys và hệ số chia được sử dụng là phép chia 64.
PWM_CLOCK_FSYS; PWM_CLOCK_DIV_64;
Cả hai đều được định nghĩa là-
#define PWM_CLOCK_FSYS CKCON & = 0xBF #define PWM_CLOCK_DIV_64 PWMCON1- = 0x06; PWMCON1 & = 0xFE PWM_OUTPUT_ALL_NORMAL;
Dòng mã dưới đây được sử dụng để che tín hiệu PWM đầu ra bằng 0 được định nghĩa là-
#define PWM_OUTPUT_ALL_NORMAL PNP = 0x00 set_PWM_period (1023);
Sau đó, chúng ta phải thiết lập khoảng thời gian của tín hiệu PWM. Hàm này đặt khoảng thời gian trong thanh ghi PWMPL và PWMPH. Vì đây là một thanh ghi 16 bit, nên hàm sử dụng phương pháp dịch chuyển bit để đặt Chu kỳ PWM.
void set_PWM_period (unsigned int value) { PWMPL = (value & 0x00FF); PWMPH = ((giá trị & 0xFF00) >> 8); }
Tuy nhiên, ngoài khoảng thời gian 1023 và 8-bit, người dùng cũng có thể sử dụng các giá trị khác. Tăng chu kỳ dẫn đến mờ hoặc mờ dần.
set_PWMRUN;
Điều này sẽ bắt đầu PWM được xác định trong thư viện SFR_Macro.h as-
#define set_PWMRUN PWMRUN = 1
Tiếp theo, trong vòng lặp while , đèn LED được bật và mờ liên tục.
while (1) { for (value = 0; value <1024; value + = 10) { set_PWM1 (value); Timer1_Delay10ms (3); } for (value = 1023; value> 0; value - = 10) { set_PWM1 (value); Timer1_Delay10ms (2); } } }
Chu kỳ nhiệm vụ được đặt bởi hàm set_PWM1 ();, một hàm đặt chu kỳ nhiệm vụ trong thanh ghi PWM1L và PWM1H.
void set_PWM1 (unsigned int value) { PWM1L = (value & 0x00FF); PWM1H = ((giá trị & 0xFF00) >> 8); set_LOAD; }
Nhấp nháy mã và kiểm tra đầu ra
Khi mã đã sẵn sàng, chỉ cần biên dịch nó và tải nó lên bộ điều khiển. Nếu bạn chưa quen với môi trường này, hãy xem hướng dẫn bắt đầu với Nuvoton N76E003 để tìm hiểu những điều cơ bản. Như bạn có thể thấy từ kết quả bên dưới, mã trả về 0 cảnh báo và 0 Lỗi và nhấp nháy bằng phương pháp nhấp nháy mặc định của Keil. Ứng dụng bắt đầu hoạt động.
Bắt đầu xây dựng lại: Dự án: PWM Xây dựng lại mục tiêu 'Mục tiêu 1' lắp ráp STARTUP.A51… biên dịch main.c… biên dịch Delay.c… liên kết… Kích thước chương trình: data = 35.1 xdata = 0 code = 709 đang tạo tệp hex từ ". \ Objects \ pwm"… ". \ Objects \ pwm" - 0 (Các) lỗi, 0 Cảnh báo. Thời gian xây dựng đã trôi qua: 00:00:05
Phần cứng được kết nối với nguồn điện và nó đã hoạt động như mong đợi. Đó là độ sáng của đèn LED trên bo mạch giảm và sau đó tăng lên để cho biết chu kỳ nhiệm vụ PWM thay đổi.
Hoạt động hoàn chỉnh của hướng dẫn này cũng có thể được tìm thấy trong video được liên kết bên dưới. Hy vọng bạn thích hướng dẫn và học được điều gì đó hữu ích nếu bạn có bất kỳ câu hỏi nào, hãy để lại chúng trong phần bình luận hoặc bạn có thể sử dụng diễn đàn của chúng tôi cho các câu hỏi kỹ thuật khác.