玩转树莓派

    返回首页    发表留言
本文作者:李德强
          第十三节 双环串级PID反馈控制
 
 

        在上一讲中我们一起学习了关于传统PID反馈控制的相关知识,在这一讲中我们将一起学习串级PID反馈控制。串级控制通过选择二个测量点构成二个反馈回路来克服干扰。第二个测量点应该比被控变量更快感知到干扰的影响,这样才能在干扰对被控变量产生很大影响之前通过第二个反馈回路迅速克服干扰的影响。一个控制器的输出用来改变另一个控制器的设定值,这样连接起来的两个控制器称作是“串级”的。

        所谓串级PID就是两个控制器都有各自的测量输入,但只有主控制器具有自己独立的设定值,只有副控制器的输出信号送给执行机构。这样组成的系统称为串级控制系统。串级PID在结构上有两个闭环。一个闭环在里面,称为副环(或副回路),输出送往调节阀直接控制生产过程。

主调节器:按主参数的测量值与给定值的偏差进行工作的调节器,其输出作为副调节器的给定值。

副调节器:按副参数的测量值与主调节器输出的偏差进行工作的调节器,其输出直接控制调节阀动作。

        两个控制器串联工作,以主控制器为主导,保证主变量稳定为目的,两个控制器协调一致,互相配合。尤其是对于二次干扰,副控制器首先进行“粗调”,主控制器再进一步“细调”,因此控制质量必高于单回路控制系统。

        由于串级控制系统副回路的存在,能迅速克服进入副回路的二次干扰,从而大大减小了二次干扰对主参数的影响。并且控制作用的总放大系数提高了,因而抗干扰能力和控制性能都比单回路控制系统有了明显提高。

        在过程控制中,被控过程的特性大多呈现不同程度的非线性。如果采用串级控制系统,由于它能根据负荷和操作条件的变化,自动调整副调节器的给定值,使系统运行在新的工作点,最终使主被控参数保持平稳。

        我们还是回到飞控程序上,对于飞行控制来说,双环PID控制就是针对飞机的两个特性进行双环控制,首先我们将对飞机的误差角度的反馈控制做为双环PID的外环,也就是主控制器,即通过测量得到的角度误差作为主控制器的输入,得到一个输出,这个输出为角速度的控制值,角速度值减去当前测量到的角速度就得到了下一环的输入值,即角速度希望;而对于内环控制器来说,它以希望角速度为输入,通过PID控制得到最终的PWM信号输出。

        在实际飞行过程中,当飞机受到一个扰动,或遥控器给飞机下达一个姿态动作时,实际上就是飞机姿态出现了一个角度误差,于是双环PID反馈控制就开始发挥作用,具体的工作过程如下:

        当飞机出现了一个角度误差,也就是姿态角的期望值,这时主控制器通过PID根据这个角度误差计算出一个效大的角速度值,并减去当前测量得到的角速度得到一个角速度期望值并做为副控制器的输入。这时,副控制器通过这个角速度输入,通过PID计算得到一个比效大的PWM,这里飞机快速的向希望角度靠近。而随着向期望角度靠近,于是随着时间变化,飞机的角度误差逐渐减小,主输入控制器通过这个效小的角度误差,计算出一个效小的角速度,减去当前测量到的角速度,得到一个新的角速度希望,并作为副控制的期望角速度。这个效小的期望角速度作为内环内环副控制器的输入,再通过PID计算出一个效小的PWM输出信号。也就是说,整个过程由快到慢,当飞机出现姿态误差时,会系统会自动维持其平衡。并很好的达到稳定状态/接下来我们 来看一看双环PID反馈控制的程序部分

//内环PID输入角度输出角速度
f32 engine_outside_pid(f32 et, f32 et2, float* sum)
{
	//输出期望角速度
	f32 palstance = 0.0;
	s_engine* e = &engine;
	//积分
	*sum += params.ki * et * 0.01;
	//PID反馈控制
	palstance = params.kp * et + (*sum) + params.kd * (et - et2);
	//输出限幅
	engine_limit_palstance(&palstance);
	return palstance;
}

//内环PID输入角速度输出PWM比例(千分比)
f32 engine_inside_pid(f32 et, f32 et2, float* sum)
{
	//输入期望pwm千分比
	f32 pwm = 0.0;
	s_engine* e = &engine;
	//积分
	*sum += params.v_ki * et * 0.01;
	//PID反馈控制
	pwm = params.v_kp * et + (*sum) + params.v_kd * (et - et2);
	return pwm;
}

//控制程序
void engine()
{
	//外环PID对根据欧拉角控制期望角速度
	//这里应该是期望角度-当前实际角度,所以这里为 0 - x_et
	xv_et = engine_outside_pid(-e->tx, -x_last, &x_sum);
	yv_et = engine_outside_pid(-e->ty, -y_last, &y_sum);
	zv_et = engine_outside_pid(-e->tz, -z_last, &z_sum);
	
	//内环角速度PID
	//这里应该期望角速度-当前实际角速度
	xv_et -= e->tgx;
	yv_et -= e->tgy;
	zv_et -= e->tgz;
	
	//内环PID根据希望角速度得到PWM输出值
	e->xv_devi = engine_inside_pid(xv_et, xv_last, &xv_sum);
	e->yv_devi = engine_inside_pid(yv_et, yv_last, &yv_sum);
	e->zv_devi = engine_inside_pid(zv_et, zv_last, &zv_sum);
}

 

 

    返回首页    返回顶部
  看不清?点击刷新

 

  Copyright © 2015-2023 问渠网 辽ICP备15013245号