Stepping Motor - 3
조이스틱 스위치를 사용하여 상 하 죄 우 그리고 스위치를 눌렀을떄 다른 기능을 하도록 프로그램하였습니다.
조이스틱 스위치는 5개의 스위치가 있어 위치에 따라 다른 기능을 할 수 있도록 만든 스위치 입니다.
회로는 아래 사진과 같고 UNU MP20 보드의 아래쪽에 조이스틱 스위치를 연결하였고 PIC 의 포트 A, B에 연결하였습니다.
스텝모터 드라이브는 포트 C에 연결하였습니다. 그리고 UNU MP20보드의 왼쪽 위에 있는 UART 핀을 사용하여 LCD 와 연결하여
결과를 표시 할 수 있도록 하였습니다.(아래 프로그램 참고)
스텝모터 구동 회로 및 확대 사진
아래 동영상은 앞 페이지의 회로를 그대로 이용하고 조이스틱 스위치를 사용하여 스위치를 누름에 따라 스텝모터를 다르게 구동하는 모습을 보여주는 동영상입니다.
조이스틱 스위치(왼쪽아래)를
위로 올리면 스텝모터가 반시계 방향으로 천천히 돌며,
아래로 내리면 스텝모터가 시계 방향으로 천천히 돌며,
왼쪽으로 하면 스텝모터가 반시계 방향으로 빠르게 돌며,
오른쪽으로 하면 스텝모터가 시계 방향으로 빠르게 돌며,
누르면 두 바퀴 시계방얗 으로 반시계방향으로 회전합니다.
위 동영상에 관한 프로그램은 아래에 있습니다.
스텝모터 구동 회로 및 확대 사진
아래 동영상은 앞 페이지의 회로를 그대로 이용하고 조이스틱 스위치를 사용하여 스위치를 누름에 따라 스텝모터를 다르게 구동하는 모습을 보여주는 동영상입니다.
조이스틱 스위치(왼쪽아래)를
위로 올리면 스텝모터가 반시계 방향으로 천천히 돌며,
아래로 내리면 스텝모터가 시계 방향으로 천천히 돌며,
왼쪽으로 하면 스텝모터가 반시계 방향으로 빠르게 돌며,
오른쪽으로 하면 스텝모터가 시계 방향으로 빠르게 돌며,
누르면 두 바퀴 시계방얗 으로 반시계방향으로 회전합니다.
//* **************************************************************************** // // 190729 UNU MP20 - StepMotor // UNU MP20 (PIC16F687) - A4998 // // 2019/07/29 // // injayu // //* **************************************************************************** #include <16f687.h> #fuses HS,NOWDT,NOPROTECT,NOMCLR #use delay (clock=18432000) #use rs232 (baud=19200, xmit=PIN_B7, rcv=PIN_B5) #define LED_ON output_low (PIN_C2) #define LED_OFF output_high (PIN_C2) #define IN_SW input (PIN_A3) #define SW_ENT 0x01 #define SW_LFT 0x02 #define SW_RGT 0x04 #define SW_UP 0x08 #define SW_DN 0x10 #define IN_SW_UP input (PIN_B4) #define IN_SW_DN input (PIN_A2) #define IN_SW_LFT input (PIN_B6) #define IN_SW_RGT input (PIN_A1) #define IN_SW_ENT input (PIN_A0) #define SM_DIR_PIN PIN_C3 #define SM_CLK_PIN PIN_C1 #define SM_EN_PIN PIN_C0 #define SM_CCW output_low (SM_DIR_PIN) #define SM_CW output_high (SM_DIR_PIN) #define SM_CLK_L output_low (SM_CLK_PIN) #define SM_CLK_H output_high (SM_CLK_PIN) #define SM_ENABLE output_low (SM_EN_PIN) #define SM_DISABLE output_high (SM_EN_PIN) //* **************************************************************************** //* ***************************************************** Common Functions **** void blink_LED (BYTE no_blinking) { BYTE idx ; for (idx = 1;idx <= no_blinking;idx++) { LED_ON ; delay_ms (20) ; LED_OFF ; delay_ms (200) ; } } BYTE read_key (void) { BYTE key_value ; key_value = (IN_SW_LFT << 1) + (IN_SW_RGH << 2) + (IN_SW_UP << 3) + (IN_SW_DN << 4) + (IN_SW_ENT) ; key_value = (~key_value) & 0x1F ; return (key_value) ; } //* **************************************************************************** //* *************************************************** StepMotor Functions **** int16 dy_time = 300 ; void sm_rotate_one_step (void) { SM_CLK_H ; LED_ON ; delay_us (dy_time) ; LED_OFF ; SM_CLK_L ; delay_us (dy_time) ; } void standby (void) { BYTE valKey ; int16 idx_step ; valKey = read_key () ; switch (valKey) { case (SW_LFT) : dy_time = 300 ; SM_ENABLE ; SM_CCW ; printf ("$3,3,Key: Left (Fast);") ; printf ("$3,4,Rotate CCW Dir. ;") ; delay_ms (10) ; while (1) { sm_rotate_one_step () ; if (read_key () != SW_LFT) break ; } break ; case (SW_RGT) : dy_time = 300 ; SM_ENABLE ; SM_CW ; printf ("$3,3,Key: Right (Fast);") ; printf ("$3,4,Rotate CW Dir. ;") ; delay_ms (10) ; while (1) { sm_rotate_one_step () ; if (read_key () != SW_RGT) break ; } break ; case (SW_UP) : dy_time = 5000 ; SM_ENABLE ; SM_CCW ; printf ("$3,3,Key: Up (Slow);") ; printf ("$3,4,Rotate CCW Dir. ;") ; delay_ms (10) ; while (1) { sm_rotate_one_step () ; if (read_key () != SW_UP) break ; } break ; case (SW_DN) : dy_time = 5000 ; SM_ENABLE ; SM_CW ; printf ("$3,3,Key: Down (Slow);") ; printf ("$3,4,Rotate CW Dir. ;") ; delay_ms (10) ; while (1) { sm_rotate_one_step () ; if (read_key () != SW_DN) break ; } break ; case (SW_ENT) : dy_time = 1000 ; SM_ENABLE ; printf ("$3,3,Key: Push (Auto);") ; printf ("$3,4,Rotate CW Dir. ;") ; SM_CW ; delay_ms (10) ; for (idx_step = 0;idx_step < 1600;idx_step++) { sm_rotate_one_step () ; } delay_ms (1000) ; printf ("$3,4,Rotate CCW Dir. ;") ; SM_CCW ; delay_ms (10) ; for (idx_step = 0;idx_step < 1600;idx_step++) { sm_rotate_one_step () ; } break ; default : SM_DISABLE ; printf ("$3,3,Key: No ;") ; printf ("$#CLR_L4;") ; } delay_ms (100) ; } //* **************************************************************************** //* *********************************************** Initialization Fuctions **** void init_system (void) { //* 7 6 5 4 3 2 1 0 //* x x OSC2 OSC1 MCLR(SW) - - - set_tris_a (0xfF) ; //* - - 1 1 1 1 1 1 //* Tx - Rx - x x x x set_tris_b (0xFF) ; //* 1 1 1 1 1 1 1 1 //* - - - - - LED - - set_tris_c (0xFB) ; //* 1 1 1 1 1 0 1 1 SM_CLK_L ; SM_DISABLE ; } //* **************************************************************************** //* ********************************************************* Main Fuctions **** void main (void) { init_system () ; blink_LED (4) ; printf ("$#CLR_LCD;") ; delay_ms (10) ; printf ("$#BL_ON;") ; printf ("$1,1,** StepMotor Test **;") ; while (1) { standby () ; } } // *****************************************************************************
< Prev |
TOP
|
Next > |