智能车串级pid的使用

http://t.csdn.cn/uFyXT书接上回,我们的小车已经完成了全部元素,这个时候当你想要提速的时候,你会发现一个单独的pid提速后车子会甩尾,一个单独的pid已经无法满足车速的正常运行,这个时候想要提速就可以用到串级pid了(串级pid一般适用于三轮差速车,四轮舵机车一般适用于模糊pid),今天我们先以之前说的三轮车为例说一下串级pid在智能车方向环的使用,通俗的理解串级pid就是外环(角度环)的输出作为内环(角速度环)的输入,原理很简单,主要是很多人不会使用,不会调参,今天我就用我的经验和大家说一下串级pid在智能车中的使用(个人经验之谈,如有不对的地方请指正谅解),首先串级pid的内外环的要成比例运行,我一般采用外环比内环=3:1的比例即外环每3ms运行一次,内环每1ms运行一次,如下图所示:

time++;	
if(time==3)
{
	Out_dw=dircontrol(TempAngle); //外环
	time=0;
}			
	Out_dn=diranglecontrol(Out_dw);//内环

外环的输入为中线差值,内环的输入为外环的输出。

int dircontrol(int chazhi)//外环
{
	int out_dw;
	static int last_chazhi;
	out_dw=(int)(chazhi*dir_p+(chazhi-last_chazhi)*dir_d);
	last_chazhi=chazhi;
    return out_dw;
}
int diranglecontrol(int out_dw)//内环
{
	int out_dn,error;
	static int last_error;
	error=(out_dw-gyroz1);//内环的偏差是外环输出与陀螺仪z轴的角速度之差
	out_dn=(int)(error*dirn_p+(error-last_error)*dirn_d);
	last_error=error;
	return out_dn;
}

 通过以上串级pid代码可见内环pid最主要加了一个陀螺仪的值,以逐飞icm20602为例,陀螺仪可测xyz三个轴的角速度和角加速度,我们三轮车串级pid仅需要其中一个轴的角速度值(如果是两轮平衡车则需要用到陀螺仪更多轴的值),首先把陀螺仪安装到车子中心线上(如图所示)智能车串级pid的使用_第1张图片然后把陀螺仪xyz轴的角速度都显示出来,左右摇晃小车,变化最剧烈的那个值就是我们串级pid方向环需要用到的值(在此我们以z轴的值为例说明),那么串级pid的参数应该怎么调呢,首先从内环调起,调内环时我们不需要外环给内环输入,我们直接给内环一个固定的输入(即固定的角速度),然后把速度环去掉,把方向内环直接给到电机输出上去,这样小车就会以一个固定的角速度原地旋转,这个时候你可以对小车进行拍打干扰它,看它抵抗干扰的响应速度,如果车子一直振荡,说明内环参数不对,如果车子受到干扰后能迅速回归正常,不振荡,那参数就差不多了,内环调好以后就可以把外环加上去然后直接放到赛道上跑了看现象调外环(这个时候电机输出为速度环加减方向内环),外环参数就和原来的单环pid一样的调法(增大p增大打脚,增大d增大响应速度,减小振荡),串级pid的使用大概就是这些了,加上串级pid以后你就可以尽情的提速了!

此外,我们现在已经学会了陀螺仪的使用,这个时候,我们就可以在处理元素时用上陀螺仪积分了,和编码器一样的原理,速度积分得到距离,角速度积分得到角度,这样我们在处理元素时就可以把上一篇文章里面的time换成角度(如有忘记可从文章开头链接回到上一篇文章),让它从固定打脚一段时间到固定打脚一个角度,这样会更加稳定,且陀螺仪积分360度就是一个圆环这会是你后续提速处理圆环的重要参数

bmq_juli+=(ECPULSE1-ECPULSE2);//编码器积分
tly_jifen+=gyroz1;//陀螺仪积分

陀螺仪积分和编码器积分是处理元素的重要工具,大家一定要学好用好,这样不管它赛题如何变化,出现什么样的元素,大家都可以轻松处理, 每个人能的想法都不一样,我只是给大家提供了一个思路,让大家更快的上手智能车,相信各位车友都会创造出自己的处理元素算法,我的智能车入门三部曲也就到此结束了,大家还有啥想要了解的可以底下评论,从17届的多车省三到18届的双车国一,智能车是唯一一个做了就停不下来的比赛,这将是我人生珍贵的一段回忆,感谢相遇,感谢陪伴,我们下次再见!(大家可以去b站看我智能车的视频,与csdn同名哦!)智能车串级pid的使用_第2张图片

你可能感兴趣的:(智能车竞赛,pid,电磁,c语言,人工智能)