初始解决方案
stalled_pwm_output = PWM / | ΔE|
PWM =最大PWM值
ΔE= last_error-new_error
初始关系基于电动机中无变化而成功地提高了PWM输出。有关示例输出,请参见下图。
这种方法使得非侵入性PID停顿的情况成为可能。但是,它具有一个不幸(很明显)的问题,即当非侵略性PID能够达到设定值并尝试减慢速度时,stalled_pwm_output会上升。当上升到空载位置时,该上升会引起较大的过冲。
当前解决方案
理论
stalled_pwm_output =(kE * PID_PWM)/ | ΔE|
kE =缩放常数
PID_PWM =来自非
主动PID的当前PWM请求ΔE= last_error-new_error
我当前的关系仍然使用1 /ΔE概念,但是使用非侵略性PID PWM输出来确定stall_pwm_output。这样,当PID开始接近目标设定值时,PID可以将stall_pwm_output调速,但在堵转时允许100%PWM输出。需要比例常数kE来确保PWM进入饱和点(下图中的10,000以上)。
伪码
请注意,cal_stall_pwm的结果已添加到我当前控制逻辑中的PID PWM输出中。
int calc_stall_pwm(int pid_pwm, int new_error)
{
int ret = 0;
int dE = 0;
static int last_error = 0;
const int kE = 1;
// Allow the stall_control until the setpoint is achived
if( FALSE == motor_has_reached_target())
{
// Determine the error delta
dE = abs(last_error - new_error);
last_error = new_error;
// Protect from divide by zeros
dE = (dE == 0) ? 1 : dE;
// Determine the stall_pwm_output
ret = (kE * pid_pwm) / dE;
}
return ret;
}
输出数据
失速PWM输出
请注意,在停转的PWM输出图中,由于电机无法在给定时间内到达位置,因此激活了内置安全功能,导致〜3400处的PWM突然下降。
空载PWM输出