دائرة مولد Arduino SPWM - تفاصيل الكود والرسم البياني

جرب أداة القضاء على المشاكل





في هذا المنشور ، نتعلم كيفية إنشاء تعديل عرض نبض موجة جيبية أو SPWM من خلال Arduino ، والذي يمكن استخدامه لصنع دائرة عاكس موجة جيبية نقية أو أدوات مماثلة.

ال اردوينو تم تطوير الكود بواسطتي ، وهو أول كود اردوينو لي ، ... ويبدو جيدًا



ما هو SPWM

لقد شرحت بالفعل كيفية إنشاء SPWM باستخدام opamps في إحدى مقالاتي السابقة ، يمكنك الاطلاع عليها لفهم كيفية إنشائها باستخدام مكونات منفصلة وفيما يتعلق بأهميتها.

في الأساس ، SPWM الذي يرمز إلى تعديل عرض النبضة الجيبية ، هو نوع من تعديل النبض حيث يتم تعديل النبضات لمحاكاة شكل موجة جيبية ، بحيث يكون التعديل قادرًا على تحقيق خصائص موجة جيبية نقية.



لتنفيذ SPWM ، يتم تعديل النبضات بعروض أولية أضيق والتي تتسع تدريجياً في مركز الدورة ، وتنتهي في النهاية لتصبح أضيق في النهاية لإنهاء الدورة.

لكي نكون أكثر دقة ، تبدأ النبضات بأضيق العروض التي تتسع تدريجياً مع كل نبضة لاحقة ، وتزداد اتساعًا عند النبض المركزي ، وبعد ذلك يستمر التسلسل ولكن مع تعديل معاكس ، أي أن النبضات تبدأ الآن بالتضيق تدريجياً حتى تنتهي الدورة.

فيديو تجريبي

يشكل هذا دورة SPWM واحدة ، ويتكرر هذا بمعدل معين كما هو محدد بواسطة تردد التطبيق (عادةً 50 هرتز أو 60 هرتز). عادةً ما يتم استخدام SPWM لقيادة أجهزة الطاقة مثل mosfets أو BJTs في المحولات أو المحولات.

يضمن نمط التعديل الخاص هذا تنفيذ دورات التردد بمتوسط ​​قيمة الجهد المتغير تدريجيًا (وتسمى أيضًا قيمة RMS) ، بدلاً من إلقاء طفرات الجهد العالي / المنخفض المفاجئة كما هو معتاد في دورات الموجة المربعة المسطحة.

هذا التعديل التدريجي لـ PWMs في SPWM يتم فرضه عن قصد بحيث يكرر عن كثب نمط الارتفاع / الهبوط الأسي لأمواج جيبية أو شكل موجة جيبية ، ومن هنا جاء اسم sinewave 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 أعلاه من قبل السيد 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 Inverter Circuit مع كود البرنامج الكامل