Pid digital notes (2)

void pid_Cal(void)
{    
    //float index = 0;
	
	IncPid * p = NULL;
    p = &g_PID_Inc;

	p->SetVal = sys_para.given_temp; 

	   
    p->ActualVal = g_pt100.f_real_value;  
    p->err = p->SetVal - p->ActualVal;  

	if(work_temp_phase == work_phase_43C_level)
	{
		if(FAN_Speed_Status == FAN_Speed_LOW)
		{
			if(fabs(p->err) >= 6.0f)
			{
				p->Kp = 0;	//0.45

				p->Ki = 0.4;	//0.05

				p->Kd = 0;
			}
			else
			{
				p->Kp = 1.8;	//0.4   0.475 
			
				p->Ki = 0.4; 	//0.05  0.07

				p->Kd = 0; 	//0.2
			}
		}
		else if(FAN_Speed_Status == FAN_Speed_HIGH)
		{
			if(fabs(p->err) >= 6.0f)
			{
				p->Kp = 0;	//0.45

				p->Ki = 0.4;	//0.05

				p->Kd = 0;
			}
			else
			{
				p->Kp = 1.75;	//0.4   0.475 
			
				p->Ki = 0.38; 	//0.05  0.07

				p->Kd = 0; 		//0.2
			}
		}
	}
	else if(work_temp_phase == work_phase_38C_level)
	{
		if(FAN_Speed_Status == FAN_Speed_LOW)
		{
			if(fabs(p->err) >= 6.0f)
			{
				p->Kp = 0;	//0.45

				p->Ki = 0.4;	//0.05

				p->Kd = 0;
			}
			else
			{
				p->Kp = 1.8;	//0.4   0.475 
			
				p->Ki = 0.4; 	//0.05  0.07

				p->Kd = 0; 	//0.2
			}
		}
		else if(FAN_Speed_Status == FAN_Speed_HIGH)
		{
			if(fabs(p->err) >= 6.0f)
			{
				p->Kp = 0;	//0.45

				p->Ki = 0.4;	//0.05

				p->Kd = 0;
			}
			else
			{
				p->Kp = 1.75;	//0.4   0.475 
			
				p->Ki = 0.38; 	//0.05  0.07

				p->Kd = 0; 		//0.2
			}
		}
	}
	else if(work_temp_phase == work_phase_32C_level)
	{
		if(FAN_Speed_Status == FAN_Speed_LOW)
		{
			if(fabs(p->err) >= 6.0f)
			{
				p->Kp = 0;	//0.45

				p->Ki = 0.4;	//0.05

				p->Kd = 0;
			}
			else
			{
				p->Kp = 1.8;	//0.4   0.475 
			
				p->Ki = 0.4; 	//0.05  0.07

				p->Kd = 0; 		//0.2
			}
		}
		else if(FAN_Speed_Status == FAN_Speed_HIGH)
		{
			if(fabs(p->err) >= 6.0f)
			{
				p->Kp = 0;	//0.45

				p->Ki = 0.4;	//0.05

				p->Kd = 0;
			}
			else
			{
				p->Kp = 1.75;	//0.4   0.475 
			
				p->Ki = 0.38; 	//0.05  0.07

				p->Kd = 0; 		//0.2
			}
		}
		
	}

	p->IncrementVal = (p->Kp * (p->err - p->err_next))  
					  + (p->Ki * p->err)          
                      + (p->Kd * (p->err - 2 * p->err_next + p->err_last));   					  
    
    p->err_last = p->err_next;
    p->err_next = p->err;
}

 As can be seen, P is the first adjustment control, the code is of Ki, ki because the incremental pid control parameter p corresponding to the position of the formula, the first adjust ki, is a shock temperature, then added KP (position of the formula control d), so you can make the system stable.

At the same time, also with the differential separation of thought, is relatively large temperature difference, do not micro-controller, namely kp = 0 ;, to a certain stable range, and only use pd control.

Guess you like

Origin www.cnblogs.com/CodeWorkerLiMing/p/11406984.html