⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 motor.c

📁 labview开发的智能仪器试验
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -