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