NI USB 6211 Чтение аналогового входа напряжения
Я пытаюсь прочитать вход напряжения в моем NI USB-6211 через программу C. Для этого я безуспешно пытался использовать некоторые примеры программ, поставляемых с установленной программой. Я посмотрел на документацию, но, если честно, она совсем не помогает.
Это код, который я адаптировал. (Имеется некоторая проверка ошибок, а также запрашивается ввод...)
/*********************************************************************
*
* ANSI C Example program:
* Acq-IntClk.c
*
* Example Category:
* AI
*
* Description:
* This example demonstrates how to acquire a finite amount of data
* using the DAQ device's internal clock.
*
* Instructions for Running:
* 1. Select the physical channel to correspond to where your
* signal is input on the DAQ device.
* 2. Enter the minimum and maximum voltages.
* Note: For better accuracy try to match the input range to the
* expected voltage level of the measured signal.
* 3. Select the number of samples to acquire.
* 4. Set the rate of the acquisition.
* Note: The rate should be AT LEAST twice as fast as the maximum
* frequency component of the signal being acquired.
*
* Steps:
* 1. Create a task.
* 2. Create an analog input voltage channel.
* 3. Set the rate for the sample clock. Additionally, define the
* sample mode to be finite and set the number of samples to be
* acquired per channel.
* 4. Call the Start function to start the acquisition.
* 5. Read all of the waveform data.
* 6. Call the Clear Task function to clear the task.
* 7. Display an error if any.
*
* I/O Connections Overview:
* Make sure your signal input terminal matches the Physical
* Channel I/O Control. For further connection information, refer
* to your hardware reference manual.
*
*********************************************************************/
#include <stdio.h>
#include <NIDAQmx.h>
#include <string.h>
#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else
int main(void)
{
int32 error=0;
int32 amount;
int32 i;
TaskHandle taskHandle=0;
int32 read;
float64 data[1000];
char errBuff[2048]={'\0'};
char c = 64;
/*********************************************/
// DAQmx Configure Code
/*********************************************/
printf("Please enter the amount of voltage checks you wish to run.\n");
//scanf("%d", &amount);
while(scanf("%d%c", &amount, &c) !=2)
{
getchar();
puts("Please enter a number.");
}
for (i = 0; i < amount; i++)
{
DAQmxErrChk (DAQmxCreateTask("",&taskHandle));
DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,"Dev1/ai0","",DAQmx_Val_Cfg_Default,1.0,10.0,DAQmx_Val_Volts,NULL));
DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",10000.0,DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,1000));
/*********************************************/
// DAQmx Start Code
/*********************************************/
DAQmxErrChk (DAQmxStartTask(taskHandle));
/*********************************************/
// DAQmx Read Code
/*********************************************/
DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByChannel,data,1000,&read,NULL));
printf("Acquired %d points\n",read);
Error:
if( DAQmxFailed(error) )
DAQmxGetExtendedErrorInfo(errBuff,2048);
if( taskHandle!=0 )
{
/*********************************************/
// DAQmx Stop Code
/*********************************************/
DAQmxStopTask(taskHandle);
DAQmxClearTask(taskHandle);
printf("Updating... ");
}
}
if(i=amount)
{
printf("End of Program, press the Enter key to quit\n");
getchar();
if( DAQmxFailed(error) )
printf("DAQmx Error: %s\n",errBuff);
}
return 0;
}
Все, что делает код в данный момент, это распечатывает число 1000, сколько раз я тоже его спрашиваю. Я уверен, что это происходит из этого кода: float64 data[1000];
, Кто-нибудь знает, как получить постоянное напряжение чтения? Даже если это просто длинная строка чисел, которые не были отформатированы (я могу понять это).
Спасибо
1 ответ
Число 1000
это отображается из второго и седьмого параметров в вашем вызове DAQmxReadAnalogF64()
, Второй параметр сообщает, сколько выборок для каждого канала вы хотите взять. Седьмой параметр (&read
) указывает, где хранить результат того, сколько сэмплов на канал было фактически взято. Итак, вы попросили 1000 и получили 1000.
В тот момент, когда ваша программа не распечатывает прочитанные данные. Вызов DAQmxReadAnalogF64()
выполняет сбор данных и сохраняет их в массиве, указанном в пятом параметре (в вашем случае data
).
После этого звонка вы можете распечатать ваши напряжения, используя что-то вроде:
for (int i = 0; i < read; i++)
{
printf("Data point %d has value %f\n",i, data[i]);
}
Хотя это, очевидно, напечатало бы все 1000 значений, что, вероятно, не то, что вы хотите.
Если вы собираетесь писать код для библиотек NI, то вам следует обратиться к справочной справке NI-DAQmx C для объяснения функций и их параметров. У них много руководств, и их легко пропустить. Примеры, как правило, довольно просты для адаптации.