2013年全国大学生电子设计竞赛-倒立摆源代码-经验交流-开发教程

2019-07-20 22:26发布

本帖最后由 zcxlyf 于 2017-8-1 17:03 编辑
2013年全国大学生电子设计竞赛+倒立摆源代码+经验交流+开发教程
学校:海南大学       作者:刘一帆        邮箱:zcxlyf_wy@163.com
注:本代码基于正点原子代码改编,欢迎各位交流学习,不要用于其他用途。
干扰 干扰 对立起来的摆施加干扰摆杆不倒下

一、硬件结构
      这个摆硬件结构是易老师某宝买的,在此首先感谢易老师免去了我搭硬件的麻烦。但是硬件上卖家的下面四个螺丝只能拧上两个,其他两颗螺丝由于卖家设计缺陷,根本拧不上。各位小伙伴购买的时候可以让店家再加工一下。我用的这个是辛苦易老师一次次的打孔才固定上的。下面就说一下硬件的注意事项吧。
       1.角度传感器。讲道理这个电位器还是挺好用的。由于STM32参考电压最多给3V3,所以当你电位器两段的电压超过参考电压后32输出就有一段是纯最大值。当电位器两段电压是3V3时最大输出4000多一点,每个角度都会有采样值,这个值够用了。
       2.减速电机。这个电机被我折腾了好几天愣是没烧,不错点个赞!输出的话测试是一周大概1024,并没有经过严格测试。我是放弃了卖家的主控板,改用战舰V3自己从底层开始搭建。
       3.驱动板。驱动板还是飞思卡尔那块从407厕所门口垃圾堆里捡来的驱动板,这里就不再多说。其他可以看我的另一篇帖子这里不表。
二、代码结构
      1.上位机。上位机还是使用匿名的四轴上位机,主要是用的顺手也就没有更换其他的上位机。前两天还特意从匿名那买了两架上位机算是支持一下吧。倒立摆的店家是给了上位机,不过不知道怎么用也不想再去琢磨。总之还是匿名的强大(能在线调PID啊)。
       2.编码器。编码器是使用的通用定时器的编码器模式,具体用法可以参见《STM32中文参考手册》226页第十版,我看店家的初始化挺不错的,我也就直接copy来用了。
       3.ADC。这个由于战舰的PA1连接了TPAD板,我就把这个采样输入移植到了PA4口上,这点在代码里稍微更改一下就可以用了。
       4.电机驱动。电机驱动的话这里我是采用两路PWM波,每个时刻仅仅有一路PWM输出信号,这样控制电机正反转。具体接口各位通过代码里面就看出来了,这里不表。但要注意MOS管死区,一定要先关再开。
       做完上面这几点以后基本的该有的就都有了,下面就是整定PID参数。首先题目设置了角度跟位置的控制,所以这里同样需要两套PID,规定的动作个人感觉组委会做了简化。角度PID在我的代码里面很重要,位置PID一般。如果按照店家提供的代码两个PID级联可以做到控制的非常完美,这点不粉不黑店家还是做的很不错的。相形见绌,我的代码就粗犷很多了,完成比赛是完全没问题的,但不管黑猫白猫抓住老鼠就是好猫。各位想学习,推荐店家的代码,但是店家的代码不太规范,命名有些任性。我的代码没啥含金量,就说简单粗暴完成程序,但是我感觉我的代码分类比店家的好,可以供各位参考打开思路。       首先,我们调整好位置PID的阶跃响应,利用四轴上位机观测阶跃响应曲线。具体说调整到什么情况算合适呢?这个一般快速跟踪,无静差,振荡很小或者没有震荡。具体怎么调整那个可以看卖家的视频资料,虽然里面讲解是针对平衡小车的,但是倒立摆也是讲的不错的。其次就是角度PID了,这个部分当然是保证立起来,稳定,干扰后能跟踪的上。平衡角度的话大家可以先把摆立起来,然后通过上位机观察输出结果得到,这样简单可靠。然后把这个值定义一下,因为之后的调整螺丝还是会有松动的,我也是吃过这个亏,走了些弯路。然后定义一下摆可调整角度范围,一般竖直位置正负40度左右吧,再定一下。然后建议大家学习一下卖家的低角度保护程序,当摆的角度在水平线以下的时候就关机不调整。这点在后面的测试中很有用,一方面保护电机,另一方面这个摆杆也是比较重,万一哪颗螺丝松了这东东飞起来威力不亚于板砖~后果各位吃瓜群众自己想象哈。 基础部分第一问 基础部分第一问 上图为基础部分第一问荡超过±60°      以上部分做完之后基本上摆杆倒立,施加干扰都没啥问题了。这样按照题目要求,基础部分第三问,发挥部分第二问也没什么问题了。就剩画圈圈跟倒立起摆了。基础部分第一问要求摆动角度大于±60°,这个我是就设定一个目标这,周期性调整就行。经过测试偏转角度会达到±90°。 倒立起摆 倒立起摆 上图为倒立起摆      画圆圈部分,这部分起初也是想判断角度啥的,然后一点点增加调整量直至完成画圆。但是无奈本人编码功底浅薄,这个代码没写过关,留在了代码七部分。但是也是比较接近了,差不多能倒立起摆。测试中发现摆会震荡的像无敌风火轮一样,别说摆完成圆周运动了,甩甩能把桌子都掀翻……后来就退回到原始的方法,手动调整,然后观察给力的时间及大小,然后不断修改代码及调整量。这样基础部分第二问画一个圆是接近100%完成。 基础第二问画圈 基础第二问画圈 上图为基础部分第二问,摆画一个圆圈      下面就剩倒立起摆了,倒立起摆主要是在合适的时间点开始控制开始角度PID控制,这个也是根据实际响应曲线调整,经过测试,我的摆起摆成功率只有90%左右。店家的起摆代码看着也是比较头痛,索性不看了……最后发挥部分第三问,摆在平面画一个圆圈,这个由于我的角度PID输出跟位置PID输出级联不成功,级联过后摆震动特别大,不到5S就掉下来。当然我也尝试过交替执行角度PID跟位置PID,这样情况好那么一点。但最后实现我是利用人为给角度加上偏移量做的,具体实现是进入模式时将当前位置清零(初始化为10000),然后当编码器值小于旋转一周后的值时,给当前的角度偏移量加上一个定值,只要这个值加的不是特别大,摆就不会倒下并且会朝着一个方向转动。当编码器读取的值超过一周之后的值时就把这个偏移量取消掉,这样虽然摆不会停一直转N圈,但不会倒下,完成了题目要求。这点也算是取巧了吧。
鸣   谢
       首先感谢这么多天易家傅老师的指点与帮助,其次感谢某宝卖家搭建的的机械结构,当然最后还有匿名科技提供的上位机!
倒立摆源代码.zip (9.63 MB, 下载次数: 2200) 2017-8-1 12:43 上传 点击文件名下载附件
整体图片及动图.zip (19.22 MB, 下载次数: 1006) 2017-8-1 17:01 上传 点击文件名下载附件
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
炫色康康
1楼-- · 2019-07-21 03:49
 精彩回答 2  元偷偷看……
a472849326
2楼-- · 2019-07-21 08:46
洋气   写的很详细 就佩服你这种人
jinfeihan57
3楼-- · 2019-07-21 10:16
厉害!厉害!
zcxlyf
4楼-- · 2019-07-21 11:35
 精彩回答 2  元偷偷看……

一周热门 更多>