ควบคุม Stepper Motor ด้วย ภาษาซี

Stepping Motor หรือ Stepper Motor เป็นมอเตอร์ที่มีลักษณะเมื่อเราป้อนไฟฟ้าให้กับมอเตอร์ทำให้หมุนเพียงเล็กน้อยตามเส้นรอบวงและหยุด ซึ่งต่าง จากมอเตอร์ ทั่วไปที่จะหมุนทันทีและตลอดเวลาเมื่อป้อนแรงดันไฟฟ้าข้อดีของสเต็ปมอเตอร์ สามารถกำหนด ตำแหน่งของการหมุนด้วยตัวเลข(องศาหรือระยะทาง) ได้อย่างละเอียดโดย ใช้คอมพิวเตอร์หรือ ไมโครคอนโทรลเลอร์เป็น เครื่องกำหนดและจัดเก็บตัวเลข

Stepping Motor หรือ Stepper Motor เป็นมอเตอร์ไฟฟ้าที่ขับเคลื่อนด้วยพัลส์ โดยโครงสร้างภายในนั้นจะประกอบไปด้วยขั้วแม่เหล็กบนสเตเตอร์ (Stator) ทำมาจากแผ่นเหล็กวงแหวน จะมีซี่ยื่นออกมาประกอบกันเป็นชั้นๆ โดยแต่ละซี่ที่ยื่นออกมานั้นจะมีขดลวด (คอยล์) พันอยู่ เมื่อมีกระแสผ่านคอยล์จะเกิดสนามแม่เหล็กไฟฟ้าขึ้น


Stepping Motor หรือ Stepper Motor


ชื่อการพันขดลวดบนสเตเตอร์ของสเต็ปมอเตอร์ จะมีการพันมีด้วยกัน 2 วิธี คือ แบบ Bipolar (ไบโพล่าร์) กับ แบบ Unipolar(ยูนิโพล่าร์)

แบบ Bipolar (ไบโพล่าร์) กับ แบบ Unipolar(ยูนิโพล่าร์)

แบบ Bipolar (ไบโพล่าร์)


จะมีการพันขดลวดหนึ่งขด (จะกี่รอบก็แล้วแต่ สเป็กใช้งาน)ในแต่ขั้วแม่เหล็กของสเเตอร์ โดยขั้วแม่เหล็กที่เกิดขึ้น ที่สเตเตอร์จะถูกกำหนดโดยทิศทางของการไหลของกระแสไฟฟ้า ซึ่งสามารถทำให้เกิดขั้วแม่เหล็กในทิศทางตรงกันข้ามได้เพียง การกลับทิศทางของการไหลในกระแสไฟฟ้า โดยมาจากการควบคุมของวงจรสวิทชิ่งให้กลับขั้วไฟฟ้า

แบบ Unipolar(ยูนิโพล่าร์)


แบบนี้มี 2 ขด บนแต่ละขั้วแม่เหล็กของสเตเตอร์ ทำให้แต่ละขดลวดเกิดขั้วแม่เหล็กในทิศทางตรงกันข้าม เช่นกันครับการกลับทิศทางขั้วแม่เหล็กทำได้โดยใช้วงจรสวิทชื่งให้สลับหนึ่งไปยังอีกขั้วหนึ่งแทนกัน

โดยแบบยูนิโพล่าร์จะทำให้เกิดแรงบิดน้อยกว่าแบบไบโพล่าร์ แล้วก็จะต้องมีคำถามตามมาอีกว่าแล้วถ้าไปซื้อหรือหามาใช้งานจะรู้ได้จากตรงใหน ก็สังเกตูจาก สายไฟที่ต่อมาจากตัวสเต็ปมอเตอร์ซึ่งแบบไบโพลาร์จะมี 4 สาย ส่วนเป็นแบบยูนิโพล่าร์จะมี 5 สายหรือ 6 สาย

บทความนี้จะสอนใช้งาน ATmega328P ควบคุม Strpping Motor หรือ Stepper Motor ด้วยการเขียนโปรแกรมภาษาซี (C) มาตรฐาน โดยใช้ สเตปปิ้งมอเตอร์ 5 โวลต์ 4 เฟส แบบยูนิโพล่าร์ พร้อมบอร์ดไดรเวอร์ใช้ IC ULN2003

สเตปปิ้งมอเตอร์ 5 โวลต์ 4 เฟส แบบยูนิโพล่าร์

รายการอุปกรณ์


ขั้นตอนการทํางาน

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

ควบคุม Stepper Motor ด้วย ภาษาซี



3: เขียนโค้ด ควบคุมมอเตอร์ Stepper Motor


แบบ Half Stepping


การควบคุมแบบ Half Stepping ทำได้ง่ายมาก เนื่องจากมอเตอร์ที่ทำจากขดลวดสี่ขดเราจึงใช้งานแต่ละขดลวดทีละตัว ตัวอย่างเช่นเราเปิดใช้งาน A1 Coil สำหรับมิลลิวินาทีที่กำหนดจากนั้นปิด A1 หลังจากนั้นเราทำสิ่งนี้กับขดลวด A2 ถัดไป วิธีนี้สามารถทำได้อย่างง่ายดายโดยใช้วงจรดิจิตอลซิงโครนัส

แผนภาพการใช้ Stepping Counter Clock Wise

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 << 00B000000010x01
1 << 10B000000100x02
1 << 20B000001000x04
1 << 30B000010000x08
1 << 40B000100000x10
1 << 50B001000000x20
1 << 60B010000000x40
1 << 70B100000000x80

ดูรายละเอียดเพิ่มเติม : 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 บทความก่อนหน้า | บทความต่อไป – >>>

Leave a Reply

Your email address will not be published. Required fields are marked *

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

Privacy Preferences

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

Allow All
Manage Consent Preferences
  • Always Active

Save