STM32野火开源平衡小车(七)之修改更适合工程应用的的PID控制
本帖最后由 qq741931893 于 2020-8-24 17:20 编辑野火开源平衡车官网板块
[https://www.firebbs.cn/forum.php?mod=forumdisplay&fid=129&page=1](https://www.firebbs.cn/forum.php?mod=forumdisplay&fid=129&page=1)
参考资料
暂无
参考视频(这个群主讲的不错)
[https://www.bilibili.com/video/BV1j7411z7uX](https://www.bilibili.com/video/BV1j7411z7uX)
硬件平台
![](https://img-blog.csdnimg.cn/20200822212404140.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
开发平台
KEIL5, STM32F103X主控,程序用的SWD下载(啥下载器都行,能下载进去就好,用串口下载也是可以的)
开发(一)这节把控制程序修改成标准的串级PID流程
![](https://img-blog.csdnimg.cn/2020082411065189.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
图来源于B站那个视频的UP主
源代码
![](https://img-blog.csdnimg.cn/20200824105102720.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
修改后
![](https://img-blog.csdnimg.cn/20200824105245483.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
再加个因为避免动手力度过大,导致车车扑街,引起电机不停的转,加入扑街前电机停转
![](https://img-blog.csdnimg.cn/20200824105400110.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
在motor.c那边添加下面函数
![](https://img-blog.csdnimg.cn/20200824105541762.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
修改直立环为标志PID直立环
修改前
![](https://img-blog.csdnimg.cn/20200824105637816.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
修改后(给用上med期望角度了)
![](https://img-blog.csdnimg.cn/20200824105703461.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
同样的 修改速度环
修改前
![](https://img-blog.csdnimg.cn/20200824105814425.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
同样的增加了机械中值
![](https://img-blog.csdnimg.cn/20200824105947687.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
转向环不用修改
我昨天那边有个BUG,就是有一边电机不受控制的上电就转, 我怀疑有程序跑飞了(可能是OLED或者MPU6050的模拟IIC的锅),现在放狗来试试
移植狗来自野火的例程
![](https://img-blog.csdnimg.cn/20200824112553195.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
![](https://img-blog.csdnimg.cn/20200824112542723.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
在工程main.c那边添加
#include "bsp_wwdg.h"
![](https://img-blog.csdnimg.cn/20200824113406807.png)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
以及在组(group)那边把bsp_wwdg.c添加进来
![](https://img-blog.csdnimg.cn/20200824113359121.png)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
在stm32f10x_it.c中
添加狗跑飞中断 并点灯
![](https://img-blog.csdnimg.cn/20200824113351340.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
灯这边我用PC1吧(低电平亮,高电平灭)
![](https://img-blog.csdnimg.cn/20200824112855573.png)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
随便配置一下在串口那边 把灯给初始化了, 还是在野火那边放狗那边移植一个过来吧
![](https://img-blog.csdnimg.cn/20200824113157299.png)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
![](https://img-blog.csdnimg.cn/20200824113256534.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
在主函数那边 配置LED和放狗
![](https://img-blog.csdnimg.cn/20200824113518491.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
死循环那边就喂狗就行
![](https://img-blog.csdnimg.cn/20200824113607471.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
现在重新调参
先确定车车重心
![](https://img-blog.csdnimg.cn/20200824113920759.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
把3个环注视掉再确定机械中值
![](https://img-blog.csdnimg.cn/20200824114257398.png)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
全部填0,确定车车在什么时候有倒下的倾向
我这边大概是+5.5 前倒 和1后倒
确定机械中值为 6.5/2 = +3.25
确定之后确定直立环
![](https://img-blog.csdnimg.cn/20200824120301494.png)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
方向我之前确定了 直接调就行 , 先来个-250
![](https://img-blog.csdnimg.cn/20200824130658790.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
-330的时候出现低频抖动了 现在引入kd
![](https://img-blog.csdnimg.cn/20200824130945245.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
Vertical_Kd=-1.7; 出现了高频抖动处理一下
Vertical_Kp=-330, *0.6 = -198
Vertical_Kd=-1.7; *0.6 = -1.02
![](https://img-blog.csdnimg.cn/20200824131246614.png)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
开始搞速度环
![](https://img-blog.csdnimg.cn/20200824131352615.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
速度环的确立 要让小车保持平衡的同时, 速度趋于0,而且回到原位(开机的位置)的效果好
![](https://img-blog.csdnimg.cn/20200824131949193.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
效果不是很好 还是会来回跑 我又设置了0.6 推一下直接扑街了
![](https://img-blog.csdnimg.cn/20200824142652949.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
最后选了0.38 比较不错,回弹力度没有0.4的晃(比较大力推会来回荡着回原点))
![](https://img-blog.csdnimg.cn/20200824142844237.png)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
调转向环
![](https://img-blog.csdnimg.cn/20200824143003852.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
![](https://img-blog.csdnimg.cn/20200824143853796.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
Turn_Kp=-0.8 效果还可以
刚才放在地上测试的时候 发现来回拨动 小车还是会倒, 因此加大速度环
同时加大扑街的角度 让他别那么块就扑街![](https://img-blog.csdnimg.cn/20200824144014460.png)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
于是总的调试结果
![](https://img-blog.csdnimg.cn/20200824145259230.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p3ZGVuZzE5OTU=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
最后效果还行, 但是车车还是不平衡, 应该是我这边放电池的位置不好,
还有 那个电机不受控制的BUG还是这个鸟样, 放狗都没用 看来不是程序跑飞的问题
问题应该出现在
MPU_Init(); // MPU6050初始化
mpu_dmp_init(); //MPU6050的DMP初始化(Digital Motion Processor数字运动处理器,硬件带的)
MPU6050_EXTI_Init();// MPU6050外部中断以及引脚配置
这个MPU6050的函数这里
下一节上蓝牙控制!
代码用贴图:lol,还是要感谢分享 你这代码烧进去,根本就平衡不了,火哥的烧进去一下子就可以平衡了,你的代码有问题明显!
页:
[1]