KoreanEnglish ROBOONE Korea Official Site Homesitemapmailadmin
모임소개일정관리공지사항게시판자료실대회현황ROBO-ONE Japan
 
자료실 > 강좌자료
게시물 번호    23 - 1 작 성 일    2003-07-30  15:26:09
글 쓴 이    김낙현 Homepage     http://ee.korea.ac.kr/~vester

조회 : 5969 타이머 하나로 8개의 서보모터 돌리는 pseudo코드.. 수정하기 삭제하기   
아는분은 다 아시겠지만 혹시나 필요한 분이 있을까봐 올립니다.

일단 타이머의 동작이나 입/출력에 관한 내용은 어느정도 아는 사람을 위해 작성했습니다.

파형의 그림이 아귀가 맞지 않을때는 메모장에 복사하기/붙이기를

해서 보시면 제대로 된 그림을 볼 수 있습니다.

혹시 궁금하신점이나 더 자세한 내용이 필요하신분은 답글 말고

저에게 메일 주시기 바랍니다.

===================================================
//타이머 인터럽트 함수
void timer0(void)
{
if(flag)
{
port = 0x01<<motorIndex;
countValue = dat[motorIndex];
flag = 0;
}
else
{
port = 0;
countVlaue = 2500 - dat[motorIndex];
motorIndex++;
motorIndex %= 8;
flag = 1
}
}


//타이머 인터럽트 함수(속도관련 부분 넣은것)
void timer0(void)
{
if(targetDat[motor0] > dat[motor0])dat[motor0] += velocity[motor0];
else if(targetDat[motor0] < dat[motor0])dat[motor0] -= velocity[motor0];

if(flag)
{
port = 0x01<<motorIndex; //이 값을 포트를 통해 출력한다.
countValue = dat[motorIndex]; //이 값을 타이머/카운트 레지스터에 세팅한다.
flag = 0;
}
else
{
port = 0;
countVlaue = 2500 - dat[motorIndex];
motorIndex++;
motorIndex %= 8;
flag = 1
}
}

*변수 설명:
flag : 전역변수, int형이든, char 형이든 상관 없다.
타이머가 걸리면서 1을 출력할 차례인지, 0을 출력할 차례인지를
저장하는 변수
port : 이 값을 출력포트를 통해 출력한다. 사용하는 컴파일러마다 다르지만
outport를 이용하거나 레지스터 주소를 이용해 출력한다.
포트는 8비트가 순서대로 되어있는것을 사용한다.
countValue : 타이머/카운트값. high신호가 출력되는 길이이다.
여기서는 2500이라는 값이 세팅되어 있을 경우 타이머의 주기가 2.5ms가
된다고 가정하였다. 타이머의 세팅에 따라 이 값은 달라지게 된다.
motorIndex : 어느 모터(또는 포트의 어느 비트)에 해당하는 PWM을
출력하는지를 저장하고 있는 변수. 0~7까지의 값을 갖는다.
dat[] : 타이머/카운트에 들어갈 값. 이 값을 조정해 줌으로써 각도를 조정할수 있다.
여기서는 dat[]의 값의 1500을 가질때 high의 신호가 1.5ms가 되며,
서보모터가 중간에 오게 된다.

*즉 2.5ms마다 타이머가 두번씩 걸리게 되며, 한번은 high로, 한번은 low로 신호를 바꾸어주게 된다.
이러한 동작이 20ms동안 8번 발생하며, 이 8번 동안 motorIndex라는 값에 따라
정해진 모터에 해당하는 포트에 high와 low를 출력해준다. 타이밍은 다음과 같다.

       __
포트0  | |_______________________________
           __
포트1  ____| |___________________________
               __
포트2  ________| |_______________________
                   __
포트3  ____________| |___________________

           :                      :
                                __
포트6  _________________________| |______
                                    __
포트7  _____________________________| |__


여기서 포트 0번과 1번의 처음 5.0ms구간을 확대해 보면
         ___________
        |           |
0       |           |_____________________________
                              ___________
                             |           |
1       _____________________|           |________


시간(ms) 0         1.5       2.5         4.0      5.0

이와같은 식이 된다. 여기서 1.5ms나 4.0ms는 서보모터가 중간에 오는 값이며, dat[]값에 따라
달라지게 된다. 그리고 2.5ms나, 5.0ms는 변하지 않는다.


*속도관련부분에 추가된 변수
targetDat[] : 모터의 목표 각도를 담고 있는 변수. 매번 타이머 인터럽트가 걸릴때마다
dat[]값이 targetDat[]를 따라가도록 되어 있다.
velocity[] : 말 그대로 모터의 속도. dat[]값이 targetDat[]값을 따라가는데 있어
얼마나 빨리 따라가는지를 정해서 속도를 조절한다. 즉 큰 값을 가질수록
빠른 속도가 나오게 된다.

 

답변하기 목록보기 이전글 다음글

[ 현재 페이지 전체 목록 ]
    제                  목 글 쓴 이 등 록 일 조회 받음
29   日 경사ㆍ요철지형 이동하는 로봇 개발 관리자 2005-05-17 3634
28   RFID, USN, Ubiquitous 란? 관리자 2005-02-01 4093
27   모바일 RFID 무엇인가? 관리자 2005-01-29 4301
26 파일받기:1101858944000000000.PPT(3371K) 블로그란(What Blog?) 관리자 2004-12-02 3334 70
25 파일받기:MGR-K201_demo(v1.0).zip(24K) [프로그램 소스] MGR-K201용 데모프로그램 1.0 메가로보틱스 2003-12-03 5316 270
         [프로그램 소스] MGR-K201용 데모프로그램 1.0 유기만 2004-02-11 4198
24 파일받기:pyro.doc(800K) 2족로봇 쇠돌이 제작기 김낙현 2003-09-22 7869 785
23   타이머 하나로 8개의 서보모터 돌리는 pseud... 김낙현 2003-07-30 5969
22 파일받기:order2.dwg(29K) 쇠돌이의 전개도2입니다. 김낙현 2003-07-30 4708 55
21 파일받기:order1.dwg(25K) 쇠돌이의 전개도1 입니다. 김낙현 2003-07-30 5097 61
 
Copyright ⓒ Since 2005 www.robo-one.or.kr All rights reservd. Designed by SaehanDataSystem
이메일주소 무단수집 거부