본문으로 바로가기

Cortex-M3 LM8962의 경우 적절한 가이드북이 아직 없더군요. 그런 경우 뭐 예제를 분석해보는 수 밖에요. 일단 복적은 제목에도 나와있지만, 일정시간간격(Timer Interrupt)을 가지고 엔코더를 해석해서 그 결과를 시리얼통신으로 전송하는 걸로 하겠습니다. 이미 myCortexM3 LM8962보드를 설치해서 사용하신 분들이라면 딱 예제3개를 한 덩어리로 묶었구만뭐~~ 하시겠지만, 사실 예제를 그대로 파는건 별로 재미없으니까 그냥 한번 합쳐본것도 있구요. 또 제가 수행할려고하는 목표가 딱 위 예제 3개에를 합쳐서 출발해야하기도 하거든요... 그런데, 물론 제가 다뤄봤다던지 공부했다는 프로세서가 얼마안되지만, (80c196, AVR, DSP2812) 이 CortexM3의 예제는 뭐라할까 좀 어색하더군요.... 음.. 역시 어색하다는 말이 맞는듯합니다. 일단 제가 (만든건 아니고, 수정했다고 하기도 좀 민망한) 편집한 예제에서 main문을 보시면

int main(void)
{
    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ);

    InitTIMERINT();
    InitUART();
    InitQEI();

    // Loop Start.
    while(1)
    {
    }
}

3번행에 나오는 저 SysCtlClockSet 이게 뭔지 하는 의문부터 들더군요. 당연히 검색했지만, 시스템의 클럭을 설정하는 거라고 하더라는...ㅜ.ㅜ.


그래서 예제폴더의 인클루드된 헤더화일들을 찾아보니 있긴 하더군요...


저렇게... 근데... 내용이 없어요...ㅜ.ㅜ 그냥 선언만 되어있더군요. .. 어디 있을까요..? 제가 못찾은 건지...ㅎㅎ ---> 헤헤 있더군요...sysctl.h랑 같은 폴더에 당연히 거기 있는건데.. 제가 멍청한 멘트를 날렸다는... (아래 irmus님께 감사 -> 역시 고수의 질책은 힘이 됩니다..ㅋㅋ) 그러나, 찾긴했는데 영~ 못알아보겠네요. ㅎㅎ 역시 결론은 차차 공부해야겠습니다..ㅋㅋ;;


저렇게 인자들은 찾았습니다. 뭐 주석만 봐도 대충이해되긴 하더군요. 그러나 정작 SysCtlClockSet 저게 하는 일이 코딩된 부분은 없더군요. 그래도 또 찾아봤는데요. API라는 저 글자...

마이크로프로세서가 진화 하면서 같이 변화된 것이 있다. 8비트 MPU에서 데이터시트를 보고 비트 제어를 하는 원시적인 코딩을 주로 했다면 32비트 특히 Cortex-M3로 오면서 전달 인수와 리턴값과 변수, define 정의 등을 요약해 놓은 API(Application Program Interface)를 이용하여 프로그램 하는 것으로 바뀌었다. 제공된 API는 데이터 시트를 일일이 분석하여 코딩 하지 않아도 하드웨어 제어에 손쉽게 입문 할 수 있으며 코딩 적응을 빠르게 하는 장점이 있다. 또한 PC에서 운영되었던 C/C++ 언어로 프로그램 수정을 극히 적게 하여 Cortex-M3 알고리듬으로 옮겨 올 수 있다.
ARM Processor의 특성 및 최신동향 08.11.14. 디지털 파워. 김형태 발췌


음.. API는 저런거인 모양입니다. 뭐 편하다고 하니(사실 잘 모르겠지만, 그냥 사용하지요. 틈틈히 그 의미를 공부해야겠습니다.) 일단 아까 그 메인문에서 시스템클럭을 8Mhz로 설정하고 -ㅎ~ 여기서 또 의문이 하나 생기긴 했습니다. Withrobot이 제공하는 설명서에는 50MHz로 동작한다고 되어있거든요. 그런데 왜 클럭은 8MHz일까요?... 2분주, 4분주 등등을 해도 50MHz로는 안가지 않습니까?^^ ㅎ... 모르는게 너무 많습니다... 쩝... 그리고 나서 타이머인터럽트와 시리얼통신, 엔코더해석부분을 초기화시키는 부분이 필요할 것입니다.

static void InitTIMERINT(void)
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
    TimerConfigure( TIMER0_BASE, TIMER_CFG_32_BIT_PER );
    TimerLoadSet( TIMER0_BASE, TIMER_A, SysCtlClockGet() / 100 );	// 10ms
    TimerIntRegister( TIMER0_BASE, TIMER_A, TimerIntHandler );
    IntMasterEnable();
    TimerIntEnable( TIMER0_BASE, TIMER_TIMA_TIMEOUT );
    TimerEnable( TIMER0_BASE, TIMER_A );
}

근데 희한하게 하드웨어 설정은 뭐 잘 모르겠지만, 해석은 또 대충되긴합니다. 일단 5번줄의 끝부분에 있는 숫자 '100'은 1/100의 시간 즉 10ms의 시간마다 인터럽트가 걸리도록 설정한 겁니다. 그리고, 그 인터럽트가 걸렸을때 수행할 함수가 6번줄 끝의 TimerIntHander로 설정되어있습니다.

다음으로 시리얼통신부분을 초기화합니다.

static void InitUART(void)
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
}


6번줄의 115200이 Baud Rate를 맞춰준 부분입니다. 뭐 8비트고 어쩌고하는 설정도 있네요. 5번줄은 Withrobot의 설명서에 있는 회로도를 보면 시리얼통신의 Tx/Rx핀이 PA0/PA1에 연결되어있습니다. 아마 그걸 설정하는 듯합니다.

그 다음... 엔코더를 해석한다는 QEI설정이 필요하겠네요.

static void InitQEI(void)
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_QEI);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);

    GPIOPinTypeQEI(GPIO_PORTC_BASE, GPIO_PIN_4 | GPIO_PIN_6);
    QEIConfigure(QEI0_BASE, (QEI_CONFIG_CAPTURE_A_B | QEI_CONFIG_NO_RESET | QEI_CONFIG_QUADRATURE | QEI_CONFIG_NO_SWAP), 0xffffffff);
    QEIVelocityConfigure(QEI0_BASE, QEI_VELDIV_1, SysCtlClockGet() / 100);

    QEIEnable(QEI0_BASE);
    QEIVelocityEnable(QEI0_BASE);
}


위 내용에서 엔코더의 A,B상은 PC4, PC6번 핀에 연결되도록하고, 4분주해서 사용한다는 말도 확인이 됩니다. 또한 엔코더에서 들어온 카운터값 뿐만 아니라 방향과 속도성분까지 주어진다는 설정도 확인할수있습니다.

위의 3개의 초기화코드를 보더라도 사실 포기(^^)하고 그냥 사용하겠다고 생각하면 뭐 편해보입니다. 게으름에 대한 변명입니다...ㅜ.ㅜ 이제 타이머인터럽트가 걸리면 수행할 TimerIntHandler 구문을 보겠습니다.

static void TimerIntHandler(void)
{
    unsigned long vel, pos;
    long dir;
    char buffer[BUFFER_LEN];

	// Clear interrupt flag
	TimerIntClear( TIMER0_BASE, TIMER_TIMA_TIMEOUT );

    dir = QEIDirectionGet(QEI0_BASE);
    vel = QEIVelocityGet(QEI0_BASE);
    pos = QEIPositionGet(QEI0_BASE);
    usnprintf(buffer, BUFFER_LEN, "%d,  %d,  %d; \n", dir, vel, pos);
    buffer[BUFFER_LEN - 1] = 0;
    UARTPutString(buffer);
}

음 위 코드에서는 방향(dir), 속도(vel), 위치(pos)를 시리얼로 보내는 것입니다. 13번행에 있는 데로 구성한 이유는 제가 데이터를 받아서 처리할 PC쪽 프로그램이 MATLAB이라서 그렇습니다. 받을 때부터 (Data1, Data2, Data3;) 의 형태로 받으면 아주 편하거든요.

일단, 보드의 외부전원을 연결하고 엔코더도 연결해야하고, 또 차후에 여러센서들도 연결해야하니까. 뭐 보드하나 준비해야겠네요..


저렇게 꾸몄습니다. JTAG부분의 선이 짧더군요..ㅜ.ㅜ... 그래서 중간에 선을 좀 더 길게 할려고했는데 때마침 제 주위에 저 커넥터가 없더군요.. 그래서 저런 좀 지저분한 작업을 했습니다. 그리고, 전원공급장치로는



를 연결했습니다. 어차피 myCortex-M3 LM8962는 3.3V 레귤레이터를 가지고 있다니까. 전 엔코더의 5V나 넣어줄겸해서 저걸 그냥 다이렉트로 연결했습니다... 하필 가지고 있는 엔코더가


5V짜리라서 Cortex에 5V 출력을 바로 물려도 될까? 하고 고민좀 했는데 어디선가 정 안되겠거든 5V 그냥 인가해도 된다길래 그냥 연결했습니다.


적당한 흔들림을 위해 저렇게 진자를 엔코더에 다시 연결했습니다.



- 단순 시리얼통신 테스트 ComPortMaster

에서 이야기했던 ComPortMaster입니다. 시리얼 통신을 수행할때 표시되어있는 StartCapture를 누르고 화일 저장창에서 꼭 txt화일로 저장을 합니다.


그리고 MATLAB에서 읽겠습니다. 물론 MATLAB도 시리얼 통신이 됩니다. 실제로도 테스트도 했는데요. 문제는 제가 시리얼 통신을 강제종료할려고 하니까 에러가 나면서 이후코드가 실행되지 않더군요. 음... 그래서 그냥 txt로 저장하기로했습니다. MATLAB쪽 코드가 좀 아름답게 다듬어지면 ComPortMaster도 필요없겠지요...^^


내가 ComPortMaster에서 바탕화면에 저장을 해서 MATLAB도 메인 폴더를 바탕화면으로 지정합니다.

그리고 test = load('123.txt'); 라고 명령어를 주면


저렇게 데이터가 들어와있는것을 확인할수있습니다. 음 MATLAB쪽 m-file을 보면
 
test = load('123.txt');
 
ts = 0.01;
scaleEnc = 360/2000;
test = [test(:,1), [test(:,2), test(:,3)]*scaleEnc];
[sizeTest, temp] = size(test);
 
t = [0:ts:ts*(sizeTest-1)]';
 
figure
plot(t,test(:,3))
grid on
hold on
xlabel('s (Second)');
ylabel('degree / degree per sencond');
plot(t,test(:,2).*test(:,1)/ts,'r')
plot(t,[0; diff(test(:,3))/ts],'c')
 
1번행에서 위에서 이야기한데로 읽구요
3번행에서 10ms 샘플링잡고
4번행에서 500펄스짜리 엔코더가 4분주되었으니 한 펄스당 360/2000 도라고 잡고
5번행에서 받은 test행렬의 값을 다시 맞춰준겁니다.
그리고 시간축을 8번줄에서 만들어주고
나머진 그렸네요^^


음 그 결과 그래프인데요. 파랑색이 각도입니다. Cyan색과 Red가 겹쳐서 잘 안보이는데요. 제가 확인할려고 했던것은 Cortex에서 넘어온 엔코더의 속도성분과 제가 MATLAB에서 계산(차분으로)한 속도성분이 일치하는지를 확인할려고 한것입니다. 거의 일치하네요. 그러니까 저 결과로 보자면, Cortex의 엔코더 해석기는 한 펄스의 길이를 잡아서 시간을 가지고 계산한 속도가 아니라 어떤 주기에서 엔코더의 출력 한 상을 읽어서 그 카운더로 만들어진 속도라는 생각이 드는군요. 뭐 하여간 여기까지, 예제3개(시리얼, 타이머인터럽트, 엔코더해석)을 합쳐서 연습했습니다. 아직 해소되지 않은 의문점들이 있지만, 차차 해결해야겠네요. 그나저나 Eclipse는 프로젝트 생성하는게 생각보다 힘들군요... 이번 테스트 코드도 엔코더해석 예제어 덥어서 만든겁니다...ㅜ.ㅜ

아래는 프로세서쪽 전체 코드입니다.

//*****************************************************************************
//
// Withrobot에서 배포하는 엔코더 테스트화일에 시리얼 통신 예제와 타이머 인터럽트 사용예를
// 통합해서 PinkWink가 수정함. 2009.06.04
//
// 일정 시간간격(Sampling Time)으로 엔코더에서 해석한 방향, 속도, 위치값 을
// 시리얼 통신으로 전송함.
//
//*****************************************************************************

#include "../../../hw_types.h"
#include "../../../hw_memmap.h"
#include "sysctl.h"
#include "gpio.h"
#include "uart.h"
#include "qei.h"
#include "ustdlib.h"
#include "timer.h"
#include "interrupt.h"

#ifdef DEBUG
void
__error__(char *pcFilename, unsigned long ulLine)
{
}
#endif

#define BUFFER_LEN              32

static void UARTPutString(char * str);
static void InitTIMERINT(void);
static void InitUART(void);
static void InitQEI(void);
static void TimerIntHandler(void);

int main(void)
{
    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ);

    InitTIMERINT();
    InitUART();
    InitQEI();

    // Loop Start.
    while(1)
    {
    }
}

static void TimerIntHandler(void)
{
    unsigned long vel, pos;
    long dir;
    char buffer[BUFFER_LEN];

	// Clear interrupt flag
	TimerIntClear( TIMER0_BASE, TIMER_TIMA_TIMEOUT );

    dir = QEIDirectionGet(QEI0_BASE);
    vel = QEIVelocityGet(QEI0_BASE);
    pos = QEIPositionGet(QEI0_BASE);
    usnprintf(buffer, BUFFER_LEN, "%d,  %d,  %d; \n", dir, vel, pos);
    buffer[BUFFER_LEN - 1] = 0;
    UARTPutString(buffer);
}

static void UARTPutString(char * str)
{
    while(*str)
        UARTCharPut(UART0_BASE, *str++);
}

static void InitTIMERINT(void)
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
    TimerConfigure( TIMER0_BASE, TIMER_CFG_32_BIT_PER );
    TimerLoadSet( TIMER0_BASE, TIMER_A, SysCtlClockGet() / 100 );	// 10ms
    TimerIntRegister( TIMER0_BASE, TIMER_A, TimerIntHandler );
    IntMasterEnable();
    TimerIntEnable( TIMER0_BASE, TIMER_TIMA_TIMEOUT );
    TimerEnable( TIMER0_BASE, TIMER_A );
}

static void InitUART(void)
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
}

static void InitQEI(void)
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_QEI);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);

    GPIOPinTypeQEI(GPIO_PORTC_BASE, GPIO_PIN_4 | GPIO_PIN_6);
    QEIConfigure(QEI0_BASE, (QEI_CONFIG_CAPTURE_A_B | QEI_CONFIG_NO_RESET | QEI_CONFIG_QUADRATURE | QEI_CONFIG_NO_SWAP), 0xffffffff);
    QEIVelocityConfigure(QEI0_BASE, QEI_VELDIV_1, SysCtlClockGet() / 100);

    QEIEnable(QEI0_BASE);
    QEIVelocityEnable(QEI0_BASE);
}




댓글을 달아 주세요

  1. BlogIcon irmus 2009.06.04 14:57 신고

    Cortex-M3 코어는 최신 기술의 코어로 지금까지 다뤄보셨던 MCU들과는 한래밸 윗등급이라 생각하시면 됩니다. 문서들과 친해지지 않으면 힘들게 느껴질 수 있습니다.
    그리고 source insight같은 소스 네비게이션 툴을 적극 활용하세요. SysCtlClockSet()함수 내용이 없을리가 있겠습니까. StellarisWare가 뭐하는 녀석인지, 폴더안에 뭐가 있는지 먼저 보는것이 좋을것 같습니다. DriverLib 내에도 유용한 소스코드들이 많습니다.

    • BlogIcon PinkWink 2009.06.04 17:32 신고

      그렇지요.
      함수가 선언만되고 내용이 없을리가 없지요...ㅋㅋ
      왜 StellarisWare까지 생각을 안했는지...
      또 찾고 공부하러 갑니다..
      여기까지 오셔서 답변달아주셔서 감사합니다....^^

  2. BlogIcon 제이유 2009.06.04 23:22 신고

    이..포스팅은 참 댓글달기가 어렵다고 생각했는데도,
    댓글 다시는 분이 있으니 대단합니다!!

    • BlogIcon PinkWink 2009.06.05 00:03 신고

      저위에 irmus님은 요즘 제가 찾아가서라도 배우고 싶은게 많으신 분이죠. 그런 분이 제 홈에 와서 댓글을 달아주신게 너무나도 고마울 따름입니다. 그래서 심기일전중입니다...ㅋㅋㅋ 오히려 제이유님이 더 대단하십니다.. 여기다 댓글을 달아주시다늬....ㅋㅋ

      이런 종류의 포스팅은 저는 제가 공부하는 것을 정리하고 공부한것을 확인하는 것입니다. 첫째는 정리하면서 제가 다시 생각하고, 둘째는 위에서처럼 irmus 님처럼 고수께서 오셔서 던지는 한마디를 바라고 있습니다...ㅋㅋㅋ

      하여간 방문에 감사드립니다....

    • BlogIcon 제이유 2009.06.05 00:28 신고

      아닙니다. ^^
      저도 뭔가 와서 댓글을 달아 드리고 싶었는데,
      오늘의 포스팅이 어려워서 순간 헉; 했답니다. ^^

    • BlogIcon PinkWink 2009.06.08 09:58 신고

      헤~~
      그럼 다른글에 다시면 되죠~~~^^

  3. BlogIcon 아서 2009.06.05 00:29 신고

    궁금해요. 핑크님 어떤 공부하시는지..

    • BlogIcon PinkWink 2009.06.05 01:06 신고

      정확하게 제 전공은 제어(Control)입니다. 그러나. 실력이 바닥이라,,,, 이것저것 공부할 수 밖에 없습니다. 왜냐면 남들은 희한하게 잘 하던데...전 그 다들 잘 한다는게 쉽게 잘 안되더라구요...ㅜ.ㅜ^^ 그러나 공부자체가 재미있긴합니다.^^.

    • BlogIcon 아서 2009.06.05 02:28 신고

      전 주변에 이과출신이 별로 없어서 더더욱 난해하게 느껴지는데요? 대체 뭘 제어하시는 걸까!! (죄송해요 ㅠㅠ)

    • BlogIcon PinkWink 2009.06.08 09:57 신고

      요즘에는 무인항공에 꽤 관심이 많답니다...ㅋㅋ^^
      (말도안되는실력으로 그걸 도전하고있다는...쿨럭)

  4. 이뿌니 2009.09.30 00:16 신고

    저도 PinkWink님처럼 공부에 바다에 풍덩 빠지고 시포요~

    • BlogIcon PinkWink 2009.10.01 00:51 신고

      오해이십니다... 저도 아직 못 빠졌답니다...
      저도 푸욱 빠지고 싶지요...
      그러나...
      네개의 CSI와 NCIS와 우리 떡만이가 자꾸 절 유혹해요~~~^^

  5. BlogIcon 프라이 2010.06.15 17:35 신고

    항상 블로그의 좋은내용 알려주셔서 감사합니다.
    매트랩에서 시리얼로 받은 내용을 복사해서 넣으시는데 더 좋은 방법이 있어 소개드립니다.

    바로 매트랩에서 바로 시리얼 통신을 하는 방법인데요. 저도 도움을 드리고자 방금 블로그에 포스팅을 하였습니다.
    http://frys.tistory.com/80
    도움이 되었으면 좋겠습니다^^

  6. BlogIcon kimswave 2010.07.07 00:47 신고

    "누구냐 넌" 올드보이의 대사가 떠오르네요...
    그냥 입이 벌어집니다. 이런 자료들 저라면 공개를 꺼릴 정도로
    가치가 높은 자료들이네요... 많은 도움 받고 갑니다.
    그런데 임베디드 크레이지 보이즈에서 만든 망고 보드랑
    위드로봇에서 만든 루미너리사의 보드랑 비교해 보면
    더 빠르게 다가가기는 망고 보드가 나은듯 한데...
    저 이클립스랑 다른 라이브러리들이랑 cygwin 등등을 찾아다니며
    개발 환경 맞추는데 드는 비용이나 시간이 어느정도 되나요?
    참 매력적인 셋팅(공짜..ㅎㅎ)이긴 한데... 거기에 들어가는
    시간과 비용 불확실성등을 보았을 때 그냥 크랙된 IAR과 망고보드가
    나아보이기도 해서요...

    • BlogIcon PinkWink 2010.07.07 10:38 신고

      비용은 본문의 보드 판매처 링크에 가격은 나와있고.. 저대로 따라가는데 최초 한 3시간정도 걸리더군요...
      그리고 망고보드라는 것은 처음 알았습니다.
      괜찮나요??? 호오...^^ 아.. 크랙된 IAR ?? 음.. 검색해 봐야겠는데요.. ㅎㅎㅎ

  7. ATO 2010.07.13 17:47 신고

    엔코더 채널 1은 써보셨나요 채널 0번 소스에서 EQI1_BASE 이렇게만 바꿔줘도 안되던데..

    • BlogIcon PinkWink 2010.07.14 15:20 신고

      그것만 바꾸면 되나요?? 저는 해보진 않았지만, 제 후배는 엔코더 두개를 사용하더군요. 그 놈이 지금 방학을 맞이 하여 2개월 일정으로 다른 곳에 가서 확인을 못하네요.

  8. 정정수 2010.07.14 14:45 신고

    8962로 seesaw system을 만들고있습니다. 저희는 3천펄스짜리 엔코더를 사용하는데 주인장님이 보여주신 컴포트마스터가 보여주는 정밀한 각도가 보여지지않는데 노이즈가 간혹 너무 심해서 위치값이 계속 증가하는 현상이 보여집니다. 혹시 노이즈를 줄이는 방법이나 노하우가 있는지요.. 몇날밤을 새도 아직도 멍충이 짓을 하고 있어 감히 여쭈어봅니다 ㅠ

    • BlogIcon PinkWink 2010.07.14 15:22 신고

      글쎄요. 그냥 엔코더의 AB상을 코어텍스에 물린것말고는 회로적으로 따로 해준것은 없습니다. 생각해보니 엔코더 해석에서는 아무것도 해준것 없이 WithRobot에서 제공하는 예제로 무난하게 해결했습니다. 답변을 드리지 못해 죄송합니다.ㅠㅠ.

  9. nambi 2010.07.27 10:37 신고

    현재 8962로 엔코더 두개를 사용하여 각각의 위치를 출력하려 하는데요. 엔코더 채널0은 위 예제로 되는데 채널1은 위 예제에서 1로 바꿔도 실행해도 되지가 않네요? 혹시 해 보셨으면 도움 좀 부탁드립니다. ---;;

    • BlogIcon PinkWink 2010.07.27 11:13 신고

      93번행부터 102번행의 모든 내용이 수정혹은 추가되어야합니다. (아마 제 기억에...ㅠㅠ) 현재.. Cortex를 사용하고 있지않아 테스트를 못해서 뭐라 추가로 드릴 말씀이 없음을 정말 죄송하게 생각합니다...ㅠㅠ

  10. nambi 2010.07.27 13:35 신고

    답변 감사드리구요.^ 한 번 고생해봐야 겠네요 -_-;; 수고 많으십니다 ㅎㅎ

  11. mijong 2011.02.26 01:14 신고

    ㅎㅎㅎ 진짜 pinkwink님 존경해욤 ㅋㅋ

    어떻게 이런 귀한 자료들을 보도록 하셧는지 ㅎㅎㅎ

    저두 벨런싱 로봇 만들어볼라하는데 많이 도움이 되는 자료에요

    감사합니당 ㅋㅋ

    • BlogIcon PinkWink 2011.02.28 08:51 신고

      아마.. 처음 접근하시는 분들께는 유용하실지도 모르겠습니다.
      하여간.. 도움이 되셨다니.. 다행입니다.^^

  12. JAY 2011.03.14 22:15 신고

    쓰신 엔코더가 E30S4-500-3-2-5 인데 가운데보면 2써놓은신게 무엇인지 모르겠네요 출력방식이 여러가지인데 NPN인지 토템폴인지 아니면 전압출력 방식인지좀 알려주세요!

  13. KIM 2011.04.09 16:32 신고

    코드 똑같이 쳤는데도 "no rule to make target 'all'. stop. 이라 나오면서 에러 떠요 ㅠㅠ 왜그런건가요 그리고 예제소스에 헤더파일들 ! 노란 느낌표 나오는거 어떻게 없애신건가요 ㅠ 헤더파일 어떻게 추가하는건지 모르겠어요 ㅠ

    • BlogIcon PinkWink 2011.04.10 08:42 신고

      http://pinkwink.kr/66 에서 설명되어지지 않은 부분은 저도 잘 모른답니다. 이 글쯤 후에 졸업준비로 인해 더 이상 cortex를 만지지 않았거든요. 그리고, 이 소스는 withrobot에서 배포했던 내용을 살짝 제가 손만 본것으로 기억납니다. withrobot.tistory.com에 한번 방문해보시는것도 괜찮을 것입니다.

  14. 문준모 2011.05.28 16:43 신고

    안녕하세요!! 항상 눈팅열심히 합니다^^ㅎ
    다름이 아니라 엔코더를 이번에 처음 다루게 되었는데요..
    토템폴 출력인데 avr128 인터럽트핀에 그냥 바로 연결해도 인터럽트 발생이 안되더라고요....아니면 따른회로를 추가해야하나요..?

    • BlogIcon PinkWink 2011.05.29 07:50 신고

      인터럽트를 이용하기도 합니다만(이 경우 정역회전에 대해 고민해야하고, 인터럽트 자원이 필요할때 프로그램이 꼬일수도 있습니다.)
      보통은 엔코더해석부분을 별도로 꾸미거나 엔코더 해석이 가능한 MCU(cortex, DSP 등)을 사용하기도 합니다.

  15. BlogIcon 구차니 2012.02.01 21:05 신고

    으흑 저도 cortex-m3 만진다고 머리 아파 죽겠는데
    pinkwink 님의 글을 찾아봐야겠어요! ㅎ

  16. VO2Max 2012.09.13 21:11 신고

    안녕하세요~
    이번에 핸드폰 장착된 자이로센서로 각도를 측정하며 가속도센서로 이동방향 및 거리를 측정하기위해 열심히 공부중인 한 사람입니다.
    정리 해주신 자료가 너무 유용하여 몇번을 읽어보니 아~ 이런게 센서구나 싶었습니다. 참고로 센서에 대한 지식은 전무 했고, 컴퓨터 프로그래밍을 해보지는 않았지만 약간의 스크립팅 경험만을 가지고 있습니다.

    갑작스럽지만... 질문이 있습니다.
    결론 부터 말하자면 엔코더를 핸드폰에 장착되어질 수는 없는가? 있다면, 왜 핸드폰 제조사는 신뢰도가 떨어지는 가속도 센서, 자이로센서를 장착하는가 입니다. 혹은 왜 신뢰도가 떨어지는 2개의 센서를 로봇 공학에서는 사용하려 하는가?

    글을 읽던중 엔코더는 정확한 수치를 출력한다는 전제를 많이 보게 되었습니다.
    그래서 이상했던 점은 정확한 수치를 보여주는걸 왜 대체 할려고 하지? 라는 의문을 버릴수 없었습니다.

    너무 초보적인 질문이라 부끄럽습니다.
    감사합니다.

    • BlogIcon PinkWink 2012.09.14 10:04 신고

      질문을 정확히 알기가 좀 어렵습니다만, 그냥 이해한대로 답변을 드리면, 당연히 엔코더를 쓸 수 없는 곳에서 사용합니다. 엔코더는 어딘가 고정되고, 축의 회전 각도를 찾는 것이니까요.

  17. 오지몬 2012.11.14 22:18 신고

    안녕하세요~!! PinkWink 님 블로그에서 많이 배우고 있습니다 ㅎㅎ 다름이 아니라 저도 쿼드콥터를 한번 개발해 보려고 하는데요 참 어렵네요 ㅎㅎ 이번 글에서 포인트는 우리가 원하는 필터링된 각도 값 대신 엔코더에서 출력된 정확한 값을 대입하고 공식을 역으로 취하여 상수를 구하는 것이라고 생각합니다. 그런데 하필 제가 엔코더가 없어서요 ㅜㅜ 엔코더 대신에 스텝모터를 장착하고 좌우 90도씩 회전을 시키면서 측정을 하면 오히려 더 쉽게 정확한 각도값을 구할수 있을거같아서 의견을 여쭤볼려합니다.

    • BlogIcon PinkWink 2012.11.15 13:12 신고

      뭐든 상관없습니다. 내가 만약 모터의 속도를 제어하는 제어기를 구성했다면, 얼마나 목표속도를 잘 따라가는지 확인하게 될겁니다.
      마찬가지로, 각도를 추정하게 했다면, 참값과의 비교가 필요할겁니다.
      그래서 엔코더를 저는 편하게 말씀드린 것이고,
      만약, 스탭모터의 구동각도를 믿을 수 있다면, 그렇게 하셔도 상관없습니다.

  18. 오지몬 2012.11.14 22:21 신고

    죄송합니다 ㅜㅜ 글을 엉뚱한데다 달았네요 ㅜㅜ 제가 보상필터 게인값을 구하려고 합니다. 스텝모터의 특성상 2상 여자 방식을 사용했을때 상이 바뀌는 타이밍을 샘플링 주기로 정해준다면 한번 샘플링 할때마다 0도에서 어느정도 돌아갔는지 더 쉽게 알수있을것같아서요.제가 글을 잘 쓰지못해서 죄송합니다 ㅜ
    항상 좋은 자료 올려주셔서 감사하구요! 열심히 공부해서 다음에 쿼드콥터 뛰우는 동영상을 꼭올릴게요! 수고하세요!

  19. 정재훈 2014.08.20 14:05 신고

    void __error__(char *pcFilename, unsigned long ulLine)

    이건도대체 뭘까요 .. ?