- PWM (Pulse with Modulation) là gì?
- PWM trong STM32
- Thành phần bắt buộc
- Chi tiết mã pin của STM32
- Sơ đồ mạch và kết nối
- Lập trình STM32
Trong phần trước, chúng ta đã biết về chuyển đổi ADC bằng STM32. Trong hướng dẫn này, chúng ta sẽ tìm hiểu về PWM (Điều chế độ rộng xung) trong STM32 và cách chúng ta có thể điều khiển độ sáng của đèn LED hoặc tốc độ của quạt DC bằng kỹ thuật PWM.
Chúng ta biết rằng có hai loại tín hiệu: Analog và Digital. Tín hiệu tương tự có điện áp như (3V, 1V… vv) và tín hiệu kỹ thuật số có (1 'và 0). Đầu ra của cảm biến là tín hiệu tương tự và những tín hiệu tương tự này được chuyển đổi thành kỹ thuật số bằng ADC, bởi vì vi điều khiển chỉ hiểu kỹ thuật số. Sau khi xử lý các giá trị ADC đó, một lần nữa đầu ra cần được chuyển đổi thành dạng tương tự để điều khiển các thiết bị tương tự. Để làm được điều đó, chúng tôi sử dụng một số phương pháp nhất định như bộ chuyển đổi PWM, Digital sang Analog (DAC), v.v.
PWM (Pulse with Modulation) là gì?
PWM là một cách để điều khiển các thiết bị tương tự 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. Chúng ta biết rằng động cơ và đèn LED hoạt động dựa trên tín hiệu tương tự. Nhưng PWM không cung cấp đầu ra tương tự thuần túy, PWM trông giống như tín hiệu tương tự được tạo ra bởi các xung ngắn, được cung cấp bởi chu kỳ nhiệm vụ.
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)
PWM trong STM32
STM32F103C8 có 15 chân PWM và 10 chân ADC. Có 7 bộ định thời và mỗi đầu ra PWM được cung cấp bởi một kênh kết nối với 4 bộ định thời. Nó có độ phân giải PWM 16-bit (2 16), tức là các bộ đếm và các biến có thể lớn đến 65535. Với tốc độ xung nhịp 72MHz, đầu ra PWM có thể có chu kỳ tối đa khoảng một phần nghìn giây.
- Vì vậy, giá trị 65535 cung cấp ĐỘ SÁNG ĐẦY ĐỦ của LED VÀ TỐC ĐỘ ĐẦY ĐỦ của Quạt DC (100% Chu kỳ làm việc)
- Tương tự, giá trị 32767 cho NỬA SÁNG SÁNG CỦA LED VÀ TỐC ĐỘ NỬA của Quạt DC (50% Chu kỳ làm việc)
- Và giá trị 13107 cho (20%) ĐỘ SÁNG VÀ (20%) TỐC ĐỘ (20% Chu kỳ nhiệm vụ)
Trong hướng dẫn này, chúng tôi sử dụng chiết áp và STM32 để thay đổi độ sáng của đèn LED và tốc độ của quạt DC bằng kỹ thuật PWM. Màn hình LCD 16x2 được sử dụng để hiển thị giá trị ADC (0-4095) và biến đã sửa đổi (giá trị PWM) là đầu ra (0-65535).
Dưới đây là một số ví dụ PWM với Vi điều khiển khác:
- Tạo PWM bằng Vi điều khiển PIC với MPLAB và XC8
- Điều khiển động cơ Servo với Raspberry Pi
- Bộ điều chỉnh độ sáng LED dựa trên Arduino sử dụng PWM
- Điều chế độ rộng xung (PWM) sử dụng MSP430G2
Kiểm tra tất cả các dự án liên quan đến PWM tại đây.
Thành phần bắt buộc
- STM32F103C8
- Quạt DC
- IC điều khiển động cơ ULN2003
- LED (ĐỎ)
- LCD (16x2)
- Chiết áp
- Breadboard
- Pin 9V
- Dây nhảy
Quạt DC: Quạt DC được sử dụng ở đây là quạt BLDC từ PC cũ. Nó yêu cầu nguồn cung cấp bên ngoài nên chúng tôi đang sử dụng pin một chiều 9V.
IC điều khiển động cơ ULN2003: Nó được sử dụng để điều khiển động cơ theo một chiều vì động cơ là một chiều và cũng cần nguồn điện bên ngoài cho quạt. Tìm hiểu thêm về Mạch điều khiển động cơ dựa trên ULN2003 tại đây. Dưới đây là sơ đồ pic của ULN2003:
Các chân (IN1 đến IN7) là các chân đầu vào và (OUT 1 đến OUT 7) là các chân đầu ra tương ứng. COM được cung cấp Điện áp nguồn dương cần thiết cho các thiết bị đầu ra.
Đèn LED: Đèn LED màu ĐỎ được sử dụng phát ra ánh sáng ĐỎ. Bất kỳ màu sắc có thể được sử dụng.
Chiết áp: Hai chiết áp được sử dụng, một là dùng để phân áp cho ngõ vào analog ADC và một là dùng để điều khiển độ sáng của led.
Chi tiết mã pin của STM32
Như chúng ta có thể thấy các chân PWM được biểu thị ở dạng sóng (~), có 15 chân như vậy, các chân ADC có màu xanh lục, 10 chân ADC ở đó được sử dụng cho các đầu vào tương tự.
Sơ đồ mạch và kết nối
Kết nối của STM32 với các thành phần khác nhau được giải thích như sau:
STM32 với đầu vào tương tự (ADC)
Chiết áp hiện diện ở phía bên trái của mạch được sử dụng như bộ điều chỉnh điện áp điều chỉnh điện áp từ chân 3,3V. Đầu ra từ chiết áp tức là chân giữa của chiết áp được kết nối với chân ADC (PA4) của STM32.
STM32 với đèn LED
Chân đầu ra STM32 PWM (PA9) được kết nối với chân dương của LED thông qua một điện trở nối tiếp và một tụ điện.
LED với điện trở và tụ điện
Một điện trở mắc nối tiếp và một tụ điện song song được kết nối với đèn LED để tạo ra sóng Tương tự chính xác từ đầu ra PWM vì đầu ra tương tự không thuần túy khi được tạo trực tiếp từ chân PWM.
STM32 với ULN2003 & ULN2003 với Quạt
Chân đầu ra STM32 PWM (PA8) được kết nối với chân Đầu vào (IN1) của IC ULN2003 và chân đầu ra tương ứng (OUT1) của ULN2003 được kết nối với dây âm của DC FAN.
Chân dương của quạt DC được kết nối với chân COM của IC ULN2003 và pin ngoài (9V DC) cũng được kết nối với cùng chân COM của IC ULN2003. Chân GND của ULN2003 được kết nối với chân GND của STM32 và cực âm của pin được kết nối với cùng một chân GND.
STM32 với LCD (16x2)
Pin LCD Không |
Tên pin LCD |
Tên pin STM32 |
1 |
Mặt đất (Gnd) |
Mặt đất (G) |
2 |
VCC |
5V |
3 |
VEE |
Ghim từ Trung tâm của Potentiometer |
4 |
Đăng ký Chọn (RS) |
PB11 |
5 |
Đọc / Ghi (RW) |
Mặt đất (G) |
6 |
Bật (EN) |
PB10 |
7 |
Bit dữ liệu 0 (DB0) |
Không có kết nối (NC) |
số 8 |
Bit dữ liệu 1 (DB1) |
Không có kết nối (NC) |
9 |
Bit dữ liệu 2 (DB2) |
Không có kết nối (NC) |
10 |
Bit dữ liệu 3 (DB3) |
Không có kết nối (NC) |
11 |
Bit dữ liệu 4 (DB4) |
PB0 |
12 |
Bit dữ liệu 5 (DB5) |
PB1 |
13 |
Bit dữ liệu 6 (DB6) |
PC13 |
14 |
Bit dữ liệu 7 (DB7) |
PC14 |
15 |
LED tích cực |
5V |
16 |
LED âm bản |
Mặt đất (G) |
Một chiết áp ở phía bên phải được sử dụng để kiểm soát độ tương phản của màn hình LCD. Bảng trên cho thấy kết nối giữa LCD và STM32.
Lập trình STM32
Giống như hướng dẫn trước, chúng tôi đã lập trình STM32F103C8 với Arduino IDE thông qua cổng USB mà không cần sử dụng bộ lập trình FTDI. Để tìm hiểu về lập trình STM32 với Arduino IDE, hãy làm theo liên kết. Chúng ta có thể tiến hành lập trình như trong Arduino. Mã hoàn chỉnh được đưa ra ở cuối.
Trong mã hóa này, chúng ta sẽ lấy một giá trị tương tự đầu vào từ chân ADC (PA4) được kết nối với chân trung tâm của chiết áp trái và sau đó chuyển đổi giá trị Analog (0-3.3V) thành định dạng số hoặc số nguyên (0-4095). Giá trị kỹ thuật số này được cung cấp thêm dưới dạng đầu ra PWM để điều khiển độ sáng LED và tốc độ của quạt DC. Màn hình LCD 16x2 được sử dụng để hiển thị ADC và giá trị được ánh xạ (giá trị đầu ra PWM).
Trước tiên, chúng ta cần bao gồm tệp tiêu đề LCD, khai báo các chân LCD và khởi tạo chúng bằng cách sử dụng mã bên dưới. Tìm hiểu thêm về giao tiếp LCD với STM32 tại đây.
#include
Tiếp theo khai báo và xác định các tên pin bằng cách sử dụng pin của STM32
const int analoginput = PA4; // Đầu vào từ chiết áp const int led = PA9; // Đầu ra LED const int fan = PA8; // đầu ra của quạt
Bây giờ bên trong setup () , chúng ta cần hiển thị một số thông báo và xóa chúng sau vài giây và chỉ định chân INPUT và chân đầu ra PWM
lcd.begin (16,2); // Chuẩn bị sẵn sàng LCD lcd.clear (); // Xóa màn hình LCD lcd.setCursor (0,0); // Đặt con trỏ tại row0 và column0 lcd.print (" ĐƯỜNG KÍNH MẠCH"); // Hiển thị Thông báo mạch lcd.setCursor (0,1); // Đặt Con trỏ tại column0 và row1 lcd.print ("PWM USING STM32"); // Hiển thị PWM sử dụng STM32 delay (2000); // Thời gian trễ lcd.clear (); // Xóa pinMode LCD (analoginput, INPUT); // đặt analoginput chế độ pin là INPUT pinMode (led, PWM); // đặt chế độ chân led làm PWM ngõ ra pinMode (quạt, PWM); // đặt quạt chế độ chân làm đầu ra PWM
Chân đầu vào Analog (PA4) được đặt làm ĐẦU VÀO bằng pinMode ( đầu vào tương tự , INPUT), chân LED được đặt làm đầu ra PWM bằng pinMode (led, PWM) và chân quạt được đặt làm đầu ra PWM bằng pinMode (quạt, PWM) . Tại đây các chân đầu ra PWM được kết nối với LED (PA9) và Fan (PA8).
Tiếp theo trong hàm void loop () , chúng tôi đọc tín hiệu Analog từ chân ADC (PA4) và lưu trữ nó trong một biến số nguyên để chuyển đổi điện áp tương tự thành các giá trị số nguyên kỹ thuật số (0-4095) bằng cách sử dụng mã bên dưới int valueadc = analogRead (analoginput);
Điều quan trọng cần lưu ý ở đây là các chân PWM là các kênh của STM32 có độ phân giải 16-Bit (0-65535) nên chúng ta cần ánh xạ nó với các giá trị analog bằng chức năng map như bên dưới
int result = map (valueadc, 0, 4095, 0, 65535).
Nếu ánh xạ không được sử dụng, chúng tôi sẽ không nhận được tốc độ tối đa của quạt hoặc độ sáng đầy đủ của đèn LED bằng cách thay đổi chiết áp.
Sau đó, chúng tôi ghi đầu ra PWM vào đèn LED bằng cách sử dụng pwmWrite (dẫn, kết quả) và đầu ra PWM cho quạt bằng cách sử dụng các hàm pwmWrite (quạt, kết quả ).
Cuối cùng, chúng tôi hiển thị giá trị đầu vào Analog (giá trị ADC) và giá trị đầu ra (giá trị PWM) trên màn hình LCD bằng cách sử dụng các lệnh sau
lcd.setCursor (0,0); // Đặt con trỏ tại row0 và column0 lcd.print ("Giá trị ADC ="); // in ra dòng chữ “” lcd.print (valueadc); // hiển thị valueadc lcd.setCursor (0,1); // Đặt Con trỏ tại column0 và row1 lcd.print ("Output ="); // in ra các từ trong "" lcd.print (result); // hiển thị kết quả giá trị
Mã hoàn chỉnh kèm theo Video minh họa dưới đây.