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

📄 pid.c.bak

📁 基于485的51单片机多机通讯程序
💻 BAK
📖 第 1 页 / 共 3 页
字号:
	p_b=~p_b;
	if(p_b==1)					//峰值
	{
		rb_sample_num=r_sample_num;
		r_sample_num=rp_sample_num;
		rb_num=temp_rot_num;
		temp_rot_num=rp_num;
		if(rot_ok==1&&K21==ON)
			PWM0=temp_rot_vp;
		if(wire_ok==1&&WIRE==ON&&K31==ON)
			PWM1=temp_wire_vp;
		CTCON=CTCON|0X80;			//CT3捕捉上升沿
	}
	else
	{
		if(rot_ok==1&&K21==ON)//&&r_slope_ok==1)
			PWM0=temp_rot_vb;
		if(wire_ok==1&&WIRE==ON&&K31==ON)//&&w_slope_ok==1)
			PWM1=temp_wire_vb;
		CTCON=CTCON|0X40;			//CT3捕捉下降沿
	}
	IEN1=IEN1|0X08;					//CT3
}

void CM0_INT (void) interrupt 11			//送丝速度变化时间/抽丝时间
{
	CMI0=0;
	c_cm0++;
	if(retract==1)
	{
		if(c_cm0==n_cm0)
		{
			IEN1=IEN1&0XEF;			//CM0
			PWM1=0;
			wire_enable=0;
			retract_ok=1;
			c_cm0=0;
		}
		CML0=TML2+0X50;			//100ms
		if(CML0<TML2)
			CMH0=TMH2+1+0XC3;
		else
			CMH0=TMH2+0XC3;		
	}
	else
	{
		if(c_cm0==n_cm0)
		{
			IEN1=IEN1&0xEF;			//CM0
			if(temp_wire_vp<wire_vp)
			{
					if(temp_wire_vp+1==wire_vp)
						temp_wire_vp=wire_vp;
					else
						temp_wire_vp=temp_wire_vp+1;
			}

			if(temp_wire_vp>wire_vp)
			{
					if(temp_wire_vp==wire_vp+1)
						temp_wire_vp=wire_vp;
					else
						temp_wire_vp=temp_wire_vp-1;
			}
			if(K31==ON)
			{
				if(temp_wire_vb<wire_vb)
				{
						if(temp_wire_vb+1==wire_vb)
							temp_wire_vb=wire_vb;
						else
							temp_wire_vb=temp_wire_vb+1;
				}
				if(temp_wire_vb>wire_vb)
				{
						if(temp_wire_vb==wire_vb+1)
							temp_wire_vb=wire_vb;
						else
							temp_wire_vb=temp_wire_vb-1;
				}
			}
			c_cm0=0;
			if(K31==OFF)
			{
				PWM1=temp_wire_vp;
				if(temp_wire_vp==wire_vp)
				{
					if(wire_ok==0)
						wire_ok=1;
					else
						w_slope_ok=1;
				}
				else
					IEN1=IEN1|0x10;		//CM0
			}
			else
			{
				if(temp_wire_vp==wire_vp&&temp_wire_vb==wire_vb)
				{
					PWM1=temp_wire_vb;
					if(wire_ok==0)
						wire_ok=1;
					else
						w_slope_ok=1;
				}
				else
					IEN1=IEN1|0x10;		//CM0
			}

		}
		CML0=TML2+0xC8;
		if(CML0<TML2)
			CMH0=TMH2+1+0X00;
		else
			CMH0=TMH2+0X00;
	}
}

void CM1_INT (void) interrupt 12			//旋转速度变化
{
	CMI1=0;
	if(rot_pid_ok==1)
	{
		new_rot_num=rot_num;
		rot_num=0;
			r_sample_num++;
			switch(r_sample_num)
			{
				case 1:	{
						temp_rot_num[r_sample_num-1]=new_rot_num;
						average_r_num=new_rot_num+average_r_num;
						new_rot_num=0;
					}break;
				case 2:	{
						if(new_rot_num<=temp_rot_num[r_sample_num-2])
						{
							temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
							temp_rot_num[r_sample_num-2]=new_rot_num;
						}
						else
							temp_rot_num[r_sample_num-1]=new_rot_num;
						average_r_num=new_rot_num+average_r_num;
						new_rot_num=0;
					}break;
				case 3:	{
						if(new_rot_num<=temp_rot_num[r_sample_num-3])
						{
							temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
							temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
							temp_rot_num[r_sample_num-3]=new_rot_num;
						}
						else if(new_rot_num<=temp_rot_num[r_sample_num-2])
						{
							temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
							temp_rot_num[r_sample_num-2]=new_rot_num;
						}
						else
							temp_rot_num[r_sample_num-1]=new_rot_num;
						average_r_num=new_rot_num+average_r_num;
						new_rot_num=0;
					}break;
				case 4:	{
						if(new_rot_num<=temp_rot_num[r_sample_num-4])
						{
							temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
							temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
							temp_rot_num[r_sample_num-3]=temp_rot_num[r_sample_num-4];
							temp_rot_num[r_sample_num-4]=new_rot_num;
						}
						else if(new_rot_num<=temp_rot_num[r_sample_num-3])
						{
							temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
							temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
							temp_rot_num[r_sample_num-3]=new_rot_num;
						}
						else if(new_rot_num<=temp_rot_num[r_sample_num-2])
						{
							temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
							temp_rot_num[r_sample_num-2]=new_rot_num;
						}
						else
							temp_rot_num[r_sample_num-1]=new_rot_num;
						average_r_num=new_rot_num+average_r_num;
						new_rot_num=0;
					}break;
				case 5:	{
						if(new_rot_num<=temp_rot_num[r_sample_num-5])
						{
							temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
							temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
							temp_rot_num[r_sample_num-3]=temp_rot_num[r_sample_num-4];
							temp_rot_num[r_sample_num-4]=temp_rot_num[r_sample_num-5];
							temp_rot_num[r_sample_num-5]=new_rot_num;
						}
						else if(new_rot_num<=temp_rot_num[r_sample_num-4])
						{
							temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
							temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
							temp_rot_num[r_sample_num-3]=temp_rot_num[r_sample_num-4];
							temp_rot_num[r_sample_num-4]=new_rot_num;
						}
						else if(new_rot_num<=temp_rot_num[r_sample_num-3])
						{
							temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
							temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
							temp_rot_num[r_sample_num-3]=new_rot_num;
						}
						else if(new_rot_num<=temp_rot_num[r_sample_num-2])
						{
							temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
							temp_rot_num[r_sample_num-2]=new_rot_num;
						}
						else
							temp_rot_num[r_sample_num-1]=new_rot_num;
						average_r_num=new_rot_num+average_r_num;
						new_rot_num=0;
					}break;
				case 6:	{
						if(new_rot_num<=temp_rot_num[r_sample_num-6])
						{
							temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
							temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
							temp_rot_num[r_sample_num-3]=temp_rot_num[r_sample_num-4];
							temp_rot_num[r_sample_num-4]=temp_rot_num[r_sample_num-5];
							temp_rot_num[r_sample_num-5]=temp_rot_num[r_sample_num-6];
							temp_rot_num[r_sample_num-6]=new_rot_num;
						}
						else if(new_rot_num<=temp_rot_num[r_sample_num-5])
						{
							temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
							temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
							temp_rot_num[r_sample_num-3]=temp_rot_num[r_sample_num-4];
							temp_rot_num[r_sample_num-4]=temp_rot_num[r_sample_num-5];
							temp_rot_num[r_sample_num-5]=new_rot_num;
						}
						else if(new_rot_num<=temp_rot_num[r_sample_num-4])
						{
							temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
							temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
							temp_rot_num[r_sample_num-3]=temp_rot_num[r_sample_num-4];
							temp_rot_num[r_sample_num-4]=new_rot_num;
						}
						else if(new_rot_num<=temp_rot_num[r_sample_num-3])
						{
							temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
							temp_rot_num[r_sample_num-2]=temp_rot_num[r_sample_num-3];
							temp_rot_num[r_sample_num-3]=new_rot_num;
						}
						else if(new_rot_num<=temp_rot_num[r_sample_num-2])
						{
							temp_rot_num[r_sample_num-1]=temp_rot_num[r_sample_num-2];
							temp_rot_num[r_sample_num-2]=new_rot_num;
						}
						else
							temp_rot_num[r_sample_num-1]=new_rot_num;
						average_r_num=new_rot_num+average_r_num;
						new_rot_num=0;
					}break;
				case 7:	{
						if(new_rot_num<=temp_rot_num[r_sample_num-7])
							average_r_num=average_r_num-temp_rot_num[5];
						else if(new_rot_num>=temp_rot_num[r_sample_num-2])
							average_r_num=average_r_num-temp_rot_num[0];
						else
							average_r_num=average_r_num-temp_rot_num[0]-temp_rot_num[5]+new_rot_num;
						average_r_num=average_r_num*10/5;
						
						rot_last_last_difference=rot_last_difference;
						rot_last_difference=rot_difference;
						rot_difference=academic_num-average_r_num;
						rot_P=r_Kp*rot_difference;
						rot_I=r_Ki*(rot_difference+rot_last_difference+rot_last_last_difference);
						rot_D=r_Kd*(rot_difference-rot_last_difference);
						rot_actual_difference=rot_P+rot_I+rot_D;
						if(K21==ON&&p_b==0)
						{
							temp_rot_vb=255*(new_rot_num+rot_actual_difference)/22;
							PWM0=temp_rot_vb;
						}
						else
						{
							temp_rot_vp=255*(new_rot_num+rot_actual_difference)/22;
							PWM0=temp_rot_vp;
						}
						new_rot_num=0;
					}break;
				default: break;
			}	
	}
	
	if(rot_ok==0||r_slope_ok==0)
	{	
		c_cm1++;
		if(c_cm1==n_cm1)
		{
			IEN1=IEN1&0xDF;				//CM1
			if(temp_rot_vp<rot_vp)
			{
				if(temp_rot_vp+1==rot_vp)
					temp_rot_vp=rot_vp;
				else
					temp_rot_vp=temp_rot_vp+1;
			}
	
			if(temp_rot_vp>rot_vp)
			{
				if(temp_rot_vp==rot_vp+1)
					temp_rot_vp=rot_vp;
				else
					temp_rot_vp=temp_rot_vp-1;
			}
			if(K21==ON)
			{
				if(temp_rot_vb<rot_vb)
				{
					if(temp_rot_vb+1==rot_vb)
						temp_rot_vb=rot_vb;
					else
						temp_rot_vb=temp_rot_vb+1;
				}
				if(temp_rot_vb>rot_vb)
				{
					if(temp_rot_vb==rot_vb+1)
						temp_rot_vb=rot_vb;
					else
						temp_rot_vb=temp_rot_vb-1;
				}
			}
	
			c_cm1=0;
			if(K21==OFF)
			{
				PWM0=temp_rot_vp;
				if(temp_rot_vp==rot_vp)
				{
					if(rot_ok==0)
						rot_ok=1;
					else
					{
						r_slope_ok=1;
						r_sample_num=0;
//						rp_sample_num=0;
					}
					rot_pid_ok=1;
				}
			}
			else
			{
				if(temp_rot_vp==rot_vp&&temp_rot_vb==rot_vb)
				{
					PWM0=temp_rot_vb;
					if(rot_ok==0)
						rot_ok=1;
					else
					{
						r_slope_ok=1;
						r_sample_num=0;
						rp_sample_num=0;
						rb_sample_num=0;
					}
					rot_pid_ok=1;
				}
			}
		}
		if(rot_pid_ok==0)
		{
			CML1=TML2+0XC8;
			if(CML1<TML2)			//CM1,400us,旋转速度变化时间
				CMH1=TMH2+1+0X00;
			else
				CMH1=TMH2+0X00;
		}
		else
		{
			CML1=TML2+0X10;
			if(CML1<TML2)			//CM1,20ms,PID采样周期
				CMH1=TMH2+1+0X27;
			else
				CMH1=TMH2+0X27;
		}
		IEN1=IEN1|0x20;		//CM1
	}
}

main()
{
	TMOD=0x22;			//定时器1,方式2;
	TL1=0XFD;			//波特率9600
	TH1=0XFD;
	TR1=1;				//启动定时器
	PCON=0X00;			//SMOD=0
	TMOD=0x23;			//定时器0,方式3,两个8位定时器;
	TR1=0;
	TF1=0;
	S0CON=0XF8;			//串口方式3,SM2=0,REN=1,TB8=1,RB8=0,TI=0,RI=0
	IP0=0X98;			//S0=1,T1=1
	ES0=1;				//开串口中断
	ET0=1;
	ET1=1;
	ES1=1;				//I2C
	EAD=1;				//AD中断允许
 	EA=1;				//中断总允许
 	start_t2();

	urgent_stop=0;
	rw_err=0;
	err_ok=0;
	err=0;

BEGIN:	if(urgent_stop==1)
	{
		urgent_stop=0;
		err_ok=0;
		EX1=1;
		EX0=1;
	}
	IEN1=0X00;
	send_enable=0;
	rot_enable=0;				//new
	PWM1=0;					//new
	wire_enable=0;				//new
	PWM0=0;					//new
	work=0;
	start=0;
	start_rot=0;
	start_wire=0;
	stop_wire=0;
	decrease=0;
	need_para=0;
	nonce_sec=0;
	in_sector=0;
	new_sector=0;
	noans_ok=1;
	S_ANSW=0;
//	R_ANSW=0;
	POINTER0=0;
	SSUM=0;
	POINTER1=0;
	RSUM=0;
	r_byte_nums=4;
	send=0;
	overtime=0;
	receive_p_out=0;
	receive_p_in=0;
	demand=0;
	resend=0;
	ans=0;
	p_b=0;				//基值
	temp_pulse_num=0;
	temp_pulse_num1=0;
	FINISH=0;
	temp_FINISH=0;
	rot_front=0;
	rot_reverse=0;
	rot_ok=0;
	rot_stop=0;
	rot_stop_ok=0;
	rot_num=0;
	new_rot_num=0;
	rot_pid_ok=0;
	average_r_num=0;
	rot_difference=0;
	rot_last_difference=0;
	rot_last_last_difference=0;
	wire_add=0;
	wire_dec=0;
	wire_ok=0;
	r_slope_ok=1;
	w_slope_ok=1;
	wire_pid_num=0;
	wire_pid_ok=0;
	motor_stop=0;
	retract=0;
	c_cm0=0;
	c_cm1=0;
	k_r_p_add=0;
	k_r_b_add=0;
	k_r_p_dec=0;
	k_r_b_dec=0;
	temp_rot_vp=0;
	temp_rot_vb=0;
	temp_wire_vp=0;
	temp_wire_vb=0;
	retract_ok=0;
	auto_return=0;
	return_ok=0;
	ask_return_ok=0;
	to_begin=0;

        PWMP=3;				//23.5K
	CTCON=CTCON|0X02;		//CT0捕捉下降沿
	tooth_num=10;
	EX1=1;
	EX0=1;
	while(start==0)
	{
		if(called==1)
		{
			ini_sbuf(M_main,infor,com_calling,S_ANSW,0,0);
			s_byte_nums=get_byte_nums(infor);
			TR_noans();
			called=0;
		}

		if(receive_p_out==1)
		{
			point=&pp.k2;
			for(p_sec=0;p_sec<24;p_sec++)
				*(point+p_sec)=rbuffer[p_sec*2+2]*256+rbuffer[p_sec*2+3];
			pp.k1=rbuffer[50];

			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			s_byte_nums=4;
			TR_noans();
			demand=0;
			receive_p_out=0;
		}

		if(receive_p_in==1)
		{
			point=&pp.x[nonce_sec][0];
			for(p_sec=0;p_sec<10;p_sec++)
				*(point+p_sec)=rbuffer[p_sec*2+3]*256+rbuffer[p_sec*2+4];

			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			s_byte_nums=4;
			TR_noans();
			demand=0;
			receive_p_in=0;
		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -