毕业设计 STM32平衡车设计与实现1 简介Hi,大家好,学长今天向大家介绍一个单片机项目,大家可用于课程设计或毕业设计基于STM32的平衡车设计与实现1 课题描述课题的研究主要是为了设计出可以在小范围内活动的轻巧灵活的绿色代步工具,并且在自平衡的功能上加上一些新功能,如自跟随功能和遥控功能,这样平衡车不仅可以当作交通工具来使用还可以作为人们的助手,如可以制造出平衡车形式的拉杆箱、平衡车形式的超市购物车等。
平衡车技术起源于国外被叫作摄位车(Segway),在国内有被叫做平衡车、思维车、体感车,平衡车易于放置,便于携带。
公共场所、汽车、火车上都可以随意携带,平衡车不需要专用的场地,可以在马路、公园、林间小路甚至室内都可以骑行,所以它相比传统的四轮车是有很大的优势的。
两轮平衡车和单轮平衡车都可以在小范围内移动,不像传统的四轮车在小范围内很难转弯。
随着电子技术的不断发展,人们对行走功能的需求越来越高,平衡车应运而生。
电动平衡车的小巧轻便也给人们带来了很多便利。
同时,电动平衡车的电力驱动赋予了它绿色交通的使命,它的广泛普及对文明城市的建设和人居环境的改善具有重要意义。
电动平衡车为人们节省了大量的油费和时间。
与其他交通工具相比,它还具有价格优势,这使得大多数人都负担得起,维护起来也相对简单。
在平衡车上增加一些传感器,可以让人更好的控制它,同时还具有操控、墙障等功能。
比如增加自走功能,可以避免人们需要用手携带的缺点。
市面上常见的平衡车2 课题设计内容这个项目的核心是平衡车的控制系统,在平衡车稳定平衡的基础上对自跟随和无线遥控进行研究,并且计划使用 STM32 作为主处理器进行开发制作,由对倒立摆控制系统的分析进而分析平衡车的控制理论,其中包括直立行驶和转弯,还有自跟随的控制理论分析。
该项目的重点首先是要对 STM32 单片机的各个硬件系统有熟练使用的能力,这样才能对各模块进行正确的驱动设计。
其中,需要对 MPU6050 原始数据进行滤波处理,所以要通过对滤波算法的分析对 MPU6050 中的陀螺仪和加速度数据进行融合,使滤波后的结果可以满足设计要求。
对 PID 算法进行分析,为闭环控制系统找到合适的 PID 控制器模型,其中参数的确定属于本次设计的难点。
遥控部分计划由触摸屏和 51 单片机进行设计,所以需要 51 单片机和 STM32 进行正确通信,才能完成触摸遥控功能。
3 平衡车控制原理两轮平衡小车则与颠倒着的单摆系统类似,倒立摆与单摆有着很大的不同了,当倒立摆离开平衡位置时它受到的重力作用与运动方向相同,不是抑制它的变化反而促使它向偏离平衡点更远的地方运动,也就是它向着不稳定方向发展,而空气阻力则是时刻与它的运动相反,所以摆杆要想平衡就必须有其它形式的外力作为辅助,所以这就引出了速度,给小车一个与摆杆运动方向相同的速度使摆杆因自身的惯性产生一个回复力,这个回复力就可以使摆杆具有向着稳定状态运动的趋势,这个回复力的大小为:如果不考虑空气阻力,那么若要摆杆具有回复的趋势,摆杆底部的平台相当于小车车轮的加速度要足够大,而且是随着偏离平衡的角度的增大而增大平衡车的控制任务可以分解为三个基本的控制任务。
•首先是控制小车的平衡,可以通过控制小车两个轮子的正反转来实现。
小车可以获得在两个方向产生回复力的加速度,从而完成平衡任务。
•然后控制车速。
从上面的分析可以看出,汽车的速度与倾斜度密切相关,所以汽车的速度变化应该与倾斜度相对应。
•最后控制车的方向,可以通过两个车轮的速度差来控制,转向速度要和速度差成正比。
4 关键算法4.1 PID控制算法PID 算法在工业控制中有着重要的地位,是现今最常用的模糊控制算法之一, PID 其实是比例控制、积分控制和微分控制,简称 PID 控制。
在闭环控制系统中 PID 控制器更是必不可少, PID 控制器之所以被应用这么广泛主要是因为它的结构简单、工作稳定性好、调整方便的特点,在实际研究中经常会遇到被控对象的具体参数不能精确的建立出数学模型,其它控制理论技术难以采用时,系统的控制器和具体参数必须要根据实验现象来现场调试,在这种情况下 PID 控制器是最能体现优势了, PID 在实际应用中 PI 控制和 PD 控制较为常见,甚至有的直接只有一个比例 P 控制就可以完成整个系统的控制。
4.2 卡尔曼滤波卡尔曼滤波器由系统的输入和输出观测数据,对系统状态做出最优估计,它的依据是系统的线性状态方程,因系统分析数据大部分存在噪声和干扰,所以最优估计又被看成是滤波过程。
卡尔曼滤波器首次被实现 Stanley Schmidt,卡尔曼滤波处理数据其实是去除数据中的噪声还原真实数据的数据处理技术,在方差已知的情况下从存在噪声的系统数据中,把系统的动态状态估计出来。
由于卡尔曼滤波容易被计算机编程实现,并且能对现场的数据及时的进行更新和处理,所以卡尔曼滤波成为目前应用非常广泛的滤波方法。
5 硬件设计硬件电路是软件的基础。
如果把软件比作人脑,那么硬件就是各种器官。
只有硬件的各个部分设计得当,我们的软件算法才能显示出它的优势。
硬件电路部分主要包括:•电源供电部分•MPU-6050 传感器部分•STM32 主控芯片部分•电机驱动部分•编码器测速部分和•蓝牙传输部分本项目学长以流行的平衡车为控制背景平台。
陀螺传感器、电机速度编码器和超声波传感器用于数据采集。
以 STM32 处理器为控制中心,利用姿态反馈和算法输出对传感器数据进行处理。
采用集成 H 桥驱动的直流电机进行输出控制,形成完整的闭环控制系统。
5.1 stm32部分最小系统电路设计:单片机引脚与外部设备的连接要做到与功能相适应,外部设备尽可能的靠近 MCU 的引脚,使信号走线最短。
使用 Keil MDK 进行 STM32 的程序开发,下载调试方式采用 2 针的 SWD 串行接口,下载接口采用 micro USB 接口(不是采用 USB下载,只是提供接口) 更加方便调试。
5.2 电机驱动电路设计这里的学长选择DC汽车,如下图所示。
DC电机的转速可以由施加在其两端的电压决定,其转向也与电流方向有关,所以控制相对简单,只需控制连接在其两端和正负两极的电压就可以控制电机的转速和转向,可以满足本项目的要求。
但,由于单片机 IO 口输出电流能力有限,但是直流电机的驱动需要大电流,所以我们要用电流放大模块将单片机输出功率放大,这里我们选用了 TB6612 芯片,该芯片广泛应用于直流电机驱动,它具有大电流 H 桥结构,双通道电路输出,可以同时驱动两个电机。
电机驱动电路接线如图所示。
5.3 蓝牙通信蓝牙模块用于实现模块化小车与手机的通信,这里我们选用的是蓝牙 HC-05,如下图所示。
蓝牙 HC-05 可以用于实现处理器与移动应用终端之间的通信,移动应用终端可以通过蓝牙连接,控制平衡车的切换和移动。
控制算法的 PID 参数也可以在开发模式下进行调试。
蓝牙通信模块与处理器之间的通信总线是一个串行口,是一个异步通信接口。
接线图如下5.4 软件实现软件设计是系统设计的核心,所以这部分也是至关重要的。
软件设计的总体流程如下图所示。
软件设计主要包括如下内容:•小车运动控制算法的软件设计和软件设计。
•小车通过检测陀螺仪和加速度计返回的角度值,利用PD 算法控制电机对小车姿态进行调节达到动态平衡,同时利用 PI 控制算法和 PD 控制算法对小车进行速度控制和转向控制。
不仅如此,在手机上,我们可以通过蓝牙与汽车连接,然后控制汽车的运行。
5.5 设计为了方便对小车进行运动控制,本设计利用手机通过蓝牙与单片机进行连接,进而很方便的在安卓手机端就可以对小车实现控制。
学长开发的手机是基于Android Studio 开发环境而设计的。
功能设计了首页、波形、调试和聊天这几个窗口, 这里学长主要使用了它的首页其实也就是控制窗口以及调试窗口。
在主页上,我们可以看到底部有三种模式,分别是重力感应模式、摇杆模式和按钮模式,可以基于不同的操作模式来控制汽车。
重力感应模式使用手机的重力感应。
当手机向上倾斜时,汽车会向前移动,反之亦然。
在遥感模式下,汽车的各种运动控制都可以通过摇杆来完成。
在按键模式下,我们需要双手控制按键来完成动作控制。
在调试窗口下,我们可以清楚的看到有对参数的调整。
通过改变参数,我们可以很容易地改变小车程序,进而得到我们想要的运动参数。
5.6 小车平衡控制车辆在垂直方向有一个机械平衡点,以实现短暂的平衡和前倾或后倾。
根据牛顿运动定律,平衡需要一个相反的方向,但外界不能对其施加力。
根据达朗贝尔原理,当车辆前倾时,施加向前的加速度以保证平衡;否则,应用向后加速。
显示了实际系统中平衡车辆的垂直控制。
车模直立环我们需要让平衡小车上电后,能够自主且迅速的直立起来,因此我们选择了 PD 控制方式,比例系数 Kp 越大可以减小调节时间,而微分环节又具有超前的调节作用,可以实现小车的快速直立。
PD 闭环输入为小车的直立机械中值角度(0 度),陀螺仪和加速度计实际检测的角度值为反馈,利用 PD 闭环控制消除偏差。
小车速度控制为了使车模运动更加稳定,需要用闭环控制来对车模速度进行实时的调整。
编码器通过检测单位时间内两个轮子旋转的脉冲个数,以计算电机真实速度。
速度偏差值是通过从所需速度中减去真实速度得到的。
然后,通过 PI 算法,计算出速度控制的输出值,即脉宽调制占空比。
这里我们将获取速度控制输出值的子程序调用周期设置为 100 ms,输出值分为 100 个部分,每毫秒输出速度控制输出值的 1%。
学长这里给出具体关键代码:int sudu (int bianmaqi_left,intbianmaqi_right){staticfloatSudu,Bianmaqi_Least,Bianmaq i;staticfloatBianmaqi_Integral;floatKp=80, Ki=0.4;Bianmaqi_Least(Bianmaqi_Lef+Bianmaqi_Right)-O;Bianmaqi*=0.7:Bianmaqi+=Bianmaqi_Least*03;Bianmaqi_I ntegral+=Bianmaqi;Sudu=Bianmaqi*kp+Bianmaq_Integral*ki ;ReturnSudu;}6 实现效果后来学长加上来了超声波模块和循迹模块,视频演示如下7 关键代码#include"stm32f10x.h"#include"sys.h"u8 Way_Angle=2;u8 Flag_Qian,Flag_Hou,Flag_Left,Flag_Right,Flag_sudu=1; u8 Flag_Stop=1,Flag_Show=0;intEncoder_Left,Encoder_Right;int Moto1,Moto2;int Temperature;int Voltage;floatAngle_Balance,Gyro_Balance,Gyro_Turn;floatShow_Data_Mb;u32 Distance;u8delay_50,delay_flag,Bi_zhang=0,PID_Send,Flash_Send;float Acceleration_Z;floatBalance_Kp=223,Balance_Kd=0.82,Velocity_Kp=83,Velocity _Ki=0.41;u16PID_Parameter[10],Flash_Parameter[10];intmain(void){de lay_init();uart_init(128000);JTAG_Set(JTAG_SWD_DISABLE );JTAG_Set(SWD_ENABLE);LED_Init();KEY_Init();MY_NVIC_P riorityGroupConfig(2);MiniBalance_PWM_Init(7199,0);机如需初始化电调接口uart3_init(9600);Encoder_Init_TIM2();Encoder_Init_TIM4 ();Adc_Init();IIC_Init();delay_ms(1000);常熟理工学院毕业设计(论文)32MPU6050_initialize();DMP_Init();OLED_Init();TIM3_Cap _Init(0XFFFF,72-1);MiniBalance_EXTI_Init();while(1){if(Flash_Send==1){ Flash_Write();Flash_Send=0;}if(Flag_Show==0){_Show();oled_show();}el se的时序,故此时关闭 app 监控部分和 OLED 显示屏{DataScope();}delay_flag=1;delay_50=0;while(delay_flag);50ms 精准延时}}8 最后。