| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 纪念一下我之前做过的平衡车 -> 正文阅读 |
|
[嵌入式]纪念一下我之前做过的平衡车 |
1.PCB板子的设计(引脚的定义在程序里面有专门的ReadMe文件里面会有写的) 在我的博客里面有平衡车PCB板子的开源(有原理图和Pcb图),实物图如下: ?(不过有一个bug,就是超声波的Trig没有设计为PA6,因为要用定时器3输入捕获通道1,确实有点不够完美,但是问题不大毕竟我也搞过超声波输入捕获的小项目,在平衡车超声波避障程序设计也不是很难,只要在规定的距离内,实时修改速度环的期望速度就好了) ? ?2.选购物品 1)stm32f103c8t6 2)? ?4引脚OLED 3)8引脚MPU6050 4)HC-05 5)TB6612 6)稳压模块输出5V 7)超声波模块 8)12V锂电池 9)大鱼电子的底板和轮子 10)一些排针,小开关(3个脚的),电源接口(3个脚的) 3.学习一些基本的STM32知识,陀螺仪知识,编码器知识,PID知识 1)STM32的学习可以去看江科大的教程,不建议野火和原子,我也不喜欢他们的代码风格 2)陀螺仪的学习看这个就好: 电控组寒假培训(四)MPU6050简介_哔哩哔哩_bilibili 2)编码器的知识(只需要看这个视频的理论部分就好):STM32第十次培训(正交解码类型编码器的原理和使用)_哔哩哔哩_bilibili 3)PID的知识学习 先看这个(看完这个其实可以不用看下面的文章了): PID超详细教程——PID原理+串级PID+C代码+在线仿真调参_skythinker616的博客-CSDN博客_pid教程 有多的时间看下面的(多阅读没有坏处的): 从不懂到会用!PID从理论到实践~_哔哩哔哩_bilibili 学会PID-基于板球平衡系统-初中基础就能听懂的简单讲_哔哩哔哩_bilibili 最通俗的PID讲解,从控制出发,全程不管公式,还不来学习?倒立摆,平衡车,无人机,哪有那么神秘,你也可以啊!!_哔哩哔哩_bilibili 4.解释一下代码的框架 1)对于轮子 a.编码器的编程 左边编码器PA0和PA1,定时器2的通道1和通道2 右边编码器PB6和PB7,定时器4的通道1和通道2 b.PWM的编程 左PA8和右PA11,对应定时器1的通道1和通道4 c.电机引脚的编程 右轮需要PB12,PB13,左轮需要PB14,PB15 2)对于OLED 我用的是江科大的模块 3)对于MPU6050 在我上面说的陀螺仪知识学习中会有相关的代码开源的,然后要注意的是陀螺仪的采样频率可以修改的(修改两个地方) 1.在mpu6050源文件中,MPU_Init函数中的尾部有采样频率的修改,也就是这句话:MPU_Set_Rate(100); 2.在inv_mpu.h头文件中修改采样频率数值,也就是这句话:#define DEFAULT_MPU_HZ ?(100) 其次就是要使用MPU6050的INT引脚,因为每次MPU6050得到数据后要送给STM32,在平衡车中要定时的去接收这些数据,那其实也可以用定时器,但是既然MPU6050都可以设置采样频率了不就相当于修改定时时间了,而且MPU6050给STM32发送完数据后它的INT引脚会有电平变化,那就可以利用这个电平变化写一个外部中断函数来处理数据进行PID的控制运算,所以也就是为什么我写的代码会有MPU_EXTI这个文件了 4)对于HC-05蓝牙 其实原理就是串口,如果你已经学过江科大关于串口的讲解那看我的代码应该问题不大, 蓝牙的指令可以自己修改,如果你想要修改蓝牙的名字,密码可以去看[软件]6_蓝牙APP控制小车_注意新旧HC-05_哔哩哔哩_bilibili或者你用我代码里写的MyUSART_SendString函数也行,也就是这种写法:MyUSART_SendString("AT+NAME Walk the world\r\n"); 5)对于PID(默认你已经看完了我上面推荐的文章和视频讲解) 注意目标值,反馈值,输出值和他们的物理意义;输出限幅,积分限幅,积分分离;串级PID中的外环积分限幅,外环输出限幅,内环积分限幅,内环输出限幅 这里要使用串级PID这个毫无疑问,速度环PI控制,直立环PD控制,实现小车不仅平衡而且在受到干扰后能够回到原处并且速度可控 ?重点:我主要介绍为什么速度环在外面,直立环在里面? 其实这个问题我想了很久,因为我纠结的是速度环输出的是角速度单位(或者你理解成直行速度单位也问题不大),直立环又是角度单位,为啥就可以这么串在一起呢不需要进行物理量纲处理吗?但是当我看完这篇文章:PID超详细教程——PID原理+串级PID+C代码+在线仿真调参_skythinker616的博客-CSDN博客_pid教程,我才弄懂了道理。 在速度环中有一个I项也就是积分项,那积分肯定是要对时间进行积分,并且我们也知道STM32每隔一小段(10ms)时间采集数据,那就有了时间的概念,并且速度环的单位确实是速度,速度对时间的积分不就是角度或者位移了吗,那也就解决了这个问题,也就是经过PI运算后输出的就是角度了,可以作为直立环的输入! 6)PID函数的编程 速度环:PI控制????????输出=比例系数*角度误差+微分系数*Y轴角速度 直立环:PD控制和低通滤波? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?输出=比例系数*速度误差+积分系数*速度误差的积分 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ErrorNew=(1-a)*ErrorThis+a*ErrorLast; 转向环:P控制? ? ? ? 输出=比例系数*Z轴角速度 7)外部中断函数的编程 1.判断中断标志位并清除 2.读取MPU6050数据和编码器数据 3.蓝牙控制 4.将数据经过PID控制器得到三个环的输出 5.电机的保护 6.给电机PWM值并进行限幅和加载 8)PID参数整定 可以看这个第3.2节:串级PID三环调参&最后四分钟_哔哩哔哩_bilibili 5.总结 一开始我想做平衡车的时候总是听到别人说很难很难,但其实平衡车真的不难,只要你各方各面要用到的模块的知识都明白了也曾自己用过了,那上手平衡车最多三天时间就可以搞定,我大概是用了两天,其实这两天基本都是在查2个bug(一个是调试端口用作普通IO口,一个是MPU6050要用到延时函数但是我忘记在主函数调用延时函数的初始化了)和调参。。。 最后附上代码(看到这了不点个赞收藏一下咩,拜托这真的对我很重要!你也可以去看我别的文章哦) 链接:https://pan.baidu.com/s/19AKMbIqSShg_V4BhJTqJDg? |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 22:28:22- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |