Simple Test SVPWM 3 Phase Induction Motor by Arduino UNO

สำหรับการทดลองนี้เป็นการทดลองแบบง่ายๆ เพื่อขับมอเตอร์ 3 เฟสแบบอินดักชั่น SVPWM ด้วยตัวควบคุม Arduino UNO โดยการทดลองนี้จะเป็นการกำหนดค่า SVPWM จากนั้นใช้การเพิ่มและลดค่า T0, T1 และ T2 ในลักษณะเชิงเส้นเพื่อสังเกตพฤติกรรมและการทำงานของ SVPWM เบื้องต้น สำหรับการควบคุมมอเตอร์ด้วยวิธี SVPWM นั้น เราจะต้องคำนวณค่า T0, T1 และ T2 สำหรับควบคุมความเร็วและแรงบิดตามคุณลักษณะของตัวมอเตอร์ที่ซับซ้อนยิ่งขึ้น ซึ่งขอแนะนำให้ดูข้อมูลตามที่อ้างอิง [1][2] ข้างล่างนี้

รูปที่ 1 จะเป็นการทดลองวัดสัญญาณที่เกิดขึ้นจากการสร้างสัญญาณ SVPWM จากโปรแกรมทั้ง 3 ช่อง คือ ที่ขา D2, D4 และ D6 โดยสัญญาณที่เกิดขึ้นที่จะเป็นไปตามลำดับของการควบคุมในส่วนของเซกเตอร์ (Sector) และกลุ่มของเวกเตอร์ (Vector) ที่สัมพันธ์กันตามช่วงเวลานั้น

รูปที่ 2 เป็นบอร์ควบคุมการสร้างสัญญาณโดยในการทดลองนี้จะใช้เป็น Arduino UNO ซึ่งเป็นบอร์ดที่นิยมใช้งานทั่วไป ราคาไม่แพง และสามารถทดลองโครงงานนี้ได้ดี ซึ่งเราสามารถปรับลักษณะการทำงานได้ตามความเหมาะสม

รูปที่ 3 บอร์ด Smart Power Module : BM64364S ที่ใช้ในการทดลอง ซึ่งช่วยให้เราสะดวกในการทดลองและออกแบบวงจรได้ง่าย รวมทั้งการจัดการเรื่องสัญญาณต่างๆ ระหว่าง Smart Power Module และบอร์ดควบคุม Arduino UNO ก็ง่ายอีกด้วย
Datasheet for IPM Power IGBT BM64364S-VA

รูปที่ 4 มอเตอร์ที่ใช้ในการทดลอง ซึ่งใช้ขนาดใม่ใหญ่มากเพื่อให้สามารถทดลองได้ง่ายและสะดวกมากขึ้น
/*
Arduino Program code credit in the experiment
1.http://electrotech4u.blogspot.com/2011/07/implementation-of-space-vector.html
2.http://electrotech4u.blogspot.com/2013/12/code-for-space-vector-modulation.html
3.https://www.edaboard.com/threads/svpwm-crooked-3-phase-inverter-output-what-is-wrong-with-the-circuit-proteus.385614/
MCU : Arduino UNO
DC link : 250VDC
Motor type : 1HP 3 Phase induction 4 Pole
Smart Power Module : BM64364S
DC power supply for MCU : 15VDC
*/
int valADC = 0;
int D2 = 2, D3 = 3, D4 = 4, D5 = 5, D6 = 6, D7 = 7; // Arduino digital Pins
int T0 = 0; // (T0)
int T1 = 0; // (T1)
int T2 = 0; // (T2)
// int T0/7 = (T0/7 = Ts-(T1+T2))
int V0 = B10101000;
int V1 = B10100100;
int V2 = B10010100;
int V3 = B10011000;
int V4 = B01011000;
int V5 = B01101000;
int V6 = B01100100;
int V7 = B01010100;
void setup() {
Serial.begin(9600); // Arduino UNO
pinMode(D2, OUTPUT); // Hi U
pinMode(D3, OUTPUT); // Lo U
pinMode(D4, OUTPUT); // Hi V
pinMode(D5, OUTPUT); // Lo V
pinMode(D6, OUTPUT); // Hi W
pinMode(D7, OUTPUT); // Lo W
PORTD= B00000000;
delay(500);
}
void loop()
{
valADC = analogRead(A0);
valADC = (valADC/16);
if (valADC<20) {valADC = 12;}
T0 = valADC; // T0 Adj range 12uS-64uS
T1 = (valADC*2); // T1 Adj range 24uS-128uS
T2 = (valADC*3); // T0 Adj range 36uS-192uS
/*
Serial.println(T0);
Serial.println(T1);
Serial.println(T2);
delay(500);
*/
// sector_1---------------------------
// v0-v1-v2-v7-v2-v1-v0
// v0:
PORTD= V0;
delayMicroseconds(T0);
//v1:
PORTD= V1;
delayMicroseconds(T1);
//v2:
PORTD= V2;
delayMicroseconds(T2);
//v7:
PORTD= V7;
delayMicroseconds(T0);
//v2:
PORTD= V2;
delayMicroseconds(T2);
//v1:
PORTD= V1;
delayMicroseconds(T1);
//v0:
PORTD= V0;
delayMicroseconds(T0);
//sector_2---------------------------
//v0-v3-v2-v7-v2-v3-v0
//v0:
PORTD= V0;
delayMicroseconds(T0);
//v3:
PORTD= V3;
delayMicroseconds(T2);
//v2:
PORTD= V2;
delayMicroseconds(T1);
//v7:
PORTD= V7;
delayMicroseconds(T0);
//v2:
PORTD= V2;
delayMicroseconds(T1);
//v3:
PORTD= V3;
delayMicroseconds(T2);
//v0:
PORTD= V0;
delayMicroseconds(T0);
//sector_3---------------------------
//v0-v3-v4-v7-v4-v3-v0
//v0:
PORTD= V0;
delayMicroseconds(T0);
//v3:
PORTD= V3;
delayMicroseconds(T1);
//v4:
PORTD= V4;
delayMicroseconds(T2);
//v7:
PORTD= V7;
delayMicroseconds(T0);
//v4:
PORTD= V4;
delayMicroseconds(T2);
//v3:
PORTD= V3;
delayMicroseconds(T1);
//v0:
PORTD= V0;
delayMicroseconds(T0);
//sector_4---------------------------
//v0-v5-v4-v7-v4-v5-v0
//v0:
PORTD= V0;
delayMicroseconds(T0);
//v5:
PORTD= V5;
delayMicroseconds(T2);
//v4:
PORTD= V4;
delayMicroseconds(T1);
//v7:
PORTD= V7;
delayMicroseconds(T0);
//v4:
PORTD= V4;
delayMicroseconds(T1);
//v5:
PORTD= V5;
delayMicroseconds(T2);
//v0:
PORTD= V0;
delayMicroseconds(T0);
//sector_5---------------------------
//v0-v5-v6-v7-v6-v5-v0
//v0:
PORTD= V0;
delayMicroseconds(T0);
//v5:
PORTD= V5;
delayMicroseconds(T1);
//v6:
PORTD= V6;
delayMicroseconds(T2);
//v7:
PORTD= V7;
delayMicroseconds(T0);
//v6:
PORTD= V6;
delayMicroseconds(T2);
//v5:
PORTD= V5;
delayMicroseconds(T1);
//v0:
PORTD= V0;
delayMicroseconds(T0);
//sector_6---------------------------
//v0-v1-v6-v7-v6-v1-v0
//v0:
PORTD= V0;
delayMicroseconds(T0);
//v1:
PORTD= V1;
delayMicroseconds(T2);
//v6:
PORTD= V6;
delayMicroseconds(T1);
//v7:
PORTD= V7;
delayMicroseconds(T0);
//v6:
PORTD= V6;
delayMicroseconds(T1);
//v1:
PORTD= V1;
delayMicroseconds(T2);
//v0:
PORTD= V0;
delayMicroseconds(T0);
}


รูปที่ 5 แสดงการต่ออุปกรณ์ต่างๆ สำหรับการทดลอง ซึ่งการทดลองครั้งนี้ เป็นแนวความคิดเบื้องต้น เพื่อต้องการใช้โค้ดโปรแกรมที่ไม่ยาวมาก แต่พอทำให้เข้าใจการทำงานและสามารถปรับค่าตัวแปรต่างๆ สำหรับเปลี่ยนค่าพารามิเตอร์ในการควบคุมมอเตอร์ด้วยวิธีการนี้
ท้ายนี้แอดมินขอแนะนำข้อมูลอ้างอิงจากลิ้งข้างล่างนี้ เพื่อเป็นแนวทางในการศึกษาเพิ่มเติม ซึ่งจะช่วยให้เราเข้าใจค่าตัวแปรต่างๆ ที่จะใช้ในการปรับค่า และสามารถควบคุมการทำงานของตัวมอเตอร์ได้อย่างมีประสิทธิภาพสูงสุดครับ.
Reference