13,11 → 13,13 |
//stepping motor busheng --> declaration 1step=1.8degrees |
//experimantally: full rotation = 3200 steps (on setting 1step/mm ($100)) |
|
|
// PORTS |
int pCOM1 = 6; |
int pCOM2 = 7; |
char GRBL[10] = "COM8"; //BE CAREFUL, IT'S IMPORTANT TO KNOW THE NAME OF THE PORTS |
char ADC[10] = "COM7"; |
|
int run, graph, f_t, ji, vi, run1; |
int run, graph, chart, ji, vi, run1; |
int left_1, right_1; |
|
static int panel, tfID, tfID1; |
38,7 → 40,7 |
void initialize() |
{ |
// Open grbl serial port //("COM6",115200) |
OpenComConfig (pCOM1, "COM6", 115200, 0, 8, 1, 512, 512); |
OpenComConfig (pCOM1, GRBL, 115200, 0, 8, 1, 512, 512); |
|
/* Turn off Hardware handshaking (loopback test will not function with it on) */ |
SetCTSMode (pCOM1, LWRS_HWHANDSHAKE_OFF); |
121,8 → 123,8 |
|
void initialize_voltage() |
{ |
// Open serial port for photodetector - reading is on chanel A1 |
OpenComConfig (pCOM2, "COM7", 115200, 0, 8, 1, 512, 512); |
// Open serial port for ADC & photodetector - reading is on chanel A1 |
OpenComConfig (pCOM2, ADC, 115200, 0, 8, 1, 512, 512); |
SetCTSMode (pCOM2, LWRS_HWHANDSHAKE_OFF); |
|
Delay(0.5); |
295,7 → 297,6 |
graph = PlotY (panel, p1_VOLTAGE_GRAPH, &volt_g[0], num_points, VAL_DOUBLE, |
VAL_CONNECTED_POINTS, VAL_SIMPLE_DOT, VAL_SOLID, 1, VAL_WHITE); |
ji = num_points; |
f_t = 1; |
} |
|
FlushInQ (pCOM1); |
310,46 → 311,24 |
|
static int CVICALLBACK voltage_run(void *functionData) |
{ |
int fix_range; |
double ymin,ymax,xmin,xmax; |
double voltA,voltB=0; |
int time = 0; |
//double volt1[TEXT_LENGTH]; |
double voltA; |
|
initialize_voltage(); |
|
int chart = NewCtrl (panel, CTRL_GRAPH_LS, "RUN VOLTAGE", 100, 15); |
chart = NewCtrl (panel, CTRL_STRIP_CHART_LS, "RUN VOLTAGE", 100, 15); |
SetCtrlAttribute(panel, chart, ATTR_HEIGHT, 600); |
SetCtrlAttribute(panel, chart, ATTR_WIDTH , 1300); |
SetAxisRange(panel, chart, VAL_NO_CHANGE, 0, 0, VAL_AUTOSCALE, 0, 0); |
|
while(1) |
{ |
// Range |
GetCtrlVal(panel, p1_RANGE, &fix_range); |
if(fix_range) |
{ |
GetAxisRange (panel, chart, VAL_MANUAL, &xmin, &xmax, VAL_MANUAL, &ymin, &ymax); |
if (ymax<=2) SetAxisRange (panel, chart, VAL_NO_CHANGE, 0, 0, VAL_MANUAL, 0, 2); |
else SetAxisRange (panel, chart, VAL_NO_CHANGE, 0, 0, VAL_MANUAL, 0, 5); |
} |
else SetAxisRange (panel, chart, VAL_NO_CHANGE, 0, 0, VAL_AUTOSCALE, 0, 0); |
|
//volt1[time] = read_voltage(); |
voltA = read_voltage(); |
PlotStripChartPoint (panel, chart, voltA); |
|
PlotPoint(panel, chart, time, voltA, VAL_SOLID_SQUARE, VAL_WHITE); |
if (time>0) PlotLine(panel, chart, time, voltA, time-1, voltB, VAL_WHITE); |
if (time>50) SetAxisRange (panel, chart, VAL_MANUAL, time-50, time, VAL_NO_CHANGE, 0, 0); |
|
SetCtrlVal(panel, p1_VOLTAGE, voltA); |
|
Delay(0.05); |
time++; |
|
voltB = voltA; |
|
//volt1[time] = voltA; |
|
FlushInQ (pCOM2); |
|
if (vi == 0) break; |
356,13 → 335,8 |
} |
|
DiscardCtrl (panel, chart); |
chart = 0; |
|
// After some time (~4000 points) it becomes slower in writing out data... |
|
//if (graph!=0) DeleteGraphPlot (panel, p1_VOLTAGE_GRAPH, graph, VAL_DELAYED_DRAW); |
//graph = PlotY (panel, p1_VOLTAGE_GRAPH, &volt1[0], time+1, VAL_DOUBLE, |
// VAL_CONNECTED_POINTS, VAL_SIMPLE_DOT, VAL_SOLID, 1, VAL_WHITE); |
|
return 0; |
} |
|
394,7 → 368,7 |
bytes_read0 = ComRd (pCOM1, read_data0, strLen); |
//printf(" : %s", read_data0); |
|
printf("Stop run1\n"); |
//printf("Stop run1\n"); |
|
break; |
} |
492,6 → 466,7 |
const int ii = ji; |
double fourier_t[ii], fourier_ti[ii]; |
char window_fun; |
double voltmax=0, voltmin=5, voltavg; |
|
switch (event) |
{ |
501,16 → 476,22 |
{ |
fourier_t[i] = volt_g[i]; |
fourier_ti[i] = 0; |
|
if (fourier_t[i]>voltmax) voltmax = fourier_t[i]; |
if (fourier_t[i]<voltmin) voltmin = fourier_t[i]; |
} |
|
voltavg = (voltmin+voltmax)/2.0; |
GetCtrlVal(panel, p1_WIN_FUN, &window_fun); |
//printf("window_fun = %d\n", window_fun); |
//printf("max %f, min %f, avg %f\n", voltmax, voltmin, voltavg); |
if (window_fun!=0) |
{ |
//do something with window functions |
if(window_fun==1) for(int i=0; i<ii; i++) fourier_t[i] = (2*fourier_t[i]); |
if(window_fun==2) for(int i=0; i<ii; i++) fourier_t[i] = sin(fourier_t[i]); |
YGraphPopup ("HOW volt_g LOOKS NOW", fourier_t, ii, VAL_DOUBLE); |
//do something with window functions (N=ii) |
if(window_fun==1) for(int i=0; i<ii; i++) fourier_t[i] = (fourier_t[i] - voltavg)*(1 - fabs((i-(ii/2.0))/(ii/2))) + voltavg; //Bartlett |
if(window_fun==2) for(int i=0; i<ii; i++) fourier_t[i] = (fourier_t[i] - voltavg)*(1 - ((i-(ii/2.0))/(ii/2))*((i-(ii/2.0))/(ii/2))) + voltavg; //Welch |
if(window_fun==3) for(int i=0; i<ii; i++) fourier_t[i] = (fourier_t[i] - voltavg)*(0.5*(1 - cos(2*3.14159265359*i/ii))) + voltavg; //Hann |
YGraphPopup ("HOW voltage LOOKS NOW", fourier_t, ii, VAL_DOUBLE); |
} |
|
FFT (fourier_t, fourier_ti, ii); |
519,37 → 500,46 |
|
YGraphPopup ("FOURIER", fourier_t, ii/2+1, VAL_DOUBLE); |
|
if (f_t == 1) |
{ |
|
FILE *fp,*fp1; |
|
//file name has to have file extension |
char fname[50]; |
GetCtrlVal(panel, p1_F_NAME, fname); |
fp = fopen(fname, "w"); |
|
char fname0[100] = "C:/Users/"; |
char *name; |
name = getenv("USERNAME"); |
strcat(fname0,name); |
strcat(fname0,"/Desktop/"); |
//char fname0[100] = "C:/Users/Student/Desktop/"; //Alternative way |
strcat(fname0,fname); |
fp = fopen(fname0, "w"); |
|
char fname1[50]; |
GetCtrlVal(panel, p1_F_NAME1, fname1); |
fp1 = fopen(fname1, "w"); |
char fname10[100] = "C:/Users/"; |
strcat(fname10,name); |
strcat(fname10,"/Desktop/"); |
strcat(fname10,fname1); |
fp1 = fopen(fname10, "w"); |
|
fprintf(fp, "step\tvolt_g\n"); |
fprintf(fp, "step\tvoltage\n"); |
for(int i=0; i<ii; i++) |
{ |
fprintf(fp, "%d\t%lf\n", i+1, volt_g[i]); |
} |
|
fprintf(fp1, "step\tfourier_t\n"); |
fprintf(fp1, "step\tfourier\n"); |
for(int i=0; i<ii/2+1; i++) |
{ |
fprintf(fp1, "%d\t%lf\n", i, fourier_t[i]); //0th component is from DC - background? |
fprintf(fp1, "%d\t%lf\n", i, fourier_t[i]); //0th component is from DC - background? YES |
} |
|
fclose(fp); |
fclose(fp1); |
printf("Files %s and %s created.\n", fname, fname1); |
} |
|
f_t = 0; //so that we make only one file |
break; |
|
} |
565,6 → 555,7 |
double ret[ki], ret1[ki]; |
double val = 3.14159265/180; |
int x1, x2, a1, a2; |
char window_fun; |
|
switch (event) |
{ |
575,11 → 566,21 |
GetCtrlVal(panel, p1_AMPL1, &a1); |
GetCtrlVal(panel, p1_AMPL2, &a2); |
|
GetCtrlVal(panel, p1_WIN_FUN, &window_fun); |
//printf("window_fun = %d\n", window_fun); |
|
for (int i=0; i<ki; i++) |
{ |
ret[i] = a1*sin(x1*i*val)+a2*sin(x2*i*val); |
ret1[i] = 0; |
} |
if (window_fun!=0) |
{ |
//do something with window functions (N=ki) |
if(window_fun==1) for(int i=0; i<ki; i++) ret[i] = ret[i]*(1 - fabs((i-(ki/2.0))/(ki/2))); //Bartlett |
if(window_fun==2) for(int i=0; i<ki; i++) ret[i] = ret[i]*(1 - ((i-(ki/2.0))/(ki/2))*((i-(ki/2.0))/(ki/2))); //Welch |
if(window_fun==3) for(int i=0; i<ki; i++) ret[i] = ret[i]*(0.5*(1 - cos(2*3.14159265359*i/ki))); //Hann |
} |
YGraphPopup ("example graph", ret, ki, VAL_DOUBLE); |
FFT (ret, ret1, ki); |
for (int i=0; i<ki; i++) ret[i] = fabs(ret[i]); |
634,8 → 635,20 |
case EVENT_COMMIT: |
|
GetCtrlVal(panel, p1_RANGE, &fix_range); |
|
if(chart) |
{ |
if(fix_range) |
{ |
GetAxisRange (panel, chart, VAL_MANUAL, &xmin, &xmax, VAL_MANUAL, &ymin, &ymax); |
if (ymax<=2) SetAxisRange (panel, chart, VAL_NO_CHANGE, 0, 0, VAL_MANUAL, 0, 2); |
else SetAxisRange (panel, chart, VAL_NO_CHANGE, 0, 0, VAL_MANUAL, 0, 5); |
} |
else SetAxisRange(panel, chart, VAL_NO_CHANGE, 0, 0, VAL_AUTOSCALE, 0, 0); |
} |
|
if(fix_range) |
{ |
GetAxisRange (panel, p1_VOLTAGE_GRAPH, VAL_MANUAL, &xmin, &xmax, VAL_MANUAL, &ymin, &ymax); |
if (ymax<=2) SetAxisRange (panel, p1_VOLTAGE_GRAPH, VAL_NO_CHANGE, 0, 0, VAL_MANUAL, 0, 2); |
else SetAxisRange (panel, p1_VOLTAGE_GRAPH, VAL_NO_CHANGE, 0, 0, VAL_MANUAL, 0, 5); |
705,6 → 718,23 |
if (run1 == 0) break; |
run1 = 0; |
|
if (run1 == 0) //Additionally here just to be sure |
{ |
ComWrt (pCOM1, "!\n", 2); //stops grbl |
|
Delay(0.01); |
|
ComWrt (pCOM1, "~\n", 2); //releases grbl |
|
Delay(0.01); |
|
int strLen = GetInQLen (pCOM1); |
bytes_read0 = ComRd (pCOM1, read_data0, strLen); |
//printf(" : %s", read_data0); |
|
printf("Stop run1\n"); |
} |
|
CmtWaitForThreadPoolFunctionCompletion (poolHandle, tfID1, |
OPT_TP_PROCESS_EVENTS_WHILE_WAITING); |
CmtReleaseThreadPoolFunctionID (poolHandle, tfID1); |