뉴티씨



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


 
스테핑모터 구동 관련 문의드립니다.
 글쓴이 : 관리자
작성일 : 20-11-07 15:02
조회 : 258  
안녕하세요? 고객님,
저희 뉴티씨 제품을 이용하여 주셔서 감사합니다.

여기서 가장 큰 문제는 모터가 삑삑 거리는 것이네요.^^

가지고 계시는 스테핑모터는 기본적으로 무부하로 동작시켜도 400mA 정도 사용합니다.
따라서, 500mA 어뎁터로는 전류가 부족할 수 있습니다. 보통, 자신이 쓰는 전류의 2배 정도는 되는 것으로 사용하는 것이 좋습니다.

사용하시는 모터를 돌리시려면, 24V 3A정도 즉, 75Watt 정도의 SMPS를 사용하시는 것이 BEST입니다.
모터 하나 당 저의 추천은 24V 100W입니다.

하지만, 부하가 적거나 하는 경우는 일반 아답타만으로도 가능합니다. 무부하시, 학생으로서 돌리는 정도라면, 돌리기만 하면 되는 거라면 12V 1A 정도도 무난하게 잘 돌아갑니다.

모터가 돌려고해도 전류가 부족하면 돌지 않습니다. 돌지는 않는데, 전기적으로는 돌리기 때문에, 모터에서 삐 하는 소리가 나게 됩니다.  밥을 먹지 않으면 배고 고프고, 배가 고프면 일을시켜도 잘 하기 싫어지는 것과 비슷합니다.  모터도 사용할 전류와 전압을 적절히 공급해주지 않으면, 제대로 된 일을 하지 못하게 됩니다.

아래 링크도 읽어보세요. 참조가 될겁니다.
http://www.newtc.co.kr/dpshop/bbs/board.php?bo_table=m53&wr_id=24

다만, 저희가 코드를 짜드리거나, 고객님의 코드를 분석해서 알려드리는 것은 범위를 벗어난 일이라, 죄송하지만, 직접 하셔야 합니다.

감사합니다.


>
>
> 안녕하세요. 스테핑 모터를 구동하는데에 문제점이 많아서 염치없이 질문 드립니다.
>
> 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;
> }
>