
//[구동선택]{****
//[ ]맷돌가상구동
//[v]맷돌직접연결
//}************

//[설명]{-------------------------------------------------------------------
//
//맷돌(G.MTDL.X)에 내장된 <PWM:서보제어기> 동작 실험.
//
//맷돌(G.MTDL.X)에는 총 12개의 RC서보를 [동시/독립] 적으로 제어할수 있는 [서보제어기] 가
//내장돼 있으며, 각 [PWM 장치] 를 [서보제어기] 로 설정하면 사용 준비 완료.
//
//실험에서는 [PWM 장치 0번:채널0](PWM00)을 사용하여 RC서보 한개를 제어.
//RC서보의 [동작완료] 는 전용 API 로 직접 완료검사 하는 방법 사용.
//[완료보고:이벤트] 를 사용하는 경우는 "RC서보제어(완료보고이벤트사용)" 예제 참고.
//
//더이상 서보가 움직일수 없는 범위까지 PWM 을 주면 서보가 과열로 파손될수 있음에 주의.
//
//2012.03.20.화
//기계닉스 첨단 대장장이 김갑철(金甲哲)
//}------------------------------------------------------------------------

//[방법]{---------------------------------------------------------------
//
//1) { 설계묶음->참고자료->회로도 } 대로 연결 후 예제로 만들어진 가상기계(GVMX) 설치.
//
//2) 맷돌(G.MTDL.X) 재기동 후 서보 동작 확인.
//}--------------------------------------------------------------------

//[영점 확인 방법]{--------------------------------------------------------------
//
//1) { 메뉴 : 설정 -> RC 서보모터 영점 조정기(맷돌 내장 제어기용) } 선택.
//
//2) 영점 조정용 가상기계가 맷돌에 설치되며 관련 제어상자가 나온다.
//
//3) 제어상자에서 RC 서보가 연결된 PWMxx 를 선택한 뒤 수평줄이동자를 이동하면 서보가 움직이는데
//   이때 [0도/90도/180도] 위치에 서보를 위치시켰을때 각각의 [듀티값] 이 해당 각도의 [영점].
//
//[영점] 을 정확하게 잡아야 서보를 정확하고 정밀하게 제어가능.
//}---------------------------------------------------------------------------


//[함수묶음] 에 등록된 API 를 사용하기 위한것.
#include "함수묶음.h"

//[내부정의]
//{
    #define  bool          unsigned char

    #define  true          1
    #define  false         0

    //PWM 동작종류 정의.
    #define  동작_PWM       1
    #define  동작_SERVO     2
    #define  동작_MELODY    3

    //PWM 장치번호 정의.
    #define  PWM0          0
    #define  PWM1          1
    #define  PWM2          2

    //채널번호 정의.
    #define  CH0           0
    #define  CH1           1
    #define  CH2           2
    #define  CH3           3

    //서보구동종류 정의.
    #define  무속           0 //속도 적용 없이 즉시 해당 PWM 출력.
    #define  등속           1
    #define  가감속          2
    #define  가속           3
    #define  감속           4

//}

//[VAR]
//{
    //[서보:생성자] 선언(생성자당 30 바이트 크기).
    unsigned char  서보[30];

//}

void main(void)
{
  //[VAR]
  //{
      unsigned char  각도수정값;

  //}

  //[PWM/서보 생성/설정:PWM00]
  //{
      //[!]{-------------------------------------
      //아날로그서보를 사용하는 것으로 하고 이에 맞게 설정.
      //}----------------------------------------

      //PWM 장치 0번을 <서보구동기> 로 설정.
      _Pwm_생성_(PWM0, 동작_SERVO);

      //일반적인 아날로그서보의 PWM 주기는 20ms.
      _Servo_주기_(PWM0, 20);

      //속도 [확대/축소]를 결정하는 <속도제어상수> 설정(기본값 5).
      //서보의 속도가 전체적으로 느린 경우는 이 값을 더 작은 값으로 설정.
      _Servo_속도제어상수_(5);

      //서보포트를 PWM0 의 CH0 에 하나 생성(PWM00 핀).
      _Servo_생성_(서보, PWM0, CH0);

      //각도원점(기본(0)/반대(1)) 은 기본으로 설정.
      _Servo_각도원점_(서보, 0);


      //[영점 설정]{---------------------------------
      //아날로그서보는 0도(500)/180도(2500) 가 기본값이고,
      //디지탈서보는 0도(900)/180도(2100) 가 기본값.
      _Servo_영점0_(서보, 500);
      _Servo_영점180_(서보, 2500);
      //자동계산(true)인 경우 설정값이 무의미하므로 0 할당.
      //자동계산-----------v
      _Servo_영점90_(서보, true, 0);
      //}------------------------------------------


      //서보 동작시 적용할 <가감속상수> 설정(기본값은 5).
      //보다 경쾌한 움직임을 위하여 가감속 구간을 작게 설정.
      _Servo_가감속상수_(서보, 10);

      //서보속도는 10(고속동작)으로 설정하고 즉시 반영.
      _Servo_속도_(서보, 10, true);

      //완료보고 위치는 100%(기본값)으로 설정하고 [완료보고:이벤트] 는 사용하지 않는다.
      _Servo_완료보고_(서보, 100, false);

      //전체완료보고는 사용하지 않는다.
      _Servo_전체완료보고_(false);


      //해당 채널 열기.
      _Pwm_채널_(PWM0, CH0, true);

      //해당 채널 핀 열기(핀으로 PWM 출력).
      _Pwm_핀_(PWM0, CH0, true);

  //}

  //[서보 동작]
  //{
      //[!]{-----------------------------------------------------
      //<각도수정값> 에서 <180 - 각도수정값> 사이를 계속 반복적으로 이동.
      //움직이는 범위를 크게 하고 싶다면 <각도수정값> 을 보다 작은 값으로 설정.
      각도수정값 = 30;
      //}--------------------------------------------------------

      //기본위치는 90도 부터 시작.
      _Servo_각도_(서보, 90, 감속, true);

      while(1)
      {
        //[각도수정값 위치로 이동]
        //{
            _Servo_각도_(서보, 각도수정값, 가감속, true);

            //동작이 완료될때까지 대기.
            while(!_Servo_완료확인_(서보));

        //}

        //[(180 - 각도수정값) 위치로 이동]
        //{
            _Servo_각도_(서보, 180 - 각도수정값, 가감속, true);

            //동작이 완료될때까지 대기.
            while(!_Servo_완료확인_(서보));

        //}

      }

  //}

}

