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 >