학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

중요함수    1

아나로그 입력과 그래프

학습목표

아나로그 입력의 데이터 수집과 가시화 방법을 익힌다.

학습주제

보드를 통해 아나로그 데이터를 수집하고 그래프와 텍스트로 표시한다.

프로그램은 1학년 C언어 시간에 배운 그래프 프로그램을 일부 수정 하기로 한다.

데이터 부분을 보드로 측정한 값으로 대체 한다.

예습내용

데이터를 측정하기 위해서는 A/D Converter 측정된 데이터를 PC 메모리에 저장했다. 이를 화면에 표시한다. A/D Converter 측정 시간에 비하면 화면에 출력에는 많은 시간이 소요된다.

1.        포인트 측정 : 1개의 측정 데이터가 생성 때마다 이를 화면에 표시한다. 이는 측정 시간 간격이 상당히 크다.

2.        Single Buffer : 일정 개수의 데이터를 메모리에 저장했다. 화면에 표시한다. 그러나 처리 시간 동안은 측정을 멈추게 된다.

3.        Duble Buffer : 곳의 측정 메모리를 사용하여 메모리에서 화면 출력 시간에도 다른 메모리에 측정 데이터를 저장하게 함으로 효율적으로 데이터를 측정할 있다.

다음은 아나로그를 측정하는 함수이다. 다음 함수의 Variable 의미하는 것을 기술하시오 [과제]

AI_VRead(iDevice, iChan, iGain, &dVoltage)

 

도스상태에서 전압을 측정하는 프로그램을 만들어 본다.

 

예습프로그램1

 

#include "stdafx.h"

#include "nidaqex.h"

 

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

{

i16 iStatus = 0;

    i16 iRetVal = 0;

    i16 iDevice = 1;

    i16 iChan = 0;

    i16 iGain = 1;

    f64 dVoltage = 0.0;

    i16 iIgnoreWarning = 0;

 

    iStatus = AI_VRead(iDevice, iChan, iGain, &dVoltage);

 

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

   

    if (iStatus == 0) {

        printf(" The voltage at AI channel %d is %lf volts.\n", iChan, dVoltage);

    }

              return 0;

}

실습방법

   

1.       배선연결

외부의 높은 전압이 보드로 들어 가면 보드가 손상을 입을 있으므로 아나로그의 측정은 보드를 보호하는 Signal Conditioning 해야 한다. SCC-AI01 J1포트에 그림과 같이 설치한다. 이는 –40~40V까지 측정할 있다.

2.       포인트 측정

AI_Vread 함수와 1학년 과정의 Graph 프로그램을 혼합하여 프로그램을 완성한다.

1)       ( NumEdit Control) 선택하여 그림과 같이 다이어로그에 추가한다.

 

2) CWGraph1 마우스 오른쪽 버튼을 눌러 Properies 선택하여 Y축의 범위를 –5~30으로 한다.

3) 숫자 표시를 마우스 오른쪽 버튼을 눌러 Properties 선택하고 Style에서 아래와 같이 선택한다.

Advanced에서 Text, Back Font=18 항목을 수정한다.

4) [View] -> [ClassWizard]에서 IDC_CWNUMEDIT1 Variable m_volt 한다.

5) 타이머가 동작할 마다 전압을 측정하고 이를 메모리에 저장하고 그래프를 그린다.

예제1

void CGraphDlg::OnTimer(UINT nIDEvent)

{

              // TODO: Add your message handler code here and/or call default

              f64 dVoltage = 0.0;

              double adjust=5.0;  // 측정값과 실제값 같게 한다. (경우에 따라 달라짐)

 

              if(iTime >= 100)                                                 // 데이타를 100개까지 반복적으로 저장

                             iTime = 0;

              AI_VRead(1, 0, 1, &dVoltage); //AI_VRead(iDevice, iChan, iGain, &dVoltage);

              m_volt.Value=dVoltage*adjust;

              Yvalue[iTime] = (double)dVoltage*adjust;                                                     

             

              // Move the data to the CNiReal64Vector data type

              CNiReal64Vector myvector(iTime+1, Yvalue);

              m_graph.PlotY(myvector, 0., 1.);

              iTime++;

              UpdateData(FALSE);

 

              CDialog::OnTimer(nIDEvent);

}

[전체프로그램 보기]

 

3.       Single Buffer (ANSI)

다음 예제는 ANSI C에서 piBuffer 30개의 데이터를 측정하는 프로그램이다. 이는 NiDAQ 있는 예제를 적은 것이다.

예제2

DAQsingleBufAsync.c 예제를 기술한 것이다.

#include "stdafx.h"

#include "nidaqex.h"

 

 

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

{

i16 iStatus = 0;

    i16 iRetVal = 0;

    i16 iDevice = 1;

    i16 iChan = 0;

    i16 iGain = 1;

    f64 dSampRate = 1000.0;

    u32 ulCount = 100;

    f64 dGainAdjust = 0.2;

    f64 dOffset = 0.0;

    i16 iUnits = 0;

    i16 iSampTB = 0;

    u16 uSampInt = 0;

    static i16 piBuffer[100] = {0};

    i16 iDAQstopped = 0;

    u32 ulRetrieved = 0;

    static f64 pdVoltBuffer[100] = {0.0};

    i16 iIgnoreWarning = 0;

    i16 iYieldON = 1;

int i;

 

    /* Convert sample rate (S/sec) to appropriate timebase and sample

     interval values. */

 

    /* NOTE: If you are using a DSA device, call DAQ_Set_Clock

     instead. Refer to NI-DAQ Function Reference Manual for details. */

              iStatus = DAQ_Rate(dSampRate, iUnits, &iSampTB, &uSampInt);

 

    /* Acquire data from a single channel */

 

    /* NOTE FOR DSA devices... DSA devices can format samples in a

     left-justified format in 32-bit data words. This means that the most

     significant bits of the data word contain the bits generated by the

     converter. When allocating data buffers, be sure to account for the

     32-bit data width. Even though a number of DAQ/SCAN/WFM functions are

     declared to accept pointers to 16-bit data buffers, you should pass

     pointers to 32-bit data buffers. Also, modify the iGain parameter to

     be in units of dB. */

    iStatus = DAQ_Start(iDevice, iChan, iGain, piBuffer, ulCount, iSampTB, uSampInt);

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

while ((iDAQstopped != 1) && (iStatus == 0)) {

        /* Loop until all acquisition is complete.  HINT: You can be

         doing other foreground tasks during this time. */

        iStatus = DAQ_Check(iDevice, &iDAQstopped, &ulRetrieved);

              iRetVal = NIDAQYield(iYieldON);

    }

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

iStatus = DAQ_VScale(iDevice, iChan, iGain, dGainAdjust, dOffset, ulCount, piBuffer, pdVoltBuffer);

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

             

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

    iStatus = DAQ_Clear(iDevice);

             

    /* Write acquired data */

for(i=0;i<ulCount;i++)

              printf("%d  %f\n",i,pdVoltBuffer[i]);

   

              return 0;

}

 

처음

   

 

중요함수

AI_VRead(iDevice, iChan, iGain, &dVoltage)