- PWM (Pulse with Modulation) คืออะไร?
- PWM ใน STM32
- ส่วนประกอบที่จำเป็น
- รายละเอียดพินของ STM32
- แผนภาพวงจรและการเชื่อมต่อ
- การเขียนโปรแกรม STM32
ในบทความก่อนหน้านี้เราได้เห็นเกี่ยวกับการแปลง ADC โดยใช้ STM32 ในบทช่วยสอนนี้เราจะเรียนรู้เกี่ยวกับPWM (Pulse Width Modulation) ใน STM32และเราจะควบคุมความสว่างของ LED หรือความเร็วของพัดลม DC โดยใช้เทคนิค PWM ได้อย่างไร
เรารู้ว่าสัญญาณมีสองประเภท: อนาล็อกและดิจิตอล สัญญาณอนาล็อกมีแรงดันไฟฟ้าเช่น (3V, 1V… ฯลฯ) และสัญญาณดิจิตอลมี (1 'และ 0) เอาต์พุตเซนเซอร์เป็นสัญญาณอนาล็อกและสัญญาณอนาล็อกเหล่านี้จะถูกแปลงเป็นดิจิทัลโดยใช้ ADC เนื่องจากไมโครคอนโทรลเลอร์เข้าใจเฉพาะดิจิทัล หลังจากประมวลผลค่า ADC เหล่านั้นแล้วเอาต์พุตจะต้องถูกแปลงเป็นรูปแบบอะนาล็อกอีกครั้งเพื่อขับเคลื่อนอุปกรณ์อนาล็อก ด้วยเหตุนี้เราจึงใช้วิธีการบางอย่างเช่นตัวแปลง PWM, Digital to Analog (DAC) เป็นต้น
PWM (Pulse with Modulation) คืออะไร?
PWM เป็นวิธีควบคุมอุปกรณ์อนาล็อกโดยใช้ค่าดิจิทัลเช่นการควบคุมความเร็วของมอเตอร์ความสว่างของไฟ LED เป็นต้นเราทราบดีว่ามอเตอร์และไฟ LED ทำงานบนสัญญาณอนาล็อก แต่ PWM ไม่ได้ให้เอาต์พุตอะนาล็อกที่บริสุทธิ์ PWM ดูเหมือนสัญญาณอะนาล็อกที่ทำจากพัลส์สั้น ๆ ซึ่งจัดทำโดยรอบการทำงาน
รอบการทำงานของ PWM
เปอร์เซ็นต์ของเวลาที่สัญญาณ PWM ยังคงสูง (ตรงเวลา) เรียกว่าเป็นรอบการทำงาน หากสัญญาณเปิดอยู่เสมอสัญญาณจะอยู่ในรอบการทำงาน 100% และหากปิดอยู่เสมอจะเป็นรอบการทำงาน 0%
Duty Cycle = เปิดเวลา / (เปิดเวลา + ปิดเวลา)
PWM ใน STM32
STM32F103C8 มีหมุด PWM 15 พินและหมุด ADC 10 ตัว มีตัวจับเวลา 7 ตัวและเอาต์พุต PWM แต่ละตัวมีให้โดยช่องที่เชื่อมต่อกับตัวจับเวลา 4 ตัว มีความละเอียด PWM 16 บิต (2 16) นั่นคือตัวนับและตัวแปรอาจมีขนาดใหญ่ถึง 65535 ด้วยอัตรานาฬิกา 72MHz เอาต์พุต PWM สามารถมีระยะเวลาสูงสุดประมาณหนึ่งมิลลิวินาที
- ดังนั้นมูลค่า 65535 จึงให้ความสว่างเต็มที่ของ LED และ FULL SPEED ของพัดลม DC (รอบการทำงาน 100%)
- ค่า 32767 ในทำนองเดียวกันให้ความสว่างครึ่งหนึ่งของ LED และความเร็วครึ่งหนึ่งของพัดลม DC (รอบการทำงาน 50%)
- และมูลค่า 13107 ให้ (20%) ความสว่างและ (20%) ความเร็ว (รอบการทำงาน 20%)
ในบทช่วยสอนนี้เราใช้โพเทนชิออมิเตอร์และ STM32 เพื่อปรับความสว่างของ LED และความเร็วของพัดลม DC ด้วยเทคนิค PWM LCD 16x2 ใช้เพื่อแสดงค่า ADC (0-4095) และตัวแปรแก้ไข (ค่า PWM) ที่เป็นเอาต์พุต (0-65535)
ตัวอย่าง PWM บางส่วนกับไมโครคอนโทรลเลอร์อื่น ๆ มีดังนี้
- การสร้าง PWM โดยใช้ไมโครคอนโทรลเลอร์ PIC พร้อม MPLAB และ XC8
- การควบคุมเซอร์โวมอเตอร์ด้วย Raspberry Pi
- Arduino LED Dimmer โดยใช้ PWM
- การมอดูเลตความกว้างพัลส์ (PWM) โดยใช้ MSP430G2
ตรวจสอบโครงการที่เกี่ยวข้องกับ PWM ทั้งหมดที่นี่
ส่วนประกอบที่จำเป็น
- STM32F103C8
- พัดลม DC
- IC ไดรเวอร์มอเตอร์ ULN2003
- LED (สีแดง)
- จอแอลซีดี (16x2)
- โพเทนชิออมิเตอร์
- เขียงหั่นขนม
- แบตเตอรี่ 9V
- สายจัมเปอร์
พัดลม DC: พัดลม DC ที่ใช้ที่นี่เป็นพัดลม BLDC จากพีซีเครื่องเก่าต้องใช้แหล่งจ่ายไฟภายนอกดังนั้นเราจึงใช้แบตเตอรี่ 9V dc
ULN2003 Motor Driver IC:ใช้เพื่อขับเคลื่อนมอเตอร์ไปในทิศทางเดียวเนื่องจากมอเตอร์เป็นแบบทิศทางเดียวและต้องใช้พลังงานภายนอกสำหรับพัดลม เรียนรู้เพิ่มเติมเกี่ยวกับวงจรขับมอเตอร์ตาม ULN2003 ที่นี่ ด้านล่างนี้คือแผนภาพรูปของ ULN2003:
หมุด (IN1 ถึง IN7) เป็นพินอินพุตและ (OUT 1 ถึง OUT 7) เป็นพินเอาต์พุตที่สอดคล้องกัน COM ได้รับแรงดันไฟฟ้าที่เป็นบวกสำหรับอุปกรณ์เอาต์พุต
LED: ใช้ไฟ LEDสีแดงซึ่งเปล่งแสงสีแดง สามารถใช้สีใดก็ได้
โพเทนชิโอมิเตอร์: โพเทนชิโอมิเตอร์สองตัวใช้สำหรับตัวแบ่งแรงดันไฟฟ้าสำหรับอินพุตแบบอะนาล็อกไปยัง ADC และอีกตัวใช้สำหรับควบคุมความสว่างของไฟ LED
รายละเอียดพินของ STM32
ดังที่เราเห็นหมุด PWM ถูกระบุในรูปแบบคลื่น (~) มี 15 พินดังกล่าวหมุด ADC จะแสดงเป็นสีเขียวมีหมุด ADC 10 ตัวซึ่งใช้สำหรับอินพุตอะนาล็อก
แผนภาพวงจรและการเชื่อมต่อ
การเชื่อมต่อของ STM32 กับส่วนประกอบต่างๆอธิบายได้ดังนี้:
STM32 พร้อมอินพุตอนาล็อก (ADC)
โพเทนชิออมิเตอร์ที่อยู่ทางด้านซ้ายของวงจรใช้เป็นตัวควบคุมแรงดันไฟฟ้าที่ควบคุมแรงดันไฟฟ้าจากขา 3.3V เอาต์พุตจากโพเทนชิออมิเตอร์คือพินกลางของโพเทนชิออมิเตอร์เชื่อมต่อกับขา ADC (PA4) ของ STM32
STM32 พร้อม LED
ขาเอาต์พุต STM32 PWM (PA9) เชื่อมต่อกับขาบวกของ LED ผ่านตัวต้านทานแบบอนุกรมและตัวเก็บประจุ
LED พร้อมตัวต้านทานและตัวเก็บประจุ
ตัวต้านทานแบบอนุกรมและตัวเก็บประจุแบบขนานเชื่อมต่อกับ LED เพื่อสร้างคลื่นอะนาล็อกที่ถูกต้องจากเอาต์พุต PWM เนื่องจากเอาต์พุตอะนาล็อกไม่บริสุทธิ์จากเมื่อสร้างโดยตรงจากพิน PWM
STM32 พร้อม ULN2003 และ ULN2003 พร้อมพัดลม
ขาเอาต์พุต STM32 PWM (PA8) เชื่อมต่อกับขาอินพุต (IN1) ของ ULN2003 IC และขาเอาท์พุทที่เกี่ยวข้อง (OUT1) ของ ULN2003 เชื่อมต่อกับสายลบของ DC FAN
ขาบวกของพัดลม DC เชื่อมต่อกับขา COM ของ ULN2003 IC และแบตเตอรี่ภายนอก (9V DC) ยังเชื่อมต่อกับขา COM เดียวกันของ ULN2003 IC ขา GND ของ ULN2003 เชื่อมต่อกับพิน GND ของ STM32 และขั้วลบของแบตเตอรี่เชื่อมต่อกับพิน GND เดียวกัน
STM32 พร้อม LCD (16x2)
หมายเลขขา LCD |
ชื่อพิน LCD |
ชื่อพิน STM32 |
1 |
พื้นดิน (Gnd) |
พื้นดิน (G) |
2 |
VCC |
5V |
3 |
วี |
Pin จาก Center of Potentiometer |
4 |
ลงทะเบียนเลือก (RS) |
PB11 |
5 |
อ่าน / เขียน (RW) |
พื้นดิน (G) |
6 |
เปิดใช้งาน (EN) |
PB10 |
7 |
บิตข้อมูล 0 (DB0) |
ไม่มีการเชื่อมต่อ (NC) |
8 |
บิตข้อมูล 1 (DB1) |
ไม่มีการเชื่อมต่อ (NC) |
9 |
บิตข้อมูล 2 (DB2) |
ไม่มีการเชื่อมต่อ (NC) |
10 |
บิตข้อมูล 3 (DB3) |
ไม่มีการเชื่อมต่อ (NC) |
11 |
บิตข้อมูล 4 (DB4) |
PB0 |
12 |
บิตข้อมูล 5 (DB5) |
PB1 |
13 |
บิตข้อมูล 6 (DB6) |
พีซี 13 |
14 |
บิตข้อมูล 7 (DB7) |
พีซี 14 |
15 |
LED เป็นบวก |
5V |
16 |
LED เชิงลบ |
พื้นดิน (G) |
โพเทนชิออมิเตอร์ทางด้านขวาใช้เพื่อควบคุมความคมชัดของจอ LCD ตารางด้านบนแสดงการเชื่อมต่อระหว่าง LCD และ STM32
การเขียนโปรแกรม STM32
เช่นเดียวกับบทช่วยสอนก่อนหน้านี้เราตั้งโปรแกรม STM32F103C8 ด้วย Arduino IDE ผ่านพอร์ต USB โดยไม่ต้องใช้โปรแกรมเมอร์ FTDI เรียนรู้เกี่ยวกับการเขียนโปรแกรม STM32 ด้วย Arduino IDE ตามลิงค์ เราสามารถดำเนินการเขียนโปรแกรมได้เหมือนใน Arduino รหัสที่สมบูรณ์จะได้รับในตอนท้าย
ในการเข้ารหัสนี้เราจะนำค่าอนาล็อกอินพุตจากขา ADC (PA4) ซึ่งเชื่อมต่อกับพินกลางของโพเทนชิออมิเตอร์ด้านซ้ายแล้วแปลงค่าอนาล็อก (0-3.3V) เป็นรูปแบบดิจิทัลหรือจำนวนเต็ม (0-4095) ค่าดิจิตอลนี้มีให้เพิ่มเติมเป็นเอาต์พุต PWM เพื่อควบคุมความสว่าง LED และความเร็วของพัดลม DC LCD 16x2 ใช้เพื่อแสดง ADC และค่าที่แมป (ค่าเอาต์พุต PWM)
ก่อนอื่นเราต้องรวมไฟล์ส่วนหัวของ LCD ประกาศหมุด LCD และเริ่มต้นโดยใช้รหัสด้านล่าง เรียนรู้เพิ่มเติมเกี่ยวกับการเชื่อมต่อ LCD กับ STM32 ที่นี่
# รวม
ถัดไปประกาศและกำหนดชื่อพินโดยใช้พินของ STM32
const int analoginput = PA4; // อินพุตจากโพเทนชิออมิเตอร์ const int led = PA9; // เอาต์พุต LED const int fan = PA8; // เอาต์พุตพัดลม
ตอนนี้อยู่ในการ ตั้งค่า () เราจำเป็นต้องแสดงข้อความและล้างหลังจากนั้นไม่กี่วินาทีและระบุพินอินพุตและพินเอาต์พุต PWM
lcd.begin (16,2); // เตรียม LCD ให้พร้อม lcd.clear (); // ล้าง LCD lcd.setCursor (0,0); // ตั้งค่าเคอร์เซอร์ที่ row0 และ column0 lcd.print ("CIRCUIT DIGEST"); // แสดงวงจรย่อย lcd.setCursor (0,1); // ตั้งค่าเคอร์เซอร์ที่ column0 และ row1 lcd.print ("PWM USING STM32"); // แสดง PWM โดยใช้ STM32 delay (2000); // เวลาหน่วง lcd.clear (); // ล้าง LCD pinMode (อินพุตอะนาล็อก, อินพุต); // ตั้งค่าอะนาล็อกอินพุตโหมดพินเป็น INPUT pinMode (led, PWM); // ตั้งค่าโหมดพินนำเป็นพินโหมดเอาต์พุต PWM (พัดลม, PWM); // ตั้งค่าพัดลมโหมดพินเป็นเอาต์พุต PWM
อินพุตขาอนาล็อก (PA4) ถูกกำหนดให้เป็น INPUT โดย pinMode (analoginput, INPUT) ขา LED ถูกตั้งค่าเป็นออก PWM โดย pinMode (นำ PWM) และพัดลมขาตั้งเป็นออก PWM โดย pinMode (พัดลม PWM) ที่นี่หมุดเอาต์พุต PWM เชื่อมต่อกับ LED (PA9) และพัดลม (PA8)
ถัดไปในฟังก์ชัน void loop () เราอ่านสัญญาณอนาล็อกจากขา ADC (PA4) และเก็บไว้ในตัวแปรจำนวนเต็มที่แปลงแรงดันแอนะล็อกเป็นค่าจำนวนเต็มดิจิทัล (0-4095) โดยใช้โค้ดด้านล่าง int valueadc = analogRead (analoginput);
สิ่งสำคัญที่ควรทราบคือหมุด PWM ที่เป็นช่องของ STM32 มีความละเอียด 16 บิต (0-65535) ดังนั้นเราต้องจับคู่กับค่าอนาล็อกโดยใช้ฟังก์ชันแผนที่ดังต่อไปนี้
ผลลัพธ์ int = แผนที่ (valueadc, 0, 4095, 0, 65535)
หากไม่ใช้การทำแผนที่เราจะไม่ได้รับความเร็วเต็มของพัดลมหรือความสว่างเต็มของ LED โดยการเปลี่ยนโพเทนชิออมิเตอร์
จากนั้นเราเขียนเอาต์พุต PWM ไปยัง LED โดยใช้ pwmWrite (led, ผลลัพธ์) และเอาต์พุต PWM ไปยังพัดลมโดยใช้ ฟังก์ชัน pwmWrite (fan, result )
ในที่สุดเราจะแสดงค่าอินพุตอนาล็อก (ค่า ADC) และค่าเอาต์พุต (ค่า PWM) บนจอ LCD โดยใช้คำสั่งต่อไปนี้
lcd.setCursor (0,0); // ตั้งค่าเคอร์เซอร์ที่ row0 และ column0 lcd.print ("ADC value ="); // พิมพ์คำว่า“” lcd.print (valueadc); // แสดง valueadc lcd.setCursor (0,1); // ตั้งค่า Cursor ที่ column0 และ row1 lcd.print ("Output ="); // พิมพ์คำใน "" lcd.print (ผลลัพธ์); // แสดงผลค่า
กรอกรหัสพร้อมวิดีโอสาธิตด้านล่าง