뉴티씨



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


 
모터 스피드 제어하기
 글쓴이 : 관리자
작성일 : 19-05-02 09:52
조회 : 70  
   ex_dcmotor_pwm.zip (40.3K) [5] DATE : 2019-05-02 09:52:35
안녕하세요 고객님,
저희 뉴티씨 제품을 이용하여 주셔서 감사합니다.

우선 요청하신 소스를 첨부해드립니다.

이 소스는 타이머를 이용하여 직접 포트핀을 제어하며 사각파를 구현하고,
듀티비를 조정하여 결론적으로 PWM으로 제어하는 소스입니다.

잘 사용하시기 바라며, 소스 관련하여 답변드리겠습니다.

Q : > input = (SW_PORT&0x20)>>2; // 이부분이 무슨뜻인지 도통 알수 없네요...0x20 이면 PORTG PORT5 맞죠? 2보다 크다는 >>2 이게 왜 들어가야 되나요?

A : 풀어서 해석해 드리자면, '&'는 논리연산 AND의 기호이며, 0x20(0b00100000)을 AND연산 합니다.
즉, SW_PORT의 5번핀의 데이터만 사용하겠다는 뜻이고, 다음으로 >>2 는 오른쪽으로
두번 쉬프트하겠다는 뜻으로 0x20(0b00100000)을 0x08(0b00001000)으로 만드는 역할을 합니다.

쉬프트 연산자 '>>'와, 비교연산자 '>' 를 헷갈리지 않으셨으면 좋겠습니다.

Q : > if(input == 0x01){        // PORTG의 첫번째 스위치 인가요?
A : 이 조건문은 위쪽의 연산결과를 사용하는 것으로, 값이 1일 때 만족하는 조건문입니다.


Q : > temp++; //DIR2_CW; 탬프 증가가 어떻게 DIR CW가 되는지요?
A : 어떤 소스를 사용하셨는지는 모르겠지만, 주석을 지우셔야 할 것 같습니다.

감사합니다.

>
>
> 안녕하세요.
> 스위치 입력하여 정역 모터 제어하는 프로그램을 겨우 완성했읍니다.
> 그동안 도움이 많이 됐읍니다. 아래 소스입니다.
> 스위치 키이 확인하고 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;

>
> }
>