뉴티씨



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


 
스테핑모터 구동 관련 문의드립니다.
 글쓴이 : 조현상
작성일 : 20-11-06 17:33
조회 : 265  
안녕하세요. 스테핑 모터를 구동하는데에 문제점이 많아서 염치없이 질문 드립니다.

avr mega 128 개발보드(AB-M128Pro-A), 스테핑 모터 클럭 구동모듈(AM-MS2(3A용)), 스테핑 모터(1.7kg,SE-SM243)을 이용합니다.
랩뷰로 타이밍에 맞춰서 360도의 이동각, 스텝각, 속도 등을 설정해 누적해가면서 일정 횟수 구동하고 싶습니다.


질문1) 스테핑 모터 단일로 구동 시, [SE-SM243(4.1V 1.95A)과 SE-SM9K(2.3V,0.75A) 두 개의 모터]와 [12V 0.5A, 12V 3A 의 어댑터 두 개]를 가지고 조합해보았는데 유일하게 SE-SM243과 12V 0.5A어댑터의 경우에만 모터에서 진동과 함께 삐-삐-삐-하며 일정한 주기로 LED가 깜빡입니다. (나머지 조합에서는 LED는 켜져있고 모터에서 삐- 소리만 납니다. 토크 조정 시에도 약간의 소리만 바뀔뿐 진동조차 생기지 않습니다.)
12V 1A 또는 24V 1A이상의 어댑터를 구입해서 실험해본다면 결과가 달라질 수 있을지 궁금합니다.


질문2) 어떤 문제 때문에 삐- 소리만 나는 경우와 주기적인 진동과 함께 LED가 깜빡이는 차이점이 생기는지 궁금합니다.


질문 3) 코딩은 문외한이라 이전에 선배가 구현했던걸 그대로 쓰려고 하는데, 랩뷰를 통해 구동이 되지 않고, 보드의 전원을 켜기만 하면 자동으로 모터가 삑삑 소리를 내며 진동만 울립니다.(나머지 조합에서는 모터에서 삐- 소리만 납니다.) 왜 바로 모터가 동작하는 것인지 궁금합니다.

아래 코드에서 두 가지의 Warning이 발생하는데, count_buff가 위에서 선언됐지만 사용안됐고 tx_char도 마찬가지입니다. 제가 어떤 코드를 추가해 랩뷰를 통해 스테핑모터를 구동할 수 있을까요.
-------------------------------------------------------

#include <mega128.h>             
#include <stdio.h>
#include <delay.h>


 unsigned int count = 0;
 unsigned int count_buff = 0;
 unsigned long int rotate =  0; 
 unsigned char m_state;
 
 union data {
 unsigned char r_data_char[2];
 unsigned int r_data_int;
 };
 
 union data32 {
 unsigned char r_data_char[4];
 unsigned long int r_data_int;
 };       
 
 union data32 a;
 union data b;

//--------------------------------------------------------------------------------------------------------------------------                     
  unsigned char Rx_data(void)
{
    while(!(UCSR0A & 0x80));
    return UDR0;
}

void tx_char(unsigned char write_char_temp)
{
while(!(UCSR0A & 0x20));
UDR0 = write_char_temp;
}                                                         

 //--------------------------------------------------------------------------------------------------------------------------
 
void main(void)
{                                   
    unsigned char d_t;
    DDRD = 0xff;             
    DDRB = 0x07;           
   
    TCNT0 = 0x00;
    TCCR0 = 0x01;
    TIMSK = 0x01;   
   
    ASSR = 00;
   
    UCSR0A=0x00;
    UCSR0B=0x18;
    UCSR0C=0x06;
    UBRR0H=0x00;
    UBRR0L = 25;    // 16MHz ,baud 9600 : 103, baud 38400 : 25, baud 76800 : 12, baud 250000 : 3

    SREG = 0x80;                   
   
    PORTD.0 = 0b1;
    PORTD.1 = 0b0;
    PORTD.2 = 0b1;
    PORTD.3 = 0b0;
    PORTD.4 = 0b0;
    PORTD.5 = 0b0;
    PORTD.7 = 0b1;
   
    b.r_data_int = 0;
    rotate = 1;
    printf("\r\n Hello!");
   
while(1)
{     
        UDR0 = 0;    //버퍼 비우기     
       
        //모터 멈춤 결정
        m_state = Rx_data();
       
                  if(m_state == 0) //모터 멈춤 버튼이 눌리면
        {
          rotate = 0;  //회전수를 없엔다. 
        }
        else if(m_state ==1)  // 2번모드이면 이동한만큼 돌아간다.
        {
          PORTD.1 = PORTD.1 ^ 1;          //회전 방향 변경
          rotate = a.r_data_int - rotate;  //총 회전양에서 현재 회전양을 뺀다.
          b.r_data_int = 10;              //회전속도는 임의로 조정(되도록 빠르게)
        } 
        else            //모터 멈춤이 아니라면
        {
                        //회전양 받기      32비트짜리
                        a.r_data_char[3] = Rx_data(); 
                        a.r_data_char[2] = Rx_data();
                        a.r_data_char[1] = Rx_data(); 
                        a.r_data_char[0] = Rx_data();
                       
                        //회전 속도 받기  16비트짜리
                        b.r_data_char[1] = Rx_data();
                        b.r_data_char[0] = Rx_d ata();
                       
                        //회전 방향 받기
                        d_t = Rx_data();           
                       
                        if(rotate == 0)    //회전양만큼 다 이동했을때만 실행
                      {                                               
                        rotate = a.r_data_int; //회전양 대입     
                       
                          if(m_state == 3)
                          {
                              if(d_t == 1){PORTD.1 = 1;}
                              else{PORTD.1 = 0;}
                          }
                          else if(m_state == 4)//방향대입?
                          {
                            if(d_t == 1){PORTD.3 = 1;}
                            else{PORTD.3 = 0;}
                          } 
                      }   
                     
                }
        }
}


interrupt  [TIM0_OVF] void timer0(void)
{               
        if(count >= b.r_data_int) //회전속도를 결정
      { 
        if(rotate != 0)          //이동해야할 거리가 0이 아니면
        {
          if(m_state == 3)
          {PORTD.0 = PORTD.0 ^ 1;  } // 펄스 생성
          else if(m_state == 4)
          {PORTD.2 = PORTD.2 ^ 1;  } // 펄스 생성
          rotate--;                // 이동거리 줄이기 삭감
        }
        count = 0;                //카운터 초기화
      }
      else
      { count++;      }       
   
      TCNT0 = 220;
}