본문 바로가기

AVR 8BIT/Motor

HS-311 (서보모터 제어하기)


안녕하세요 숭덕이 박제현입니다. 오늘은 서보모터에 대해 공부할겁니다.

음 제가 이번에 암제어 로봇을 만들고 싶어 서보모터에 대해 자료조사를 하다 좋은 자료인거 같아 몇가지

자료를 올립니다. 암로봇이라 해서 특정지역이나 사람이 오갈 수 없을 때 유용하게 사용되거나 의료시술, 공장

특정제어 등 많은 곳에 쓰이고 많은곳에 현재에도 많이 쓰이는것으로 알고 있습니다.

저는 이 작품을 포맥스로 이용해 통신으로 제어를 해보겠습니다 일단 모터에 대해서만 서술하는 내용이니

HS-311에 대해서만 말씀드리겠습니다.

출처 : http://www.google.co.kr/imgres?imgurl=http://www.yeogie.com/wwwfiles/img.board/000000000459/E23DE056-652A-42F1-A6AD-DCC7D9CCE6A5.jpg&imgrefurl=http://news.yeogie.com/news/business/detail.htm%3Fcontentno%3D13932%26MENUCODE%3D000000000139%26CurrentPage%3D16%26PageSize%3D10%26blockN%3D0&h=321&w=400&sz=24&tbnid=g0_QKd1xDzuALM:&tbnh=93&tbnw=116&prev=/search%3Fq%3D%25EC%2595%2594%25EB%25A1%259C%25EB%25B4%2587%26tbm%3Disch%26tbo%3Du&zoom=1&q=%EC%95%94%EB%A1%9C%EB%B4%87&hl=ko&usg=__c_dSsAXFT57iLjTwScYVcprqJds=&sa=X&ei=T5YZTsm7EsPfmAXDy8z_Dw&ved=0CFwQ9QEwBg



HS-311은 5V에서 동작하며 OPERATING SPEED는 0.19sec 입니다 스톨토크는 3.0kg.cm 입니다.

머 자세한 내용은 데이터시트를 첨부하겠습니다..............


 서보모터 데이터시트 (HS-311)
 



음 회로도 그리기 정말 싫으네 ㅋㅋㅋㅋ

엔지니어라면 회로도를 제일 먼저 그리는게 맞지만 왜 이렇게 회로도 그리는게 싫은건지 금방 그리고 오겠습니다.

대충 그린 회로도 입니다. 이해해주세요 ^^









자 서보모터는 180˚ 회전이 가능합니다. 600usec에는 -90 이며 1500usec에서는 0 2400usec에서는 90 을 나타내고 있습니다 그럼 어떻게 저렇게 모터를 움직이느냐에 대해서 일단 딜레이로만 가지고 모터에 각도를 조절해보도록 하겠습니다
그 다음에는 PWM으로 제어를 해보도록 하겠습니다.

일단 딜레이로 PWM같은 파형을 발생시킬 수 있겠지요 정확하지는 않겠지만 그래도 얼추 맞다고 보시면 됩니다.
컴파일로는 코드비젼을 사용했으며 CPU는 ATMEGA128으로 제어하였습니다.
자 제가 코드는 조금 약해서 그래도 이해하면서 봐주시기 바랍니다. 이 아래 표에 있는 것은 딜레이문으로
서보모터를 제어했습니다. 동영상과 같이 올리니 참고 하세요



#include  
#include  


void main(void){

    unsigned int i=0;
    DDRB=0x60;  //PB5,6 입니다.


    while(1){         
      
      for(i=0; i<100; i++) //해당 각도에서 유지하는 시간 
      {
          PORTB=0x20; //포트 B의 5번핀에 High 출력
          delay_us(600);  //600us 동안  
          PORTB=0x00; //포트 B의 5번핀에 Low 출력
          delay_ms(23); // 23ms 동안
      }                                                      
     for(i=0; i<100; i++)
      {
       PORTB=0x20, delay_us(1050)  , PORTB=0x00, delay_ms(23);
      }           
      for(i=0; i<100; i++)
      {
       PORTB=0x20, delay_us(1500)  , PORTB=0x00, delay_ms(23);
      }
      for(i=0; i<100; i++)
      {
       PORTB=0x20, delay_us(1950)  , PORTB=0x00, delay_ms(23);
      }
      for(i=0; i<100; i++)
      {
       PORTB=0x20, delay_us(2400)  , PORTB=0x00, delay_ms(23);
      }
      
  
    }
}
   

 


자 여기까지 잘 오셨으면 이제 PWM으로 한번 제어해보겠습니다 시간이 벌써 이렇게 되었으니 일단 밥 먹고 와서 시작하겠습니다. 아훙~~~~~~~~

밥을 맛있게 먹고 왔네요 ^^

자 이제 딜레이로 제어가 아닌 PWM으로 한번 제어를 해볼가요??

딜레이는 조금 정확한 제어가 안됩니다. 따라서 PWM은 정확한 제어가 되기때문에 타이머/카운터만 정확하게 배우셔도

취업이나 AVR을 거의 다 배우셨다고 해도 과언이 아닐겁니다.

자 이제 PWM을 안다는 가정하에 소스와 오실로스코프에 나온 주파수 주기 등을 올려드리겠습니다.

자 PWM을 B포트에 PWM포트가 있습니다 그 중에 PORTB.5로 제어를 했습니다.


 이 소스는 AVR 전자공작의 키트님이 작성하신 소스 입니다.


#include  //16MHz
#include  
void RC_Motor(int angle){ // angle : -90도 ~ +90도
    int i;
    if(angle<-90)angle=-90;
    if(angle> 90)angle= 90;
    i=(angle+ 90)*20 +1500;
    OCR1A=i; //PB5
}
void main(void){
    DDRB=0x60;   // PB5
    TCCR1A=0xAA; // FAST PWM
    TCCR1B=0x1A; // 8분주=0.5usec
    ICR1=19999;  // 0.5usec*20000= 100Hz  

    while(1){
        RC_Motor(-90), delay_ms(500);  
        RC_Motor(-45), delay_ms(500);
        RC_Motor(  0), delay_ms(500);
        RC_Motor(45), delay_ms(500);
        RC_Motor( 90), delay_ms(500); 
      
    
    }
}



 



이상 끝.....................

 

조금만 힘을 내자!!!!!!!!!! 여름이라 기운이 없는거 뿐이야........ 열심히 2년 아니 3년만 해보자 아니야 3년도 작아 10년만???? 너무 길어 5년만 해보고 아 그럼 결혼인데 흠 3년만 해보자 그 다음에 머 할지 생각해보자!!!!

박제현 아자아자!!!화이팅이다........