Pulse width Modulation (PWM) in STM32F103C8
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’s). Đầ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 tín hiệu kỹ thuật số bằng cách sử dụ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.
What is PWM (Pulse with Modulation)?
(PWM (Pulse with Modulation) là gì?).
PWM là một cách để đ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. 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ụ.
Duty cycle of the 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%.
Duty Cycle =Turn ON time/ (Turn ON time + Turn OFF time)
PWM in 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 (216), tức là các bộ đếm và biến có thể lớn đến 65535. Với tốc độ đồng hồ 72MHz, đầu ra PWM có thể có khoảng thời gian tối đa khoảng một phần nghìn giây.
Vì vậy, giá trị 65535 cung cấp TỐC ĐỘ SÁNG ĐẦY ĐỦ của đèn LED VÀ TỐC ĐỘ ĐẦY ĐỦ của Quạt DC (100% Chu kỳ hoạt động)
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).
Components Required
- STM32F103C8
- DC fan
- ULN2003 Motor Driver IC
- LED (RED)
- LCD (16x2)
- Potentiometer
- Breadboard
- Battery 9V
- Jumper Wires
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 vào ADC và một là dùng để điều khiển độ sáng của led.
Pin Details of STM32
Như chúng ta có thể thấy các chân PWM được chỉ định ở 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ự.
Circuit Diagram and Connections
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 đèn 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 chân COM tương tự 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 with LCD (16x2)
LCD Pin No | LCD Pin Name | STM32 Pin Name |
1 | Ground (Gnd) | Ground (G) |
2 | VCC | 5V |
3 | VEE | Pin from Centre of Potentiometer |
4 | Register Select (RS) | PB11 |
5 | Read/Write (RW) | Ground (G) |
6 | Enable (EN) | PB10 |
7 | Data Bit 0 (DB0) | No Connection (NC) |
8 | Data Bit 1 (DB1) | No Connection (NC) |
9 | Data Bit 2 (DB2) | No Connection (NC) |
10 | Data Bit 3 (DB3) | No Connection (NC) |
11 | Data Bit 4 (DB4) | PB0 |
12 | Data Bit 5 (DB5) | PB1 |
13 | Data Bit 6 (DB6) | PC13 |
14 | Data Bit 7 (DB7) | PC14 |
15 | LED Positive | 5V |
16 | LED Negative | Ground (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.
Programming STM32
#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
}