컨텐츠 바로가기


board


현재 위치

  1. 게시판
  2. 자료실

자료실

관리자가 운용하는 제품관련 자료실입니다.

QV24-Touch(공통) 예제-RC 서보모터 제어하기
제목 QV24-Touch(공통) 예제-RC 서보모터 제어하기
작성자 관리자 (ip:)
  • 작성일 2009-10-16 02:58:35
  • 추천 추천 하기
  • 조회수 418
  • 평점 0점
 

**기존 QV24A에서 작성된 code를 AT128A + QV24-Touch 구성에 맞게 porting 한 내용입니다.

RC Servo 모터를 콘트롤하는 예제입니다.

AT128A  + QV24-Touch3 소스코드 - Touch3-RC_Servo1(20091107A).zip
AT128A  + QV24-Touch2 소스코드 - QV24-RC_Servo1_20080719A.zip

setup은 그냥 J207 3핀 헤더핀 맨 마지막줄에 servo moter를 꼽는것으로 끝납니다. ^^;
(사진에 보이는 UART0 연결은 PC에서 하이퍼 터미널로 원격 조정을 하기 위한것 입니다)

SERVO_PLUGIN.jpg

RC servo는 1.0 ~ 2.0mS 폭의 positive pulse를 20mS 주기로 공급하면 pulse 폭에 대응하는 각도로 움직입니다.

움직이는 각도는 servo 모터에 따라 다르지만.

1.0mS 펄스를 20mS 마다 연속해서 공급 할 때 제일 왼쪽(서보 모터에 따라 0도 ~ 45도 각도)을 유지하고,
1.5mS 펄스를 20mS 마다 연속해서 공급할때 중앙(90도)를 유지하며,
2.0mS 펄스를 20mS 마다 연속해서 공급하면 제일 오른쪽(서보 모터에 따라 160도 ~ 180도 각도)을 유지하게 됩니다.
                             RC_Servo1_screen.PNG

아래 사진은 Cute Logger로 OC1C(PB7) 출력 port에서 servo 모터로 가는 PWM 신호를 측정한 모습입니다.
    SERVO_1_setup.jpg

1.0mS 보다 좁은 펄스나 2.0mS 보다 넓은 펄스를 인가하면 서보 모터 모델에 따라 조금 더 넓은 각도를 제어할 수 있지만 servo 모터 메이커에서 보장하지 않는 범위이기 때문에 파손등의 우려가 있을수도 있습니다.

서보모터를 제어하는 방법은 여러가지가 있겠지만 그중에서도 가장 정밀한 Timer1(16bits timer)을 Phase and Frequency corection mode로 제어하는 방법을 구현해 보았습니다.
P_n_F_PWM_Timing.PNG

16Mhz clock을 1/8 prescale 하여 Timer1의 구동 clock으로 사용하고 (0.5uS increment) output caputre OC1C를 사용하면, 1uS increment의 주기 20mS짜리 PWM 출력을 OC1C(QV24A J207 PIN15) 에서 쉽게 얻을수 있습니다.

Timer1의 max 값은 ICR1 register에 지정하며,(20,000을 setting하면 0.5uS X 20,000 X 2 = 20mS)
Pulse 의 폭은 OCR1의 값으로 지정할수 있습니다.(1,500을 setting 하면 0.5uS X 1,500 x 2 = 1.5mS)

아래는 keys_n_timers.c에 정의되어 있는 관련 registers setting입니다.
---------------------------------------------------------------------------------------------------------------------------------------------
void start_timer1(unsigned short time) // time in uS
{
  TCCR1A = 0b00001000;//  3<  TCCR1B = 0b00010010;//  4<  TCCR1C = 0b00100000;//  5<

  TCNT1  = 0x0;                          // for 16Mhz MCU clock.  65535/0.5uS = 32.7675mS maximum period
                                                     // if Phase and Frequency correct PWM mode is used the maximum period
                                                     // would become doubled of 65.535 mS
  ICR1=time;                              // if time=20,000, total period become 20mS in Phase and Frequency correct PWM mode.
  OCR1C=1500;                       // default pulse width = 1500mS
}
---------------------------------------------------------------------------------------------------------------------------------------------


servo 각도 조정은 SW201, 202, 203, 204및 38400BPS 하이퍼 터미널로 할 수 있습니다.
스위치로는,
SW201 : 한번 누를때마다 OCR1C(Pulse width)의 값을 250uS 씩 감소 시킨다.
SW202 : 한번 누를때마다 OCR1C(Pulse width)의 값을 50uS 씩 감소 시킨다.
SW203 : 한번 누를때마다 OCR1C(Pulse width)의 값을 50uS 씩 증가 시킨다.
SW204 : 한번 누를때만다 OCR1C(Pulse width)의 값을 250uS 씩  증가 시킨다.

하이퍼 터미널에서는 38400BPS로 속도를 맞추고,
SERVO(1500)      : pulse width를 1500uS로 setting.
SERVO(1000)      : pulse width를 1000uS로 setting.
SERVO(2000)      : pulse width를 2000uS로 setting.
*** 1000 미만, 2000초과 를 입력하면 자동으로 각각 1000uS, 2000uS로 setting 합니다.

아래는 동작 동영상 입니다.
먼저 SW201 ~ 204를 이용해서 서보모터를 조정하고, 후반부에는 하이퍼 터미널을 이용하여 원격으로 조정하는 모습입니다.
*원격조정은 Pulse width 1500mS -> 1000mS -> 2000mS -> 1500mS 의 순서로 진행하였습니다.
 

첨부파일
비밀번호 삭제하려면 비밀번호를 입력하세요.

목록

삭제 수정 답변

댓글 수정

비밀번호

수정 취소

/ byte

댓글 입력

이름 비밀번호 관리자답변보기

확인

/ byte


* 왼쪽의 문자를 공백없이 입력하세요.(대소문자구분)

회원에게만 댓글 작성 권한이 있습니다.