학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

중요함수    1

모터회전 측정

학습목표

모터의 회전수를 측정하고 제어한다.

학습주제

오른쪽 그림과 같이 회전 원판에 포토인터럽트를 설치하면 펄스가 발생한다. 1 펄스의 시간을 측정하여 1회전에 발생하는 펄스수를 곱하면 1회전의 시간을 알아낼 있다.

예습내용

응용분야

1.        회전체의 회전수 측정

2.        자동차 크랭크앵글 센서에 응용하여 펄스가 Low에서 High 되는 순간부터 카운트하여 점화플러그를 동작 시는데 사용하기도 한다. 센서를 이용하여 피스톤의 위치를 간접적으로 알아낸다.

참조사이트 (다음 사이트를 찾아보고 예습한다.)

 

실습방법

   

1. 보드 제작

잘못된 입력신호로부터 보드를 보호하기 위해서 포토커플러(4N25) 사용하여 신호를 받는다.

오른쪽 그림은 회로도를 제작한 것이다.

[주의] Simulator 전원은 5V 사용해야 한다. 그렇지 않으면 과전류가 흘러서 포토인터럽터가 손상 된다.

2. 회로연결

옆의 그림은 실험 기자재이다. J2, J3 위의 회로도와 같이 연결하고 P2 Power Supply 접지에 연결하고 P1 Power Supply + 연결하여 전압을 5~12V까지 변화시켜 회전체의 속도를 조절하며 실습해 본다.

아래 그림은 포토인터럽터(SENSOR1-1,2) J2=Vcc, J3=Output 그림이다.

 

3. 펄스 주기 측정

다음 예제는 반복되는 펄스의 주기를 측정하여 모터의 회전 수를 계산한 프로그램이다.

보드는 내부 클럭을 가지고 주기를 카운트 한다. 예제1에서는 ND_INTERNAL_100_KHZ 100KHz 클럭으로 카운트 한다. 그러므로 클럭은 1/(20 MHz) = 50 ns 된다.

그림과 같이 4개가 카운트 되면 펄스의 주기는 다음과 같다.

4 * 50 ns = 200 ns

 

예제1

#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 ulArmed = ND_YES;

    u32 ulTCReached = ND_NO;

    i16 iIgnoreWarning = 0;

    i16 iYieldON = 1;

       float rev,rpm;

 

    iStatus = GPCTR_Control(iDevice, ulGpctrNum, ND_RESET);

       iStatus = GPCTR_Set_Application(iDevice, ulGpctrNum, ND_SINGLE_PERIOD_MSR);

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

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

       /* Load initial count. */

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

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

       iStatus = GPCTR_Control(iDevice, ulGpctrNum, ND_PROGRAM);

       /* Loop until 'ulGpctrNum' is no longer armed. */                           

       do {

              iStatus = GPCTR_Watch(iDevice, ulGpctrNum, ND_ARMED, &ulArmed);

              iRetVal = NIDAQYield(iYieldON);

       } while ((ulArmed == ND_YES) && (iStatus == 0));

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

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

    if (ulTCReached == ND_YES) {

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

       }

    else {

              printf(" The period in between pulses (in 10uSec ticks) was %lu\n", ulCount);

       }

 

       /* Reset GPCTR. */

       iStatus = GPCTR_Control(iDevice, ulGpctrNum, ND_RESET);

       // 실험 기자재의 1회전에 10개의 펄스가 발생한다.

       rev = (float)ulCount/100000*10; //1회전(10개펄스) 시간

       rpm = 60/rev;

       printf("rpm =  %f     1회전 시간 = %f \n",rpm, rev);

             

       return 0;

}

 

3. 비주얼 프로그램 만들기

그림과 같이 프로젝트 이름을 주고 나머지는 기본값으로 해서 프로젝트를 만든다.

 

[NumEdit Control] 선택해서 그림과 같이 RPM sec/rev 2개를 만든다. 글자는 [Static Text] 만들었다.

RPM 마우스 오른쪽 키를 눌러 Range 그림과 같이 고치고 Style에서 모양을 바꾸고

[Advanced]에서 [Control mode] Indicator 하고 Font크기를 20 Text,Back 색을 그림과 같이 바꾼다.

[sec/rev] 같은 방법으로 바꾼다.

2개의 창의 Variable 그림과 같이 만든다.

ClassWizard에서 WM_TIMER 더블 크릭해서 OnTimer함수를 만든다.

 

RpmDlg.cpp nidaqex.h 포함시킨다. [보기]

타이머가 0.5초마다 동작하도록 설정한다. [보기]

펄스의 주기를 측정하는 함수를 추가한다. [보기]

타이머 함수에 측정돤 값을 출력한다. [보기]

처음

   

 

중요함수