(保姆级教程)基于STM32和MPU6050的平衡车制作报告_直立平衡小车报告-程序员宅基地

技术标签: for逸的日常  嵌入式硬件  

这是我去年做的一个课设,最近比较闲就整理出来供大家学习交流!当初摸索花了很多时间,希望能帮其他同学少走点弯路!

 

摘要

双轮平衡车是一种利用倒立摆原理的高度不稳定两轮机械装置,其力学特性具有多变量,非线性和不稳定等特点。本文使用STM32F103C8T6作为MCU,利用MPU6050六轴加速度陀螺仪和带霍尔编码器的MG315减速电机搭建平衡小车。通过整合小车的加速度、倾角进而速度信息,应用串级PID算法实现对小车的直立行走以及差速转向。此外,还使用HC-06蓝牙模块实现对小车的无线控制,利用4路光电模块完成寻迹功能,经过试验本系统具有较强的适应性和稳定性。

关键词:STM32F103C8T6;双轮平衡车;MPU6050;串级PID;

 

Abstract

Double-wheeled balanced car is a highly unstable two-wheeled mechanical device using the principle of inverted pendulum. Its mechanical characteristics are multivariable, non-linear and unstable. This essay uses STM32F103C8T6 as MCU, uses MPU6050 six-axis accelerometer gyroscope and MG315 deceleration motor with Hall encoder to build a balanced car. By integrating the acceleration, inclination and speed information of the car, a cascade PID algorithm is applied to achieve vertical walking and differential turning of the car. In addition, the HC-06 Bluetooth module is also used to achieve wireless control of the car, and 4 photoelectric modules are used to complete the tracking function. Finally, the system is proved to be very stable and flexible by experiments.

Keywords: STM32F103C8T6; Double-wheeled balancing car; MPU6050; Cascade PID;

 

1 绪论

双轮平衡车是一种应用广泛的动力学系统,具有多变量,非线性和不稳定等特点。在研究控制论和应用方面都有巨大的意义,近年来它的发展也受到了人们的广泛关注。
双轮直立平衡车可以简化为一阶倒立摆模型进行分析,设计的目标是保证小车能够在启动后快速到达平衡位置,并且能够在外界施加随机扰动后依旧没有振荡和过大的角度偏移。即当小车达到期望的状态后,能够通过控制系统实现动态稳定。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZm9y6YC4,size_5,color_FFFFFF,t_70,g_se,x_16

1. 一阶倒立摆模型

本文中提到的直立小车使用MPU6050内部DMP算法读取小车当前在三个方向上的倾角和加速度作为输入量,此外利用霍尔传感器得到车轮转速作为反馈信息。小车左右两个轮子的转速和转向作为控制量,实现前后运动和差速转向。整个控制过程通过串级PID来实现,利用TB6612芯片调节PWM输出的占空比以改变电机转速。最后通过控制参数的调整和优化,实现小车的稳定运行。

通过这个项目我们可以学会MPU6050的使用,简单的PID算法和参数整定方法,以及基本的I2C,USART,外部中断以及定时器的使用。

 

2 设计总框架

2.1硬件框架

硬件方面主要由STM32F103C8T6最小系统,TB6612电机驱动,电源管理模块,HC-06蓝牙,OLED显示屏,控制按键和编码电机组成。通过单片机输出的PWM控制左右电机的转速,完成前后作用运动。利用寻迹模块检测地面黑线达到寻路功能,硬件框架如下图:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZm9y6YC4,size_18,color_FFFFFF,t_70,g_se,x_16

图2. 硬件框架图

2.2软件框架

软件方面主要是通过MPU6050读取的三轴角速度和倾角信息作为基本的控制信息,再加上霍尔编码器输出的左右轮转速作为反馈信息实现。算法方面使用串级PID算法,包括PD直立环、PI速度环以及PD转向环三个方面综合计算实现小车的稳定运行,软件框架如图所示:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZm9y6YC4,size_20,color_FFFFFF,t_70,g_se,x_16


3. 算法框架图

 

3 硬件方案论述

3.1 平衡车结构论证与选择

小车需要搭乘多个模块,因此需要足够的空间。这里我们选择双层结构,层与层之间用铜柱和螺丝固定。模块和车体之间用捆扎带固定,杜邦线使用热熔胶固定。车体总的来说较为稳定,在旋转和高速运动时车上每个结构都能够保持相对静止。小车实物图如下: 

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZm9y6YC4,size_16,color_FFFFFF,t_70,g_se,x_16

图4.小车正视图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZm9y6YC4,size_14,color_FFFFFF,t_70,g_se,x_16
图5.小车侧视图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZm9y6YC4,size_16,color_FFFFFF,t_70,g_se,x_16
图6.小车俯视图

A.框架材料选择

平衡小车的重心要尽量低,且尽量处于车体的平面上的几何中心。这样小车加速度和倾角将更趋于线性,也将更便于控制和整定参数。因此我们选择铝制板和37电机支架这样较重的材料做车的底层,而顶层选择用亚克力。在保持结构有足够的刚度的同时,将重心尽量拉低。

B.车体大小选择

平衡小车的控制要点类似于四旋翼飞行器,两者的都是体积越大越容易控制,在受到随机扰动的时候也越容易保持稳定。但不同的是小车是需要严格控制一个方向(俯仰角)的角度,而四旋翼飞行器是要保持两个方向(俯仰角和翻滚角)的角度。也就是说垂直于小车运动方向的距离,即适当增大轮距有助于小车的平衡。

除了以上描述的一些部分外,其他材料的选择还有一些不太重要的考量,这里就不再一一赘述,使用的所有模块和硬件连接如下表(电源线和地线省略):

1. 模块和硬件连接表

模块/材料

连接/材料类型

作用

MPU6050

PB8->SCL, PB9 ->SDA, INT->PB5

获取小车加速度和倾角

电机驱动

B12->BIN2, B13->BIN1, B14->AIN1, B15->AIN2

PWMA->A8, PWMB->A11

控制左右轮转向和转速

霍尔编码器

B1A->B6 B1B->B7

B2A->A0, B2B->A1

获取左右电机的转速和转向

4线OLED

B4 ->SCL, B3 ->SDA

显示读取的数和PID数值

HC-06蓝牙

RXD ->B10, TXD->B11

使用单片机的USART3和上位机的通信

四路光电

寻迹模块

D0->B1, D1->B0,

D2->A7, D3->A6

完成小车寻迹功能

按键

1->A2, 2->A3,3->A4, 4->A5

调整PID和控制小车

板材框架

亚克力*1,铝板*1

37电机支架*2

用作载物和固定电机

支撑件

铜柱*4,M3螺丝*8,螺母*8

用于层与层之间的连接

固定件

捆扎带若干,绝缘胶带若干

固定模块,同时保证绝缘

3.2 陀螺仪论证与选择

方案一:

选用双轴倾角传感器LE-60-OEMLE-60-OEM,可以测量x, y方向上的重力加速度变换,以转换成倾角。具有成本低,体积小,重量轻等优点。但是操作复杂,软件处理难度大。此外,虽然小车的航向角Yaw不太重要,但是失去转向环对小车的稳定性依旧有一定影响。

方案二:

MPU-6050是全球首个整合性6轴运动处理组件,具有体积小、重量轻和响应速度快等优点。可以测量整个空间的加速度,全面反映运动物体的空间位置。芯片内部还有温度传感器能够拟补温度造成的误差,使用I2C即可完成与MCU的通信。此外利用芯片内置的DMP功能能够很便捷地获取姿态信息,避免了复杂的算法操作和外围电路。DMP(Digital Motion Processor)是MPU6050内部的运动引擎,可以通过它直接输出四元数,可以减轻外围微处理器的工作负担且避免了繁琐的滤波和数据融合,使用方便。

方案三:

MPU-6050加上外接3轴磁力计可以实现9轴运动处理。相比于单独的MPU-6050传感器,这种组合可以拟补测得的航向角因为磁场和硬件问题造成的积分累积偏差,但是也大大增加了硬件的成本。

由于较小的航向角误差对于小车的整体性能并不会有较大的影响,我们也不需要小车在复杂的磁场环境下长时间工作,这里我们直接选择方案二。

3.3 控制器的论证与选择

方案一:

STM32F103是一种处理能力强、运算速度快、超低功耗、片内资源丰富,具有方便高效的开发环境。通过I2C通信可以轻松读取MPU-6050中DMP输出的四元素,实现简单易于新手使用。缺点是今年由于美国芯片“禁运”导致国内芯片大涨,尤其是很多常用中低端芯片甚至涨价两三倍,使用成本较高。

方案二:

CH32F103是南京沁恒公司推出的对标STM32F103的芯片,其同样基于Cortex-M3架构,在绝大多数结构上和STM32F103一致。在软件上也同样兼容STM32F103程序,甚至不用做任何改动直接烧录就可以正常运行。成本低,在一般使用情况下,可以完美替代STM32F103。

最初我们选择并具体实施了方案二,但在使用过程中我们先后遇到了两大问题。首先是MPU-6050的DMP读取总是只能读取到初始化之后第一次的值,经过多方查找最后发现是硬件的FIFO溢出。当传感器在工作时,MPU6050对陀螺仪和加速度计按照一定的采样速率进行采样,并将采样得到的陀螺仪和加速度计数据通过DMP处理后得到姿态角然后存入FIFO中。如果FIFO当中的数据没有得到及时处理便会溢出,最终导致读取失败。遇到这种情况我们可以在每次读取输出时重置FIFO,这样的话即使处理速度达不到FIFO的溢出速度也能正常读取信息。

解决了第一个问题后本以为万事大吉,没想到第二个问题却接踵而来。每次读取时重置FIFO固然虽然可以保证数据的正常获取,但是整个系统运行的速度也就下降了。虽然也能保证每秒钟读取1~2次数据,但是造成的延时完全不满足平很车这个高度不稳定系统动态平衡的需求。由于网上关于CH32使用MPU6050的资料几乎为零,再加上自身经验的不足最终选择放弃。

之后我们开始尝试使用STM32F103,发现并不存在FIFO溢出的现象。说明STM32的运行速度可以满足MPU6050的正常读取,但是依旧有一定的延时,不能满足动态平衡的需求,针对这个问题的解决方案我将在之后的软件系统部分再详细。为了维持MP6050的高速读取,我们最终选择方案二。

3.4 电机驱动模块论证与选择

方案一:

L298N直流电机驱动模块是一种接受高电压的电机驱动器,被广泛应用到直流电机和步进电机的驱动。通过主控芯片的I/O输入对其控制电平进行设定,就可为电机进行正转反转驱动。总体来说其操作简单、稳定性好,可以满足直流电机的大电流驱动条件。

方案二:

TB6612N是一款功能基本等同于L298N的电机驱动芯片,相对于L298N它有体积小,结构简单的特点。此外它的PWM响应速度、效率都优于L298N,发热也更少。

综合考虑,我们选择能够快速相应且节省空间的TB6612芯片作为电机驱动。车轮转向通过输出的2位高低电平控制,转速由PWM调节真值表如下:

2️. 电机转速和转向控制真值表​​​​​​​

转速控制

PWMA:控制电机1转速

PWMB:控制电机2转速

转向控制

AIN1

0

0

1

BIN1

0

0

1

AIN2

0

1

0

BIN2

0

1

0

转向

停止

正转

反转

转向

停止

正转

反转

3.5 无线模块论证与选择

方案一:

HX1838B红外接收模块能够满足短距离内的遥控需求,且价格低廉,结构简单,只需要简单的解码就可以接收数据。但是使用它需要占用一个中断,影响程序的运行效率。

方案二:

HC-06是一种广泛应用于各种场合,且支持蓝牙4.0驱动的模块。在最新的安卓、IOS、Windows操作系统以及微信小程序中都能自由使用,具有很强的兼容性。此外,使用它可以直接通过USART串口和上位机通信,方法简单技术成熟。

实际测试中我们发现红外接收模块正常接收数据必须保证无遮挡,且正常通信距离不超过2m。这给我们的调试带来了很多不便,因此我们最终选择方案二。

3.6 电源和稳压模块的论证与选择

方案一:

12V18650锂电池+12V-5/3.3V电源模块可以满足电机12V驱动供电,以及单片机和其他模块的正常供电。

方案二:

12V聚合物电池+12V-5/3.3V电源模块功能与方案一相同,最大的区别在于聚合物电池的体积小。

对于需要重心高度集中的平衡小车而言选择小体积是必要的,此外聚合物锂电池放电效率也更高。所以我们选择方案二。

3.7 电机种类的论证与选择

方案一:步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件,在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,电机的位置可以被精准控制。但是对于平衡小车这个极度不平衡的系统,受到的干扰很大,很难完成精准控制。

方案二:减速电机是在上普通电机加上了减速箱,这样便降低了转速,增加了扭力。满足了小车大载重和高速反应的需求,但是速度控制需要用PWM波调节,精确度不是很高。

综合考虑,我们选择方案二。小车的主要目的是能够平衡,对速度控制要求不高。

 

4 软件系统论述

4.1 MPU6050数据读取

MPU6050的数据读取一般有三种方式,分别是DMP、互补滤波和卡尔曼滤波。互补滤波和卡尔曼滤波能够一定程度解决航向角偏移的问题,而且对于随机干扰也有更优秀的表现,但是实现较为复杂的算法。从自身实力考虑,我们选择使用MPU6050内置的DMP运动芯片自动解算模块,只需要通过简单读取寄存器操作便可以获得小车的姿态信息。

最初我们选择将读取DMP数据的函数和PID算法都放到main中执行,但无论我们怎样调整参数,小车只能维持短暂的平衡,且会在平衡之后进行高频振动。在多方查找资料后我们发现,PID算法需要保持良好的周期性。特别是在进行PD运算时,短暂的时差就会导致巨大的误差。而MCU的每个运行周期受到运算量的影响,所以PD算法也会有随机误差产生。

所以我们选择将DMP读取和PID算法同时放到外部中断当中,用MPU6050自带的中断引脚INT发出的信号作为定时信息。这样就能维持高度的周期性,且PID和DMP也会高度同步。这样原本的抖动现象就消失了,经过简单的参数整定就能保持稳定。

4.2 PID算法

我们选择简单的串级PID算法,所谓串级PID类似于串联,它将PD直立环(balance)、PI速度环(velocity)和PD转向环(turn)结果分别计算最后相加。得到输出左右轮的PWMA和PWMB输出。其极性代表转向。三个环量“你追我赶”,“相互制约”才能保证一个动态稳定的系统,具体计算公式如下:

64b73473f06b4b9d868fc3e0bf784778.png

其中直立环使用比例+微分变量(PD)进行控制,比例系数计算小车倾角与平衡位置的差(Bias),而微分系数计算小车俯仰角的加速度(gyroy)。小车的直立情况与积分量无关,主要与其位置和加速度有关,具体计算公式如下:

10819d0785544831b451bb0600380a5e.png

 速度环使用优化后的限幅比例+积分变量(PI)进行控制,比例系数计算小车左右轮速度之和和零之间差值(Encoder_Least),积分系数计算小车速度差累加和(Encoder_Integral)。由于速度控制与小车的加速度几乎无关,所以只是用PI控制,具体公式如下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZm9y6YC4,size_19,color_FFFFFF,t_70,g_se,x_16

 转向环一般可以单独使用P控制,直接差速即可。但是在实验过程中,地面过于光滑调整参数后的整体效果极不理想,最后我们选择用限幅的PD控制。通过轮胎的反馈速度和航向角Yaw来给定差速。比例系数计算控制理想差速度(设置为0,小车理想状态是处于静止平衡状态)和实际差速度的差值(Turn_Target),微分系数计算z轴陀螺仪转向角(yaw),具体计算公式如下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZm9y6YC4,size_14,color_FFFFFF,t_70,g_se,x_16

 将以上三者融合在一起,我们可以得到以下框图用以表示本文中所用到PID算法流程:

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZm9y6YC4,size_20,color_FFFFFF,t_70,g_se,x_16

7. PID算法框图

4.3 电机测速

电机测速使用双输出的正交霍尔编码器输出,这种旋转编码器不仅可以测量速度还可以测量旋转方向,编码器的两组A/B输出相位差90度的300个双相脉冲。想要使用脉冲信息测量速度,首先使用定时器定时50ms。编码器转一圈会发送脉冲,一个脉冲可以产生一个中断,在中断函数里令一个变量自加,每产生一个脉冲总脉冲数就加一。

之后用脉冲数/300就可得到在这50ms内电机转动得圈数,乘以20就是每秒钟转的圈数。

4.4 寻迹功能

通过GPIO输入判断地面线的位置,使用IF语句处于不同位置的情况给予不同的转向力度。实现这个功能和原理比较简单,但是参数整定过程较为麻烦。

4.5 算法及程序流程图

除了以上算法之外,整个程序的运行还有一些小的优化,用语言表达过于繁琐,我将在下面的流程图中表示出来:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZm9y6YC4,size_13,color_FFFFFF,t_70,g_se,x_16

8. 程序运行流程图

5 参数整定

平衡小车的具体参数受到车体结构和地面倾斜角度的影响,参数整定是一个极为枯燥耗时的工作。参数整定没有好的方法,只能通过不断尝试,用“夹逼准则”才能找到最好的值。换言之,好的参数就是大量时间堆积出来的结果,而我们的课设意在学习使用PID,对于参数的调节不过分追求。但仅仅调出一个勉强能用的参数也耗费了我们大半个月的时间,这里我们简单叙述一下参数调整的过程。对于串级PID我们一般先调节直立环,再调节速度环,在调节完这两个环节之后小车就能很好地走直线了。最后我们调节转向环,用于调节转向。每个环的功能如下图所示:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZm9y6YC4,size_20,color_FFFFFF,t_70,g_se,x_16

图9. PID对应每部分功能

5.1确定小车机械中值

首先把平衡小车放在地面上,绕电机轴旋转平衡小车,寻找小车能够保持平衡的角度并记录,这里我们获得的角度是0°。

5.2直立环调节

直立环是保证小车能够直立的关键,有了直立环小车就能在无任何扰动的情况下保持直立。也就是说,小车可以根据自身的俯仰角数据控制轮胎的转向和转速。

A.Kp的极性和大小的确定

我们将PWM设置为 7200 代表占空比100当假如我们设定Kp值为720,那么平衡小车在±10°的时候就会满转。所以可以估计Kp值在0~720 之间。

首先我们确定Kp的极性,我们将小车的Kp设置为200。如果小车向那边倒车轮就像哪边转,这是我们不希望看到的正反馈。这时我们要修改Kp的极性,反之说明极性正确,这里我们的Kp极性确定为负值。

确定Kp大小的方法是将其一直增加,直到出现大幅度的低频抖动,大致过程如下:

  1. 设定Kp=-30, 小车虽然有平衡的趋势,但是显然响应太慢了。
  2. 设定Kp=-100, 可以看到响应有所加快,但是松手后小车依然会快速倒下。
  3. 设定Kp=-160,小车的响应明显加快,而且来回推动小车的时候,会有大幅度的低频抖动。说明这个时候Kp值已经足够大了,需要增加微分控制削弱比例控制,抑制低频抖动。

B.Kd的极性和大小的确定

通过观察编码器回传的数据,我们发现最大值在3000左右,再根据7200 代表占空比100%,所以我们估算Kd值应该在0~2.4 之间。

将Kd的值设定为0,再设定Kd=0.5。当我们拿起小车旋转的时候,车轮会反向转动,并没有能够实现跟随效果。这说明了Kd的极性反了。接下来,我们设定Kd=-0.5,这个时候我们可以看到,当我们旋转小车的时候,车轮会同向以相同的速度跟随转动,这说明我们实现了角速度闭环,至此,我们可以确定kd 的极性是负的。

打开确定好的比例控制,将Kd从小到大增加,直到小车出现剧烈高频抖动。

  1. 设定Kd=-0.5, 这时由于比例控制所导致的低频抖动已经基本消失。
  2. 设定Kd=-1, 可以看到小车已经趋于平衡,且松开手后可以保持短暂平衡。
  3. 设定Kd=-2.3, 小车开始出现高频剧烈抖动,但是在遇到这种情况时需要立刻关闭小车,否则长时间高频抖动会导致驱动被烧坏的。

按照前人的调试经验,这时我们已经获得了最大的比例和微分数值。这时,将我们这个数值乘以0.6就是我们需要的数值,最后通过微调得到:Kd=-97, Kd=-1.38。

5.3速度环调节

 有了速度环后我们还并不能让小车保持直立。通过实验可以发现,当加入微小的扰动之后,小车会向一个方向快速倒下。这是因为只依靠俯仰角信息,我们不能使有一定速度的小车依然保持平衡,小车会由于惯性倒下。我们要让小车停下来,小车需要行驶更快的速度去“追”,小车运行的速度越快,去“追”的速度也就越快。

Kp和Ki的极性相同,且是一种线性控制器,它们的系数大小一般有Ki=Kp/200的关系。

A.确定Kp,Ki的极性

关闭直立环控制后,设置Kp=100,Ki=0.5,拿起小车将其中一个轮胎向任意一个方向旋转,另一个轮胎会自动反向旋转。这就是一般控制系统中的负反馈现象,这是我们不想看到的结果。

设置Kp=-100,Ki=-0.5,拿起小车将其中一个轮胎向任意一个方向旋转,另一个轮胎会向相同的方向旋转并逐渐加速到最大值。自此,我们可以确定Kp,Ki的极性为负值。

B,确定Kp,Ki的大小

由于直立环和速度环是相互制约的系统,所以先打开已经调整好的直立环控制。

  1. 设定 Kp=-100,Ki=-0.5,此时小车的速度控制比较弱,很难让速度恒定。
  2. 设定 Kp=-150,Ki=-0.75,此时小车已经可以保持直立,但是轻推小车后,小车会向一个方向“滑行”很长一段距离,说明对于速度的控制依然不够。
  3. 设定 Kp=-200,Ki=-1,此时小车已经可以保持直立,但是轻推小车后,小车会剧烈抖动,说明对速度的控制过大。

通过以上步骤,我们可以判断Kp, Ki的范围为Kp:-150~-200,Ki:-0.75~-1,通过反复调整,最后我们确定Kp=-180,Ki=-0.9。

5.4转向环调节

我们前面说过,有了直立和转向环控制后小车就已经能够有很好的平衡性能。但是想要小车走直线或者转向还需要转向环控制转向角和两轮的差速度值。这里我们使用左右轮编码器数据之差的积分值作为比例控制量,以 Z 轴陀螺仪作为微分控制的输入进行 PD控制,目标是保持转向角为设定值。

A.确定Kp, Ki的极性

将直立环和速度环关闭,设置Kp=-10,Ki=-0.1,将小车放到地面尝试转动小车。发现小车能够很轻易地被转动,这样的正反馈是我们所不希望看到的。设置Kp=10,Ki=0.1重复上述操作,我们发现下车很难被转动,说明小车控制电机保持走直线,可以确定Kp, Ki均为正值。

B.确定Kp, Ki的极性

首先开启已经调试好的转向换和速度环。

  1. 设置Kp=10, Ki=0.1,控制小车前进,发现小车走直线的偏差很大。
  2. 设置Kp=30, Ki=0.3,控制小车前进,小车走直线的能力已经很好。
  3. 设置Kp=70, Ki=0.7,控制小车前进,小车在急停的时候又剧烈抖动,对方向的控制过大。

可以确定Kp:30~70, Ki:0.3~0.7, 通过多次调整最终确定Kp=42,Ki=0.5。最后小车具有很好的平衡特性,且能完成前进后退以及转向的功能。

6 总结

6.1小结

本次课设对我们小组的成员来说是一次勇敢的尝试和巨大的挑战。之所以这么说是因为我们的单片机基础比较差,还选择了这样有难度的题目。但是这一次尝试也给我们带来了宝贵的收获,下面就我们的课设做一下总结。

首先是准备阶段,我们提前前三个月开始恶补关于单片机,在花了一个月学习完了51单片机后,之后的时间就用来学习和使用STM32F103。相比于51的驾车就熟,STM32少了很多约束,但是随之而来让人眼花缭乱的库函数、寄存器操作让我们应接不暇。我们选择跟着野火的教程系统的学习STM32的标准库操作和初级实验,虽然知道我们实力不济但是在学习一个月后我们硬着头皮开始了课设。这是因为基础不牢,之后我们也是麻烦不断。

第一个遇到的问题就是使用MPU6050,我们参考了官方给的DMP手册和CSDN上的一些资料进行操作。一切看上去比较顺利,但是无论怎么样MPU6050只能读到上电时的初始数据。经过查阅资料我们发现是MPU6050的FIFO溢出,在每次读取数据之前对FIFO进行重置操作后问题得到了解决。但是严重的延时问题,最终还是让我们放弃了使用CH32。在赶完了所有程序之后,就是漫长的调参过程,一开始无论我们这样调整参数效果都不太理想。

首先我们将问题归结于机械结构,我们将小车拆了又装装了又拆,来来回回调整了十多次。一开始使用胶带固定模块,后来发现效果很差又改用了捆扎带。又将电池换成重量较小的聚合物电池,但是还是不太理想。最后我们像是搭积木一样从下而上一点一点搭建结构。每一步都尽量让小车的重心处于几何中心。这样没有上电的小车才能勉强立起来一两秒。

但是我们无论这样再优化参数最后小车总是在平衡几秒钟后向一个方向加速倒下。后来我们询问了有智能车比赛的学长得知应该是PID的读取没有定时的问题。之后一切豁然开朗我们将DMP读取和PID算法同时放到外部中断当中,用MPU6050自带的中断引脚INT发出的信号作为定时信息。这样就能维持高度的周期性,且PID和DMP也会高度同步。这样原本的抖动现象就消失了,经过简单的参数整定就能保持稳定。

至此我们的课设才画上一个句号,但是还是有一些遗憾。参数还可以进一步优化,之前的一些功能和想法也没来得及实现。但是我们收获了很多知识,也培养了自己多学多问大胆尝试的精神。在我们不够擅长的机械控制领域也有了一些涉足,也体会到了做一个完整的系统的困难。从硬件到软件只要有一步出错,最终的表现将大相径庭。在未来的工程应用和科研中,我们必定会遇到比这更困难的系统。这需要我们学会合作,认真的态度,从小事做起每一步都脚踏实地才能做成大事。

6.2团队分工

你猜!

7 参考目录

 

[1]卓晴. 第七届全国大学生“飞思卡尔”杯智能汽车竞赛电磁组直立行车参考设计方案[M]. 智能车竞赛秘书组, 2012.

[2]刘火良. STM32库开发实战指南[M]. 机械工业出版社, 2013.

[3]卓晴, 黄开胜, 邵贝贝. 学做智能车:挑战"飞思卡尔"杯[M]. 北京航空航天大学出版社, 2007.

[4] Xiaogang R ,  Hongge R , 阮晓钢, et al. Two-wheeled self-balancing mobile robot dynamic model and balancing control两轮自平衡机器人动力学建模及其平衡控制*[J]. 计算机应用研究, 2009, 26(1):99-101.

[5]高正中, 龚群英, 宋森森. 基于STM32的智能平衡车控制系统设计[J]. 现代电子技术, 2016, v.39; No.469(14):46-48.

[6]王开亮, 王琪, 秦海亭,等. 基于电磁寻迹的二轮自平衡小车的设计与实现[J]. 自动化与仪器仪表, 2020, No.243(01):83-86.

[7]闻双云. 两轮自平衡小车控制算法的研究与优化[D]. 吉林大学.

[8]赖义汉, 王凯. 基于MPU6050的双轮平衡车控制系统设计[J]. 河南工程学院学报:自然科学版, 2014.

 

想要源代码的同学可以选择支持一下:基于stm32和MPU6050的平衡车代码+技术报告-嵌入式文档类资源-CSDN下载

或者前往我的B站专栏文末去白嫖

┭┮﹏┭┮B站同id:for逸

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43323255/article/details/123628999

智能推荐

Steve Jobs遗失的珍贵访谈_<meta itemprop="uploaddate">-程序员宅基地

文章浏览阅读2w次。 &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt; &lt;meta http-equiv="X-UA-Com_

电子测量-示波器的应用_数字示波器怎么调心电图-程序员宅基地

文章浏览阅读2.6k次。目的 1.熟悉和掌握示波器的组成及各控制键的作用,并能正确使用。2.能够分析示波器的工作原理,能够利用示波器测量电压、频率、相位差和调幅系数等测量,并对测量结果进行分析处理。3.能够理解示波器测量时间、电压和相位的基本方法。 任务 1.理解测周法的原理并实践检测成果。2.理解测频法的原理并实践检测成果。 内容 1.直流电压测量(数字示波器)(1)选择通道CH1或CH2,将输入“耦合”选择为“接地”,调整垂直移位旋钮使扫描时基线移到屏幕中间或其他适当位置上,.._数字示波器怎么调心电图

公众号数据分析系列之-caoz的梦呓-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏2次。导读:关注曹大的公众号和加入知识星球有一年半了,我和大家一样从曹大那里受益良多。不过说来惭愧,明知道曹大的公众号是个宝藏,却一直没有系统学习,因为曹大真的很能写(主要因为我懒),那么该如何最高效得学习他的这些文章呢?作为一个菜鸟公众号主我可以从曹大 V 这里借鉴点什么呢?甚至,在我可以批量拿到许多原始数据的情况下要怎么挖掘这些数据的价值呢?于是我想到下面几个问题:曹大的文章中最受欢迎的是哪..._caoz的梦呓

win10显示rpc服务器不可用,win10系统RpC服务器不可用的详细办法-程序员宅基地

文章浏览阅读3.3k次。win10系统使用久了,好多网友反馈说win10系统RpC服务器不可用的问题,非常不方便。有什么办法可以永久解决win10系统RpC服务器不可用的问题,面对win10系统RpC服务器不可用的图文步骤非常简单,只需要1、使用netsh interface ip add 添加ip的时候出现下面的提示:RpC服务器不可用。 2、解决办法在这里开始:打开运行框;输入services.msc命令。就可以了。..._rpc服务器不可用

Shell脚本自动部署(编译)LAMP平台-程序员宅基地

文章浏览阅读194次。Shell脚本自动部署(编译)LAMP平台LAMP是当下非常流行的一套Web架构,我们可以在GNU/Linux下通过其他人打包的程序包来进行安装; 但是在生产环境中,很多时候都需要我们自己定制安装AMP,编译安装LAMP有以下几个优点根据生产环境灵活定制程序优化编译参数,提高性能解决不必要的软件依赖友情提示:对编译安装有疑问的朋友, 查看我以前写的博客:教你使用rpm、yum..._shell脚本编排平台

Centos7.2上安装libreoffice7.1.0.2-程序员宅基地

文章浏览阅读2.9k次。目录文章目录目录1. 环境准备1.1 机器准备1.2 系统环境2. 升级操作系统3. 安装依赖包4. 安装4.1 下载安装包4.2 创建安装目录4.3 把下载的包上传到目录/opt/libreoffice7.1/中4.4 解压安装包4.5 分别进入解压之后的目录中执行安装命令4.6 确认安装是否成功5. 启动服务6. 查看端口或者进程是否启动1. 环境准备1.1 机器准备服务器ip主机名系统版本192.168.2.215myhostCentos7.21.2 系统环境_libreoffice7.1

随便推点

Umbraco网站制作(四) XSLT使用-程序员宅基地

文章浏览阅读92次。XSLT可拓展样式表语言。如果大家不知道的,可以上http://www.w3school.com.cn/学习在Umbraco中,XSLT的用法很多,用好了效果也很多,比如搜索,指定显示的条目啊,等等。为了演示这个的效果,我们根据第一篇文章写到的,我们多创建一些标签去,如图。我又多创建了一个HomePage标签。这里值得大家注意的是Structure这里,我们如..._umbraco.library

一文让你彻底弄懂 “vue-style-loader” 跟 “style-loader” 区别-程序员宅基地

文章浏览阅读2.7w次,点赞40次,收藏73次。一文让你彻底弄懂 “vue-style-loader” 跟 “style-loader” 区别简介用过 vue-cli 脚手架搭建 vue 项目都知道,vue-cli 中内置了 vue-style-loader 去加载样式模块,最后通过 <style> 标签把样式加载到页面,但是 style-loader 同样可以达到同样的效果,那么 vue 官方为啥还封装一个 vue-style-loader 库呢?那么它们到底有啥区别?平时项目中又该如何选择呢?下面先看一下它们各自官网的简介。开始_vue-style-loader

ajax传json后台接收,Ajax传Jsond Mvc后台接收实例-程序员宅基地

文章浏览阅读555次。Ajax传Jsond Mvc后台接收实例复制代码 代码如下://后台[HttpPost]public JsonResult CheckStock(IEnumerable pvIds){}public class pvIdsCount{public int pvId { set; get; }public int count { set; get; }}//前台$(document).ready(f..._c# ajax传json mvc后台接收实例

整数线性规划实现(lingo,python分枝界定法)_lingo整数约束怎么写-程序员宅基地

文章浏览阅读7.1k次,点赞20次,收藏62次。本文章为上篇建模学习打卡第二天的续文章目录一、本次问题二、本题理解三、问题求解1.lingo实现(1)先抛除整数约束条件对问题求解(2)加入整数约束条件求解2.python实现求解(1)先抛除整数约束条件对问题求解(2)加入整数约束条件求解实现 通过 pulp 库求解(3)加入整数约束条件求解实现 分枝界定法求解一、本次问题二、本题理解目标函数:max = 40x1+90x2一级约束条件:9x1+7x2<=56..._lingo整数约束怎么写

Windows 7: Update is not applicable to your computer-程序员宅基地

文章浏览阅读924次。https://www.sevenforums.com/windows-updates-activation/119088-update-not-applicable-your-computer.html Belarc Advisor - Free Personal PC Audit Secunia Personal Security Inspector Download D..._win7the update is not applicable to vour computet

业界资讯 :flash player11 介绍_flash player 11-程序员宅基地

文章浏览阅读1k次。http://www.adobe.com/products/flashplayer.html这里有关于flash player 11 的一些视频介绍。有兴趣的人可以看看。最近flash player 11.2 正式版已经放出来了,支持stage3d 和兼容老显卡。http://get.adobe.com/cn/flashplayer/_flash player 11

推荐文章

热门文章

相关标签