Arduino SPWM Generator Circuit - รายละเอียดรหัสและแผนภาพ

ลองใช้เครื่องมือของเราเพื่อกำจัดปัญหา





ในโพสต์นี้เราเรียนรู้วิธีการสร้างคลื่นไซน์ - ความกว้าง - มอดูเลตหรือ SPWM ผ่าน Arduino ซึ่งสามารถใช้สำหรับการสร้างวงจรอินเวอร์เตอร์คลื่นไซน์บริสุทธิ์หรืออุปกรณ์ที่คล้ายกัน

Arduino ฉันพัฒนาโค้ดและเป็นรหัส Arduino ตัวแรกของฉัน ... และมันก็ดูดีทีเดียว



SPWM คืออะไร

ผมได้อธิบายไปแล้ว วิธีสร้าง SPWM โดยใช้ opamps ในบทความก่อนหน้านี้ของฉันคุณสามารถอ่านเพื่อทำความเข้าใจว่าสามารถสร้างโดยใช้ส่วนประกอบที่ไม่ต่อเนื่องและเกี่ยวกับความสำคัญได้อย่างไร

โดยทั่วไปแล้ว SPWM ซึ่งย่อมาจากการมอดูเลตความกว้างของคลื่นไซน์คือการมอดูเลตแบบพัลส์ที่พัลส์ถูกมอดูเลตเพื่อจำลองรูปคลื่นไซน์เพื่อให้การมอดูเลตสามารถบรรลุคุณสมบัติของคลื่นไซน์บริสุทธิ์ได้



ในการใช้ SPWM พัลส์จะถูกมอดูเลตด้วยความกว้างเริ่มต้นที่แคบลงซึ่งจะค่อยๆกว้างขึ้นที่ศูนย์กลางของวงจรและสุดท้ายจะแคบลงในตอนท้ายเพื่อจบรอบ

เพื่อให้แม่นยำยิ่งขึ้นพัลส์จะเริ่มต้นด้วยความกว้างที่แคบที่สุดซึ่งจะค่อยๆกว้างขึ้นในแต่ละพัลส์ที่ตามมาและจะกว้างที่สุดที่พัลส์กลางหลังจากนี้ลำดับจะดำเนินต่อไป แต่ด้วยการมอดูเลตตรงกันข้ามนั่นคือพัลส์ตอนนี้จะค่อยๆแคบลง จนกว่ารอบจะเสร็จสิ้น

วิดีโอสาธิต

สิ่งนี้ถือเป็นหนึ่งรอบ SPWM และสิ่งนี้จะทำซ้ำตลอดในอัตราเฉพาะตามที่กำหนดโดยความถี่ของแอปพลิเคชัน (โดยปกติคือ 50Hz หรือ 60Hz) โดยทั่วไปแล้ว SPWM จะใช้สำหรับการขับเคลื่อนอุปกรณ์พลังงานเช่นมอสเฟตหรือ BJT ในอินเวอร์เตอร์หรือตัวแปลง

รูปแบบการมอดูเลตพิเศษนี้ช่วยให้มั่นใจได้ว่ารอบความถี่จะถูกดำเนินการด้วยค่าแรงดันไฟฟ้าเฉลี่ยที่ค่อยๆเปลี่ยนไป (หรือที่เรียกว่าค่า RMS) แทนที่จะขว้างแรงดันสูง / แรงดันต่ำอย่างกะทันหันตามปกติที่เห็นในรอบคลื่นสี่เหลี่ยมแบน

การปรับเปลี่ยน PWM แบบค่อยเป็นค่อยไปใน SPWM จะถูกบังคับใช้อย่างใกล้ชิดเพื่อให้จำลองรูปแบบการเพิ่มขึ้น / ลดลงแบบทวีคูณของคลื่นไซน์มาตรฐานหรือรูปคลื่นไซน์ดังนั้นจึงชื่อว่าไซน์เวฟ PWM หรือ SPWM

การสร้าง SPWM ด้วย Arduino

SPWM ที่อธิบายข้างต้นสามารถนำไปใช้งานได้อย่างง่ายดายโดยใช้ชิ้นส่วนแยกไม่กี่ชิ้นและยังใช้ Arduino ซึ่งอาจช่วยให้คุณได้รับความแม่นยำมากขึ้นด้วยช่วงเวลารูปคลื่น

รหัส Arduino ต่อไปนี้สามารถใช้สำหรับการติดตั้ง SPWM ที่ต้องการสำหรับแอปพลิเคชันที่กำหนด

เอ้ย !! มันดูใหญ่มากถ้าคุณรู้วิธีทำให้สั้นลงคุณอาจรู้สึกอิสระที่จะทำมันในตอนท้าย

// By Swagatam (my first Arduino Code)
void setup(){
pinMode(8, OUTPUT)
pinMode(9, OUTPUT)
}
void loop(){
digitalWrite(8, HIGH)
delayMicroseconds(500)
digitalWrite(8, LOW)
delayMicroseconds(500)
digitalWrite(8, HIGH)
delayMicroseconds(750)
digitalWrite(8, LOW)
delayMicroseconds(500)
digitalWrite(8, HIGH)
delayMicroseconds(1250)
digitalWrite(8, LOW)
delayMicroseconds(500)
digitalWrite(8, HIGH)
delayMicroseconds(2000)
digitalWrite(8, LOW)
delayMicroseconds(500)
digitalWrite(8, HIGH)
delayMicroseconds(1250)
digitalWrite(8, LOW)
delayMicroseconds(500)
digitalWrite(8, HIGH)
delayMicroseconds(750)
digitalWrite(8, LOW)
delayMicroseconds(500)
digitalWrite(8, HIGH)
delayMicroseconds(500)
digitalWrite(8, LOW)
//......
digitalWrite(9, HIGH)
delayMicroseconds(500)
digitalWrite(9, LOW)
delayMicroseconds(500)
digitalWrite(9, HIGH)
delayMicroseconds(750)
digitalWrite(9, LOW)
delayMicroseconds(500)
digitalWrite(9, HIGH)
delayMicroseconds(1250)
digitalWrite(9, LOW)
delayMicroseconds(500)
digitalWrite(9, HIGH)
delayMicroseconds(2000)
digitalWrite(9, LOW)
delayMicroseconds(500)
digitalWrite(9, HIGH)
delayMicroseconds(1250)
digitalWrite(9, LOW)
delayMicroseconds(500)
digitalWrite(9, HIGH)
delayMicroseconds(750)
digitalWrite(9, LOW)
delayMicroseconds(500)
digitalWrite(9, HIGH)
delayMicroseconds(500)
digitalWrite(9, LOW)
}
//-------------------------------------//

ในโพสต์ถัดไปฉันจะอธิบายวิธีใช้เครื่องกำเนิด SPWM ที่ใช้ Arduino ข้างต้นเพื่อ สร้างวงจรอินเวอร์เตอร์คลื่นไซน์บริสุทธิ์ .... อ่านต่อ!

โค้ด SPWM ข้างต้นได้รับการปรับปรุงเพิ่มเติมโดย Mr Atton เพื่อเพิ่มประสิทธิภาพดังที่ระบุด้านล่าง:

/*
This code was based on Swagatam SPWM code with changes made to remove errors. Use this code as you would use any other Swagatam’s works.
Atton Risk 2017
*/
const int sPWMArray[] = {500,500,750,500,1250,500,2000,500,1250,500,750,500,500} // This is the array with the SPWM values change them at will
const int sPWMArrayValues = 13 // You need this since C doesn’t give you the length of an Array
// The pins
const int sPWMpin1 = 10
const int sPWMpin2 = 9
// The pin switches
bool sPWMpin1Status = true
bool sPWMpin2Status = true
void setup()
{
pinMode(sPWMpin1, OUTPUT)
pinMode(sPWMpin2, OUTPUT)
}
void loop()
{
// Loop for pin 1
for(int i(0) i != sPWMArrayValues i++)
{
if(sPWMpin1Status)
{
digitalWrite(sPWMpin1, HIGH)
delayMicroseconds(sPWMArray[i])
sPWMpin1Status = false
}
else
{
digitalWrite(sPWMpin1, LOW)
delayMicroseconds(sPWMArray[i])
sPWMpin1Status = true
}
}
// Loop for pin 2
for(int i(0) i != sPWMArrayValues i++)
{
if(sPWMpin2Status)
{
digitalWrite(sPWMpin2, HIGH)
delayMicroseconds(sPWMArray[i])
sPWMpin2Status = false
}
else
{
digitalWrite(sPWMpin2, LOW)
delayMicroseconds(sPWMArray[i])
sPWMpin2Status = true
}
}
}




ก่อนหน้านี้: 8X Overunity จาก Joule Thief - การออกแบบที่พิสูจน์แล้ว ถัดไป: วงจรอินเวอร์เตอร์ Arduino Pure Sine Wave พร้อมรหัสโปรแกรมแบบเต็ม