我正在查看arduino中简单PID实现的代码引用。
这些是少数几个实现 YMFC
pid_error_temp = gyro_pitch_input - pid_pitch_setpoint;
pid_i_mem_pitch += pid_i_gain_pitch * pid_error_temp;
if(pid_i_mem_pitch > pid_max_pitch)pid_i_mem_pitch = pid_max_pitch;
else if(pid_i_mem_pitch < pid_max_pitch * -1)pid_i_mem_pitch = pid_max_pitch * -1;
pid_output_pitch = pid_p_gain_pitch * pid_error_temp + pid_i_mem_pitch + pid_d_gain_pitch * (pid_error_temp - pid_last_pitch_d_error);
if(pid_output_pitch > pid_max_pitch)pid_output_pitch = pid_max_pitch;
else if(pid_output_pitch < pid_max_pitch * -1)pid_output_pitch = pid_max_pitch * -1;
pid_last_pitch_d_error = pid_error_temp;
error_sum[PITCH] += errors[PITCH];
deltaErr[PITCH] = errors[PITCH] - previous_error[PITCH];
previous_error[PITCH] = errors[PITCH];
pitch_pid = (errors[PITCH] * Kp[PITCH]) + (error_sum[PITCH] * Ki[PITCH]) + (deltaErr[PITCH] * Kd[PITCH]);
double PTerm = kp * error;
integral += error * (double) (timeChange * .000001);
ITerm = ki * integral;
// Derivative term using angle change
derivative = (input - lastInput) / (double)(timeChange * .000001);
DTerm = (-kd * derivative);
//Compute PID Output
double output = PTerm + ITerm + DTerm ;
void Compute()
{
/*How long since we last calculated*/
unsigned long now = millis();
double timeChange = (double)(now - lastTime);
/*Compute all the working error variables*/
double error = Setpoint - Input;
errSum += (error * timeChange);
double dErr = (error - lastErr) / timeChange;
/*Compute PID Output*/
Output = kp * error + ki * errSum + kd * dErr;
/*Remember some variables for next time*/
lastErr = error;
lastTime = now;
}
任何人都可以给我解释如下:
YMFC代码,我的术语是
pid_i_mem_pitch + = pid_i_gain_pitch * pid_error_temp;
为什么他会乘以错误? labodol只是添加了前一个错误和当前错误,其他两个正在将它与时间变化相乘
欢迎任何其他简单的实施建议。
答案 0 :(得分:0)
lobodol和YMFC系统在不使用时间常数的情况下工作,因为代码是以这样的方式编写的,即Arduino除了控件之外不会做任何事情。
因此,P,I和D误差的计算之间的时间差将保持不变。
将这些系统调整为如何调整任何其他PID系统没有区别。
虽然这个系统有效,但这也意味着最终调谐的PID值只能用于这些系统,而不能用于任何其他系统。
在计算中使用时差的其他系统。这意味着可以使用调谐的PID值(与lobodol和YMFC相比更可靠)与其他系统一起使用。
在YMFC实施中
pid_i_mem_pitch += pid_i_gain_pitch * pid_error_temp;
^
注意'='符号前面的'+'符号。这意味着错误正在增加。只是在加法之前进行增益乘法而不是在加法之后。
两种方法产生相同(理论上)的结果。
我希望这会有所帮助。