Я беру показания напряжения и преобразую их в показания давления. Это мой первый реальный опыт работы с C, поэтому мой код грязный, но до сих пор работал нормально. Проблема, с которой я сталкиваюсь, заключается в том, чтобы программа подсчитывала количество показаний (хранимых в данных массива [i]), которые падают между минимальным и максимальным желаемым значением.Значения доступа во внешнем генераторе
Вот код, Sum2 и количество областей, которые дают мне проблемы. Sum2 добавляет 999 значений вместо фильтрации и подсчета всегда приводит к 998, когда он должен быть ближе к 500
РЕДАКТИРОВАТЬ:
показания в данных [I] находятся под напряжением, и я работает с давлением. Моя калибровочную кривую Р = (V-2,9674) /. 404
//Voltage readings for NI USB-6009 built from the ground up
#include "stdafx.h"
#include "stdio.h"
#include "NIDAQmx.h"
#include "math.h"
#include "tdmwriter.h"
#include "fundtypes.h"
#include "platdefines.h"
#define DAQmxErrChk(functionCall) if(DAQmxFailed(error=(functionCall))) goto Error; else
int main(void)
{
int32 error = 0;
TaskHandle taskHandle = 0;
int32 read;
float64 data[1000], Sum=0, Average, Variance, Deviation=0, std_dev, min=0, max=0, num=0, avg=0, minP=0, maxP=0, avgP=0, avgP2=0, minP2=0, maxP2=0, minV=0, maxV=0, avgV=0, Sum2 = 0;
char errBuff[2048] = { '\0' };
int i, count = 0;
/*********************************************/
// DAQmx Configure Code
/*********************************************/
DAQmxErrChk(DAQmxCreateTask("Pressure Voltage\n", &taskHandle));
DAQmxErrChk(DAQmxCreateAIVoltageChan(taskHandle, "Dev1/ai0", "", DAQmx_Val_Cfg_Default, -10.0, 10.0, DAQmx_Val_Volts, NULL));
DAQmxErrChk(DAQmxCfgSampClkTiming(taskHandle, "", 100.0, DAQmx_Val_Rising, DAQmx_Val_FiniteSamps, 1000));
/*********************************************/
// DAQmx TDMS Configure Code
/*********************************************/
DAQmxErrChk(DAQmxConfigureLogging(taskHandle, "C:\\TestData\\LogFile.tdms", DAQmx_Val_LogAndRead, "ECS Test Data", DAQmx_Val_OpenOrCreate));
//DAQmxWriteAnalogF64(taskHandle,1000, 1 /*autoStart*/, -1 /*timeout*/, DAQmx_Val_GroupByScanNumber, data, 1000, NULL);
/*********************************************/
// DAQmx Start Code
/*********************************************/
DAQmxErrChk(DAQmxStartTask(taskHandle));
printf("Voltage due to Pressure:\n");
printf("\n");
printf("Recording Data...\n");
DAQmxErrChk(DAQmxWaitUntilTaskDone(taskHandle, 10.0));
/*********************************************/
// DAQmx Read Code
/*********************************************/
DAQmxErrChk(DAQmxReadAnalogF64(taskHandle, 1000, 10.0, DAQmx_Val_GroupByChannel, data, 1000, &read, NULL));
printf("Acquired %d points\n", (int)read);
/*********************************************/
//Display Values
/*********************************************/
printf("\n");
printf("values:\n");
printf("Voltage 1= %f\n",data[10]);
printf("Voltage 2= %f\n", data[100]);
printf("Voltage 3= %f\n", data[200]);
printf("Voltage 4= %f\n", data[300]);
printf("Voltage 5= %f\n", data[400]);
printf("Voltage 6= %f\n", data[500]);
printf("Voltage 7= %f\n", data[600]);
printf("Voltage 8= %f\n", data[700]);
printf("Voltage 9= %f\n", data[800]);
printf("Voltage 10= %f\n", data[900]);
printf("\n");
//for (int i = 1; i < 1000; i++) {
// printf("Voltage %i= %f\n",i, data[i]);
//}
//printf("\n");
/*********************************************/
//Average Values
/*********************************************/
for (i = 1; i < 999; ++i) {
Sum = Sum + data[i];
}
Average = (Sum/999);
printf("Average= %f\n", Average);
/*********************************************/
//Standard Deviation
/*********************************************/
for (i = 1; i < 999; ++i) {
Deviation = Deviation + pow((Average - data[i]), 2);
}
Variance = Deviation/999;
printf("Variance= %f\n", Variance);
std_dev = sqrt(Variance);
printf("Standard Deviation= %f\n", std_dev);
printf("\n");
/*********************************************/
//Min and Max Values
/*********************************************/
{
max = fmax(data[2], data[999]);
}
{
min = fmin(data[2], data[999]);
}
printf("Min: %f\n", min);
printf("Max: %f\n", max);
printf("Log File located in C:\\TestData. Please rename LogFile.tdms after testing\n");
printf("\n");
/*********************************************/
//Convert to Pressure Readings
/*********************************************/
printf("Pressure Readings (inches H2O):\n");
{
minP = (min - 2.9674)/.404;
maxP = (max - 2.9674)/.404;
avgP = (Average - 2.9674)/.404;
}
printf("Min Pressure: %f\n", minP);
printf("Max Pressure: %f\n", maxP);
printf("Average Pressure: %f\n", avgP);
printf("\n");
/*********************************************/
//New Voltage and Pressure Averages
/*********************************************/
{//target min and max pressure
minP2 = avgP - (avgP/10);
maxP2 = avgP + (avgP/10);
}
{//target min and max voltage
minV = (minP2*.404) + 2.9674;
maxV = (maxP2*.404) + 2.9674;
}
{//Sum of values in desired range
for (i = 1; i < 999; ++i) {
if (minV < data[i] && data[i] < maxV); { Sum2 = Sum2 + data[i]; }
}
}
{//Number of values in desired range
for (i = 1; i < 999; i++)
{
if (minV < data[i] && data[i] < maxV);
{
count++;
}
}
}
{//New average voltage
avgV = Sum2/count;
}
{//New average pressure
avgP2 = ((avgV - 2.9674)/.404);
}
printf("Adjusted Values:\n");
printf("Min P2= %f\n", minP2);
printf("Max P2= %f\n", maxP2);
printf("Min Voltage= %f\n", minV);
printf("Max Voltage= %f\n", maxV);
printf("Sum Voltage= %f\n", Sum2);
printf("Count= %d\n", count);
printf("AvgV= %f\n", avgV);
printf("AvgP= %f\n", avgP2);
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;
}
Вы должны исправить свой отступ, чтобы сделать его более читаемым. У вас также есть скобки, которые не требуются. Обязательно используйте пробелы, а не вкладки. – sabbahillel