Pid Position Controller Code
Pid Position Controller Code
#include <stdio.h>
#include <NIDAQmx.h>
#include <math.h>
#include <windows.h> // for timer
#define pi 3.14159265358979
int main(void)
{
LARGE_INTEGER frequency; // ticks per second
LARGE_INTEGER t1,t0; // ticks
double Time;
int32 error=0;
char errBuff[2048]={'\0'};
int i,j;
TaskHandle taskHandle=0;
uInt8 data[8]={0};
TaskHandle taskHandle1=0;
int32 read1[1000];
float64 data1[1000]={0};
DAQmxErrChk (DAQmxCreateTask("",&taskHandle1));
DAQmxErrChk
(DAQmxCreateCIAngEncoderChan(taskHandle1,"Dev3/ctr0","",DAQmx_Val_X4,0,0.0,DA
Qmx_Val_AHighBHigh,DAQmx_Val_Degrees,1000,0.0,""));
DAQmxErrChk
(DAQmxCfgSampClkTiming(taskHandle1,"/Dev3/PFI8",1000.0,DAQmx_Val_Rising,DAQmx
_Val_ContSamps,1000.0));
DAQmxErrChk (DAQmxStartTask(taskHandle));
DAQmxErrChk (DAQmxStartTask(taskHandle1));
QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter(&t0);
while(1){
QueryPerformanceCounter(&t1);
dt=Time-told; //delta t
d=10*sin(2*pi*0.25*Time); // desired mm
err=result-act;
sum=sum+err;
derror=err-eold;//change of error
ddd=err*0.6*0.058*2000+(0.058*0.6*0.2*sum*dt/0.02)+0.058*0.6*0.02*derror/((dt
)*8); //no of pulses or control signal
if(ddd>0)
{
data[1]=1;
dd=ddd;
}
else {
data[1]=0;
dd=-ddd;
}
for(i=1;i<=dd;i++)
{
if(i%2==1)
data[0]=0;
else
data[0]=1;
//write pulses
DAQmxErrChk
(DAQmxWriteDigitalLines(taskHandle,1,1,10.0,DAQmx_Val_GroupByChannel,data,NUL
L,NULL));
}
told=Time;
eold=err;
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;
}