Điều chế độ rộng xung (PWM) trong STM32F103C8: Điều khiển tốc độ của quạt DC
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 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 số có (1 ‘và 0). Đầu ra cảm biến là tín hiệu tương tự và các tín hiệu tương tự này được chuyển đổi thành tín hiệu số bằng cách sử dụng ADC, bởi vì vi điều khiển chỉ hiểu tín hiệu 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ự. Vì vậy, 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 (điều khiển xung) là gì?
PWM là một cách để điều khiển các thiết bị analog sử dụng giá trị kỹ thuật số như điều khiển tốc độ của động cơ, độ sáng của led, v.v. Chúng ta biết rằng động cơ và led hoạt động trên tín hiệu analog. Nhưng PWM không cung cấp đầu ra analog thuần túy, PWM trông giống như tín hiệu tương tự được tạo bởi các xung ngắn, được cung cấp bởi chu kỳ hoạt động.
Chu kỳ làm việc của PWM
Tỷ lệ phần trăm thời gian trong đó tín hiệu PWM vẫn ở mức CAO (đúng giờ) được gọi là chu kỳ hoạt động. Nếu tín hiệu luôn BẬT thì nó ở trong chu kỳ hoạt động 100% và nếu nó luôn tắt thì đó là chu kỳ hoạt động 0%.
Duty Cycle =Turn ON time/ (Turn ON time + Turn OFF time)
PWM trong STM32
STM32F103C8 có 15 chân PWM và 10 chân ADC. Có 7 timer và mỗi đầu ra PWM được cung cấp bởi một kênh được kết nối với 4 timer. Nó có độ phân giải PWM 16 bit (216 ), nghĩa là bộ đếm và biến có thể lớn tới 65535. Với cường độ xung 72 MHz, đầu ra PWM có thể có thời gian tối đa khoảng một mili giây.
- Vì vậy, giá trị 65535 mang lại cho LED và Quạt DC cường độ tối đa (Chu kỳ hoạt động 100%)
- Giá trị tương tự 32767 mang lại cho LED VÀ Quạt DC cường độ một nữa (Chu kỳ hoạt động 50%)
- Và giá trị của 13107 mang lại (20%) độ sáng của LED VÀ (20%) TỐC ĐỘ quạt quay (Chu kỳ hoạt động 20%)
Trong hướng dẫn này, chúng tôi đang sử dụng biến trở và STM32 để thay đổi độ sáng của LED và tốc độ của quạt DC bằng kỹ thuật PWM. Một màn hình LCD 16×2 được sử dụng để hiển thị giá trị ADC (0-4095) và biến được sửa đổi (giá trị PWM) là đầu ra (0-65535).
Linh kiện cần thiết
- STM32F103C8
- Quạt DC
- IC điều khiển động cơ ULN2003
- LED (ĐỎ)
- LCD (16×2)
- Biến trở
- Breadboard
- Nguồn 9V
- Dây dẫn
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 vì vậy chúng tôi đang sử dụng nguồn dc 9V.
IC điều khiển động cơ ULN2003: Nó được sử dụng để điều khiển động cơ theo một hướng vì động cơ là loại một chiều và cũng cần có nguồn điện bên ngoài cho quạt. Dưới đây là sơ đồ chân 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.
LED: LED màu được sử dụng phát ra ánh sáng ĐỎ.
Biến trở: Hai biến trở được sử dụng một là cho bộ chia điện áp cho đầu vào tương tự với ADC và một cái là để điều khiển độ sáng của led.
Chi tiết chân của STM32
Như chúng ta có thể thấy các chân PWM được chỉ định ở định dạng sóng (~), có 15 chân như vậy, các chân ADC được biểu thị bằng màu xanh lá cây, 10 chân ADC được sử dụng cho đầu vào tương tự.
Sơ đồ mạch và kết nối
Các kết nối của STM32 với các linh kiện khác nhau được giải thích như dưới đây:
STM32 với đầu vào tương tự (ADC)
Biến trở có mặt ở bên trái của mạch được sử dụng làm bộ điều chỉnh điện áp để điều chỉnh điện áp từ chân 3,3V. Đầu ra từ biến trở tức là chân giữa của biến trở được nối với chân ADC (PA4) của STM32.
STM32 với LED
Chân đầu ra PWM STM32 (PA9) được nối với chân dương của LED thông qua một điện trở nối tiếp và 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à tụ điện song song được nối với LED để tạo ra sóng Analog chính xác từ đầu ra PWM vì đầu ra analog không thuần túy khi được tạo ra 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 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 nối với dây âm của DC FAN.
Chân dương của quạt DC được nối với chân COM của IC ULN2003 và chân ngoài (9V DC) cũng được nối với cùng một chân COM của IC ULN2003. Chân GND của ULN2003 được nối với chân GND của STM32 và chân âm được nối với cùng chân GND.
STM32 với màn hình LCD (16×2)
Thứ tự chân LCD |
Tên chân LCD |
Tên chân STM32 |
1 |
Đất (Gnd) |
Đất (G) |
2 |
VCC |
5V |
3 |
VEE |
Chân giữa biến trở |
4 |
Chọn Điện trở (RS) |
PB11 |
5 |
Đọc / Viết (RW) |
Đất (G) |
6 |
Kích hoạt (EN) |
PB10 |
7 |
Bit dữ liệu 0 (DB0) |
Không có kết nối (NC) |
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 dương |
5V |
16 |
LED âm |
Đất (G) |
Một biến trở ở phía bên phải được sử dụng để điều khiển độ tương phản của màn hình LCD. Board 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 FTDI. Chúng ta có thể tiến hành lập trình như trong Arduino. Code hoàn chỉnh được đưa ra ở cuối.
Trong code 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 giữa của biến trở 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 và tốc độ LED của quạt DC. Một màn hình LCD 16×2 được sử dụng để hiển thị giá trị ADC và ánh xạ (giá trị đầu ra PWM).
Trước tiên, chúng ta cần thêm tệp tiêu đề LCD, khai báo chân LCD và khởi tạo chúng bằng code bên dưới.
#include <LiquidCrystal.h> // include the LCD library const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //mention the pin names to with LCD is connected to LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Initialize the LCD
Tiếp theo khai báo và xác định tên chân bằng cách sử dụng chân của STM32
const int analoginput = PA4; // Input from potentiometer const int led = PA9; // LED output const int fan = PA8; // fan output
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); //Getting LCD ready lcd.clear(); //Clears LCD lcd.setCursor(0,0); //Sets cursor at row0 and column0 lcd.print("CIRCUIT DIGEST"); //Displays Circuit Digest lcd.setCursor(0,1); //Sets Cursor at column0 and row1 lcd.print("PWM USING STM32"); //Displays PWM using STM32 delay(2000); // Delay Time lcd.clear(); // Clears LCD pinMode(analoginput, INPUT); // set pin mode analoginput as INPUT pinMode(led, PWM); // set pin mode led as PWM output pinMode(fan, PWM); // set pin mode fan as PWM output
Chân đầu vào Analog (PA4) được đặt là INPUT theo pinMode(analoginput, INPUT), chân LED được đặt làm đầu ra PWM bởi pinMode(led, PWM) và chân quạt được đặt làm đầu ra PWM bởi pinMode(fan, PWM). Ở đây các chân đầu ra PWM được nối với LED (PA9) và Quạt (PA8).
Tiếp theo trong hàm void loop (), chúng ta đọc tín hiệu Analog từ chân ADC (PA4) và lưu 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 (0-4095) bằng cách sử dụng code 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) vì vậy chúng ta cần ánh xạ với các giá trị tương tự bằng cách sử dụng chức năng bản đồ 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 độ quạt hoặc độ sáng của LED bằng cách thay đổi biến trở.
Sau đó, chúng ta viết đầu ra PWM cho LED bằng cách sử dụng pwmWrite (led, result) và đầu ra PWM cho quạt bằng cách sử dụng các hàm pwmWrite(fan, result).
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); //Sets cursor at row0 and column0 lcd.print("ADC value= "); // prints the words “” lcd.print(valueadc); //displays valueadc lcd.setCursor(0,1); //Sets Cursor at column0 and row1 lcd.print("Output = "); //prints the words in "" lcd.print(result); //displays value result
Code hoàn chỉnh với một video trình diễn được đưa ra dưới đây.
CODE:
#include <LiquidCrystal.h> // include the LCD library const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //mention the pin names to with LCD is connected to LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Initialize the LCD const int analoginput = PA4; // Input from potentiometer const int led = PA9; // LED output const int fan = PA8; // fan output void setup() { lcd.begin(16,2); //Getting LCD ready lcd.clear(); //Clears LCD lcd.setCursor(0,0); //Sets cursor at row0 and column0 lcd.print("CIRCUIT DIGEST"); //Displays Circuit Digest lcd.setCursor(0,1); //Sets Cursor at column0 and row1 lcd.print("PWM USING STM32"); //Displays PWM using STM32 delay(2000); // Delay yime lcd.clear(); // Clears LCD pinMode(analoginput, INPUT); // set pin mode analoginput as INPUT pinMode(led, PWM); // set pin mode led as PWM output pinMode(fan, PWM); // set pin mode fan as PWM output } void loop() { int valueadc = analogRead(analoginput); //gets analog value from pot and store in variable,converts to digital int result = map(valueadc, 0, 4095, 0, 65535); //maps the (0to4095 into 0to65535) and stores in result variable pwmWrite(led, result); //puts resultin PWM form pwmWrite(fan, result); //puts resultin PWM form lcd.setCursor(0,0); //Sets cursor at row0 and column0 lcd.print("ADC value= "); // prints the words in "" lcd.print(valueadc); //displays value lcd.setCursor(0,1); //Sets Cursor at column0 and row1 lcd.print("Output = "); //prints the words in "" lcd.print(result); //displays value result }
VIDEO:
Add có thể cho em biết sơ đồ giải thuật của bài này ko ạ