מעגל גנרטורים SPWM של Arduino - פרטי קוד ותרשים

נסה את הכלי שלנו לביטול בעיות





בפוסט זה אנו לומדים כיצד ליצור אפנון רוחב דופק של גל סינוס או SPWM באמצעות Arduino, אשר ניתן להשתמש בהם להכנת מעגל מהפך טהור של גל סינוס או גאדג'טים דומים.

ה ארדואינו קוד פותח על ידי, וזה קוד הארדואינו הראשון שלי, ... וזה נראה די טוב



מה זה SPWM

כבר הסברתי כיצד ליצור SPWM באמצעות באחד מהמאמרים הקודמים שלי, תוכל לעבור עליו כדי להבין כיצד ניתן ליצור אותו באמצעות רכיבים נפרדים ולגבי חשיבותו.

ביסודו של דבר, SPWM אשר מייצג אפנון רוחב דופק של גל סינוס, הוא סוג של אפנון דופק שבו הפולסים מווסתים לדמות צורת גל סינוסואידית, כך שהאפנון מסוגל להשיג מאפיינים של גל סינוס טהור.



כדי ליישם SPWM הפולסים מווסתים עם רוחבים צרים ראשוניים שמתרחבים בהדרגה במרכז המחזור, ולבסוף בסוף הם צרים יותר לסיום המחזור.

ליתר דיוק, הפולסים מתחילים ברוחבים הצרים ביותר אשר הולכים ומתרחבים בהדרגה עם כל הפולסים הבאים, ומתרחבים בדופק המרכזי, לאחר מכן, הרצף ממשיך אך עם אפנון הפוך, כלומר הפולסים מתחילים בהדרגה להיות צרים יותר. עד לסיום המחזור.

הדגמת וידאו

זה מהווה מחזור SPWM אחד, וזה חוזר על עצמו בקצב מסוים כפי שנקבע על ידי תדר היישום (בדרך כלל 50Hz או 60Hz). בדרך כלל, SPWM משמש להפעלת התקני כוח כגון מוספטים או BJT בממירים או ממירים.

דפוס אפנון מיוחד זה מבטיח כי מחזורי התדרים מבוצעים עם ערך מתח ממוצע משתנה בהדרגה (נקרא גם ערך RMS), במקום לזרוק קוצים פתאומיים של מתח גבוה / נמוך כפי שמקובל בדרך כלל במחזורי גל מרובעים שטוחים.

שינוי PWM's בהדרגה ב- SPWM נאכף בכוונה כך שהוא משכפל מקרוב את התבנית העולה / יורדת באופן אקספוננציאלי של גלי סינוס סטנדרטיים או צורת גל סינוסי, ומכאן השם sinewave PWM או SPWM.

יצירת SPWM עם Arduino

ניתן ליישם את SPWM שהוסבר לעיל באמצעות כמה חלקים נפרדים, וגם באמצעות 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 לעיל שופר עוד יותר על ידי מר אטון לשיפור ביצועיו, כמפורט להלן:

/*
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 from Joule Thief - עיצוב מוכח הבא: מעגל מהפך גל סינוס טהור Arduino עם קוד תוכנית מלא