PID入门及无人机实战

一、PID的理论知识

大家可以搜索 《PID控制算法的C语言实现(绝对的好东西)》很好的入门材料。
下图就是从上面摘下来的PID控制流程图。

在这里插入图片描述

二、利用温控讲解单环PID

我们可以在电路板上焊几个电阻进行加热(PWM控制加热速度),然后用温度传感器来读取实时温度来控制加热温度,我觉得这是最好的单环PID实践实验。
在这个实验中,流程图中的传感器是温度传感器,执行器是电阻。

  1. 位置式PID的公式:无人机上使用的基本是位置式PID
    百度百科的公式
    在这里插入图片描述
    在这里插入图片描述
    上面是代码中参考的公式。

在这个温控当中,我没有带上dt参数也能实现PID温控,而无人机上的PID控制基本上都带上了dt。

  1. 为了方便和公式对应上,代码里面的变量尽量采用公式的名字进行定义。
void Pid_Realize(void)
{
	float desiredvalue = 20; // 期望值,也就是设定值,在这里,我们设定的温度是20℃,让温度保持在20℃
	ek= desiredvalue - actualvalue; // 期望值和实际值(传感器测量值)的误差。
	integral += ek; // 所有误差的和就是积分。
	uk = kp*ek + ki*integral + kd*(ek - ek_1); // PID 控制的输出
	// uk = kp*ek + ki*integral*dt + kd*(ek - ek_1)/dt; // PID 控制的输出. 带dt项

	// 输出限幅,这里的pwm占空比的数值在0 ~ 4000 之间
	if(uk > 4000)
		uk = 4000;
	else if(uk < 0)
		uk = 0;
	
	// 把uk 的值传递给PWM,作为PWM的占空比驱动电阻加热
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
	_HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,uk); // 设置占空比

	ek_1 = ek; // 更新e(k-1)的值
	actualvalue = 温度传感器的测量值; // 这里的实际值保存的是温度传感器的值,曲线看的是这个。
}
  1. 调参
    调参一般是先P,再I,最后D来进行的。大家可以自行调节参数,通过曲线来观察参数的作用。

三、无人机中使用的串级PID

串级PID有两个单环PID,一个内环PID,一个外环PID,下面引用了正点原子的minifly小四轴的串级PID流程图

在这里插入图片描述
内环是角速度环,能快速响应,外环是角度环。外环的期望角度是遥控器操作杆给的值,内环的期望角速度是外环PID的输出。测量角度来自于姿态结算,测量角速度来自于陀螺仪的测量值。

四、电机输出

这是一个很重要的点。如果正负号不对的话,怎么调参也是不对。
电机油门肯定是个正号。然后其它的正负号怎么判断呢。比如下面的飞机,只看横滚。
在这里插入图片描述
当你向右转动(向右横滚)无人机的时候,1号和2号电机是会抵抗你向右转动的,因此,PWM1和PWM2中,R_motorout 是正号,PWM3和PWM4中,R_motorout 是负号。其它的都可以根据抵抗作用来进行判断。

PWM1 = motor_throttle  + R_motorout;
PWM2 = motor_throttle  + R_motorout;
PWM3 = motor_throttle  - R_motorout ;
PWM4 = motor_throttle  - R_motorout;

五、调参

调参前的准备:
如果是小四轴,可以用绳子绑住无人机,注意一定要将绳子固定在中间,不然调出来的参数是不对的。

调参指导:一般先调内环,再外环,先PI,再I,最后D。横滚俯仰一起调。调完横滚俯仰最后调yaw。
具体可以看一下该博主
https://blog.csdn.net/nemol1990/article/details/45131603

我的一些建议:
如果你调参的时候,发现无论Kp 给什么值,貌似都不起作用,这时候,你把PID最后的输出减半,然后再调参,你就会发现新大陆。同时,也要留一些占空比给姿态控制,不要都给了油门控制,比如占空比最多1000的话,留个100给姿态控制。(当时第一次调参的时候,我就没注意这个PID输出的限制,也调了一个多月吧,都没调出来,一度抑郁。呜呜)。
比如这样:
PWM1 = motor_throttle + R_motorout * 0.5;
PWM2 = motor_throttle + R_motorout * 0.5;
PWM3 = motor_throttle - R_motorout * 0.5;
PWM4 = motor_throttle - R_motorout * 0.5;
从现象调参一般只能是个粗调值,如果有无线数传之类的设备,可以通过看曲线来进行细调。

如果错误,麻烦指正。

  • 0
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值