写在前面
我将我的参赛代码已经在GitHub上进行了开源,欢迎大家下载
2020年全国大学生智能汽车竞赛浙江赛区二等奖开源代码 接下来我将就十六届智能车竞赛为各位同学分享我的模糊PID调试思路,并且手把手教大家如何将我的开源代码加以利用,关于我的代码有什么不明白的都可以在评论区评论,博主看到了会第一时间回复的。 不过大家一定要注意,2021年的主控芯片跟2020年的不一样的,我用的主控芯片MK66FN2VLQ18,然后今年要求的芯片是 Infineon系列的单片机了。我的代码工程是用IAR8.25及以上版本才能正常打开,所以我推荐大家拿我的代码做为一个参考即可。 我采用的 电感摆放方式是这样的,5个电感均采用 横电感的摆放方式
效果图
代码讲解
这个模糊PID函数实现代码我是在GitHub上找的开源代码,理解之后进行了修改就运用到了我自己的程序当中。如有侵权,请联系我,立刻删除 Fuzzy()
这个函数就是我们模糊PID的实现了,参数是电感数值和电感数值的变化量,输出就是舵机所需要打的偏移量。 先放一个大致的介绍图,这个模糊PID的规则表其实大家用起来都差不多,如果需要小车跑到2.5m左右的话只需要微调这个规则表即可,但是如果3m往上走就需要理解模糊PID的本质并且写好隶属函数才可哦,我这个只是帮助大家入个门。 首先是这PEF[4]、DEF[4]、PEF[7]
这三个数组的介绍了,大家看了函数的实现就会知道Fuzzy()
这个函数会先将电感数值和电感数值变化量进行归属,例如某次电感数值为17,电感数值变化量为5,那么它就是PEF[2]和PEF[3]之间,DEF[2]和DEF[3]之间 此时Pn = 3,Dn=3
函数内通过特定的算法将这2个数值映射到规则表里的4个位置 得出来是这4个数字(5,5,6,6) 最后将这个4个数字做为舵机打角数组的索引取出舵机打角数组中的4个数值,并且这个数值进行一定的运算之后得出最终的舵机打角。 函数的调用是这个样子滴 至此模糊PID的代码实现介绍结束
模糊PID调试方法
经过上面的介绍之后我们就很清楚了,我们只需要调整这些参数就可以了 在这里我给出一种PEF、DEF、UEF数组等幅增长时的规则表调试方法 经过分析,我们可以知道对应的P和D参数传进来之后,实际上调用的就是规则表里的相邻的4个数字,因此我的方法就是: 首先按照大致的规则表跑一圈,然后我在电磁车电感差比和数值小于特定数值的(车子快要冲出赛道)、或者我手动发射一个串口信号(车子运行姿态不好) 的时候,车子就会通过串口传出来当时调用的是哪4个数组下标,然后再微调这4个数组数值的大小,打角不够就调整数值使其运算之后的输出数值变大,反之则调整数值使其运算之后的输出数值变小 索引数组发送函数 最终我经过多次调整之后,可以将小车的速度稳定在2.5m左右,期待大家能在我的基础上更进一步~
(づ ̄3 ̄)づ╭❤~一键三连,这次一定(๑•̀ㅂ•́)و✧