뉴티씨



  • HOME
  • 고객지원
  • 질문답변


 
모터 스피드 제어하기
 글쓴이 : 김상용
작성일 : 19-05-01 22:11
조회 : 67  
안녕하세요.
스위치 입력하여 정역 모터 제어하는 프로그램을 겨우 완성했읍니다.
그동안 도움이 많이 됐읍니다. 아래 소스입니다.
스위치 키이 확인하고 PWM ON DIR ON/OFF 하는 동작입니다.
다음은 키이 입력 후 PWM을 제어해서 스피드를 제어하고 싶습니다.
VR 입력에 PWM 제어하는 소스는 있는데 직접 PWM을 제어하고 싶읍니다.
그런 예제가 있는지요..
그리고 문의 드릴 아래 스피드 제어의 해석을 좀 부탁드려요...
DIR1 CW, CCW를 사용해야 되고요
void Speed_Control(void){
input = (SW_PORT&0x20)>>2; // 이부분이 무슨뜻인지 도통 알수 없네요...0x20 이면 PORTG PORT5 맞죠? 2보다 크다는 >>2 이게 왜 들어가야 되나요?
if(input == 0x01){        // PORTG의 첫번째 스위치 인가요?
temp++; //DIR2_CW; 탬프 증가가 어떻게 DIR CW가 되는지요?
}
  if(input == 0x02){
temp--; //DIR2_CCW;
}
}

========키이 입력하고 정역 모터 제어 ===============
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned char pind6, pind5, pind4;

//#define SW_PORT PING
//#define SW_PORT_DDR DDRG

#define MOTOR_PORT PORTC
#define PWM1_ON (MOTOR_PORT|=0x01)
#define PWM1_OFF (MOTOR_PORT&=0xFE)
#define DIR1_ON (MOTOR_PORT|=0x02)
#define DIR1_OFF (MOTOR_PORT&=0xFD)
#define ENABLE1_OFF (MOTOR_PORT|=0x04)
#define ENABLE1_ON (MOTOR_PORT&=0xFB)
#define BREAK1_ON (MOTOR_PORT|=0x08)
#define BREAK1_OFF (MOTOR_PORT&=0xF7)




void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0x00; //m103 output only
 DDRC  = 0xff;
 PORTD = 0xff;
 DDRD  = 0x00;
 PORTE = 0x00;
 DDRE  = 0x00;
 PORTF = 0x00;
 DDRF  = 0x00;
 PORTG = 0x00;
 DDRG  = 0x00;
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 cli(); //disable all interrupts
 XMCRA = 0x00; //external memory
 XMCRB = 0x00; //external memory
 port_init();

 MCUCR = 0x00;
 EICRA = 0x00; //extended ext ints
 EICRB = 0x00; //extended ext ints
 EIMSK = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 ETIMSK = 0x00; //extended timer interrupt sources
 sei(); //re-enable interrupts
 //all peripherals are now initialized
}

void delay(int delaytime){
int i,j;
for(i=0;i<1000;i++){
for(j=0;j<delaytime;j++){
}
}
}

int main(void)
{
 init_devices();


 
 while(1){

  pind5=PIND&0x20;
    pind4=PIND&0x10;



if(pind5 == 0)
  {
   
  PWM1_ON;
  DIR1_ON;
  delay(100);
  }

else if(pind4 == 0)
  {
   
  PWM1_ON;
  DIR1_OFF;
  delay(100);

      }
   
    else
{
  PWM1_OFF;
  }
   
    }
    return 0;
 

}