การควบคุมมอเตอร์ (Motor Control) ด้ วย PIC16F877A มอเตอร์ที่นิยมนํามาใช้ควบคูก่ บั ไมโครคอนโทรลเลอร์ ในปั จจุบนั จะแบ่งออกเป็ น 3ประเภทคือ 1.สเต็ปเปอร์มอเตอร์ (Stepper motor) 2.เซอร์โวมอเตอร์ (Servo motor) 3.มอเตอร์ไฟฟ้ ากระแสตรง (DC motor) ในบทนี้จะกล่าวถึงการเขียนโปรแกรมควบคุมมอเตอร์ท้ งั 3 ประเภท 6.1 สเต็ปเปอร์ มอเตอร์ สเต็ปเปอร์มอเตอร์ เป็ นมอเตอร์ที่หมุนตามจํานวนองศาหรื อตามจํานวนรอบที่ตอ้ งการ ทั้งนี้ความ ละเอียดของการหมุนจะขึ้นอยูก่ บั จํานวนองศาต่อหนึ่งจังหวะการหมุน เนื่องจากการหมุนของมอเตอร์ชนิดนี้ มีการหมุนเป็ นจังหวะ จึงเรี ยกว่า สเต็ปเปอร์มอเตอร์ และที่นิยมใช้จะเป็ นชนิดที่เรี ยกว่า สเต็ปเปอร์มอเตอร์ แบบยูนิโพล่าร์ (uni-polar Stepper motor ) 6.1.1 สเต็ปเปอร์มอเตอร์แบบยูนิโพล่าร์ สเต็ปเปอร์มอเตอร์แบบยูนิโพล่าร์จะมีการพันขดลวด 2 ขดบนแต่ละขั้วแม่เหล็กของสเต เตอร์ แต่ละขดแบ่งเป็ น 2 เฟส ในมอเตอร์หนึ่งตัวจะมี 4 เฟส คือ เฟส 1,2,3 และเฟส 4 ในการต่อสายไฟ ของสเต็ปเปอร์มอเตอร์จะมีท้ งั แบบ 5 สายและแบบ 6 สาย ในแบบ 5 สายนั้นจะเป็ นการนําสายไฟเลี้ยงของ ขดลวดมาต่อรวมกันเป็ นสายเดียวไว้แล้ว
ไม่สามารถแสดงรูปทีมี่ การเชือมโยงได ่ ้ แฟ้ มนี้อาจได ้รับการย ้าย เปลียนชื ่ อหรือลบ ่ ตรวจ สอบว่าการเชือมโยงชี ่ ไปที ้ แฟ้ ่ มและตําแหน่งทีตั่ ้งทีถู่ กตอง ้
รู ป6.1แสดงภาพถ่ายโครงสร้างสเต็ปมอเตอร์
รู ปที่6.2 แสดงภาพถ่ายของสเต็ปเปอร์มอเตอร์ 6.1.2 การทํางานของสเต็ปเปอร์มอเตอร์ การทํางานของสเต็ปเปอร์มอเตอร์จะทํางานได้โดยการกระตุน้ ขดลวดในแต่ละขดลวดบน สเตเตอร์เพื่อให้มอเตอร์หมุนและในการกระตุน้ ขดลวดนี้ตอ้ งป้ อนกระแสไฟแบบต่อเนื่อง (Sequacious) ใน รู ปแบบที่ถูกต้อง จึงจะสามารถขับสเต็ปเปอร์มอเตอร์ให้หมุนได้ตามต้องการ สําหรับการกระตุน้ การหมุน ของสเต็ปเปอร์มอเตอร์ แบ่งออกได้เป็ น 3 รู ปแบบคือ 1. ฟูลสเต็ปแบบ 1เฟส (full step 1 phase) 2.ฟูลสเต็ปแบบ 2เฟส(full step 2 phase) 3.ฮาล์ฟสเต็ป(half step) 6.1.3 การขับสเต็ปเปอร์มอเตอร์ฟลู สเต็ปแบบ 1เฟส การขับสเต็ปเปอร์มอเตอร์ฟลู สเต็ปแบบ 1เฟส เป็ นการขับสเต็ปมอเตอร์แบบที่ง่ายที่สุด โดยการป้ อนกระแสไฟกระตุน้ การทํางานของขดลวดทีละขด เรี ยงลําดับกันไป แบบนี้จะกินกระแสไฟน้อย ที่สุด และให้แรงบิตน้อยลักษณะการขับสเต็ปเปอร์มอเตอร์แบบ 1เฟส แสดงดังตารางที่ 6.1
ตารางที่ 6.1 การทํางานของขดลวดแบบฟูลสเต็ป 1 เฟส สเต็ปที่ 1
เฟสที่ 1
1 ON 2 3 4 หมายเหตุ เครื่ องหมาย “-” แสดงสภาวะ OFF
เฟสที่ 2
เฟสที่ 3
เฟสที่ 4
ON -
ON -
ON
6.1.4 การเขียนโค้ดควบคุมการทํางานแบบฟูลสเต็ป 1 เฟส หมุนในทิศทางตามเข็มนาฬิกา /**Forward Step*/ void fw_step(int16 step,int dl) { int n = 0; while(step--){ STEP_M_OUTPUT(fs1p[n]); if(n++ == 3) n = 0; } } หมุนในทิศทางทวนเข็มนาฬิกา /**Reward Step*/ void rw_step(int16 step,int dl) { int n = 3; while(step--) { STEP_M_OUTPUT(fs1p[n];);
if(n-- == 0) n = 3; Delay_1ms(dl) } }
6.1.5 การขับสเต็ปมอเตอร์ฟลู สเต็ปแบบ 2 เฟส การขับสเต็ปมอเตอร์ฟลู สเต็ปแบบ 2 เฟส จะเป็ นการขับสเต็ปมอเตอร์ที่จ่ายกระแสไฟ ให้กบั ขดลวด 2 ขดพร้อมกัน จะกินกระแสไฟมากกว่าแบบ 1 เฟสแต่ให้แรงบิตที่มากขึ้น ลักษณะการขับ สเต็ปมอเตอร์แบบ 2 เฟส แสดงดังตารางที่ 6.2 ตารางที่ 6.2 การทํางานของขดลวดแบบฟูลสเต็ป 2เฟส 6.1.6 การเขียนโค้ดควบคุมการทํางานแบบฟูลสเต็ป 2 เฟส หมุนในทิศทางตามเข็มนาฬิกา /**Forward Step*/ void fw_step(int16 step,int dl) { int n = 0; while(step--){ STEP_M_OUTPUT(fs2p[n]); if(n++ == 3) n = 0; Delay_1ms(dl); } }
หมุนในทิศทางทวนเข็มนาฬิกา /**Reward Step*/ void rw_step(int16 step,int dl) { int n = 3; while(step--) { STEP_M_OUTPUT(fs2p[n];); if(n-- == 0) n = 3; Delay_1ms(dl) } } 6.1.7 การขับสเต็ปมอเตอร์แบบฮาล์ฟสเต็ป การขับสเต็ปมอเตอร์แบบฮาล์ฟสเต็ปหรื อครึ่ งจังหวะเป็ นการนํารู ปแบบการขับ สเต็ป มอเตอร์ 2 แบบมารวมกันทําให้จาํ นวนสเต็ปของมอเตอร์เพิ่มขึ้นมาอีกหนึ่งเท่าตัว ดังแสดงในตารางที่6.3 ตารางที่6.3 การทํางานของขดลวดแบบฮาล์ฟสเต็ป สเต็ปที่ 1
เฟสที่ 1
1 ON 2 ON 3 4 5 6 7 8 ON หมายเหตุ เครื่ องหมาย “-” แสดงสภาวะ OFF
เฟสที่ 2
เฟสที่ 3
เฟสที่ 4
ON ON ON -
ON ON ON -
ON ON ON
6.1.8 การเขียนโค้ดควบคุมการทํางานแบบฮาล์สเต็ป หมุนในทิศทางตามเข็มนาฬิกา /**Forward Step*/ void fw_step(int16 step,int dl) { int n = 0; while(step--){ STEP_M_OUTPUT(hs[n]); if(n++ == 8) n = 0; Delay_1ms(dl); } } หมุนในทิศทางทวนเข็มนาฬิกา /**Reward Step*/ void rw_step(int16 step,int dl) { int n = 8; while(step--) { STEP_M_OUTPUT(hs[n];); if(n-- == 0) n = 8; Delay_1ms(dl) } }
การควบคุมสเต็ปเปอร์ มอเตอร์
โค้ ดโปรแกรม /*************************************************************************** workfile
: LAB0602.c
* purpose : Stepper Motor Control (Full Step 1-Phase) * Copyright : appsofttech co.,ltd. * Author
: Prajin Palangsantikul
* Email
:
[email protected]
* Compiler : CCS C Compiler
* Target
: PIC16F877A
* Other Files : * ref
:
****************************************************************************** /***************************************************************** Includes */ #include <16f877A.h>
// header file for PIC16F877A
/********************************************** Sitting configuration fuses */ #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay (clock=20000000)
// configuration word
// Change OSC here (default 20 MHz)
#define STEP_M_OUTPUT(x) output_c(x) // int fslp[4] = {0x01,0x02,0x04,0x08};
// Data Full Step 1-Phase
/************************************************************** Prototypes */ void Delay_seconds (int i); void Delay_1ms (int16 i); void fw_step (int16 step,int dl); void fw_step (int16 step,int dl); /*********************************************************** Delay Seconds */ /** Delay Seconds */ void Delay_Seconds (int i) {
//
for (;i>0;i--) { delay_ms (1000); } } /*************************************************************** Delay ms */ /** Delay ms */ void Delay_1ms (int16 i)
//
{ if (i<50) i = 50;
// Minimun Step (default)
for (;i>0;i--) { Delay_ms(1); } } /********************************************************** Motor control */ /** Driver motor forware,backword */ /** Forword Step */ void fw_Step (int16 step,int dl) { int n = 0; while (step--) {
//
STEP_M_OUTPUT (fslp[n]); if (n++ == 3) n = 0; Delay_1ms (dl); } } /** Reward Step */ void rw_step (int16 step,int dl)
//
{ int n = 3; while (step--) { STEP_M_OUTPUT (fslp[n]); if (n-- == 0) n = 3; Delay_1ms (dl); } } /********************************************************** Main Function */ void main () {
set_tris_c (0x00);
// Port C all output
while (TRUE) { fw_step (10,50); Delay_seconds (2); rw_step (10,50); Delay_seconds (2);
// Clockwise // Delay 2s // Counter-Clockwise // Delay 2s
} } /************************ End of $Workfile: $ ******************************/
รายละเอียดโค้ดโปรแกรม 1. LAB0602(1) กําหนดขาพอร์ทสําหรับควบคุมการทํางานของสเต็ปเปอร์มอเตอร์ผา่ นไอซี ULN2003 2. LAB0602(2) ค่าคงที่สาํ หรับใช้ในการควบคุมขาพอร์ทให้หมุนแบบฟูลสเต็ปหนึ่งเฟส 3. LAB0602(3) ฟังก์ชนั Delay_Secones() ใช้ในการหน่วงเวลามีหน่วยเป็ นวินาที โดยอาศัยลูป For () และ ฟังก์ชนั Delay_ms(1000) การหน่วงเวลาจะขึ้นอยูก่ บั ค่าอาร์กิวเมนต์ที่ส่งให้กบั ฟังก์ชนั Delay_Seconds() 4. LAB0602(4) ฟังก์ชนั Delay_1ms ใช้ในการหน่วงเวลามีหน่วยเป็ นมิลลิวินาที โดยฟังก์ชนั นี้จะหน่วงเวลา ตํ่าสุ ด ที่50มิลลิวินาที หากส่ งค่าหน่วงเวลาให้กบั ฟังก์ชนั Delay_1ms() น้อยกว่า50มิลลิวินาที ฟังก์ชนั จะกําหนดค่าตํ่าสุ ดที่ 50 มิลลิวินาที เนื่องจากการหน่วงเวลาน้อยกว่า 50 มิลลิวินาที
สเต็ปเปอร์มอเตอร์อาจไม่หมุน ทั้งนี้ข้ ึนอยูก่ บั สเต็ปเปอร์มอเตอร์ที่เลือกใช้งานและการหน่วง เวลาเท่าไรด้วยจึงจะเหมาะสม 5. LAB0602(5) ฟังก์ชนั fw_step() ใช้ในการขับสเต็ปมอเตอร์ให้หมุนไปข้างหน้าหรื อตามเข็มนาฬิกา โดยการ ทํางานจะขึ้นอยูก่ บั จํานวนอาร์กิวเมนต์ที่ส่งให้กบั ฟังก์ชนั ในการขับแต่ละสเต็ป 6. LAB0602(6) ฟังก์ชนั bw_step() ใช้ในการขับสเต็ปมอเตอร์ให้หมุนย้อนกลับหรื อทวนเข็มนาฬิกา โดยการ ทํางานจะขึ้นอยูก่ บั จํานวนอาร์กิวเมนต์ที่ส่งให้กบั ฟังก์ชนั ในการขับแต่ละสเต็ป 7. LAB0602(7) เรี ยกใช้งานฟังก์ชนั fw_step() เพื่อขับสเต็ปมอเตอร์หมุนตามเข็มนาฬิกาไป 10 สเต็ป ด้วย ความเร็ วตํ่าสุ ด 50 มิลลิวินาที 8. LAB0602(8) หน่วงเวลาไป 2 วินาทีหรื อวนลูป 2 ครั้งในแต่ละครั้งจะหน่วง 1 วินาที(1000 มิลลิวินาที) 9. LAB0602(9) เรี ยกใช้งานฟังก์ชนั bw_step() เพื่อให้สเต็ปมอเตอร์หมุนทวนเข็มนาฬิกาไป 10 สเต็ป ด้วย ความเร็ วตํ่าสุ ด 50 มิลลิวินาที