학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

중요함수    1

디지털 포트의 출력

학습목표

디지털포트의 출력을 이해하고 이를 기계제어에 응용한다.

학습주제

PCI6024에는 8개의 디지털포트를 입출력으로 사용할 있다. 이를 이용하여

1.     LED 동작 시키다.

입력 스위치를 만들고 LED 함께 동작시킨다.

예습내용

 

실습방법

   

1. LED 보드의 제작    1

2. 프로그램 작성    1

1. LED 보드의 제작

LED 발광 다이오드로서 전압을 가하면 적색이나 녹색 자신의 색으로 발광 한다. 보통 2V 정도의 전압에 10mA-20mA 전류 흐른다.

1)     5V 전원 사용 저항값 (허용전류 9mA 설계)

R=(5V-2V)/9mA=330 W

2)     12V 전원 사용 저항값 (허용전류 10mA 설계)

R=(12V-2V)/10mA=1000 W

다음과 같이 보드를 설계한다. LED 보드에 연결된 단자가 0V(접지) 연결될 발광한다.

Led 있는 보드의 CON1 숫컨넥터를 사용하고 위에서 보았을 다음과 같이 연결한다.

2

4

6

8

10

1

3

5

7

9

디지털 포트가 0V LED 점등된다. 아래는 LED 동작에 따는 출력 값을 표시한 것이다.

 

상위비트

하위비트

 

LED

Dp

g

f

E

d

c

b

a

출력

보드핀이름

DIO7

DIO6

DIO5

DIO4

DIO3

DIO2

DIO1

DIO0

 

보드핀번호

48

16

51

19

47

49

17

52

 

0

5V

5V

5V

5V

5V

5V

5V

0V

0xfe

1

5V

5V

5V

5V

5V

5V

0V

5V

0xfd

2

5V

5V

5V

5V

5V

0V

5V

5V

0xfb

3

5V

5V

5V

5V

0V

5V

5V

5V

0xf7

4

5V

5V

5V

0V

5V

5V

5V

5V

0xef

5

5V

5V

0V

5V

5V

5V

5V

5V

0xdf

6

5V

0V

5V

5V

5V

5V

5V

5V

0xbf

7

0V

5V

5V

5V

5V

5V

5V

5V

0x7f

 

2. 프로그램 작성

다음은 “C:/Program Files/National Instruments/NI-DAQ/Examples/DAQmx ANSI C/Digital/Generate Values/Write Dig Chan” 프로그램을 이해하기 쉽게 필요한 함수만 나타낸 것이다. 이는 “data[8]={0,1,0,1,1,1,1,1};” 데이터 값으로 8개의 출력이 지정된 포트로 나타난다.

#include <stdio.h>

#include <NIDAQmx.h>

 

int main(void)

{

        TaskHandle  taskHandle=0;

        uInt8       data[8]={0,1,0,1,1,1,1,1};

 

        /*********************************************/

        // DAQmx Configure Code

        /*********************************************/

        DAQmxCreateTask("",&taskHandle);

        DAQmxCreateDOChan(taskHandle,"Dev1/port0/line0:7","",DAQmx_Val_ChanForAllLines);

 

        /*********************************************/

        // DAQmx Start Code

        /*********************************************/

        DAQmxStartTask(taskHandle);

 

        /*********************************************/

        // DAQmx Write Code

        /*********************************************/

        DAQmxWriteDigitalLines(taskHandle,1,1,10.0,DAQmx_Val_GroupByChannel,data,NULL,NULL);

 

        /*********************************************/

        // DAQmx Stop Code

        /*********************************************/

        DAQmxStopTask(taskHandle);

        DAQmxClearTask(taskHandle);

 

        getchar();

        return 0;

}

 

반복문을 사용하여 8개의 led가 차례로 불이 들어오게 프로그램 한다.

#include <stdio.h>

#include <NIDAQmx.h>

 

int main(void)

{

        TaskHandle  taskHandle=0;

        uInt8       data[8]={1,1,1,1,1,1,1,1};

        int i;

 

        DAQmxCreateTask("",&taskHandle);

        DAQmxCreateDOChan(taskHandle,"Dev1/port0/line0:7","",DAQmx_Val_ChanForAllLines);

        DAQmxStartTask(taskHandle);

        for(i=0;i<8;i++) {

                data[i]=0;

                DAQmxWriteDigitalLines(taskHandle,1,1,10.0,DAQmx_Val_GroupByChannel,data,NULL,NULL);

                getchar();

        }

        DAQmxStopTask(taskHandle);

        DAQmxClearTask(taskHandle);

        printf("프로그램을마쳤습니다. 아무키나치세요");

        getchar();

        return 0;

}

 

다음은 “C:/Program Files/National Instruments/NI-DAQ/Examples/DAQmx ANSI C/Digital/Generate Values/Write Dig Chan”의 프로그램이다. 위에서 기술한 프로그램이 에러가 발생했을 때 이를 화면에 표시함으로 프로그램 개발시에는 유용하다.

data[8]={0,1,0,1,1,1,1,1};”의 데이터 값으로 8개의 출력이 지정된 포트로 나타난다.

#include <stdio.h>

#include <NIDAQmx.h>

 

#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else

 

int main(void)

{

        int32       error=0;

        TaskHandle  taskHandle=0;

        uInt8       data[8]={0,1,0,1,1,1,1,1};

        char        errBuff[2048]={'\0'};

 

        /*********************************************/

        // DAQmx Configure Code

        /*********************************************/

        DAQmxErrChk (DAQmxCreateTask("",&taskHandle));

        DAQmxErrChk (DAQmxCreateDOChan(taskHandle,"Dev1/port0/line0:7","",DAQmx_Val_ChanForAllLines));

 

        /*********************************************/

        // DAQmx Start Code

        /*********************************************/

        DAQmxErrChk (DAQmxStartTask(taskHandle));

 

        /*********************************************/

        // DAQmx Write Code

        /*********************************************/

        DAQmxErrChk (DAQmxWriteDigitalLines(taskHandle,1,1,10.0,DAQmx_Val_GroupByChannel,data,NULL,NULL));

 

Error:

        if( DAQmxFailed(error) )

                DAQmxGetExtendedErrorInfo(errBuff,2048);

        if( taskHandle!=0 ) {

                /*********************************************/

                // DAQmx Stop Code

                /*********************************************/

                DAQmxStopTask(taskHandle);

                DAQmxClearTask(taskHandle);

        }

        if( DAQmxFailed(error) )

                printf("DAQmx Error: %s\n",errBuff);

        printf("End of program, press Enter key to quit\n");

        getchar();

        return 0;

}

 

프로그램을 Visual 프로그램으로 작성해 보겠습니다.

 

 

아래와 같이 프로젝트를 만듭니다.

MeasurmentStudio 없이 아래 Visual C++ 만으로는 아래와 같이 프로젝트를 만들고 후는 똑같이 프로그램하면 된다.

이후 나머지는 기본값으로 선택하고 “Finish” 선택한다.

 

화면 오른쪽의도구상자 “Button” 선택하여 다이어로그 박스에 만든다.

 

상태에서 아래와 같이 번개모양의커트롤이벤트  선택하고 “BN_CLICKED” 선택하여 함수를 만든다.

아래와 같이 프로그램 하면 vector 값에 따라 출력이 나간다.

void CVisualDigOutChanDlg::OnBnClickedButton1()

{

              // TODO: 여기에컨트롤알림처리기코드를추가합니다.

              CNiDAQmxTask myTask;

              CNiBoolVector vector(8);

              vector[0]=0;vector[1]=0;vector[2]=0;vector[3]=0;

              vector[4]=1;vector[5]=1;vector[6]=1;vector[7]=1;

              myTask.DOChannels.CreateChannel("Dev1/port0/line0:7", "",DAQmxOneChannelForAllLines);

              CNiDAQmxDigitalSingleChannelWriter writer(myTask.Stream);

              writer.WriteSingleSampleMultiLine(true, vector);

}

 

arrow01c처음

   

For 문을 사용하여 1 간격 DIO0~7까지을 차례로 10번을 점등하는 프로그램을 완성하시오.

void CVisualDigOutChanDlg::OnBnClickedButton1()

{

              // TODO: 여기에컨트롤알림처리기코드를추가합니다.

              CNiDAQmxTask myTask;

              CNiBoolVector vector(8);

              vector[0]=1;vector[1]=1;vector[2]=1;vector[3]=1;

              vector[4]=1;vector[5]=1;vector[6]=1;vector[7]=1;

              myTask.DOChannels.CreateChannel("Dev1/port0/line0:7", "",DAQmxOneChannelForAllLines);

              for(int i=0;i<8;i++) {

                             vector[i]=0;

                             CNiDAQmxDigitalSingleChannelWriter writer(myTask.Stream);

                             writer.WriteSingleSampleMultiLine(true, vector);

                             Sleep(500);

              }

}