- SPWM (Sinusoidal Pulse Width Modulation) คืออะไร?
- SPWM Inverter ทำงานอย่างไร
- ส่วนประกอบที่จำเป็นในการสร้าง SPWM Inverter
- การสร้างวงจรอินเวอร์เตอร์ SPWM
- โปรแกรม Arduino สำหรับ SPWM Inverter
- การทดสอบวงจรอินเวอร์เตอร์ TL494 PWM
มักต้องการวงจรอินเวอร์เตอร์ซึ่งไม่สามารถรับแหล่งจ่ายไฟ AC จากกริดได้ วงจรอินเวอร์เตอร์ใช้ในการแปลงไฟฟ้ากระแสตรงเป็นไฟฟ้ากระแสสลับและสามารถแบ่งออกเป็นสองประเภทนั่นคืออินเวอร์เตอร์ Pure Sine WaveหรือModified Square Wave Inverters อินเวอร์เตอร์คลื่นไซน์บริสุทธิ์เหล่านี้มีราคาแพงมากโดยที่อินเวอร์เตอร์คลื่นสี่เหลี่ยมที่ดัดแปลงนั้นมีราคาไม่แพง เรียนรู้เพิ่มเติมเกี่ยวกับอินเวอร์เตอร์ประเภทต่างๆที่นี่
ในบทความก่อนหน้านี้ฉันได้แสดงวิธีที่จะไม่สร้างอินเวอร์เตอร์คลื่นสี่เหลี่ยมที่แก้ไขแล้วโดยการแก้ไขปัญหาที่เกี่ยวข้อง ดังนั้นในบทความนี้ฉันจะสร้างอินเวอร์เตอร์คลื่นไซน์บริสุทธิ์อย่างง่ายโดยใช้ Arduinoและอธิบายหลักการทำงานของวงจร
หากคุณกำลังสร้างวงจรนี้โปรดทราบว่าวงจรนี้ไม่มีข้อเสนอแนะไม่มีการป้องกันกระแสเกินไม่มีการป้องกันไฟฟ้าลัดวงจรและไม่มีการป้องกันอุณหภูมิ ดังนั้นวงจรนี้จึงถูกสร้างขึ้นและแสดงให้เห็นเพื่อจุดประสงค์ทางการศึกษาเท่านั้นและไม่แนะนำให้สร้างและใช้วงจรประเภทนี้สำหรับเครื่องใช้ในเชิงพาณิชย์ อย่างไรก็ตามคุณสามารถเพิ่มเข้าไปในวงจรของคุณได้หากจำเป็นวงจรป้องกันที่ใช้กันทั่วไปเช่น
การป้องกันแรงดันเกิน, การป้องกันกระแสเกิน, การป้องกันขั้วย้อนกลับ, การป้องกันไฟฟ้าลัดวงจร, ตัวควบคุม Hot Swap ฯลฯ ได้รับการกล่าวถึงแล้ว
ข้อควรระวัง:หากคุณกำลังสร้างวงจรประเภทนี้โปรดระมัดระวังเป็นพิเศษเกี่ยวกับแรงดันไฟฟ้าสูงและแรงดันไฟฟ้าที่เกิดจากสัญญาณสวิตชิ่งไปยังอินพุต
SPWM (Sinusoidal Pulse Width Modulation) คืออะไร?
ตามชื่อที่แนะนำSPWMย่อมาจากS inusoidal P ulse W idth M odulation ดังที่คุณทราบแล้วสัญญาณ PWMเป็นสัญญาณที่เราสามารถเปลี่ยนความถี่ของพัลส์ตลอดจนเวลาตรงและเวลานอกเวลาซึ่งเรียกอีกอย่างว่ารอบการทำงาน หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ PWM คุณสามารถอ่านได้ที่นี่ ดังนั้นโดยการเปลี่ยนรอบการทำงานเราจึงเปลี่ยนแรงดันไฟฟ้าเฉลี่ยของพัลส์ ภาพด้านล่างแสดงให้เห็นว่า -
ถ้าเราพิจารณาสัญญาณ PWMที่สลับไปมาระหว่าง 0 - 5V ซึ่งมีรอบการทำงาน 100%เราจะได้แรงดันเอาต์พุตเฉลี่ย5Vอีกครั้งหากเราพิจารณาสัญญาณเดียวกันโดยมีรอบการทำงาน 50%เราจะ รับแรงดันเอาต์พุต 2.5Vและสำหรับรอบการทำงาน 25% มันเป็นครึ่งหนึ่งของนั้น นั่นเป็นการสรุปหลักการพื้นฐานของสัญญาณ PWM และเราสามารถทำความเข้าใจหลักการพื้นฐานของสัญญาณ SPWMได้
แรงดันไซน์เป็นหลักแรงดันไฟฟ้าที่คล้ายคลึงกันซึ่ง alters ของขนาดเมื่อเวลาผ่านไปและเราสามารถทำซ้ำพฤติกรรมของคลื่นไซน์นี้โดยการเปลี่ยนแปลงอย่างต่อเนื่องรอบหน้าที่ของคลื่นแบบ PWM, ด้านล่างแสดงให้เห็นภาพว่า
หากคุณดูแผนผังด้านล่างจะเห็นว่ามีตัวเก็บประจุเชื่อมต่ออยู่ที่เอาต์พุตของหม้อแปลง ตัวเก็บประจุนี้จะรับผิดชอบเรียบออกสัญญาณไฟฟ้ากระแสสลับจากความถี่
สัญญาณอินพุตที่ใช้จะชาร์จและปล่อยตัวเก็บประจุตามสัญญาณอินพุต และโหลดเนื่องจากเราใช้สัญญาณ SPWM ความถี่สูงมากมันจะมีรอบการทำงานที่เล็กมากเช่น 1% รอบการทำงาน 1%นี้จะชาร์จตัวเก็บประจุเล็กน้อยรอบการทำงานถัดไปคือ 5%จะเรียกเก็บอีกครั้ง ตัวเก็บประจุอีกเล็กน้อยต่อไปพัลส์จะมีรอบการทำงาน 10%และตัวเก็บประจุจะชาร์จอีกเล็กน้อยเราจะใช้สัญญาณจนกว่าเราจะถึงรอบการทำงาน 100%และจากนั้นเราจะกลับลงไป 1% สิ่งนี้จะสร้างเส้นโค้งที่เรียบเนียนเหมือนคลื่นไซน์ที่เอาต์พุต. ดังนั้นโดยการระบุค่าที่เหมาะสมของวัฏจักรการทำงานที่อินพุตเราจะมีคลื่นไซน์มากที่เอาต์พุต
SPWM Inverter ทำงานอย่างไร
ภาพด้านบนแสดงส่วนการขับเคลื่อนหลักของอินเวอร์เตอร์ SPWMและอย่างที่คุณเห็นเราได้ใช้N-channel MOSFET สองตัวในการกำหนดค่าครึ่งสะพานเพื่อขับเคลื่อนหม้อแปลงของวงจรนี้เพื่อลดสัญญาณรบกวนในการเปลี่ยนที่ไม่ต้องการและเพื่อป้องกัน MOSFET เราใช้ไดโอด 1N5819 ขนานกับมอสเฟต เพื่อลดความแหลมที่เป็นอันตรายใด ๆ ที่สร้างในส่วนประตูที่เราได้ใช้4.7 โอห์มต้านทานแบบคู่ขนานกับไดโอด สุดท้ายBD139 และ BD 140 ทรานซิสเตอร์มีการกำหนดค่าในการผลักดันดึง การตั้งค่าในการขับเคลื่อนเกตของมอสเฟตเนื่องจากมอสเฟตนี้มีความจุเกตสูงมากและต้องใช้อย่างน้อย 10V ที่ฐานเพื่อเปิดอย่างถูกต้อง เรียนรู้เพิ่มเติมเกี่ยวกับการทำงานของแอมพลิฟายเออร์ Push-Pull ที่นี่
เพื่อให้เข้าใจหลักการทำงานของวงจรได้ดีขึ้นเราได้ลดระดับลงจนถึงจุดที่ส่วนนี้ของ MOSFET เปิดอยู่ เมื่อ MOSFET อยู่บนกระแสไฟฟ้าขั้นแรกจะไหลผ่านหม้อแปลงจากนั้นจึงต่อสายดินโดย MOSFET ดังนั้นฟลักซ์แม่เหล็กจะถูกเหนี่ยวนำในทิศทางที่กระแสไหลและแกนของหม้อแปลงจะผ่านฟลักซ์แม่เหล็ก ในขดลวดทุติยภูมิและเราจะได้ครึ่งรอบบวกของสัญญาณไซน์ที่เอาท์พุท
ในรอบถัดไปส่วนล่างของวงจรจะอยู่ที่ส่วนบนสุดของวงจรจึงปิดอยู่นั่นคือสาเหตุที่ฉันถอดส่วนบนออกตอนนี้กระแสจะไหลไปในทิศทางตรงกันข้ามและสร้างฟลักซ์แม่เหล็กในทิศทางนั้นจึงย้อนกลับ ทิศทางของฟลักซ์แม่เหล็กในแกนกลาง เรียนรู้เพิ่มเติมเกี่ยวกับการทำงานของ MOSFET ที่นี่
ตอนนี้เราทุกคนรู้แล้วว่าหม้อแปลงทำงานโดยการเปลี่ยนแปลงของฟลักซ์แม่เหล็ก ดังนั้นการเปิดและปิด MOSFET ทั้งสองตัวหนึ่งกลับไปเป็นอีกตัวหนึ่งและทำเช่นนั้น 50 ครั้งในหนึ่งวินาทีจะสร้างฟลักซ์แม่เหล็กที่สั่นได้ดีภายในแกนของหม้อแปลงและฟลักซ์แม่เหล็กที่เปลี่ยนแปลงจะทำให้เกิดแรงดันไฟฟ้าในขดลวดทุติยภูมิตาม เรารู้ว่าโดยกฎหมายของฟาราเดย์ นั่นคือวิธีการทำงานของอินเวอร์เตอร์พื้นฐาน
วงจรอินเวอร์เตอร์ SPWM ที่สมบูรณ์ที่ใช้ในโครงการนี้มีดังต่อไปนี้
ส่วนประกอบที่จำเป็นในการสร้าง SPWM Inverter
ส. เลขที่ |
อะไหล่ |
ประเภท |
ปริมาณ |
1 |
Atmega328P |
เข้าใจแล้ว |
1 |
2 |
IRFZ44N |
มอสเฟต |
2 |
3 |
BD139 |
ทรานซิสเตอร์ |
2 |
4 |
BD140 |
ทรานซิสเตอร์ |
2 |
5 |
22pF |
คาปาซิเตอร์ |
2 |
6 |
10K, 1% |
ตัวต้านทาน |
1 |
7 |
16MHz |
คริสตัล |
1 |
8 |
0.1 ยูเอฟ |
คาปาซิเตอร์ |
3 |
9 |
4.7 ร |
ตัวต้านทาน |
2 |
10 |
1N4148 |
ไดโอด |
2 |
11 |
LM7805 |
ตัวควบคุมแรงดันไฟฟ้า |
1 |
12 |
200uF, 16V |
คาปาซิเตอร์ |
1 |
13 |
47uF, 16V |
คาปาซิเตอร์ |
1 |
14 |
2.2uF, 400V |
คาปาซิเตอร์ |
1 |
การสร้างวงจรอินเวอร์เตอร์ SPWM
สำหรับการสาธิตนี้วงจรถูกสร้างขึ้นบน Veroboardด้วยความช่วยเหลือของแผนผังที่เอาท์พุทของหม้อแปลงกระแสจำนวนมากจะไหลผ่านการเชื่อมต่อดังนั้นจัมเปอร์การเชื่อมต่อจะต้องหนาที่สุด
โปรแกรม Arduino สำหรับ SPWM Inverter
ก่อนที่เราจะไปข้างหน้าและเริ่มทำความเข้าใจโค้ดเรามาทำความเข้าใจพื้นฐานกันก่อน จากหลักการทำงานข้างต้นคุณได้เรียนรู้ว่าสัญญาณ PWM จะมีลักษณะอย่างไรที่เอาต์พุตตอนนี้คำถามยังคงอยู่ว่าเราจะสร้างคลื่นที่แตกต่างกันได้อย่างไรที่พินเอาต์พุตของ Arduino
ในการสร้างสัญญาณ PWM ที่แตกต่างกันเราจะใช้ตัวจับเวลา16 บิต 1พร้อมการตั้งค่าตัวกำหนดล่วงหน้าเป็น1ซึ่งจะให้เวลา 1600/16000000 = 0.1 มิลลิวินาทีสำหรับการนับแต่ละครั้งหากเราพิจารณาครึ่งรอบเดียวของคลื่นไซน์ ซึ่งพอดีกับ 100 ครั้งภายในครึ่งรอบของคลื่น พูดง่ายๆก็คือเราจะสุ่มตัวอย่างคลื่นไซน์ได้ 200 ครั้ง
ต่อไปเราจะต้องแบ่งคลื่นไซน์ของเราถึง 200 ชิ้นและคำนวณค่าของพวกเขาด้วยความสัมพันธ์ของความกว้างต่อไปเราต้องแปลงค่าเหล่านั้นเป็นค่าตัวนับตัวจับเวลาโดยคูณด้วยขีด จำกัด ของตัวนับ สุดท้ายเราต้องใส่ค่าเหล่านั้นลงในตารางค้นหาเพื่อป้อนไปที่เคาน์เตอร์และเราจะได้คลื่นไซน์ของเรา
เพื่อให้ง่ายขึ้นเล็กน้อยฉันใช้รหัส SPWM ที่เขียนได้ดีมากจาก GitHub ซึ่งสร้างโดย Kurt Hutten
รหัสนั้นง่ายมากเราเริ่มโปรแกรมของเราโดยการเพิ่มไฟล์ส่วนหัวที่ต้องการ
# รวม # รวม
ต่อไปเรามีตารางการค้นหาสองตารางซึ่งเราจะได้รับค่าตัวนับตัวจับเวลา
int lookUp1 = {50, 100, 151, 201, 250, 300, 349, 398, 446, 494, 542, 589, 635, 681, 726, 771, 814, 857, 899, 940, 981, 1020, 1058, 1095, 1131, 1166, 1200, 1233, 1264, 1294, 1323, 1351, 1377, 1402, 1426, 1448, 1468, 1488, 1505, 1522, 1536, 1550, 1561, 1572, 1580, 1587, 1593, 1597, 1599, 1600, 1599, 1597, 1593, 1587, 1580, 1572, 1561, 1550, 1536, 1522, 1505, 1488, 1468, 1448, 1426, 1402, 1377, 1351, 1323, 1294, 1264, 1233, 1200, 1166, 1131, 1095, 1058, 1020, 981, 940, 899, 857, 814, 771, 726, 681, 635, 589, 542, 494, 446, 398, 349, 300, 250, 201, 151, 100, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0}; int lookUp2 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 100, 151, 201, 250, 300, 349, 398, 446, 494, 542, 589, 635, 681, 726, 771, 814, 857, 899, 940, 981, 1020, 1058, 1095, 1131, 1166, 1200, 1233, 1264, 1294, 1323, 1351, 1377, 1402, 1426, 1448, 1468, 1488, 1505, 1522, 1536, 1550, 1561, 1572, 1580, 1587, 1593, 1597, 1599, 1600, 1599, 1597, 1593, 1587, 1580, 1572, 1561, 1550, 1536, 1522, 1505, 1488, 1468, 1448, 1426, 1402, 1377, 1351, 1323, 1294, 1264, 1233, 1200, 1166, 1131, 1095, 1058, 1020, 981, 940, 899, 857, 814, 771, 726, 681, 635, 589, 542, 494, 446, 398, 349, 300, 250,201, 151, 100, 50, 0};
ต่อไปในส่วน การตั้งค่า เราจะเริ่มต้นการลงทะเบียนตัวนับตัวจับเวลาเพื่อให้ชัดเจนในแต่ละรายการ สำหรับข้อมูลเพิ่มเติมคุณต้องอ่านแผ่นข้อมูลของ atmega328 IC
TCCR1A = 0b10100010; / * 10 ชัดเจนในการจับคู่ตั้งไว้ที่ BOTTOM สำหรับ compA 10 ชัดเจนในการแข่งขันตั้งค่าที่ด้านล่างสำหรับ compB 00 10 WGM1 1: 0 สำหรับรูปคลื่น 15. * / TCCR1B = 0b00011001; / * 000 11 WGM1 3: 2 สำหรับรูปคลื่น 15. 001 ไม่มี prescale บนเคาน์เตอร์ * / TIMSK1 = 0b00000001; / * 0000000 1 TOV1 Flag interrupt เปิดใช้งาน * /
หลังจากนั้นเราจะเริ่มต้นการบันทึกข้อมูลเข้าด้วยค่าที่กำหนดไว้ล่วงหน้าที่ 16000 ซึ่งจะช่วยให้เราสร้างตัวอย่างได้ 200 ตัวอย่าง
ICR1 = 1600; // ระยะเวลาสำหรับคริสตัล 16MHz สำหรับความถี่การเปลี่ยน 100KHz สำหรับการแบ่งย่อย 200 ส่วนต่อรอบคลื่นไซน์ 50Hz
ต่อไปเราจะเปิดใช้งานการขัดจังหวะส่วนกลางโดยการเรียกใช้ฟังก์ชัน
ซี ();
สุดท้ายเราตั้ง Arduino pin 9 และ 10 เป็นเอาต์พุต
DDRB = 0b00000110; // ตั้ง PB1 และ PB2 เป็นเอาต์พุต
นั่นถือเป็นการสิ้นสุดฟังก์ชันการตั้งค่า
ส่วนการวนซ้ำของรหัสจะว่างเปล่าเนื่องจากเป็นโปรแกรมที่ขับเคลื่อนด้วยตัวนับการขัดจังหวะตัวจับเวลา
ห่วงเป็นโมฆะ () {; /*ไม่ทำอะไร…. ตลอดไป! * /}
ต่อไปเราได้กำหนดเวกเตอร์โอเวอร์โฟลว์ของ timer1 ฟังก์ชันขัดจังหวะนี้จะรับสายเมื่อ timer1 ล้นและสร้างอินเทอร์รัปต์
ISR (TIMER1_OVF_vect) {
ต่อไปเราจะประกาศตัวแปรท้องถิ่นบางตัวเป็นตัวแปรคงที่และเราได้เริ่มป้อนค่าไปยังตัวจับและเปรียบเทียบตัวต้านทาน
คง int num; ถ่าน Trig แบบคงที่ // เปลี่ยน duty-cycle ทุกงวด OCR1A = lookUp1; OCR1B = lookUp2;
ในที่สุดเราจะเพิ่มตัวนับล่วงหน้าเพื่อป้อนค่าถัดไปให้กับการจับและเปรียบเทียบตัวต้านทานซึ่งถือเป็นจุดสิ้นสุดของรหัสนี้
ถ้า (++ num> = 200) {// จำนวนที่เพิ่มขึ้นล่วงหน้าจากนั้นตรวจสอบว่าต่ำกว่า 200 num = 0; // รีเซ็ต num Trig = ตรีโกณ ^ 0b00000001; digitalWrite (13, ตรีโกณ); }
การทดสอบวงจรอินเวอร์เตอร์ TL494 PWM
ในการทดสอบวงจรจะใช้การตั้งค่าต่อไปนี้
- แบตเตอรี่ตะกั่วกรด 12V
- หม้อแปลงไฟฟ้าที่มีต๊าป 6-0-6 และต๊าป 12-0-12
- หลอดไส้ 100W เป็นโหลด
- Meco 108B + TRMS มัลติมิเตอร์
- มัลติมิเตอร์ Meco 450B + TRMS
สัญญาณเอาต์พุตจาก Arduino:
เมื่อฉันอัปโหลดรหัสแล้ว ฉันวัดสัญญาณ SPWM เอาท์พุทจากสองพินของArduinoซึ่งดูเหมือนภาพด้านล่าง
ถ้าเราซูมเข้าไปอีกหน่อยเราจะเห็นรอบการทำงานที่เปลี่ยนแปลงตลอดเวลาของคลื่น PWM
ถัดไปภาพด้านล่างแสดงสัญญาณเอาต์พุตจากหม้อแปลง
SPWM Inverter Circuit ในสภาวะที่เหมาะสม:
ดังที่คุณเห็นจากภาพด้านบนวงจรนี้ใช้พลังงานประมาณ 13W ในขณะที่ทำงานในอุดมคติ
แรงดันขาออกโดยไม่ต้องโหลด:
แรงดันไฟฟ้าขาออกของวงจรอินเวอร์เตอร์แสดงไว้ด้านบนนี่คือแรงดันไฟฟ้าที่ออกที่เอาต์พุตโดยไม่มีโหลดใด ๆ ติดอยู่
การใช้พลังงานอินพุต:
ภาพด้านบนแสดงกำลังอินพุตที่ ic ใช้เมื่อต่อโหลด 40W
การใช้พลังงานเอาท์พุท:
ภาพด้านบนแสดงกำลังขับที่ใช้โดยวงจรนี้ (โหลดคือหลอดไส้ 40W)
ด้วยเหตุนี้เราจึงสรุปส่วนการทดสอบของวงจร คุณสามารถดูวิดีโอด้านล่างสำหรับการสาธิต ฉันหวังว่าคุณจะชอบบทความนี้และได้เรียนรู้เกี่ยวกับ SPWM และเทคนิคการใช้งานเล็กน้อย อ่านต่อไปเรียนรู้สร้างต่อไปและฉันจะพบคุณในโครงการต่อไป