PID执行
PID Implementation
我正在查看 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;
}
任何人都可以给我解释以下内容:
- lobodol & YMFC 忽略时间常数。它如何影响 pid 计算
YMFC代码第i项是
pid_i_mem_pitch += pid_i_gain_pitch * pid_error_temp;
为什么他乘以错误?
labodol 只是将先前的错误与当前的错误相加,其他两个将其与时间变化相乘
也欢迎任何其他简单的实施建议。
lobodol 和 YMFC 系统在不使用时间常数的情况下工作,因为代码的编写方式使得 Arduino 除了控制之外不会做任何事情。
因此,P、I 和 D 误差计算之间的时间差将保持不变。
调整这些系统的方式与调整任何其他 PID 系统的方式没有区别。
虽然该系统有效,但这也意味着最终调整的 PID 值将仅用于这些系统,而不用于任何其他系统。
在计算中使用时差的其他系统。这意味着调整后的 PID 值也可以用于其他系统(与 lobodol 和 YMFC 相比更可靠)。
在YMFC实现中
pid_i_mem_pitch += pid_i_gain_pitch * pid_error_temp;
^
注意“=”号之前的“+”号。这意味着正在添加错误。只是增益乘法是在加法之前完成的,而不是在加法之后。
两种方法产生相同的(理论上)结果。
希望对您有所帮助。
我正在查看 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;
}
任何人都可以给我解释以下内容:
- lobodol & YMFC 忽略时间常数。它如何影响 pid 计算
YMFC代码第i项是
pid_i_mem_pitch += pid_i_gain_pitch * pid_error_temp;
为什么他乘以错误? labodol 只是将先前的错误与当前的错误相加,其他两个将其与时间变化相乘
也欢迎任何其他简单的实施建议。
lobodol 和 YMFC 系统在不使用时间常数的情况下工作,因为代码的编写方式使得 Arduino 除了控制之外不会做任何事情。
因此,P、I 和 D 误差计算之间的时间差将保持不变。
调整这些系统的方式与调整任何其他 PID 系统的方式没有区别。
虽然该系统有效,但这也意味着最终调整的 PID 值将仅用于这些系统,而不用于任何其他系统。
在计算中使用时差的其他系统。这意味着调整后的 PID 值也可以用于其他系统(与 lobodol 和 YMFC 相比更可靠)。
在YMFC实现中
pid_i_mem_pitch += pid_i_gain_pitch * pid_error_temp;
^
注意“=”号之前的“+”号。这意味着正在添加错误。只是增益乘法是在加法之前完成的,而不是在加法之后。
两种方法产生相同的(理论上)结果。
希望对您有所帮助。