Điều chế độ rộng xung PWM
PWM là một chế độ của Timer. Trong trường hợp bộ đếm thời gian được cấp xung nhịp từ một nguồn clock bên trong và đếm đến giá trị thanh ghi tự động tải lại, khi đó chân kênh đầu ra được điều khiển ở mức cao và duy trì cho đến khi bộ đếm thời gian đạt đến giá trị thanh ghi CCRx, sự kiện khớp làm cho chân kênh đầu ra được điều khiển mức thấp và duy trì cho đến khi bộ đếm thời gian đếm đến giá trị thanh ghi tự động tải lại, v.v.
Dạng sóng thu được được gọi là tín hiệu PWM (điều chế độ rộng xung). Tần số của xung PWM được xác định bởi clock bên trong, bộ định thời và thanh ghi ARRx. Và chu kỳ nhiệm vụ của nó được xác định bởi giá trị thanh ghi CCRx. PWM không phải lúc nào cũng phải tuân theo quy trình chính xác này để tạo PWM, tuy nhiên, đây là quy trình rất cơ bản và dễ hiểu hơn về khái niệm. Nó được gọi là chế độ PWM đếm lên.
Nội dung Project:
Tạo xung PWM có chu kỳ 1Khz, duty 20% sử dụng Timer2
Cấu hình trên STM32CubeMX
Bước 1: Mở STM32CubeMX và tạo dự án mới

Bước 2: Gõ tên tìm kiếm loại MCU cần lập trình và click đúp vào tên của nó

Bước 3: Cấu hình chế độ Debug cho chip là Serial Wire

Bước 4: Trong tab Clock Configuration, cấu hình tần số hoạt động cho chip là 216Mhz (max)

Bước 5: Cấu hình chu kỳ xung PWM

Trong mục Timers chọn TIM2, Chọn clock source cho Timer2 là Internal Clock, và cho phép kênh PWM1 của Timer2 hoạt động. Do clock cấp cho TIM2 là từ bus APB1 là 108Mhz nên để tạo tần số PWM là 1Khz, chọn hệ số chia đầu vào là 108 => timer chạy ở 1Mhz nên ta có:
Ttimer = 1/10^6 (s)
=>1Khz =1000*Ttimer
Trong mục Counter Period để là 999 vì Timer cần 1 chu kỳ để reset lại bộ đếm.
Mục cấu hình PWM Generation Channel 1 chọn chế độ cho PWM là mode 1, giá trị xung ban đầu là 0 (mục Pulse như hình)
Bước 6: Trong tab Project Manager, đặt tên cho Project, chọn đường dẫn lưu thư mục, chọn trình biên dịch là Keilc (MDK-ARM) và chọn phiên bản sử dụng

Bước 7: Trong mục Code Generator tích chọn Generate peripheral initialization.. Sau đó tiến hành GENERATE CODE.

Đợi cho quá trình GENERATE CODE hoàn tất

Bước 8:Chọn Open Project để mở chương trình code trên trình biên dịch Keilc

Để cho phép bộ PWM kênh 1 của timer2 hoạt động, chúng ta gọi hàm HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);

Để tạo ra xung có Duty = 20%, do chu kỳ xung là 1Khz = 1000*Ttimer, nên Duty=20% => Duty=200*Ttimer, chúng ta khai báo 1 biến duty và gán giá trị ban đầu cho nó là 200.

__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,duty); hàm này sẽ set giá trị Duty cho xung PWM. Sau khi được set giá trị, độ rộng xung pwm sẽ thay đổi ngay sau đó.

Sau khi hoàn thiện code, nhấn F7 hoặc click vào biểu tượng như hình dưới để biên dịch chương trình

Kết nối các chân trên header JTAG của KIT và mạch nạp ST-link V2 tương ứng như hình dưới
* Các chân nạp code cho STM32 của St-Link:
[1] 3.3V
[2] GND
[3] SWDIO
[4] SWCLK
nối tương ứng các chân này với các chân tương ứng trên KIT STM32F746I

Trước khi nạp chương trình cho KIT qua mạch nạp ST-LINK V2, chúng ta cần cấu hình một số chức năng. Thực hiện các bước như hình dưới để vào giao diện cài đặt mạch nạp.

Sau khi nhấn Setting, cửa sổ cấu hình mạch nạp hiện ra, Trong SW Device, ID CODE hiện ra có nghĩa mạch nạp đã kết nối với KIT thành công, chúng ta cấu hình tốc độ nạp ở mục Max Clock là tần số cao nhất, ở như hình là 4Mhz, Tick vào các mục Verify Code Download để Verify lại chương trình sau khi nạp và Tick vào Download to Flash để nạp chương trình vào bộ nhớ Flash chip.

Trong tab Flash Download tích chọn Reset and Run để chương trình chạy ngay sau khi nạp code xong, sau đó click OK để kết thúc cài đặt.
Click vào biểu tượng LOAD để tiến hành nạp code cho chip.

Kết quả

Chúc các bạn thành công!
Tác giả: Mai Văn Ba
Để cập nhật tin tức công nghệ mới nhất và các sản phẩm của công ty AIoT JSC, vui lòng truy cập link: http://aiots.vn hoặc linhkienaiot.com