📄 motor.c
字号:
case EVENT_TIMER_TICK:
////////////////////////
if(is_run)
{
DI_ReadPort(cardID,0,&left_led); //左限位
if(left_led & 0x0001)
{
SetCtrlVal(panelHandle,PANEL_LED_4,1);
SetCtrlVal(panelHandle,PANEL_LED_6,1);
AO_WriteChannel(cardID,0,2048); //停止
}
else
{
SetCtrlVal(panelHandle,PANEL_LED_4,0);
SetCtrlVal(panelHandle,PANEL_LED_6,0);
}
DI_ReadPort(cardID,1,&right_led); //右限位
if(right_led & 0x0002)
{
SetCtrlVal(panelHandle,PANEL_LED_5,1);
SetCtrlVal(panelHandle,PANEL_LED_6,1);
AO_WriteChannel(cardID,0,2048); //停止
}
else
{
SetCtrlVal(panelHandle,PANEL_LED_5,0);
SetCtrlVal(panelHandle,PANEL_LED_6,0);
}
/////////////////////
AI_VReadChannel(cardID,0,AD_U_5_V,&read);
//temp1=(temp1>>4)&0x0fff;
curPosition=read/5.0*16;
SetCtrlVal(panelHandle,PANEL_NUMERICSLIDE,curPosition);
distance=setPosition-curPosition;
}
///////////////////
//////////////////
//if(is_start && is_dc /*&& is_run*/) //dc motor
if(is_start && is_dc && is_run)
{
if(left_flag)
{
AO_WriteChannel(cardID,0,100);
}
else if(right_flag)
{
AO_WriteChannel(cardID,0,4000);
}
else if(1==method) /////////////查询控制
{
if(distance>0.3||distance<-0.3)
{
//distance=5;
volt_out=(unsigned short int)(distance/16*2047+2047);
SetCtrlVal(panelHandle,PANEL_TEST,distance);
//volt_out=(int)(-distance/16*2048+2048);
AO_WriteChannel(cardID,0,volt_out);
motor_volt=(volt_out-2048)*12.0/2048;
SetCtrlVal(panelHandle,PANEL_NUMERICSLIDE_3,motor_volt);
display();
SetCtrlVal(panelHandle,PANEL_TEST,volt_out);
//
}
else
{
AO_WriteChannel(cardID,0,2048);
}
}
//////////////////////
else if(2==method) //pid
{
e2=e1;
e1=e0;
e0=distance;
delt_u=a0*e0+a1*e1+a2*e2;
u1=u0+delt_u; //out
u0=u1;
u1=u1/60;
volt_out=(int)(u1*2047+2047);
if(volt_out>4095)
volt_out=4095;
if(volt_out<0)
volt_out=0;
AO_WriteChannel(cardID,0,volt_out);
motor_volt=(volt_out-2048)*12.0/2048;
SetCtrlVal(panelHandle,PANEL_NUMERICSLIDE_3,motor_volt);
display();
SetCtrlVal(panelHandle,PANEL_TEST,volt_out);
}
else if(3==method) //fuzzy
{
if(distance<=-3)
volt_out=2.5;
else if(distance>=3)
volt_out=-2.5;
else if(distance<=-1)
volt_out=1.5;
else if(distance>=1)
volt_out=-1.5;
else if(distance<=-0.5)
volt_out=1;
else if(distance>=0.5)
volt_out=-1;
else if(distance<=-0.2)
volt_out=0.5;
else if(distance>=0.2)
volt_out=-0.5;
else if(distance<=-0.1)
volt_out=0.2;
else if(distance>=-0.1)
volt_out=-0.2;
else
volt_out=0;
volt_out=(unsigned short int) ((volt_out+2.5)/5*4096);
AO_WriteChannel(cardID,0,volt_out);
SetCtrlVal(panelHandle,PANEL_TEST,volt_out);
display();
}
}
//////////////////////
/* if(is_start && !is_dc && is_run) //step motor
{
} */
//////////////////
break;
}
return 0;
}
int CVICALLBACK step_timer (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
unsigned short int s_temp1=0;
double s_curPosition=0;
double s_distance=0;
switch (event)
{
case EVENT_TIMER_TICK:
if(is_start && !is_dc && is_run) //step motor
{
/* AI_ReadChannel(cardID,0,AD_U_5_V,&s_temp1);
DI_ReadPort(cardID,0,&mask);
s_temp1=(s_temp1>>4)&0x0fff;
s_curPosition=temp1*16.0/4096;
SetCtrlVal(panelHandle,PANEL_NUMERICSLIDE,s_curPosition);
s_distance=setPosition-s_curPosition;
target=17-abs((int)s_distance);
count++; */
if(left_flag)
{
DO_WritePort(cardID,0,stepLeft[index] );
index++;
index%=8;
}
else if(right_flag)
{
DO_WritePort(cardID,0,stepRight[index]);
index++;
index%=8;
}
else if(distance>0.5) //left rotace
{
{
DO_WritePort(cardID,0,stepLeft[index] );
index++;
index%=8;
}
}
if(distance<-0.5) //right rotace
{
{
DO_WritePort(cardID,0,stepRight[index]);
index++;
index%=8;
}
}
if(distance>-0.5&&distance<0.5)
{
DO_WritePort(cardID,0,0xff0f );
}
if(dis_count%25==0)
{
display();
}
dis_count++;
}
if(is_start && is_run)
{
DI_ReadPort (cardID, 0, &inport);
impulse+=inport&0x0008;
SetCtrlVal(panelHandle,PANEL_LED_7,inport&0x008);
}
break;
}
return 0;
}
int CVICALLBACK run_motor (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal(panelHandle,PANEL_TOGGLEBUTTON_2,&is_start);
//is_start=1;
//SetCtrlVal(panelHandle,PANEL_TEST,(double)is_start);
if(is_start==0)
{
left_flag=0;
right_flag=0;
//DO_WritePort(cardID,0,0x002); //急停
AO_WriteChannel(cardID,0,2048);
DO_WritePort(cardID,0,0x001);
}
break;
}
return 0;
}
int CVICALLBACK query (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
method=1;
ClearStripChart(panelHandle,PANEL_STRIPCHART);
ClearStripChart(panelHandle,PANEL_STRIPCHART_2);
SetCtrlVal(panelHandle,PANEL_RADIOBUTTON_3,1);
SetCtrlVal(panelHandle,PANEL_RADIOBUTTON_4,0);
SetCtrlVal(panelHandle,PANEL_RADIOBUTTON_5,0);
SetCtrlAttribute(panelHandle,PANEL_NUMERIC,ATTR_DIMMED,1);
SetCtrlAttribute(panelHandle,PANEL_NUMERIC_2,ATTR_DIMMED,1);
SetCtrlAttribute(panelHandle,PANEL_NUMERIC_3,ATTR_DIMMED,1);
break;
}
return 0;
}
int CVICALLBACK pidcontrol (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
method=2;
ClearStripChart(panelHandle,PANEL_STRIPCHART);
ClearStripChart(panelHandle,PANEL_STRIPCHART_2);
SetCtrlVal(panelHandle,PANEL_RADIOBUTTON_3,0);
SetCtrlVal(panelHandle,PANEL_RADIOBUTTON_4,1);
SetCtrlVal(panelHandle,PANEL_RADIOBUTTON_5,0);
SetCtrlAttribute(panelHandle,PANEL_NUMERIC,ATTR_DIMMED,0);
SetCtrlAttribute(panelHandle,PANEL_NUMERIC_2,ATTR_DIMMED,0);
SetCtrlAttribute(panelHandle,PANEL_NUMERIC_3,ATTR_DIMMED,0);
break;
}
return 0;
}
int CVICALLBACK fuzzyControl (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
method=3;
ClearStripChart(panelHandle,PANEL_STRIPCHART);
ClearStripChart(panelHandle,PANEL_STRIPCHART_2);
SetCtrlVal(panelHandle,PANEL_RADIOBUTTON_3,0);
SetCtrlVal(panelHandle,PANEL_RADIOBUTTON_4,0);
SetCtrlVal(panelHandle,PANEL_RADIOBUTTON_5,1);
SetCtrlAttribute(panelHandle,PANEL_NUMERIC,ATTR_DIMMED,1);
SetCtrlAttribute(panelHandle,PANEL_NUMERIC_2,ATTR_DIMMED,1);
SetCtrlAttribute(panelHandle,PANEL_NUMERIC_3,ATTR_DIMMED,1);
break;
}
return 0;
}
int CVICALLBACK setKp (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
break;
case EVENT_VAL_CHANGED:
GetCtrlVal(panelHandle,PANEL_NUMERIC,&kp);
pid_compute();
break;
}
return 0;
}
int CVICALLBACK setKi (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
break;
case EVENT_VAL_CHANGED:
GetCtrlVal(panelHandle,PANEL_NUMERIC_2,&ki);
pid_compute();
break;
}
return 0;
}
int CVICALLBACK setKd (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
break;
case EVENT_VAL_CHANGED:
GetCtrlVal(panelHandle,PANEL_NUMERIC_3,&kd);
pid_compute();
break;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -