Multifunction DAQ

cancel
Showing results for 
Search instead for 
Did you mean: 

Want to know to use counter pulse for sampling of analog input/output - PCI-6111 with DAQmx 9.4

I want to use counter pulse which uses external source into PFI8 for analog input/output. I am using PCI-6111 and DAQmx 9.4.

With Traditional DAQ 7.4.4, the following code could what I want.

 

	iStatus = Select_Signal (m_deviceNumber, ND_RTSI_0, ND_GPCTR0_OUTPUT, ND_LOW_TO_HIGH);
	iStatus = Select_Signal (m_deviceNumber, ND_IN_SCAN_START, ND_RTSI_0, ND_LOW_TO_HIGH);

	iStatus = GPCTR_Control(m_deviceNumber, ND_COUNTER_0, ND_RESET);
	iStatus = GPCTR_Set_Application (m_deviceNumber, ND_COUNTER_0, ND_PULSE_TRAIN_GNR);
	iStatus = GPCTR_Change_Parameter (m_deviceNumber, ND_COUNTER_0, ND_SOURCE, ND_PFI_8);
	iStatus = GPCTR_Change_Parameter(m_deviceNumber, ND_COUNTER_0, ND_COUNT_1, ulLOWcount);
	iStatus = GPCTR_Change_Parameter(m_deviceNumber, ND_COUNTER_0, ND_COUNT_2, ulHIGHcount);
	iStatus = GPCTR_Control(m_deviceNumber, ND_COUNTER_0, ND_PREPARE);

	iStatus = Timeout_Config (m_deviceNumber, timeout); 

	iStatus = WFM_Group_Control (m_deviceNumber, 1, 0);
	iStatus = AO_VWrite (m_deviceNumber, ANALOG_OUTPUT_CHAN, 0.0);

	iStatus = Select_Signal (m_deviceNumber, ND_OUT_UPDATE, ND_RTSI_0, ND_LOW_TO_HIGH);
	iStatus = WFM_Load (m_deviceNumber, 1, chanVect, dataArray, iNumPoints, 1, 0);
	iStatus = WFM_ClockRate (m_deviceNumber, 1, 0, 0, 1, 1);
	iStatus = WFM_Group_Control (m_deviceNumber, 1, 1);

iStatus = DAQ_Start (m_deviceNumber, ANALOG_INPUT_CHAN, range, collectionBuffer, iNumDataPoints, 0, 1);
iStatus = GPCTR_Control(m_deviceNumber, ND_COUNTER_0, ND_ARM);
	iStatus = DAQ_Check (m_deviceNumber, &daqStopped, &retrieved);
	while (daqStopped !=1 && iStatus ==0)
	{
		iStatus = DAQ_Check (m_deviceNumber, &daqStopped, &retrieved);
		Sleep(100);
	} 
iStatus = GPCTR_Control(m_deviceNumber, ND_COUNTER_0, ND_DISARM);
	iStatus = DAQ_VScale (m_deviceNumber, ANALOG_INPUT_CHAN, range, externalGain, 0, iNumDataPoints, collectionBuffer, voltArray);
		//Start another buffer data collection if needed
		iStatus = DAQ_Clear (m_deviceNumber);



 With DAQmx, I changed the code as follows:

	iStatus = DAQmxConnectTerms("/Dev1/Ctr0InternalOutput", "/Dev1/RTSI0", DAQmx_Val_DoNotInvertPolarity);

	iStatus = DAQmxCreateTask("", &inTaskHandle);
	iStatus = DAQmxCreateTask("", &outTaskHandle);
	iStatus = DAQmxCreateTask("", &counterTaskHandle);

	iStatus = DAQmxCreateCOPulseChanTicks(
		counterTaskHandle,
		"Dev1/ctr0",
		"",
		"/Dev1/PFI8",
		DAQmx_Val_Low,
		0,
		iLOWcount,
		iHIGHcount);

	iStatus = DAQmxCreateAOVoltageChan(
		inTaskHandle, 
		"/Dev1/ao0", 
		"", 
		-10.0, 
		10.0, 
		DAQmx_Val_Volts, NULL);
	
	// write initial value of 0 to the output so we have the same starting state
	iStatus = DAQmxWriteAnalogScalarF64(
		outTaskHandle, 
		false, 
		timeout, 
		0.0, 
		NULL
	);

	iStatus = DAQmxCfgSampClkTiming(
		outTaskHandle, 
		"/Dev1/RTSI0", 
		1, /* arbitrary with external clock */
		DAQmx_Val_Rising, 
		DAQmx_Val_ContSamps, 
		1000 /* automatically determined by sample interval */
		);

	iStatus = DAQmxWriteBinaryI16(
		outTaskHandle,
		iNumPoints,
		true,			/* Start automatically */
		timeout,
		DAQmx_Val_GroupByChannel,
		dataArray,
		NULL,
		NULL);

	iStatus = DAQmxCreateAIVoltageChan(
		inTaskHandle, 
		"Dev1/ai0", 
		"", 
		DAQmx_Val_Cfg_Default,	
		- cdRangeMaximums[range], 
		cdRangeMaximums[range], 
		DAQmx_Val_Volts, NULL);

	iStatus = DAQmxCfgSampClkTiming(
		inTaskHandle,		// task handle
		"/Dev1/RTSI0",		// clock source
		1.0,	// sampling frequency (ignored for external clock)
		DAQmx_Val_Rising,	// sampling timing
		DAQmx_Val_FiniteSamps,	// finite samples
		iNumDataPoints);	// number of samples

	iStatus = DAQmxStartTask(inTaskHandle);
	// Start Clock
	iStatus = DAQmxStartTask(counterTaskHandle);

	iStatus = DAQmxReadBinaryI16(
		inTaskHandle,		// task handle
		iNumDataPoints,		// number of samples
		timeout,		// timeout
		true,			// Fill Mode
		buffer1,		// output buffer
		iNumDataPoints,		// array size
		&actualDataPoints,	// actual data points
		NULL			// reserved in future
		);

 I am expecting RTSI0 is connected to counter pulse output and it is used for sampling. However, DAQmxWriteBinaryI16 and DAQmxReadBinaryI16 don't work with timeout error (-200284).

It seems that RTSI0 does not any clock pulses. Does anyone let me know what I am wrong?

 

Thanks,

Neppie

0 Kudos
Message 1 of 1
(2,743 Views)