학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

중요함수    1

엔코더(Encoder) 입력

학습목표

엔코더의 원리를 이해하고 회전체의 회전수와 위치를 측정하는데 활용한다.

학습주제

사용된 엔코더는 1회전에 5번의 펄스가 발생한다. 이를 다이어로그 박스에 카운트 펄스를 표시하고 이를 회전수로 변환한 값을 표시한다. [RESET]키를 누르면 0부터 새로 카운트를 시작한다.

               그림1 엔코더 다이어로그 박스

1.       엔코더 정회전을 카운트하는 프로그램을 만든다.

2.       엔코더 정회전과 역회전을 카운트하는 프로그램을 만든다.

예습내용

엔코더가 정회전에서는 A상이  Low에서 High B상은 Low 나타나고 역회전에서는 High 나타난다.

1.        엔코더의 원리와 기술 [보기]

2.        엔코더의 활용 [보기]

3.        실습에서는 ㈜오토닉스 ENB-5-2-1 사용한다. [매뉴얼]

엔코더를 상품화한 사이트를 조사한다. [과제제출]

실습방법

   

1. 회로를 연결한다.

그림과 같이 회로를 연결 한다. 엔코더의 전원과 접지는 보드의 것을 사용한다.

그림2.  엔코더 회로 연결

2. MAX 프로그램에서 포토센서 동작 확인

아래 그림과 같이 초기 셋팅을 후에 [Start] 버튼을 누르면 엔코더의 회전에 따라 [Counter Value] 값이 표현되는 것을 수가 있다.

그림3. MAX 카운터 테스트

3. 센서 입력 프로그램을 만든다.

  다음 프로그램은 Ni-daq Example 프로그램 “STCeventCount.c” Visual C++에서 실행한 것이다. 프로그램은 1 간격으로 10번을 카운트 값을 도스 화면으로 출력하게 된다.

#include "stdafx.h"

#include "nidaqex.h"             // 다음 헤더 파일을 추가 한다.

 

int main(int argc, char* argv[])

{

              i16 iStatus = 0;

    i16 iRetVal = 0;

    i16 iDevice = 1;

    u32 ulGpctrNum = ND_COUNTER_0;

    u32 ulCount = 0;

    u32 ulTCReached = ND_NO;

    u32 iLoopCount = 10;

    i16 iIgnoreWarning = 0;

    i16 iYieldON = 1;

 

    iStatus = GPCTR_Control(iDevice, ulGpctrNum, ND_RESET);

    iRetVal = NIDAQErrorHandler(iStatus, "GPCTR_Control/RESET", iIgnoreWarning);

    iStatus = GPCTR_Set_Application(iDevice, ulGpctrNum, ND_SIMPLE_EVENT_CNT);

    iRetVal = NIDAQErrorHandler(iStatus, "GPCTR_Set_Application", iIgnoreWarning);

    iStatus = GPCTR_Change_Parameter(iDevice, ulGpctrNum, ND_SOURCE, ND_DEFAULT_PFI_LINE);

    iRetVal = NIDAQErrorHandler(iStatus, "GPCTR_Change_Parameter/SOURCE", iIgnoreWarning);

 

    /* Load initial count. 새로 카운트 값을 읽는다.*/

    iStatus = GPCTR_Change_Parameter(iDevice, ulGpctrNum, ND_INITIAL_COUNT, ulCount);

    iRetVal = NIDAQErrorHandler(iStatus, "GPCTR_Change_Parameter/INITCOUNT", iIgnoreWarning);

    printf(" Apply your digital pulse train to the SOURCE of your counter.\n");

    iStatus = GPCTR_Control(iDevice, ulGpctrNum, ND_PROGRAM);

    iRetVal = NIDAQErrorHandler(iStatus, "GPCTR_Control/PROGRAM", iIgnoreWarning);

 

    /* Loop 10 times. */

 

    do {

        iStatus = GPCTR_Watch(iDevice, ulGpctrNum, ND_COUNT, &ulCount);

        iRetVal = NIDAQErrorHandler(iStatus, "GPCTR_Watch/COUNT", iIgnoreWarning); //현재 카운트 읽음

        printf(" The current count is %lu\n", ulCount);

        --iLoopCount;

        iStatus = GPCTR_Watch(iDevice, ulGpctrNum, ND_TC_REACHED, &ulTCReached);

        if (ulTCReached == ND_YES) {

            printf(" Counter reached terminal count! - The count may be incorrect.\n");

        }

        iRetVal = NIDAQDelay(1.0);   // 1초간 지연 시킨다.

                             iRetVal = NIDAQYield(iYieldON);

    } while ((iLoopCount > 0) && (iStatus == 0));

    iRetVal = NIDAQErrorHandler(iStatus, "GPCTR_Watch", iIgnoreWarning);

    /* CLEANUP - Don't check for errors on purpose. */

    /* Reset GPCTR. */

    iStatus = GPCTR_Control(iDevice, ulGpctrNum, ND_RESET);

    printf(" Done with event counting!\n");

              return 0;

}

 

4. 비주얼 프로그램을 만든다.

(1)     “Encoder1” 이름으로 프로젝트를 새로 만든다.

(2)     그림1 같이 [NumEdit Control] 두개의 표시창을 만들고, [Button]으로 1개의 “RESET” 실행 버튼을 만든다.

(3)     “Encoder1Dlg.h” “nidaqex.h” 포함한다. [보기]

(4)     “Encoder1Dlg.h” 필요한 Variable 선언 한다. [보기]

(5)     [ClassWizard ->Member Variables]에서 표시창의 멤버 Vriable “m_count” “m_rev” 선언 한다.

(6)     [ClassVi…]에서 “Cencoder1Dlg” 클래스에 마우스 오른쪽 키를 눌러 “SetCount()” 함수를 만든다.

(7)    

(8)     “SetCount()” 함수에 타이머를 초기화 하는 프로그램을 한다. [보기]

(9)     “OnInitDialog()” 타이머와 디지털포트를 초기화 한다. [보기]

(10) [ClassWizard ->Message Maps]에서 아래 그림과 같이 타이머 함수를 설정한다.

(11) “OnTimer()” 함수에 카운트 값을 읽어 화면에 표시한다. 프로그램에서 “ulCount” 현재 카운트 값이 정회전&역회전에 관계 없이 계속 표시된다. 그러므로 이전에 카우느값(ulCountPrev) 현재 카운트(ulCount) 차를 “DIO0” low 또는 high 따라 더하거나 뺀다. [보기]

(12) 다이어로그 박스의 [RESET] 눌리면 실행되는 함수를 만든다. [보기]

 

[주의] 카운터의 A 펄스가 low에서 high 마다 카운트 되고 B상이 low 인지 high 인지를 알아야 정회전 역회전을 감지하여 전체 회전수를 수가 있다. 그러므로 회전 속도가 빠른 것을 카운트 때는 위의 프로그램이 약간의 오차를 일으킬 수가 있다. 때는 카운터를 위한 전용 마이크로프로세서에서 A상이 low->high 인터럽트를 걸어 B상의 상태를 읽어 회전수를 RS232 통신을 이용해 PC 보내면 해결 있다.

처음

   

 

중요함수