ควบคุม Stepper Motor ด้วย ภาษาซี
Stepping Motor หรือ Stepper Motor เป็นมอเตอร์ที่มีลักษณะเมื่อเราป้อนไฟฟ้าให้กับมอเตอร์ทำให้หมุนเพียงเล็กน้อยตามเส้นรอบวงและหยุด ซึ่งต่าง จากมอเตอร์ ทั่วไปที่จะหมุนทันทีและตลอดเวลาเมื่อป้อนแรงดันไฟฟ้าข้อดีของสเต็ปมอเตอร์ สามารถกำหนด ตำแหน่งของการหมุนด้วยตัวเลข(องศาหรือระยะทาง) ได้อย่างละเอียดโดย ใช้คอมพิวเตอร์หรือ ไมโครคอนโทรลเลอร์เป็น เครื่องกำหนดและจัดเก็บตัวเลข
Stepping Motor หรือ Stepper Motor เป็นมอเตอร์ไฟฟ้าที่ขับเคลื่อนด้วยพัลส์ โดยโครงสร้างภายในนั้นจะประกอบไปด้วยขั้วแม่เหล็กบนสเตเตอร์ (Stator) ทำมาจากแผ่นเหล็กวงแหวน จะมีซี่ยื่นออกมาประกอบกันเป็นชั้นๆ โดยแต่ละซี่ที่ยื่นออกมานั้นจะมีขดลวด (คอยล์) พันอยู่ เมื่อมีกระแสผ่านคอยล์จะเกิดสนามแม่เหล็กไฟฟ้าขึ้น
ชื่อการพันขดลวดบนสเตเตอร์ของสเต็ปมอเตอร์ จะมีการพันมีด้วยกัน 2 วิธี คือ แบบ Bipolar (ไบโพล่าร์) กับ แบบ Unipolar(ยูนิโพล่าร์)
แบบ Bipolar (ไบโพล่าร์)
จะมีการพันขดลวดหนึ่งขด (จะกี่รอบก็แล้วแต่ สเป็กใช้งาน)ในแต่ขั้วแม่เหล็กของสเเตอร์ โดยขั้วแม่เหล็กที่เกิดขึ้น ที่สเตเตอร์จะถูกกำหนดโดยทิศทางของการไหลของกระแสไฟฟ้า ซึ่งสามารถทำให้เกิดขั้วแม่เหล็กในทิศทางตรงกันข้ามได้เพียง การกลับทิศทางของการไหลในกระแสไฟฟ้า โดยมาจากการควบคุมของวงจรสวิทชิ่งให้กลับขั้วไฟฟ้า
แบบ Unipolar(ยูนิโพล่าร์)
แบบนี้มี 2 ขด บนแต่ละขั้วแม่เหล็กของสเตเตอร์ ทำให้แต่ละขดลวดเกิดขั้วแม่เหล็กในทิศทางตรงกันข้าม เช่นกันครับการกลับทิศทางขั้วแม่เหล็กทำได้โดยใช้วงจรสวิทชื่งให้สลับหนึ่งไปยังอีกขั้วหนึ่งแทนกัน
โดยแบบยูนิโพล่าร์จะทำให้เกิดแรงบิดน้อยกว่าแบบไบโพล่าร์ แล้วก็จะต้องมีคำถามตามมาอีกว่าแล้วถ้าไปซื้อหรือหามาใช้งานจะรู้ได้จากตรงใหน ก็สังเกตูจาก สายไฟที่ต่อมาจากตัวสเต็ปมอเตอร์ซึ่งแบบไบโพลาร์จะมี 4 สาย ส่วนเป็นแบบยูนิโพล่าร์จะมี 5 สายหรือ 6 สาย
บทความนี้จะสอนใช้งาน ATmega328P ควบคุม Strpping Motor หรือ Stepper Motor ด้วยการเขียนโปรแกรมภาษาซี (C) มาตรฐาน โดยใช้ สเตปปิ้งมอเตอร์ 5 โวลต์ 4 เฟส แบบยูนิโพล่าร์ พร้อมบอร์ดไดรเวอร์ใช้ IC ULN2003
รายการอุปกรณ์
- 1. ชุดคิทต่อวงจร Minimum ATmega328P Circuit
- 2. Breadboard 700 Points SYB-120
- 3. Jumper (M2M) cable 10cm Male to Male
- 4. FT232RL FTDI USB To TTL Serial Converter Module
- 5. USB Male to Mini USB B 5pin Data Cable
- 6. 5 Line 4 Phase Stepper Motor + Driver Board ULN2003
- 7. Push Button Switch สวิตช์กดติดปล่อยดับ 2 ขา
- 8. Jumper (F2M) cable 20cm Female to Male
ขั้นตอนการทํางาน
1 : ทดสอบโปรแกรมแรก กับ ATmega328P
โปรแกรมแรกของ การใช้งานไมโครคอนโทรลเลอร์มักจะเป็น Blink ไฟกะพริบ ซึ่งเป็นหนึ่งในโปรแกรมที่ง่ายที่สุดเท่าที่จะเป็นไปได้ในการเขียนภาษาโปรแกรมต่างๆ เพราะฉะนั้นโดยธรรมเนียมปฏิบัติแล้ว มักจะใช้ในการตรวจสอบว่าเขียนภาษาโปรแกรมได้ถูกต้องหรือระบบมีการประมวลผลที่ถูกต้อง และมักถูกใช้เป็นตัวอย่างที่ง่ายที่สุดในการแสดงผลลัพธ์ของการเขียนโปรแกรม โดยทำตามขั้นตอนลิงค์ด้านล่าง
2: เชื่อมต่อ ATmega328P เข้ากับ Board ULN2003 และ สวิทช์
เชื่อมต่อ ATmega328P เข้ากับ Board ULN2003
PB0 <-> IN1
PB1 <-> IN2
PB2 <-> IN3
PB3 <-> IN4
GND <-> GND , SW
VCC <-> VCC
PD7 <-> SW
3: เขียนโค้ด ควบคุมมอเตอร์ Stepper Motor
แบบ Half Stepping
การควบคุมแบบ Half Stepping ทำได้ง่ายมาก เนื่องจากมอเตอร์ที่ทำจากขดลวดสี่ขดเราจึงใช้งานแต่ละขดลวดทีละตัว ตัวอย่างเช่นเราเปิดใช้งาน A1 Coil สำหรับมิลลิวินาทีที่กำหนดจากนั้นปิด A1 หลังจากนั้นเราทำสิ่งนี้กับขดลวด A2 ถัดไป วิธีนี้สามารถทำได้อย่างง่ายดายโดยใช้วงจรดิจิตอลซิงโครนัส
แผนภาพการใช้ Stepping Counter Clock Wise
แผนภาพการใช้ Stepping Clock Wise
ตัวอย่าง การเขียนโค้ดแบบ Half Stepping เป้าหมายคือ ถ้าสวิตช์ ถูก กด ให้มอเตอร์ หมุนตามเข็มนาฬิกา หรือ เดินหน้า , ถ้าปล่อยสวิตช์ ให้มอเตอร์ หมุนทวนเข็มนาฬิกา หรือ ถอยหลัง
#include <avr/io.h>
#define F_CPU 16000000UL
#include "util/delay.h"
#define stepTime 50
void stepBackward()
{
PORTB = 0x01;
_delay_ms(stepTime);
PORTB = 0x02;
_delay_ms(stepTime);
PORTB = 0x04;
_delay_ms(stepTime);
PORTB = 0x08;
_delay_ms(stepTime);
}
void stepForward()
{
PORTB = 0x08;
_delay_ms(stepTime);
PORTB = 0x04;
_delay_ms(stepTime);
PORTB = 0x02;
_delay_ms(stepTime);
PORTB = 0x01;
_delay_ms(stepTime);
}
int main(void)
{
DDRB = 0x0F; //PฺB0-PฺB3 ARE OUTPUT
PORTB = 0x00; //Clear PortB
DDRD = 0x7F
; //PD7 IS INPUT
PORTD = 0x80; //PULLUP PD7 HIGH
while (1)
{
if (PIND & 0x80) stepBackward();
else stepForward();
}
}
อธิบายโค้ด
ตารางเทียบการเขียนโค้ด เลื่อนบิตไปทางซ้าย | ใช้ระบบเลขฐานสอง | ใช้ระบบเลขฐานสิบหก
เลื่อนบิตไปทางซ้าย | ใช้ระบบเลขฐานสอง | ใช้ระบบเลขฐานสิบหก |
1 << 0 | 0B00000001 | 0x01 |
1 << 1 | 0B00000010 | 0x02 |
1 << 2 | 0B00000100 | 0x04 |
1 << 3 | 0B00001000 | 0x08 |
1 << 4 | 0B00010000 | 0x10 |
1 << 5 | 0B00100000 | 0x20 |
1 << 6 | 0B01000000 | 0x40 |
1 << 7 | 0B10000000 | 0x80 |
ดูรายละเอียดเพิ่มเติม : ASCII Character Table
แบบ Full Stepping
การควบคุมแบบ Full Stepping ทำให้มอเตอร์เพิ่มแรงบิดเอาต์พุตสูงสุด สำหรับขั้นตอนนี้เราต้องเปิดใช้งานขดลวดสองตัวพร้อมกันเพื่อทำขั้นตอนเดียว
แผนภาพการใช้ Full Step Clock Wise Rotation
แผนภาพการใช้ Full Step Counter Clock Wise Rotation
ตัวอย่าง การเขียนโค้ดแบบ Full Stepping เป้าหมายคือ ถ้าสวิตช์ ถูก กด ให้มอเตอร์ หมุนตามเข็มนาฬิกา หรือ เดินหน้า , ถ้าปล่อยสวิตช์ ให้มอเตอร์ หมุนทวนเข็มนาฬิกา หรือ ถอยหลัง
#include <avr/io.h>
#define F_CPU 16000000UL
#include "util/delay.h"
#define stepTime 50
void stepForward()
{
PORTB = 0b1001;
_delay_ms(stepTime);
PORTB = 0x0011;
_delay_ms(stepTime);
PORTB = 0b0110;
_delay_ms(stepTime);
PORTB = 0b1100;
_delay_ms(stepTime);
}
void stepBackward()
{
PORTB = 0b1100;
_delay_ms(stepTime);
PORTB = 0b0110;
_delay_ms(stepTime);
PORTB = 0b0011;
_delay_ms(stepTime);
PORTB = 0b1001;
_delay_ms(stepTime);
}
int main(void)
{
DDRB= 0x0F; //PB0 - PB3 ARE OUTPUT
PORTB = 0x00; //Clear PortB
DDRD = 0x7F; //PD7 IS INPUT
PORTD = 0x80; //PULLUP PD7 HIGH
while (1)
{
if(PIND & 0x80) stepBackward();
else stepForward();
}
}
4: ทดสอบการทํางาน
ถ้าสวิตช์ถูก กดค้างไว้ สเตปปิ้งมอเตอร์ จะค่อยๆหมุนตามเข็มนาฬิกา แต่ถ้าหยุดกดสวิตช์ สเตปปิ้งมอเตอร์ จะค่อยๆหมุนทวนเข็มนาฬิกา
<<< C8: ควบคุม Servo Motor บทความก่อนหน้า | บทความต่อไป – >>>