单片机课程设计报告 基于STM32陀螺仪姿态读取的平衡车_第1页
单片机课程设计报告 基于STM32陀螺仪姿态读取的平衡车_第2页
单片机课程设计报告 基于STM32陀螺仪姿态读取的平衡车_第3页
单片机课程设计报告 基于STM32陀螺仪姿态读取的平衡车_第4页
单片机课程设计报告 基于STM32陀螺仪姿态读取的平衡车_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《单片机原理与接口技术》课程设计(报告)基于STM32陀螺仪姿态读取的平衡车摘要双轮平衡车是一种利用倒立摆原理的高度不稳定两轮机械装置,其力学特性具有多变量,非线性和不稳定等特点。本文使用STM32F103C8T6作为MCU,利用MPU6050六轴加速度陀螺仪和带霍尔编码器的MG315减速电机搭建平衡小车。通过整合小车的加速度、倾角进而速度信息,应用串级PID算法实现对小车的直立行走以及差速转向。此外,还使用HC-06蓝牙模块实现对小车的无线控制,利用4路光电模块完成寻迹功能,经过试验本系统具有较强的适应性和稳定性。关键词:STM32F103C8T6;双轮平衡车;MPU6050;串级PID;单片机原理与接口技术课程设计(报告)目录TOC\o"1-3"\h\u24495第1章概叙 概叙双轮平衡车的发展背景双轮平衡车是一种应用广泛的动力学系统,具有多变量,非线性和不稳定等特点。在研究控制论和应用方面都有巨大的意义,近年来它的发展也受到了人们的广泛关注。双轮直立平衡车可以简化为一阶倒立摆模型进行分析,设计的目标是保证小车能够在启动后快速到达平衡位置,并且能够在外界施加随机扰动后依旧没有振荡和过大的角度偏移。即当小车达到期望的状态后,能够通过控制系统实现动态稳定。双轮平衡车的发展意义我觉得前景应该还是不错的,生活是向着智能化,便捷化的方向发展,自平衡车符合这个趋势,顺应了时代的潮流,有着良好的发展前景。总体方案设计概述直立小车使用MPU6050内部DMP算法读取小车当前在三个方向上的倾角和加速度作为输入量,此外利用霍尔传感器得到车轮转速作为反馈信息。小车左右两个轮子的转速和转向作为控制量,实现前后运动和差速转向。整个控制过程通过串级PID来实现,利用TB6612芯片调节PWM输出的占空比以改变电机转速。最后通过控制参数的调整和优化,实现小车的稳定运行。硬件设计硬件框架硬件方面主要由STM32F103C8T6最小系统,TB6612电机驱动,电源管理模块,HC-06蓝牙,OLED显示屏,控制按键和编码电机组成。通过单片机输出的PWM控制左右电机的转速,完成前后作用运动。利用寻迹模块检测地面黑线达到寻路功能,硬件框架如下图:图1.硬件框架图硬件方案论述平衡车结构论证与选择小车需要搭乘多个模块,因此需要足够的空间。这里我们选择双层结构,层与层之间用铜柱和螺丝固定。模块和车体之间用捆扎带固定,杜邦线使用热熔胶固定。车体总的来说较为稳定,在旋转和高速运动时车上每个结构都能够保持相对静止。小车实物图如下:图2小车正视图图3小车侧视图A.框架材料选择平衡小车的重心要尽量低,且尽量处于车体的平面上的几何中心。这样小车加速度和倾角将更趋于线性,也将更便于控制和整定参数。因此我们选择铝制板和37电机支架这样较重的材料做车的底层,而顶层选择用亚克力。在保持结构有足够的刚度的同时,将重心尽量拉低。B.车体大小选择平衡小车的控制要点类似于四旋翼飞行器,两者的都是体积越大越容易控制,在受到随机扰动的时候也越容易保持稳定。但不同的是小车是需要严格控制一个方向(俯仰角)的角度,而四旋翼飞行器是要保持两个方向(俯仰角和翻滚角)的角度。也就是说垂直于小车运动方向的距离,即适当增大轮距有助于小车的平衡。陀螺仪论证与选择方案一:选用双轴倾角传感器LE-60-OEMLE-60-OEM,可以测量x,y方向上的重力加速度变换,以转换成倾角。具有成本低,体积小,重量轻等优点。但是操作复杂,软件处理难度大。此外,虽然小车的航向角Yaw不太重要,但是失去转向环对小车的稳定性依旧有一定影响。方案二:MPU-6050是全球首个整合性6轴运动处理组件,具有体积小、重量轻和响应速度快等优点。可以测量整个空间的加速度,全面反映运动物体的空间位置。芯片内部还有温度传感器能够拟补温度造成的误差,使用I2C即可完成与MCU的通信。此外利用芯片内置的DMP功能能够很便捷地获取姿态信息,避免了复杂的算法操作和外围电路。DMP(DigitalMotionProcessor)是MPU6050内部的运动引擎,可以通过它直接输出四元数,可以减轻外围微处理器的工作负担且避免了繁琐的滤波和数据融合,使用方便。方案三:MPU-6050加上外接3轴磁力计可以实现9轴运动处理。相比于单独的MPU-6050传感器,这种组合可以拟补测得的航向角因为磁场和硬件问题造成的积分累积偏差,但是也大大增加了硬件的成本。由于较小的航向角误差对于小车的整体性能并不会有较大的影响,我们也不需要小车在复杂的磁场环境下长时间工作,这里我们直接选择方案二。控制器的论证与选择方案一: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的高速读取,我们最终选择方案二。电机驱动模块论证与选择方案一:L298N直流电机驱动模块是一种接受高电压的电机驱动器,被广泛应用到直流电机和步进电机的驱动。通过主控芯片的I/O输入对其控制电平进行设定,就可为电机进行正转反转驱动。总体来说其操作简单、稳定性好,可以满足直流电机的大电流驱动条件。方案二:TB6612N是一款功能基本等同于L298N的电机驱动芯片,相对于L298N它有体积小,结构简单的特点。此外它的PWM响应速度、效率都优于L298N,发热也更少。综合考虑,我们选择能够快速相应且节省空间的TB6612芯片作为电机驱动,即方案二。无线模块论证与选择方案一:HX1838B红外接收模块能够满足短距离内的遥控需求,且价格低廉,结构简单,只需要简单的解码就可以接收数据。但是使用它需要占用一个中断,影响程序的运行效率。方案二:HC-06是一种广泛应用于各种场合,且支持蓝牙4.0驱动的模块。在最新的安卓、IOS、Windows操作系统以及微信小程序中都能自由使用,具有很强的兼容性。此外,使用它可以直接通过USART串口和上位机通信,方法简单技术成熟。实际测试中我们发现红外接收模块正常接收数据必须保证无遮挡,且正常通信距离不超过2m。这给我们的调试带来了很多不便,因此我们最终选择方案二。电源和稳压模块的论证与选择方案一:12V18650锂电池+12V-5/3.3V电源模块可以满足电机12V驱动供电,以及单片机和其他模块的正常供电。方案二:12V聚合物电池+12V-5/3.3V电源模块功能与方案一相同,最大的区别在于聚合物电池的体积小。对于需要重心高度集中的平衡小车而言选择小体积是必要的,此外聚合物锂电池放电效率也更高。所以我们选择方案二。电机种类的论证与选择方案一:步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件,在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,电机的位置可以被精准控制。但是对于平衡小车这个极度不平衡的系统,受到的干扰很大,很难完成精准控制。方案二:减速电机是在上普通电机加上了减速箱,这样便降低了转速,增加了扭力。满足了小车大载重和高速反应的需求,但是速度控制需要用PWM波调节,精确度不是很高。综合考虑,我们选择方案二。小车的主要目的是能够平衡,对速度控制要求不高。软件设计软件整体设计软件方面主要是通过MPU6050读取的三轴角速度和倾角信息作为基本的控制信息,再加上霍尔编码器输出的左右轮转速作为反馈信息实现。算法方面使用串级PID算法,包括PD直立环、PI速度环以及PD转向环三个方面综合计算实现小车的稳定运行,软件框架如图所示:图4.算法框架图软件系统功能论述MPU6050数据读取MPU6050的数据读取一般有三种方式,分别是DMP、互补滤波和卡尔曼滤波。互补滤波和卡尔曼滤波能够一定程度解决航向角偏移的问题,而且对于随机干扰也有更优秀的表现,但是实现较为复杂的算法。从自身实力考虑,我们选择使用MPU6050内置的DMP运动芯片自动解算模块,只需要通过简单读取寄存器操作便可以获得小车的姿态信息。最初我们选择将读取DMP数据的函数和PID算法都放到main中执行,但无论我们怎样调整参数,小车只能维持短暂的平衡,且会在平衡之后进行高频振动。在多方查找资料后我们发现,PID算法需要保持良好的周期性。特别是在进行PD运算时,短暂的时差就会导致巨大的误差。而MCU的每个运行周期受到运算量的影响,所以PD算法也会有随机误差产生。所以我们选择将DMP读取和PID算法同时放到外部中断当中,用MPU6050自带的中断引脚INT发出的信号作为定时信息。这样就能维持高度的周期性,且PID和DMP也会高度同步。这样原本的抖动现象就消失了,经过简单的参数整定就能保持稳定。PID算法我们选择简单的串级PID算法,所谓串级PID类似于串联,它将PD直立环(balance)、PI速度环(velocity)和PD转向环(turn)结果分别计算最后相加。得到输出左右轮的PWMA和PWMB输出。其极性代表转向。三个环量“你追我赶”,“相互制约”才能保证一个动态稳定的系统,具体计算公式如下:其中直立环使用比例+微分变量(PD)进行控制,比例系数计算小车倾角与平衡位置的差(Bias),而微分系数计算小车俯仰角的加速度(gyroy)。小车的直立情况与积分量无关,主要与其位置和加速度有关,具体计算公式如下:速度环使用优化后的限幅比例+积分变量(PI)进行控制,比例系数计算小车左右轮速度之和和零之间差值(Encoder_Least),积分系数计算小车速度差累加和(Encoder_Integral)。由于速度控制与小车的加速度几乎无关,所以只是用PI控制,具体公式如下:转向环一般可以单独使用P控制,直接差速即可。但是在实验过程中,地面过于光滑调整参数后的整体效果极不理想,最后我们选择用限幅的PD控制。通过轮胎的反馈速度和航向角Yaw来给定差速。比例系数计算控制理想差速度(设置为0,小车理想状态是处于静止平衡状态)和实际差速度的差(Turn_Target),微分系数计算z轴陀螺仪转向角(yaw),具体计算公式如下:将以上三者融合在一起,我们可以得到以下框图用以表示本文中所用到PID算法流程:图5.PID算法框图电机测速电机测速使用双输出的正交霍尔编码器输出,这种旋转编码器不仅可以测量速度还可以测量旋转方向,编码器的两组A/B输出相位差90度的300个双相脉冲。想要使用脉冲信息测量速度,首先使用定时器定时50ms。编码器转一圈会发送脉冲,一个脉冲可以产生一个中断,在中断函数里令一个变量自加,每产生一个脉冲总脉冲数就加一。之后用脉冲数/300就可得到在这50ms内电机转动得圈数,乘以20就是每秒钟转的圈数。寻迹功能通过GPIO输入判断地面线的位置,使用IF语句处于不同位置的情况给予不同的转向力度。实现这个功能和原理比较简单,但是参数整定过程较为麻烦。算法及程序流程图除了以上算法之外,整个程序的运行还有一些小的优化,用语言表达过于繁琐,我将在下面的流程图中表示出来:图6.程序运行流程图系统调试平衡小车的具体参数受到车体结构和地面倾斜角度的影响,参数整定是一个极为枯燥耗时的工作。参数整定没有好的方法,只能通过不断尝试,用“夹逼准则”才能找到最好的值。换言之,好的参数就是大量时间堆积出来的结果,而我们的课设意在学习使用PID,对于参数的调节不过分追求。但仅仅调出一个勉强能用的参数也耗费了我们大半个月的时间,这里我们简单叙述一下参数调整的过程。对于串级PID我们一般先调节直立环,再调节速度环,在调节完这两个环节之后小车就能很好地走直线了。最后我们调节转向环,用于调节转向。每个环的功能如下图所示:.图7PID对应每部分功能确定小车机械中值首先把平衡小车放在地面上,绕电机轴旋转平衡小车,寻找小车能够保持平衡的角度并记录,这里我们获得的角度是0°。直立环调节直立环是保证小车能够直立的关键,有了直立环小车就能在无任何扰动的情况下保持直立。也就是说,小车可以根据自身的俯仰角数据控制轮胎的转向和转速。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从小到大增加,直到小车出现剧烈高频抖动。设定Kd=-0.5,这时由于比例控制所导致的低频抖动已经基本消失。设定Kd=-1,可以看到小车已经趋于平衡,且松开手后可以保持短暂平衡。设定Kd=-2.3,小车开始出现高频剧烈抖动,但是在遇到这种情况时需要立刻关闭小车,否则长时间高频抖动会导致驱动被烧坏的。按照前人的调试经验,这时我们已经获得了最大的比例和微分数值。这时,将我们这个数值乘以0.6就是我们需要的数值,最后通过微调得到:Kd=-97,Kd=-1.38。速度环调节有了速度环后我们还并不能让小车保持直立。通过实验可以发现,当加入微小的扰动之后,小车会向一个方向快速倒下。这是因为只依靠俯仰角信息,我们不能使有一定速度的小车依然保持平衡,小车会由于惯性倒下。我们要让小车停下来,小车需要行驶更快的速度去“追”,小车运行的速度越快,去“追”的速度也就越快。Kp和Ki的极性相同,且是一种线性控制器,它们的系数大小一般有Ki=Kp/200的关系。A.确定Kp,Ki的极性关闭直立环控制后,设置Kp=100,Ki=0.5,拿起小车将其中一个轮胎向任意一个方向旋转,另一个轮胎会自动反向旋转。这就是一般控制系统中的负反馈现象,这是我们不想看到的结果。设置Kp=-100,Ki=-0.5,拿起小车将其中一个轮胎向任意一个方向旋转,另一个轮胎会向相同的方向旋转并逐渐加速到最大值。自此,我们可以确定Kp,Ki的极性为负值。B,确定Kp,Ki的大小由于直立环和速度环是相互制约的系统,所以先打开已经调整好的直立环控制。设定Kp=-100,Ki=-0.5,此时小车的速度控制比较弱,很难让速度恒定。设定Kp=-150,Ki=-0.75,此时小车已经可以保持直立,但是轻推小车后,小车会向一个方向“滑行”很长一段距离,说明对于速度的控制依然不够。设定Kp=-200,Ki=-1,此时小车已经可以保持直立,但是轻推小车后,小车会剧烈抖动,说明对速度的控制过大。通过以上步骤,我们可以判断Kp,Ki的范围为Kp:-150~-200,Ki:-0.75~-1,通过反复调整,最后我们确定Kp=-180,Ki=-0.9。转向环调节我们前面说过,有了直立和转向环控制后小车就已经能够有很好的平衡性能。但是想要小车走直线或者转向还需要转向环控制转向角和两轮的差速度值。这里我们使用左右轮编码器数据之差的积分值作为比例控制量,以Z轴陀螺仪作为微分控制的输入进行PD控制,目标是保持转向角为设定值。A.确定Kp,Ki的极性将直立环和速度环关闭,设置Kp=-10,Ki=-0.1,将小车放到地面尝试转动小车。发现小车能够很轻易地被转动,这样的正反馈是我们所不希望看到的。设置Kp=10,Ki=0.1重复上述操作,我们发现下车很难被转动,说明小车控制电机保持走直线,可以确定Kp,Ki均为正值。B.确定Kp,Ki的极性首先开启已经调试好的转向换和速度环。设置Kp=10,Ki=0.1,控制小车前进,发现小车走直线的偏差很大。设置Kp=30,Ki=0.3,控制小车前进,小车走直线的能力已经很好。设置Kp=70,Ki=0.7,控制小车前进,小车在急停的时候又剧烈抖动,对方向的控制过大。可以确定Kp:30~70,Ki:0.3~0.7,通过多次调整最终确定Kp=42,Ki=0.5。最后小车具有很好的平衡特性,且能完成前进后退以及转向的功能。结论本次课设对我们小组的成员来说是一次勇敢的尝试和巨大的挑战。之所以这么说是因为我们的单片机基础比较差,还选择了这样有难度的题目。但是这一次尝试也给我们带来了宝贵的收获,下面就我们的课设做一下总结。首先是准备阶段,我们提前前三个月开始恶补关于单片机,在花了一个月学习完了51单片机后,之后的时间就用来学习和使用STM32F103。相比于51的驾车就熟,STM32少了很多约束,但是随之而来让人眼花缭乱的库函数、寄存器操作让我们应接不暇。我们选择跟着野火的教程系统的学习STM32的标准库操作和初级实验,虽然知道我们实力不济但是在学习一个月后我们硬着头皮开始了课设。这是因为基础不牢,之后我们也是麻烦不断。第一个遇到的问题就是使用MPU6050,我们参考了官方给的DMP手册和CSDN上的一些资料进行操作。一切看上去比较顺利,但是无论怎么样MPU6050只能读到上电时的初始数据。经过查阅资料我们发现是MPU6050的FIFO溢出,在每次读取数据之前对FIFO进行重置操作后问题得到了解决。但是严重的延时问题,最终还是让我们放弃了使用CH32。在赶完了所有程序之后,就是漫长的调参过程,一开始无论我们这样调整参数效果都不太理想。首先我们将问题归结于机械结构,我们将小车拆了又装装了又拆,来来回回调整了十多次。一开始使用胶带固定模块,后来发现效果很差又改用了捆扎带。又将电池换成重量较小的聚合物电池,但是还是不太理想。最后我们像是搭积木一样从下而上一点一点搭建结构。每一步都尽量让小车的重心处于几何中心。这样没有上电的小车才能勉强立起来一两秒。但是我们无论这样再优化参数最后小车总是在平衡几秒钟后向一个方向加速倒下。后来我

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论