独轮平衡单车改双轮(双轮载人平衡车设计完整教程)
独轮平衡单车改双轮(双轮载人平衡车设计完整教程)1.3 课题设计要求1、设计车体硬件,主要包括车体重心设计、电子元器件位置摆放,电气布线等,力求车体简洁美观;2、电路设计,主要包括控制模块、稳压电源模块、双轮测速模块、电机驱动模块,保证电子元器件之间不会出现电磁信号干扰;3、设计电机速度控制算法,实现稳定、可靠地车体平衡直立、前进后退以及转向三个功能;要求:(1)可实现载人原地平衡直立,前进后退;(2)平坦道路上可安全、平稳行驶;(3)设计双闭环控制算法;(4)可爬坡8°以上;(5)低速行驶状态下可安全通过路面减速带;(6)大功率高亮LED前后车灯,方便晚上行驶;(7)实时车速显示;(8)最大载重80KG以上,续航20KM,最高时速10KM/H;(9)倾角过大,转速过高或失控等,发出相对应提示;图1.2.3固高教学自平衡车1.2 国内外研究现状近年来,国内外诸多科研工作单位、企业及自平衡机器人爱好者都对自平衡载人机器人领域的发展做出了许
一、硬件篇
双轮载人平衡车采用无污染的电能作为动力,具备体积小、运动灵活、停车方便、狭小地方作业能力强等特点,针对当今社会交通拥挤、汽车尾气污染等问题提出了新型的出行方式解决方案。便捷、智能、迷你实用、纯绿色的平衡车既可以有效的解决中短距离的交通问题,又能健身娱乐,得到了广大群众的拥护和喜好。同时,自平衡车作为高度灵敏的非线性不稳定体,具有强耦合、欠驱动等特征,是研究自控技术及理论的绝佳实验平台。
设计中充分分析了自平衡技术的工作及控制原理,运用了经典的牛顿力学建立载人平衡车的动力学与运动学模型,参考倒立摆的运动设计了自平衡控制算法。对系统的可控角度、最大爬坡角度、可控性、可观测性进行了分析,得到了载人平衡车设计的指导性结论。硬件系统设计包括车体、车轮、19花键免法兰轮胎、直流减速电机、铅酸电池以及STM32主控制电路、MPU6050姿态检测电路、AS5040增量式编码器电路和两个超大功率H全桥电机驱动。通过对编码器与姿态传感器的数据融合,获得了实时的、低噪声的车身倾角信息与电机转动速度信息,采用双闭环控制算法调整PWM占空比控制电机转动实现了车身的原地平衡直立、前行后退、转向等功能。
实测结果表明,本文所设计的载人平衡车能够很好的实现自平衡并且稳定的运行,其快恢复性,准确性和稳定性能良好。
关键词:非线性;超大功率H全桥;双闭环控制算法;STM32;MPU6050;
研究目的及意义
生活是向着智能化,便捷化的方向发展。而在交通和环境问题日益突出的当今,作为适合多种场合使用的代步工具,平衡车顺应了时代的潮流,具有使用简单、节能环保、移动灵敏便捷等特点,尤其在空间狭窄、急转角度大的工作场合作业优势更凸显。如今全球变暖将给地球带来严重灾害,而气温变暖的罪魁祸首,便是工业废气、汽车尾气等大量的排放。当今世界的另一个危机就是能源危机,节能环保交通工具取代传统是必然趋势,为平衡车的发展提供了广阔的发展空间。同时,作为新式健身器材锻炼平衡性发展警用型设备,在原有基础上进行合理的优化和设计,更适用于道路交通防治工作的代步,从而获得了广泛关注。作为一个非线性的对称系统,具有强耦合、多变量、参数不确定等特性。其原理和传统的倒立摆系统类似,本身是一个自然重心不稳定的物体,需要电机的控制来维持姿态的平衡,通过姿态传感器、控制算法、微控制器数据拟合驱动电机转动及车体机械集装配置整体协调制衡,是集环境感知、姿态检测、动态规划与决策、行为控制与执行等多种功能于一体的非线性系统,其控制难度大,控制算法复杂,给自动控制理论体系提出了很大的挑战,具有较强的理论研究和实践价值。
1.2 国内外研究现状
近年来,国内外诸多科研工作单位、企业及自平衡机器人爱好者都对自平衡载人机器人领域的发展做出了许多突破性的贡献,积累了宝贵的理论与实践经验,极大地促进了自平衡技术的前进速度,同时也将一批具有代表性的自平衡机器人和载人代步产品展现在世人眼前。
2002年,美国赛格威(Segway)发布了全球第一款双轮载人平衡车,时速可达20Km/h。如图1.2.2所示,赛格威自平衡车颠覆了人们日常以低重心、大而宽、多点平衡式的地盘设计的传统观念。让世人得以见识本身即自然不稳定的双轮车体通过内置的姿态传感器和编码器数据融合驱动大功率无刷伺服电机来保持车体直立以及灵活运动的类似倒立摆的机械结构也是可以平衡直立与稳定行驶的。。平衡车只需要三个陀螺仪就可以完全监测车身的前后左右倾与侧倾斜程度,赛格威更是安装了五个航空级别的固态陀螺仪以作为行车安全防范作用的备用装置。除了修正前后倾与前进后退外,赛格威车身的转向可以通过两种方式来控制。其中一种可以扭转其把手部分,使得车辆左右轮产生速差来控制其转向;除此之外驾驶人在行进过程中通过倾斜身体,利用驾驶人的体重所产生与赛格威车体纵向垂直的分量,作为拐弯转角时的内向心力而达到扭转方向的目的,这是只有赛格威办得到的动作。
图1.2.2 Segway
深圳固高科技有限公司研发的教学自平衡车,如图1.2.3所示,使用减速比为10:1的85W大功率直流有刷伺服电机作为动力执行单元,可达最高1.6m/s的运行速度,最大爬坡角度20°。采用24V镍氢电池供电,可连续运行1.5小时。
图1.2.3固高教学自平衡车
1.3 课题设计要求
1、设计车体硬件,主要包括车体重心设计、电子元器件位置摆放,电气布线等,力求车体简洁美观;
2、电路设计,主要包括控制模块、稳压电源模块、双轮测速模块、电机驱动模块,保证电子元器件之间不会出现电磁信号干扰;
3、设计电机速度控制算法,实现稳定、可靠地车体平衡直立、前进后退以及转向三个功能;
要求:
(1)可实现载人原地平衡直立,前进后退;
(2)平坦道路上可安全、平稳行驶;
(3)设计双闭环控制算法;
(4)可爬坡8°以上;
(5)低速行驶状态下可安全通过路面减速带;
(6)大功率高亮LED前后车灯,方便晚上行驶;
(7)实时车速显示;
(8)最大载重80KG以上,续航20KM,最高时速10KM/H;
(9)倾角过大,转速过高或失控等,发出相对应提示;
2 载人平衡车建模和控制策略
2.1 载人平衡车工作原理
自平衡车是建立在基于动态平衡的自动控制系统上的一种高度灵敏、快恢复的非线性系统。而载人平衡车则是建立在自平衡的基础之上,与人体操作相融合的高度协调的“思维车”。相较于一般的自平衡小车而言,载人平衡车具备更高的抗干扰能力和更快速的自平衡恢复能力[8]。车身内置高精度、高速的姿态传感器实时监测车体倾斜角度,并通过数字滤波算法与电机测速的编码器数据相融合,根据接收到的倾斜角与加速度信息,中央控制器随即的做出相应的判断指令并输出频率固定、动态可调幅度的PWM波以驱动电机转动去维持系统的平衡[5]。通过采集把手带动转向电位器转过的模拟值,判断在当前行进速度下安全平稳转弯的角度大小,达到稳定、灵活的行进。
2.2 载人平衡车动力学与运动学建模
参照日常生活中手托木棒保持直立的现象,我们以木棒直立控制来建立自平衡系统的模型。如图2.2.1手托木棒控制系统所示,首先我们理想的状态是要保值木棒的直立,但是实际中以手掌掌托为零点平面的话,木棒总会朝着这个圆面的任意一个可能的方向倾斜甚至倒下,此刻我们的大脑就会通过眼睛观察木棒与掌托平面之间的倾斜角与大致判断在这个倾斜方向上的加速度并不断的发送指令给我们的执行机构(手掌)不断地以不同的速度移动位置来尽可能的达到木棒的直立[3]。而双轮载人平衡车的控制相对于手托木棒保持直立来说较为简单一些。因为小车具备两个轮子接触地面,所以车身只需要在一维上面保持平衡即可,理想的情况下,只需要不断地调整轮子前后移动的速度即可维持车身的平衡。
图2.2.1 手托木棒控制系统
2.3 载人平衡车控制算法
自平衡的控制算法可以参考单摆系统的运动来做分析,如图2.3所示,在重力场的作用下,单摆摆动的角度与其运动方向相反的回复力成正比。但由于空气阻力的存在,单摆最终会停留在竖直位置上。但是对于自平衡车而言,我们不但要通过MCU控制使电机输出与车身倾角成正比的回复力,还要施加与角速度成正比关系、方向相反的阻尼力。针对上述,可以得到平衡控制算法: 。所以只需计算角速度及角度的偏差便可得到可以维持小车平衡的回复力[10]。
图2.3 单摆系统
3 系统方案分析论证及选择
3.1 主控芯片选型
方案一: ARM V7-M架构作为目前的主流构架,被英国的ARM公司应用到Cortex-M3当中,和曾流行一时的 ARMV4T 架构相比,它拥有性能更强运算核心、更低的功耗和优良的性价比。STM32F103xx系列运行主频为72MHz,外设资源丰富,集成一整套完整固件库,和51单片机直接操作寄存器的方式有所区别,可直接调用标准库函数进行项目开发,操作简单,调试方便,通用、高级定时器包含的编码器接口模式在电机测速上拥有无与伦比的优势,是同价类产品中性能最高的产品。
方案二:选择宏晶科技的STC12C5A60S2增强型51单片机。STC12C5A60S2抗干扰能力强、消耗功率极低,和传统的51单片机运行速度相比较,它的运行加快了10倍,而且它们两者之间的指令代码具有无缝的兼容性。内部集成MAX810专用复位电路,一旦接上电源便可以实现自动复位。但内部的资源相对较少,运算速度不足以满足自平衡系统快速、复杂的数据运算和融合,内部存储空间小,性价比低。
考虑到系统的复杂度、自平衡车身内置的高精度姿态传感器数据融合和编码器数据处理的复杂计算任务,需要与传感器进行IIC通讯,通过ADC采集电池电压、转向电位器数据并输出多路灵活可控的PWM信号。结合以上所述方案,选择方案一,即用STM32F103C8T6作为本系统的主控芯片较为合适。
3.2 姿态检测传感器方案选择
方案一:MMA7260和ENC-03是美国飞思卡尔公司的姿态传感器,广泛应用于运动与控制系统中。MMA7260三轴加速度传感器与ENC-03陀螺仪数据融合后可检测倾角,跌落状态等诸多方面。运用角速度原理,将由物理位置偏移情况所产生的位移转换成电流输送到主控IC中,通过观察再对它所产生的位移进行一些调整,以便达到稳定的目的。在照相机、飞机模型等产品设计中得以广泛应用。
方案二: MPU-6050三轴陀螺仪三轴加速度计拥有良好的性能而被广泛应用于飞行器,机器人等运动控制类产品中。其将 6轴运动处理组件使用多种方案进行整合得出最优值,来解决陀螺仪与加速度计轴间差的问题。缩减了物理包装空间,便于安装在各种不同环境下的物理位置。通过IIC协议读取内部原始的数据并由四元数矩阵计算出欧拉角。经过卡尔曼滤、DMP、互补等波算法滤波后输出的角度精确稳定,足以满足高灵敏度的随动控制系统在姿态检测上的要求。在DMP方面,它还支持多种操作系统系统,为应用开发提供了架构化的API。
综合以上所叙述的:选择MPU6050模块作为自平衡系统的姿态检测部分,可以有效地解除物理上的轴间差问题,实现了载人平衡车工作的可靠性和系统工作的稳定性。
3.3 电机选择方案
方案一:步进电机的步进角与脉冲数属正比关系,调节速度范围相对较宽,在配合驱动器的情况下可以做到步进角度细分,提高其运行精确度,产生的误差也不会进行累积。但是步进电机步距角是固定化的,对于分辨率的灵活性是有所欠缺的,而且步进驱动时容易造成车体震荡,不利于小车的稳定。步进电机虽然可以使用细分驱动方式克服上述缺点,但是细分驱动电路结构复杂,且大功率的步进电机价格相对较高,性价比极低。
方案二:直流无刷电机继承了直流有刷电机机械特性好的优点,同时拥有较宽的调节速度范围,而且无刷电机的构造没有安装换向器和电刷,让无刷电机具有高度的可靠性和长期的使用寿命,运行时产生的噪音小。市面上一般的无刷电机输出扭矩小,全桥逆变器电路极其复杂,负载性能不强且价格偏高。
方案三:直流有刷减速电机。直流有刷减速电机具有扭矩大,机械特性硬,运行响应速度快,可调节速度范围宽,可控制性强的特点,双轮载人平衡车对灵敏性、快速性等性能的要求可以被满足,虽然电机的电刷会导致电机的使用寿命减短,电磁干扰的产生也无法避免。但是基于负载较轻的设计,换向器和电刷的损失功耗比较低。为了能够有效率地降低电磁干扰,多层机械结构被选择应用到车体中,使得电机驱动电路能够与其他电路进行分离开。综上,选择两个36V 350W带有减速齿轮的直流有刷电机驱动自平衡车较为合适。
3.4 系统组成
综合以上所叙述的,选择STM32F103C8T6单片机作为主控芯片,MPU-6050姿态传感器,直流有刷减速电机,大功率H全桥电机驱动器组成双轮载人平衡车硬件系统。辅以卡尔曼滤波算法对陀螺仪和加速度计数据进行融合 计算出车身倾角与角速度的最优估计值。并以最优姿态角和车身速度作为反馈量构成双闭环控制反馈回主控制系统中产生两路动态可调的PWM波驱动电机前后转动以维持车身的平衡与直立。系统框图如图3.4所示。
图3.4 系统框图
4 平衡车硬件设计
4.1 STM32主控电路
双轮载人平衡车选择的是STM32F103C8T6作为中央控制器,其内部包含丰富的资源。自平衡车主控系统设计中采用核心板 转接板的方式工作,力求精简小巧,其板载资源如下:
1个复位按钮,可用于复位MCU系统以及转接板上的相关外设;
1个采用2x3 6Pin排针的启动模式选择配置接口,用于选择复位后MCU的启动模式;
1个4线SWD调试下载接口,极大的精简了下载调试需要占用的IO资源和PCB整体尺寸,SWD只需两个IO口即可在线仿真调试,清楚的观测到MCU内核寄存器运行状态及相关变量,给后期的程序设计与调试带来很大的便利;1个3.3V电源指示灯,用于指示电源状态,在按下电源开关时,若是通路,指示灯亮起,反之灯会不亮,通过观察这颗LED指示灯的状态,可以清楚明了的判断核心板的上电情况是否正常,防止电源短接造成芯片烧毁等严重失误;
图4.1 STM32最小系统
三组16Pin的排针将MCU的所有IO口(除了被晶振占用的2个IO口)资源按芯片管脚顺序引出,在核心板上标号分别为J1,J2,J3,非常方便后期硬件接线实验与调试,最小系统原理图如图4.1所示。
4.2 电源电路
小车系统共使用了四路电源,其中还包括对模拟与数字、高压与低压以及高速信号部分的供电,这对PCBA的布局布线、信号完整性以及元器件的选用都提出了很大的挑战。在高压、高速开关功率MOS管这部分模拟电路VCC连接的是铅酸电池的正极VCC_36V(三个12V的电瓶串联相接),能够稳定输出36V电压,12安培的电流,给予电机强劲的运行动力。此外,在电路最前端放置一只耐压值45V的反向保护二极管防止电源短接对后面的电路造成短路烧毁的危险。过大的压差会使电源芯片负载过大而发热进而影响系统稳定性,遂通过200欧姆/5W的分压电阻对36V分压得到20V电压,经过220uF/50V的铝壳电解电容滤去低频纹波再经一个0.1uF的陶瓷电容滤去高频纹波后流入三端可调线性稳压器LM317中,同时在LM317输入与输出两端并联肖特基二极管增加电源系统稳定性,通过5.1K和0.51K的电阻对其进行分压后输出稳定的15V正向电压给半桥驱动器IR2104S供电。考虑到除了功率开关管部分功耗极大之外其余皆为耗电量较小的系统,MCU系统,外设,半桥驱动器等加起来功耗不大,但对电源稳定性要求较高,遂决定采用上述的线性稳压器LM317来作为除功率MOS管外的系统的总电源转换芯片,该芯片在1.2V~37V可调输出并且保证1%的容差和0.01%的线性调整率,能够稳定输出超过1.5安培的电流,足以满足系统的使用。相比开关电源所带来的大噪声,线性电源在小功耗场合下更为适用。第二部分为5V正向电压输出,前端放置一个100Ω/2W的功率电阻分掉一部分电压以减小压差,再经过220uF/50V的铝壳电解电容滤波后流入LM7805三端线性稳压芯片,输出稳定的VCC正5V电源给高速光耦HCPL2631供电。高速光耦隔离的信号电路作为主控板与大功率电机驱动唯一的桥梁,不但没有削弱主控的PWM控制信号,并且在主控板与大功率电机驱动板之间做了良好的隔离,放置大电流回灌而烧毁主控,对光耦单独供电是必须的。第三部分是由三端稳压芯片ASM1117_3.3V输出的3.3.V正向电源,它拥有最大0.2%线性调整率,0.4%的负载调整率,可输出最大800mA电流,性能非常优秀,是小功耗电系统极佳选型。设计中使用的是总线式电源分配方案,为所有的器件供电的同时适当的铺设接地过孔(类似于电源层式分配方案),具有良好的阻抗特性和尽可能小的电源噪声。电源电路原图如图4.2所示。
图4.2 电源电路
4.3 电机驱动电路
平衡车使用的是350W 36V的有刷直流减速电机,额定工作电流10A左右,堵转电流20A以上。市面上少有大功率集成的直流有刷电机驱动器,价格昂贵。利用功率NMOS管的开关特性,配合IR2104S半桥驱动器组成H全桥电机驱动电路方案简单实用、廉价、性能满足使用需求。IR2104S芯片相比传统的高端低端栅极驱动器具备自动插入520纳秒死区时间、耐压值为600V、开启电压10~20V超宽、高侧输出与输入相位相同动态范围等优点。特别是内置死区时间,在电机驱动H桥控制中是不可或缺的。鉴于开关元件通性,导通时间与关断时间是不一样的,这样就会造成MOS管导通与关断过程中存在时间相叠合的死区,也称之为开关损耗,当上下管子同时导通,会在瞬间把管子烧毁。而IR2104S芯片内置520纳秒死区时间,相对于高速开关管来说既保护了场效应管不被烧毁也不会对管子的开关频率造成影响,是做H桥驱动器的极佳选择。设计中选用IR2104S半桥驱动器芯片搭配耐压值600V的超快速恢复二极管RS1M FR107以及10uF钽电容和10Ω电阻构成的泄放回路组成电荷泵来控制H桥MOS管的导通与断开。如图4.3.1所示,C11为自举电容,D6为超快速恢复二极管RS1M FR107,PWM在上桥臂调制。当Q1断开时,A点电位由于Q3续流回零,此时C11通过VCC_15V和D6进行充电。当输入信号P1导通,上桥臂的驱动电压由C11提供且C11电压不变,Vb随Vs的升高而浮动,即自举。每一个PWM周期,电路都会给C11充电来确保其电压状态基本保持不变。在Q1断开时,D6则为C11的充电提供正向电流通道,当Q1导通时则阻止电流反向流入控制电压VCC_15V。直流电机一端接正,另一端接负即可让电机转动起来;调换两端极性,电机即反向转动。在平衡车这种高灵敏度自控系统中需要快速的切换高低电平的极性来驱动电机前后转动以达到平衡的状态,显然手动的把电机线反接过来是不现实的。通过实验可知,当频繁的切换开关状态时候,电机就不在是匀速转动,而是变化的了。相应的,扭矩也随之变化。而H桥驱动电路能够方便的实现电机的四象限运动,即正反转、正反转制动。H桥驱动电路原理如图4.3.2所示,组成H桥驱动电路的四只开关管工作在开关的状态,S1,S4与S2,S3为两组互补状态关系的开关。当S1、S4导通,S3 、S4关闭时,电机两端施以正向电压实现电机正转,反之,电机反转。实际控制中,常用75NF75功率MOS管代替以上四只开关管,辅以合适电容与电阻搭建的泄放回路以及高速肖特基二极管保护电路组成的大功率H桥电机驱动器,耐压值可达75V,可承受最大80A的瞬间放电、50A的稳定放电电流。各项性能参数可通过更换不同元器件获得,价格低廉,可二次开发和调试。
![在这里插入图片描述](https://img-blog.csdnimg.cn/5b73c8f019be40f1b2ea9663c120f0e0.png?x-oss-process=image/watermark type_ZHJvaWRzYW5zZmFsbGJhY2s shadow_50 text_Q1NETiBAZ3VqdW5xdWFu size_20 color_FFFFFF t_70 g_se x_16#pic_center
图4.3.1 H桥驱动电路图 4.3.2 H桥原理图
4.4 编码器电路
编码器可以测量位移或者速度信息,一般常用的有光电编码器,霍尔编码器,磁编码器等。载人平衡车系统中使用的是基于AS5040旋转磁编码器芯片的增量式编码器。AS5040旋转磁编码器拥有磁铁位置检测和断电监测的故障检测模式,旋转速率高达10000rpm,还可采用菊链连接模式,串行读取多个互联的AS5040器件[1]。广泛应用于非接触式旋转位置检测、机器人技术,汽车电子中的方向盘位置检测、油门位置检测、传动变速箱位置检测等领域,是高端光学编码器、电位器的良好替代者。
图4.4.1 编码器原理图 图4.4.2 编码器实物图
自平衡车系统中采用的电机底部转轴是露出的,因此可以将磁钢紧贴于电机转轴处。编码器使用的是正交编码模式,只需对电源进行简单的滤波处理,并用小于5KΩ的电阻下拉到地即可通过A_LSB_U、B_Dir_V引脚输出正交A/B相的矩形脉冲波,利用STM32编码器模式的输入捕获功能和软件四倍频法可直接测量矩形脉冲数并通过公式计算可得电机实时转动速度。编码器原理图与实物图如图4.4.1、4.4.2所示。
4.5 姿态传感电路
MPU-6050对3轴MEMS加速度计、3轴陀螺仪,和一个可扩展的数字运动处理器 DMP进行整合。市面上也有经过STM32芯片硬件卡尔曼滤波后通过串口直接输出倾角的MPU6O5O模块,此类硬件卡尔曼滤波的陀螺仪有专门负责运动姿态结算的MCU,辅以数字滤波技术,输出的角度稳定、精准,极大的减轻主控MCU的运算负担。但就平衡车系统而言采用这类集成的用串口输出数据的模块是不现实的,因为平衡车是一个高度灵敏,姿态实时变化的非线性系统,串口的速度有限,并不足以满足小车系统的响应速度。独立使用微控制器对MPU6050做姿态解算与滤波效果显著,但受限于MPU6050串口传输速率,不能使用集成硬件卡尔曼滤波算法的陀螺仪模块作为系统的姿态传感器[2]。再者,可以在主控板PCB放置两块MCU,一块专门负责陀螺仪姿态解算和滤波数据的融合并以IIC或者SPI通信方式将数据传输出来到中央微控制器,一块则负责控制系统及各个外设模块的控制,但这也极大的拉长了硬件和程序的开发周期。综上所诉,选择了一个以中央微处理器对陀螺仪、加速度计进行简易卡尔曼滤波与主控制算法相互补融合的这种做法,既有效的降低测量噪声、提高精度、又能抑制温漂。完全满足自平衡系统的使用。其电路如原理图4.5所示。
图4.5 姿态传感电路
4.6 USB转RS-232串口下载电路
南京沁恒公司的CH340G的稳定性能经过大量的实验和测试还是不错的。兼容USB2.0,外围电路非常简单,硬件全双工串口。如图4.6所示,下载时将FlyMcu软件设置为:DTR低电平复位,RTS高电平进BootLoader,便可实现程序的一键下载功能。除此之外,通过外加电平转换的元器件,对于 TTL转RS232、RS485、RS422等皆可以实现,不仅可以给核心板提供电流,还可以通过串口助手实时观察数据非常方便调试程序。但在实际使用中发现,通过该方式下载程序还是有些不稳定的,在由USB-B提供 5V电源时, DTR/RTS的信号会有些许不稳定,进而可能会引起MCU系统复位2~3次,其实这个现象是很正常的,针对上述问题,可以对其进行连续按复位按钮几次,或者直接拔插USB线一两次就可以解决了。
图4.6串口下载电路
USB2.0可提供最大500mA的电流,但由于导线有内阻,实际供到核心板 的电压准确的说一般不会到达5V,所以在对一些例如电机、显示屏等较大功耗的负载的时候,USB供电往往不够,也将导致一些莫明的BUG出现。所以在对MCU供电的时候,特别的经过10uF的滤波电容滤波流经L1117-3.3V稳压芯片再使用一个0.1uF的陶瓷电容滤去高频纹波及噪声输出稳定、干净、低噪声的3.3V电压。
4.7 液晶显示电路
对于车之一类来说,显示屏是不可或缺的,更加确切的应该是电子里程表。上面显示着车速,里程,耗电耗油量,年月日等等与生活密切相关的信息。给驾驶人以直观明了的人机交互体验。平衡车系统也一样,显示电路是必备的,在显示测量姿态传感器机械安装中值、车体倾角,当前运行时速,电池电量,主板温度等信息上给驾驶人以直观的车体当前状态信息,极大地方便驾驶与维护方面的工作。设计中采用四线SPI串行通信接口的1.3寸OLED显示屏,屏幕集成SSH1106驱动芯片。相较于市面上广泛使用的0.96寸OLED屏来说,除了驱动芯片由SSH1306改为SSH1106其他的基本兼容,只不过1106选用的是13264的RAM,而1306则为12864的RAM,两者操作指令基本相同,1.3寸的屏是从0x02列开始显示的,在初始化的时候修改一下地址即可。具有黄蓝双色,128*64的高分辨率,低功耗等特点,给人以良好的人机交互体验。其接口定义如下:
GND→电源地;
3V3→电源正;
PC15→时钟线(SCL);
PC14→数据线(SDA);
PC13→MOSI;
PB4→MISO;
OLED接口电路如图4.7所示。
图4.7 OLED接口电路
4.8 脚踏开关和LED车灯控制电路
实验研究阶段曾经出现按下电源开关,车子立马往一个方向跑的情况,这在使用中是绝对不许的,毫无安全措施保障。于是设计中使用了四个防锈防水金属按钮自复位开关作为脚踏板的感应开关,四个开关为并联关系,分别于四个通用GPIO口相接并两两分布在两边脚踏板之间,当人们踩踏在平衡车上时即开关导通,可通过程序设置开关首次被按下必须检测到四个开关都被按下,才启动平衡程序,而在行进过程中,只要感应到左右任各一个开关还被按下即继续运行程序。MCU通过检测IO口高低电平即可判断开关是否处于导通状态,进而决定是否进入平衡行驶模式,看似微小的四个自复位开关却有效的提高了平衡车在行驶上的安全性能,最大限度保障驾驶人身安全。车身前后左中右共安装了六颗高亮贴片式食人鱼蓝色LED,在行进过程中,直线行走会触发前后中间两颗LED高亮显示,前行则会相应的闪烁前面中间那颗LED,反之亦然。当操纵把进行向左转弯操作时,左车灯进入闪烁模式,提醒路人本车正进行左转弯动作。同理,右车灯亦然。相应的灯光提示,炫彩夺目,作为装饰的同时也起到了照明的作用,具有良好的人机交互功能。
4.9 硬件设计中抗干扰措施
电机驱动板中存在模拟(42V和15V)和数字(MCU系统)电路信号,电机自身运行过程中会产生感生电动势给电路系统带来强烈的电磁干扰,H桥电机驱动器中包含的大功率的NMOS管以开关的方式工作,这无疑会产生大量的高频谐波。这对PCB布线接地方式和整车的电气系统提出了严峻的挑战,这些信号电路不进行抗干扰措施就会影响编码器输送到MCU的速度信号和四路PWM、电平输出的功率NMOS管的开关信号,使得整个系统工作收到极大干扰,甚至不能工作,接地不佳情况下甚至会导致电流回灌到MCU系统烧毁主控电路。针对上述问题,设计中采取以下几个措施来提高硬件系统的抗干扰能力:在主控制电路输出四路PWM脉宽调制信号到电机驱动板之间放置高速光耦做光电隔离,防止驱动板的大电流信号对主控板的小信号造成干扰。查阅相关资料和实践表明,高速光耦对控制信号几乎没有衰减,但却有效的隔离大信号与小信号之间的干扰,设计中选用的是HCPL2631光电隔离器件。HCMOS兼容,搞CMR,10MBd的速度足以满足H桥20KHz的开关频率的使用;在旋转磁编码器A B正交信号干路上放置滤波RC滤波器进行滤波处理;从电磁兼容性EMC角度出发,在PCBA布局布线上采取一些提高系统抵抗干扰能力的措施:在对噪声有高要求的时钟电路中,走线尽可能短,元件摆放顺序按照电源通路来放置并做包地处理;在电源和地之间加去耦电容,均走直线或弧形走线;充分考虑大功率场效应管部分电路的散热问题必要情况下应该添加散热片或者风扇进行散热并与MOS管保持一定的距离,高频部分尽量布置在板子边缘处以减少信号线走线长度等措施是保证一块PCB成功的关键因素。
二、软件篇
系统软件设计
5.1 系统初始化
为了防止程序运行过程中跑飞而造成的人身安全的伤害,系统主控制循环程序中添加独立看门狗程序,在程序死锁或跑飞状态下可自动复位,确保行车安全。系统初始化流程图如图5.1所示:
图5.1 系统初始化
5.2 数字滤波器设计
5.2.1卡尔曼滤波
卡尔曼滤波算法广泛地应用于智能机器人控制,航模传感器数据融合,卫星导航领域以及计算机图像处理当中。姿态传感器MPU-6050陀螺仪测量的角速度通过数学积分运算得到角度的信息,总是会存在微小的偏差和漂移变化所形成的累积误差,并且误差会随时间的增加逐步增大,到最后无法输出正确可控的角度信号。先对其偏差验证估计一个大概值,在用倾角减去刚才估计的八个大概值误差协方差的微分,后期验证再估计一个大概值,最后输出稳定的角度信息。经过多次试验,使用卡尔曼滤波算法融合得到的角度值非常稳定。部分程序代码如下所示。
void Kalman_Filter(float Accel float Gyro)
{
angle =(Gyro - Q_bias) * dt; //ÏÈÑé¹À¼Æ
Pdot[0]=Q_angle - PP[0][1] - PP[1][0];
Pdot[1]=-PP[1][1];
Pdot[2]=-PP[1][1];
Pdot[3]=Q_gyro;
PP[0][0] = Pdot[0] * dt;
PP[0][1] = Pdot[1] * dt;
PP[1][0] = Pdot[2] * dt;
PP[1][1] = Pdot[3] * dt;
Angle_err = Accel - angle;
PCt_0 = C_0 * PP[0][0];
PCt_1 = C_0 * PP[1][0];
E = R_angle C_0 * PCt_0;
K_0 = PCt_0 / E;
K_1 = PCt_1 / E;
t_0 = PCt_0;
t_1 = C_0 * PP[0][1];
PP[0][0] -= K_0 * t_0;
PP[0][1] -= K_0 * t_1;
PP[1][0] -= K_1 * t_0;
PP[1][1] -= K_1 * t_1;
angle = K_0 * Angle_err;
Q_bias = K_1 * Angle_err;
angle_dot = Gyro - Q_bias;
1234567891011121314151617181920212223242526272829
}
void Yijielvbo(float angle_m float gyro_m)
{
angle = K1 * angle_m (1-K1) * (angle gyro_m * 0.005);
}
5.2.2一介低通滤波
机械齿轮的减速电机是存在一定的控制死区的,我们没有必要把它控制在一个精度非常高的范围里面,这会让电机产生强烈的震动、更严重的会烧毁电机等不可逆转的损害。恰恰相反,我们可以利用减速电机这存在的死区,适当的减缓速度的变化,可以有效的降低速度控制对直立控制的干扰。在自平衡系统里,直立平衡才是最主要的,其他一切的控制相对平衡来说都算是一种干扰,干扰越大,稳定性越差[6]。所以我们对编码器所测得的电机转速信息乘以0.8后再赋值给编码器输出,对速度偏差乘以0.2后赋值给新的速度偏差变量。相关代码如下所示:
Encode = 0.8; //对Encode进行低通滤波
Encode = Encode_Least0.2; //对Encode偏差进行低通滤波
5.3 数字PID控制器
5.3.1直立环PD控制
相对于平衡车而言,所有的功能都是建立在车身平衡的基础上的。平衡是主要,其他所有的附加功能相较于直立来说都是干扰[7]。首先定义程序入口参数Angle(角度) Gyro(角速度),Bias(偏差)为浮点型变量,比例值,微分值可以先行估计一个大概值,方便后期调试。定义使得系统平衡的平衡(Balance)变量为整形数据。其次估计车身的机械安装中值为0(姿态传感器安装在绝对零点位置的时候),用陀螺仪所测得的实时变化的角度减去机械安装中值并赋值给偏差变量;再对偏差乘以比例值并加上角速度乘以微分值赋值给平衡PWM波,最后返回的是整形的平衡PWM波值。程序设计如图5.3.1所示。
图5.3.1 直立环PD控制代码
以上为角度闭环控制也就是直立PD控制的关键部分程序,一般的控制系统而言,只需使用单纯的比例控制或者PI控制即可,但是相对于那些需要对干扰做出迅速响应的高度灵敏系统来说,还需要引入微分控制来消除抖动。
5.3.2速度环PI控制
一般的速度控制皆采用PI控制器,平衡车系统中线性控制器也选择了这种类型。根据公式可得:偏差=测量值-目标值。我们使用左右两个编码器所测得的数据相加作为测量值,在这里我们需要的是一个可以表示速度变化的变量,所以不用纠结是否要对这个测量值做除以2的计算,因为这样的话会引入舍去误差。速度闭环控制的目的是为了使得系统在保持直立的同时速度为零,所以我们设定目标值速度为零可以得到以下公式:
Encoder_Least =(Encoder_Right-Encoder_Left)-0;
定义速度控制PWM波,做编码器,右编码器数据类型为整形,再将速度、编码器偏差、编码器积分等参数定义为静态全局变量。将上试所计算的最新速度偏差赋值给Encoder_Least变量,并对编码器加权滤波,积分10毫秒得到位移,将积分得到的位移减去速度变化量Movement再赋值给Encoder_Integral,并限制Encoder_Integral的积分幅度,也就是对平衡车最大行进速度的限制,以防止驾驶过快导致的生命危险。速度乘以比例加上速度积分乘以积分赋值给速度控制的PWM,如果检测到电机关闭的话,就清除积分,防止多次积分所带来的误差,最后返回速度控制PWM。核心程序如下图5.3.2所示。
图5.3.2 PWM核心程序代码
5.3.3转向环PD控制
单只是做到在速度为零时保持平衡直立,就让小车上路行驶的话,绝对会出现横冲直撞的现象的。所以转向部分是必不可少的,算法设计起初,可以说是毫无头绪。在行进过程中,遇到前方有转弯,突然把把手打向其中一边来达到转弯的目的,而把手是通过中心轴的方式与10K的单圈式电位器连接在一起的,也就是说利用单片机的ADC采集电位器转过的模拟值,再与上述的直立、速度闭环控制数据相融合后计算出能使小车在保持平衡的同时稳定的转向的差速算法。
因为行驶环境有诸多变化,在较滑的地面可能会使轮胎发生打滑现象,且编码器精度有限,所以单纯的依靠左右编码器相加之差来做来做转向闭环控制的方式是不现实的。使用Z轴陀螺仪的数据的积分得到的应该转向的角度作为控制的偏差,并以Z轴陀螺仪的数据作为微分控制的输入进行比例微分闭环控制,目的是保持转向的角度为自行设定的值。也就是说将ADC采集到电位器转过的值传入Gyro_Turn中,用gyro减去电位器的值再加上一个参考值即可,当电位器没有被转动的时候,即相当于gyro-0=gyro,这样在没有转动把手的情况下,车子则保持直线行驶,在把手转动后,根据一个简单的判断指令后,即进行转向的闭环控制。使得程序具有更加良好的鲁棒性和适应性。核心代码如下:
5.4 编码器M法测速
编码器M法测速是一项非常实用的技术,它可以将编码器的测量精度切切实实的提高4倍。如图5.4所示设计中用到的是旋转正交编码器,输出的是正交的A,B两相矩形波,一般的测量方法就是测量单位时间内A相或者B相输出的脉冲次数来计算得到电机转轴当前的速度信息[9]。常规运用中,普遍的做法是利用单片机的输入捕获功能测量任意一相的上升沿或者下降沿,也就是测量对应图5.4的1234数字中的任何一个,这样的话就只能计数三次,而M法测量则是利用软件四倍频的方法同时捕获A,B,相的上升沿与下降沿,在相同的时间里,可以捕获到12次数据,测量精度也随之大大提高。
图5.4 A,B相正交矩形波
5.5 OLED显示程序
设计中使用的是6线的SPI串行通信的OLED显示屏,它的分辨率为128*64,能显示汉字、图片、字符等多样化的信息。如下程序所示,首先在主函数里初始化OLED_Init()子程序,然后打开OLED的显示函数。可以看到,当前模式下OLED第一行显示的内容为当前小车所使用的是内置的DMP滤波算法,速度处于普通模式下。第二行则显示的是左编码器测量电机转轴的实时速度信息,第三行显示的是右编码器测量电机转轴的实时速度信息,非常的直观明了,有助于驾驶人实时动态的了解车子运行速度以控制在安全速度以内。第五行则是显示当前电池的电压值,让人们时刻知道电池电量以确保电池不会过放而造成不必要的经济损失。第六行显示的信息对于调试来说是非常使用的,它显示的是当前车身的倾角信息,给后期的测试带来极大的便利。核心代码如下:
u8 OLED_GRAM[128][8];
void OLED_Refresh_Gram(void)
{
u8 i n;
for(i=0;i<8;i )
{
OLED_WR_Byte (0xb0 i OLED_CMD); //ÉèÖÃÒ³µØÖ·£¨0~7£©
OLED_WR_Byte (0x00 OLED_CMD); //ÉèÖÃÏÔʾλÖáªÁе͵ØÖ·
OLED_WR_Byte (0x10 OLED_CMD); //ÉèÖÃÏÔʾλÖáªÁиߵØÖ·
for(n=0;n<128;n )OLED_WR_Byte(OLED_GRAM[n][i] OLED_DATA);
}
}
void OLED_WR_Byte(u8 dat u8 cmd)
{
u8 i;
if(cmd)
OLED_RS_Set();
else
OLED_RS_Clr();
for(i=0;i<8;i )
{
OLED_SCLK_Clr();
if(dat&0x80)
OLED_SDIN_Set();
else
OLED_SDIN_Clr();
OLED_SCLK_Set();
dat<<=1;
}
OLED_RS_Set();
}
void OLED_Set_Pos(unsigned char x unsigned char y)
1
{
OLED_WR_Byte(0xb0 y OLED_CMD);
OLED_WR_Byte(((x&0xf0)>>4)|0x10 OLED_CMD);
OLED_WR_Byte((x&0x0f)|0x01 OLED_CMD);
}
void OLED_Display_On(void)
{
OLED_WR_Byte(0X8D OLED_CMD); //SET DCDCÃüÁî
OLED_WR_Byte(0X14 OLED_CMD); //DCDC ON
OLED_WR_Byte(0XAF OLED_CMD); //DISPLAY ON
}
void OLED_Display_Off(void)
{
OLED_WR_Byte(0X8D OLED_CMD); //SET DCDCÃüÁî
OLED_WR_Byte(0X10 OLED_CMD); //DCDC OFF
OLED_WR_Byte(0XAE OLED_CMD); //DISPLAY OFF
}
void OLED_Clear(void)
{
u8 i n;
for(i=0;i<8;i )for(n=0;n<128;n )OLED_GRAM[n][i]=0X00;
OLED_Refresh_Gram();//¸üÐÂÏÔʾ
}
void OLED_DrawPoint(u8 x u8 y u8 t)
{
u8 pos bx temp=0;
if(x>127||y>63)return;
pos=7-y/8;
bx=y%8;
temp=1<<(7-bx);
if(t)OLED_GRAM[x][pos]|=temp;
else OLED_GRAM[x][pos]&=~temp;
}
void OLED_ShowChar(u8 x u8 y u8 chr u8 size u8 mode)
{
u8 temp t t1;
u8 y0=y;
chr=chr-’ ';
for(t=0;t<size;t )
{
if(size==12)temp=oled_asc2_1206[chr][t];
else temp=oled_asc2_1608[chr][t];
for(t1=0;t1<8;t1 )
{
if(temp&0x80)OLED_DrawPoint(x y mode);
else OLED_DrawPoint(x y !mode);
temp<<=1;
y ;
if((y-y0)==size)
{
y=y0;
x ;
break;
}
}
}
}
//m^nº¯Êý
u32 oled_pow(u8 m u8 n)
{
u32 result=1;
while(n–)result*=m;
return result;
}
void OLED_ShowNumber(u8 x u8 y u32 num u8 len u8 size)
{
u8 t temp;
u8 enshow=0;
for(t=0;t<len;t )
{
temp=(num/oled_pow(10 len-t-1));
if(enshow0&&t<(len-1))
{
if(temp0)
{
OLED_ShowChar(x (size/2)*t y ’ ' size 1);
continue;
}else enshow=1;
}
OLED_ShowChar(x (size/2)*t y temp '0' size 1);
}
123
}
void OLED_ShowString(u8 x u8 y const u8 *p)
{
#define MAX_CHAR_POSX 122
#define MAX_CHAR_POSY 58
while(p!=’\0’)
{
if(x>MAX_CHAR_POSX){x=0;y =16;}
if(y>MAX_CHAR_POSY){y=x=0;OLED_Clear();}
OLED_ShowChar(x y p 12 1);
x =8;
p ;
}
}
void OLED_ShowCHinese(u8 x u8 y u8 no)
{
u8 t adder=0;
OLED_Set_Pos(x y);
for(t=0;t<16;t )
{
OLED_WR_Byte(Myzk[2no][t] OLED_DATA);
adder =1;
}
OLED_Set_Pos(x y 1);
for(t=0;t<16;t )
{
OLED_WR_Byte(Myzk[2no 1][t] OLED_DATA);
adder =1;
}
}
void OLED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO ENABLE);
1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC &GPIO_InitStructure);
PWR_BackupAccessCmd(ENABLE);
RCC_LSEConfig(RCC_LSE_OFF);
BKP_TamperPinCmd(DISABLE);
PWR_BackupAccessCmd(DISABLE);
OLED_RST_Clr();
delay_ms(100);
OLED_RST_Set();
OLED_WR_Byte(0xAE OLED_CMD);
OLED_WR_Byte(0xD5 OLED_CMD);
OLED_WR_Byte(80 OLED_CMD);
OLED_WR_Byte(0xA8 OLED_CMD);
OLED_WR_Byte(0X3F OLED_CMD);
OLED_WR_Byte(0xD3 OLED_CMD);
OLED_WR_Byte(0X00 OLED_CMD);
OLED_WR_Byte(0x40 OLED_CMD);
OLED_WR_Byte(0x8D OLED_CMD);
OLED_WR_Byte(0x14 OLED_CMD);
OLED_WR_Byte(0x20 OLED_CMD);
OLED_WR_Byte(0x02 OLED_CMD);
OLED_WR_Byte(0xA1 OLED_CMD);
OLED_WR_Byte(0xC0 OLED_CMD);
OLED_WR_Byte(0xDA OLED_CMD);
OLED_WR_Byte(0x12 OLED_CMD);
OLED_WR_Byte(0x81 OLED_CMD);
OLED_WR_Byte(0xEF OLED_CMD);
OLED_WR_Byte(0xD9 OLED_CMD);
OLED_WR_Byte(0xf1 OLED_CMD);
OLED_WR_Byte(0xDB OLED_CMD);
OLED_WR_Byte(0x30 OLED_CMD);
OLED_WR_Byte(0xA4 OLED_CMD);
OLED_WR_Byte(0xA6 OLED_CMD);
OLED_WR_Byte(0xAF OLED_CMD);
OLED_Clear();
1234567891011121314151617181920212223242526272829303132333435363738
}
5.6 主板温度监测显示
主板的温度监测,是笔者在纵观多种电机驱动设计方案后所设计出来的一种基于自然环境下的PCBA的保护。一般的PCB单层电路板多数采用铝基板,多层板则是采用FR-4材料的,他们都有一个正常工作的情况下耐温度值,超过了一定的温度,板子会发生变形、扭曲等状态。而功率场效应管也是一般耐最高温度值多数为150°C或者175°C,那么正常工作的时候肯定是不会到达这么高的温度的,但是当平衡车遇到坑洼,障碍物的时候,电机会几近处于堵转的状态,此时MOS管的输出电流会急剧上升,随之而来的是巨大的发热量。出于安全考虑,在散热片表贴安装多个温度传感器来实时检测MOS管的发热状态以确保行车的安全。
int Read_Temperature(void)
{
float Temp;
Temp=(I2C_ReadOneByte(devAddr MPU6050_RA_TEMP_OUT_H)<<8) I2C_ReadOneByte(devAddr MPU6050_RA_TEMP_OUT_L);
if(Temp>32768) Temp-=65536;
Temp=(36.53 Temp/340)*10;
return (int)Temp;
}
5.7 高亮LED车灯闪烁设计
高亮的车灯显示,在行进过程中这是必须的。既可以作为照明使用,也可以指示当前车子运行状态。如下程序所示,当MCU判断车身向左转弯的时候,随即以1/200ms的频率不断地闪烁左车灯,当车子向右转往的时候,右车灯也同样以1/200ms的闪烁频率不停地闪烁以表示车子当前为向右转状态。在直线行驶情况下,中间的车灯一直高亮显示,起装饰和照明作用。
int turn(int encoder_left int encoder_right float gyro)
{
static float Turn_Target=0 Turn Turn_Convert=3 Turn_Count;
float Turn_Bias Turn_Bias_Integral Turn_Amplitude=1800;
if(Volt > 1.75 || Volt < 1.55)
{
if( Turn_Count==1)
Encoder_temp=myabs(encoder_left encoder_right);
Turn_Convert=2000/Encoder_temp;
if(Turn_Convert<3)Turn_Convert=3;
if(Turn_Convert>10)Turn_Convert=10;
}
else
{
Turn_Convert=3;
Turn_Count=0;
Encoder_temp=0;
}
if(Volt > 1.75) //×óת
{
Turn_Target-=Turn_Convert;
LED3=1;
LED6=1;
if(led_delay == 1)
{
LED1=0;
LED4=0;
}else{
LED1=1;
LED4=1;
}
}
else if(Volt < 1.55)
{
Turn_Target =Turn_Convert;
LED1=1;
LED4=1;
if(led_delay == 1)
{
LED3=0;
LED6=0;
}else{
LED3=1;
LED6=1;
}
}
else {
Turn_Target=0;
LED2=0;
LED5=0;
LED1=1;
LED4=1;
LED3=1;
LED6=1;
}
if(Turn_Target>Turn_Amplitude) Turn_Target=Turn_Amplitude;
if(Turn_Target<-Turn_Amplitude) Turn_Target=-Turn_Amplitude;
Turn_Bias=encoder_right-encoder_left;
if(Turn_Off(Angle_Balance) == 0)
{
Turn_Bias_Integral =Turn_Bias;
Turn_Bias_Integral=Turn_Bias_Integral-Turn_Target;
}
if(Turn_Bias_Integral>1800) Turn_Bias_Integral=1800;
if(Turn_Bias_Integral<-1800) Turn_Bias_Integral=-1800;
Turn=Turn_Bias_Integral*0.5-gyro*0.5;
return Turn;
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
}
三、调校测试篇
实验及路测结果
6.1 硬件测试
6.1.1车体与元件安装
车体采用的是精钢打造的船型包厢,车体机械部分的安装及重量分布,直接影响到小车的平衡性能。拿起螺丝准备安装的一刻,瞬间傻眼了,全是型号各异的六角螺丝,限于手上工具有限,只是草草把电机,电池固定住在相应的位置。载人平衡车使用的是电动车电瓶供电,组装成半成品时候已经不下30Kg质量了。如图6.1.1所示,车体只是组装了一部分,这样方便给系统上电及对电路板的测试,至此,组装告一段落。
图6.1.1 车体图片
6.1.2 STM32主控板测试
主控MCU选择的是STM32F103C8T6芯片,具有64Pin引脚,各个引脚之间的间隙为0.254mm,曾一度想采用工业PCB打样以提高电路板稳定性和具有更好的阻抗关系。受限于时间关系,最终决定使用手工腐蚀铜板印制PCB电路板,所以在焊接和测试上倍加专心。首先用万用表测量电源VCC3.3V与GND两端,看看是否处于短路、断路、通路状态,如果板子电源和地短路了,使用万用表测量时会发出滴滴滴的响声。此时要做的第一件事就是仔细观察板子的各个电源引脚与引线是否短接在一起,然后通过万用表的辅助逐个检查并修正。测试核心板无短路,无断路后,给它 3.3V供电,板子上的电源指示灯瞬间亮了,各元器件无发热、冒烟状态,说明电路供电系统正常。然后在MDK5.1软件编写好跑马灯程序,并在设置好J-LINK相关变量及芯片选型后将程序通过J-LINK下载进核心板测试GPIO是否正常工作。起初,过于激动,忘记将启动模式选择引脚BOOT0,BOOT1对地短接,导致下载程序失败,并提示无法检测到STM32芯片,将这俩引脚对地短接后,成功下载跑马灯测试程序,板子软硬件测试宣告成功。
6.1.3电机驱动板测试
电机驱动电路板实验测试。是硬件系统调试的最关键的一个方面,它决定了自平衡车带负载、过流过压、急刹急停这些重要的性能,电路板不允许有任何一个地方的失误,毫无疑问,笔者将画好的PCB文件发至工厂打样采用工业板并在VCC_36V,GND主干道,电机输出接口这几条线路进行镀锡处理。确认焊接的板子无误后,为了安全起见,只用了两个电瓶串联24V供电。在按下开关的一瞬间“啪”的一个元器件直接炸了。立马松开开关后发现是耐压值45V的反向保护二极管炸了,原来由于心急将其焊接反了,换上新的二极管重新上电,电源指示灯依旧没有亮。迅速的断开开关,触摸到电源通路前端的100Ω/5W的功率电阻发烫的厉害,上电时间也不过30秒,这要是实际工作起来,后果不堪设想。再次上电,用万用表测量其两端电压为33V之高,而LM317芯片15V输入端电压为2V左右。断电后对照着如图6.1.3分析其原因。如果二极管D1短路,那么36V电压进来会直接加在R1两端,换了新的D1上去后重新上电后电源指示灯亮起来了,说明现在电源是通路的。用万用表测试36V,15V,5V,3.3V各个电源接口,发现LM317芯片发热的厉害,而15V输出引脚,实际电压值为17V左右。这应该是压差过大导致的LM317芯片高发热,效能低,遂找了一个200Ω/2W的功率电阻替换掉之前100Ω/5W的电阻,重新上电测得15V输出引脚实际电压14.99V左右,LM317芯片几乎没有出现发热现象,非常完美。根据常识可知,如果电机两端一高一低有较大压差,则电机就会转动,但万用表测得两端分别对地电压为12.2V,两端压差为0.02V,显然这说明IR2101S芯片Vs引脚输出为高电平,查阅其数据手册得知该状态是正确的。把编写好的带死区互补PWM波电机测试程序烧写进核心板,连接好主控与驱动的线,上电发现电机并没有像自己预期的那样会转动起来,摸了下电机连接线,电源线并没有发热。测得电机输出两端状态依旧和没烧写程序前有任何变化。因为带死区互补PWM波电机测试程序是用示波器观察过的,波形很完美,可以排除软件的错误。百思不得其解,断电继续观察硬件电路设计,并查找相关资料,在原理上没有发现错误,但实际测试的时候却没有任何反应。这一阶段是最煎熬的时刻,一步步排查,电阻,电容,IR2101S芯片。两周过后,无果,此时已是4月下旬,我冒着风险做了一个大胆也是承上启下的关键决定——修改了电机驱动的方案。是的,我起初并不是很了解半桥驱动器与高端低端栅极驱动器之间的区别,都是驱动MOS管的栅极,所以之前图方便使用了手头上的IR2101S芯片。后面了解到IR2104S这款芯片内置了520纳秒的死区时间,超过600V的耐压值,专为驱动电机而生,于是对原有的H桥电路做了简单的元器件替换工作就再一次的发板到工厂打样,这一次还特地的加了光耦隔离器件做隔离,之前第一版并没有隔离。拿到第二次开发的板子焊接完毕检查电路系统后,迫不及待的把程序烧写进单片机,测得电机两端电平依旧相等,都为高。但是可以确定的是电路板是OK的了,两次结果一致。原因是IR2104S驱动芯片是不需要带死区PWM波控制的,用普通的PWM波控制即可,于是之前的4路带死区互补PWM波改为4路普通PWM波,烧写进单片机,电机瞬间转动起来,测得两端压差为24.2V,至此电机驱动终于告一段落。
图6.1.3 电源通路
6.1.4编码器电路测试
旋转正交磁编码器电路原理相对简单,但是在从原理到PCB板子调试完成过程中还是出现了不小波折。全英文的芯片数据手册,看了许久仍不明其理,刚开始凭着自己对这款芯片的理解,将Prog引脚直接连接到地,然后将VDD3V3与VDD5V连接在一起,A_LSB_U,B_Dir_V引脚用两个排针引出。对电源通路做简单测试确认无误后即安装在电机转轴上开启电机测试。打开串口助手,设置好波特率、奇偶校验位候并没有出现自己理想中的转动脉冲的数据,甚至连数据也没有。这款芯片笔者只用到了其中正交编码模式,不需要对其进行编程,没有任何数据输出,毫无疑问是硬件电路除了问题。于是倒回去啃读晦涩难懂的数据手册,查找芯片正常工作时各引脚的电平状态,发现在使用增量输出模式下Csn片选引脚应该给予一个500ns的低电平或者永久下拉到地来解锁增量输出模式。于是第二次做板时把Csn引脚直接接到GND引脚上,再次上电观察串口助手输出了如图6.1.5所示的一系列毫无规律的数据,很明显这并不能作为电机转轴实时转速的参考值。考虑到Csn从高电平到低电平的尖峰脉冲时间为500ns,遂将Csn片选引脚通过2.5KΩ的电阻下拉到地。再次上电,用示波器观察,波形完美,如图6.1.4所示,串口助手测得数据稳定、精确如图6.1.6所示。
图6.1.4 示波器测得波形
图6.1.5 未下拉前编码器数据 图6.1.6 下拉后编码器数据
6.2 软件测试
我们理想的情况是在倾角为0时刻,速度为零,并且车身保持直立,图6.2即为车模控制参数的整定。这些参数的调整需要遵循角度、速度、转向的顺序,在确定各参数极性正确下,才能进行下一个参数整定。
图6.2 车身控制参数
6.2.1角度环PD参数整定
角度控制包含P、D两个参数。比例相当于传统倒立摆的回复力,它所产生的效果必须大于重力加速度才能使得车身保持直立。首先,确定比例值的取值范围。考虑到控制电机所用的PWM波频率为20KHz,即3599代表满占空比。当P值为360的时候,说明车身倾角为10°时占空比为100%,显然实时不现实的,试想,驾驶人稍微倾斜一下身体,车子即高速的前进或者后退,即使车子能平衡,站在上面的人也难以适应这高速的响应。而过小的P值不能抵消重力场所带来的影响。所以,先假定一个值P=100,D=0;可以观察到车体短时间内在一个大约50cm范围内来回摆动随后倒下。因为车体没有出现往哪边倒,车轮就加速往哪边转动的情况,说明我们P值极性是正确的,只是这个比例值太小而不足以维持车身的直立。尝试着将设定P=200,理论上说,此时此时PWM波占空比已经超过55%了,足以抵消重力加速度所带来的影响。上电可观察到车身来回摆动的范围缩小了,且摆动频率加快,直立的趋势更加明显。继续增大比例值至300,此时车体发生了剧烈的抖动,在电机驱动下,比例值过大会导致系统发生共振现象。在确定使车体直立的最大比例值P=300情况下,我们引入微分控制来一直电机的抖动。微分控制就相当于单摆系统中单摆受到的阻尼力,可以有效的抑制车身的共振。通过串口助手观察MPU6050输出的陀螺仪原始数据,最大值不会超过4位数。设定D=0.1,旋转其中一个车轮,另一个车轮会以相同的速度、方向跟随旋转,说明D值极性是正确的。继续设定D=0.1,并将比例值设定为P=300,小车共振现象减小,并且来回摆动的范围进一步缩小至30cm,保持直立的时间加长。用手轻推车身,发现车体有些许轻微低频抖动现象。继续增大微分值到P=0.3,此时车体来回摆动的幅度在20cm之间,保持30秒左右的时间便往一个方向倒下。继续增大微分值为P=0.5,此时车身出现强烈的高频抖动,难以控制,但是其摆动的幅度则进一步缩小。为了减小对电机损伤,将角度闭环控制这一环节的比例微分参数分别设置为剧烈抖动时值的60%:P=180,D=0.3即可。表6.2.1为角度闭环控制参数整定过程中车身摆动的幅度范围,直立时间,以及相应的PD大致的参数值,因为测试次数较多,下表所列为系统变化较大时刻所选定的值,“/”代表抖动剧烈或者时间过长为了保护电机而没有做测试。
表6.2.1 角度闭环控制参数
第几次 比例值§ 微分值(D) 摆动范围(cm) 直立时间(s)
一 100 0.1 50~-53 5
二 101 0.2 48~-50 7
三 102 0.3 47~-48 7
四 103 0.4 45~-46 8
五 104 0.5 42~-43 /
第几次 比例值§ 微分值(D) 摆动范围(cm) 直立时间(s)
一 181 0.1 40~-43 20
二 182 0.2 38~-30 25
三 183 0.3 37~-38 35
四 184 0.4 35~-36 /
五 185 0.5 32~-33 /
第几次 比例值§ 微分值(D) 摆动范围(cm) 直立时间(s)
一 300 0.1 30~-33 /
二 300 0.2 28~-30 /
三 300 0.3 27~-28 /
四 300 0.4 25~-26 /
五 300 0.5 22~-23 /
6.2.2速度环PI参数整定
由于姿态传感器机械安装的误差以及信号的漂移,经过上述角度闭环控制调节后的车身不会精确的停留在某个位置上,它会朝着前进或者后退的某个方向加速倒下。在这个过程中,对于车体重力加速度和陀螺仪的零点参数(通常我们称之为机械中值,一般在-2~2之间)进行多次调整,可以逐渐消除车体往某一个方向加速倒下的现象。但是,随着陀螺仪积分数据的漂移,车体经过多次调试后还是会发生加速移动的现象,那就需要速度闭环控制来达到在倾斜角为0°时候,车体不会朝着某一方向加速倒下并且能长时间保持直立的效果。速度控制采用的是常用的速度闭环PI控制器。我们是利用STM32正交编码模式对编码器进行四倍频M法测速的,通过串口助手打印的数据可知左编码器与又编码器速度相加的绝对最大值为1000左右,出于对整车系统反应速度的考虑,我们假定当速度偏差达到最大速度60%的时候输出电机的最快速度,而3599代表满占空比,可以大致估算比例值:P=3599/(1000*60%)=6。为了测试P值的极性,先把上述调试好的角度闭环控制先屏蔽掉,设定P=1,D=1/200,尝试着旋转其中一个轮子,另一个轮子会以相同方向加速转动直至到最大速度。这正是我们所想要的正反馈效果,说明P值极性是正确的。之前我非常困扰,在学习自动控制原理的时候,对于偏差我们一般使用负反馈来减少或消除以达到尽可能的小偏差的目的。但日常生活中我们随处可见一种现象,当我们用一手指顶着雨伞或者棍子尖端时,我们总是需要不断的移动手指,并且方向与物体倒下的方向一致才能勉强保持直立,如果以反方向而行,那将会加速物体的倒下。所以整车系统中,我们采用的是速度正反馈。接下来我们将之前调试好的角度闭环控制打开,并将速度闭环控制的参数设置为:P=1,I=1/200;小车的速度控制很弱,根本无法让速度恒定下来。设定P=3,I=3/200,这时候小车的速度没有出现理论中速度响应提升的情况,变化与之前相比没有多大变化。进一步的设定为P=5,I=5/200,因为比例值已经接近理论计算值的84%,以为小车摆动频率应该会很快甚至高频抖动。上电观察发现并没有出现这类情况,倒是速度响应确实加快,而且摆动幅度很小已经接近能长时间直立的状态了。于是,便大胆的将比例值P提高到15,完美!上电后车身直接不动了!关键是车身并没有倒下也没有朝着任何一个方向行进。直勾勾的立在地板上,尝试用手轻推车身,在很小的摆幅下车身很快恢复了平衡直立,几乎达到静止的状态。至此,先暂定角度闭环参数为P=180,D=0.3,速度闭环参数P=15,I=15/200为理想值。表6.2.2为速度闭环控制P,I参数整定的大致实测结果(“/”代表抖动剧烈或者时间过长为了保护电机而没有做测试)。
表6.2.2 速度环参数整定及结果
第几次 比例值§ 微分值(D) 摆动范围(cm) 直立时间(s)
一 1 1/200 30~-33 30
二 3 3/200 28~-30 32
三 5 5/200 22~-24 45
四 15 15/200 3~-3 /
五 20 20/200 1~-1 /
6.2.3转向环PD参数整定
控制方向这一方面,使用的是通过单片机ADC采集单圈10K电位器上时刻变化的模拟值作为参考值传入Bias=gyro-(Volt-50)中。利用陀螺仪的Z轴补偿,将电位器实时变化的模拟值作为转向偏差,构成简单的比例-微分控制器。当10K电位器位于中间值时,Volt即为50,因为设定转向偏差(Bias)为0;所以此时刻小车不做旋转方向。这里对比例及微分值参数不是很明显,所以在P,D参数整定上有比较大的范围可以选取,实测效果都比较不错。但是经测试发现,如果将Volt值放大10倍来控制,那么小车的旋转灵敏度会有所提升,并且控制精确度也有所提高。平衡车的直立,速度,转向测试皆已告一段路,只有实际的上路测试,才能对PID参数值更好的优化修改。
6.3 实况路测
鉴于载人平衡车已经能做到直立,转向的控制,但是骡子是马,总得拉出来溜溜。只有真正的上路测试,才能真实的了解车身实时运行状态,以便对其作出更佳的优化。如图6.3所示,开机后,我们先踏出一只脚在脚踏板上来回的感受平衡车的回复力,再换另一只脚在另一边做上述操作。熟悉它的恢复力度之后在有辅助的情况下尝试着双脚踩踏上去,人们心态比较激动,往往刚站上去就开始倾斜身体来操纵车身前进后退,这是非常危险的。正确的做法应该是站上去的时候,我们要尽可能的保持自身的平衡与车身平衡的协调性,当站立一两分钟后逐渐找到感觉,便可以尝试着向前轻微倾斜一点角度,感受车子的扭力。切勿脚动人不动,而应与车身高度的协调统一。行进过程中,每当倾斜一定的角度之后,车体几乎是在同时间就做出了相应的响应,但是总感觉速度跟上去了,力量却稍有不足。通俗的说就是反应速度与电机扭矩不在同一水平线上,这回造成人身体往前倒,而车子却无法跟上来的节奏。以往的工程经验来看,很明显这是角度闭环中的比例值参数设置过低导致的最终电机输出的扭矩不足。笔者尝试着将P值从180增大到200,重新上电测试发觉依旧没什么改观,还是很软;大胆的将P值继续增大到240,结果依旧,找来周围伙伴来试车大家感觉一致。这不得不引起笔者的重视,如果将P值设置超过260,那么理论上估计电机此时应该会发生强烈的震动,而车体也会随之共振,更严重者甚至会造成电机与驱动的烧毁等不可逆的损害。好奇心的驱使下,我将P值进一步提高到260,上电的一瞬间,电机即产生剧烈的抖动,迅速的将开关断开,但还是晚了一步,电机驱动板上其中有一路4根MOS管烧毁了。这无疑是当头棒喝,80V,80A,10mΩ的大功率MOS管居然一瞬间烧毁,理论上说这搭建的H桥驱动力应该是绰绰有余的,更谈不上会烧管子。至此,实测阶段暂时搁浅并寻找解决方法。
图6.3 实况测试
6.4 硬件电路改进
电机回复力软弱,这绝对不是电机的原因,350W的带金属减速齿轮的大扭矩有刷电机,足以载重200Kg的质量。首先可以将电机自身扭矩不足这个因素排除。查阅多方书籍并与同学探讨之后,可以确定以下几点相关信息:电压决定电机的速度,电流决定电机的扭矩大小,而电池作为一种储能元件,决定的是续航。那么针对上述电机软弱无力而响应速度却迅速的问题,可以把原因锁定在是由于电流不足导致的电机输出扭矩不足的情况。因为实测之前已将电池充满电,可以排除是电池输出电流不足的原因,那只能是电机驱动的问题了。在同学的帮助下,做出了以下几点分析:
(1) STM32主控板输出的PWM方波信号上升沿与下降沿变化是否处于零延迟状态,是否有较多毛刺;
(2) 此PWM信号经过光耦隔离出来后衰减多少,波形是否依旧完美;
(3) 经过光耦隔离出来后的PWM波通过半桥驱动器IR2104S放大后流经滤波电容出来的方波信号是否还完美;
(4) 没有给大功率MOS管安装散热片。
之前笔者因为实验条件的原因并没有用示波器观测过其真实波形,而是匆忙焊接好板子就开始驱动电机转动,这是不可行的。针对以上问题,逐步检查。用示波器测得STM32主控板子出来的PWM波信号是非常完美的,高低电平之间的跳变几乎是零延迟的直线上升或者下降;经过高速光耦隔离后的PWM方波信号,因为光耦隔离电路输入与输出IO口经过300R的上拉电阻引出,所以信号衰减的非常微小,几乎可以忽略不计。很明显,问题应该是出现在IR2104S半桥驱动器放大这里。示波器实测后观察到经过放大后的波形毛刺较多,且矩形脉冲波类似于斜坡上升、下降的趋势,这会导致MOS管无法完全导通,内阻急剧增大,发热量上升,对MOS管的损耗非常大,这也是为什么很多人把MOS管一而再再而三的换成更高级的MOS管之后依然烧管的原因。另外,这一批IR2104S是从某宝网址购买的货源,不敢保证其是否原装正品,其次在自举升压电容选取上不应该选择使用钽电容。钽电容的漏电率比陶瓷电容大,这也是造成波形具有较多毛刺的主要原因。把10uF钽电容换成1uF高压陶瓷贴片电容后,用示波器观测器波形,毛刺明显减少,且波形较之前更加接近于完美的方波信号;尝试着将高压陶瓷贴片电容换成1uF的CBB快速恢复电容,测得H桥在工作时的自举升压电压值非常稳定,放大后输出的方波非常标准。MOS管的性能得以有效的发挥,电机输出的扭矩较之前提升好几个档次,完全做到随动随到的效果。小小的几颗电容在人们印象中更多的是隔直流通交流、滤波、去耦、旁路等作用,殊不知器件的选型也同样重要,可以帮助我们设计出更加严谨,使用的电路。
7 结论与展望
生活无处不智能,平衡车是当今智能时代的产物。人们赋予它另一个名称:思维车,确实,当人体大脑发送向前后倾斜的指令时候,我们的肢体便会做出相应的动作去完成这个指令操作;思维车亦是如此,当姿态传感器感应到人体重心发生变化时刻,内置中央处理即迅速的做出相应判断并输出控制指令去驱动执行机构完成相应的动作来维持系统的平衡。在这点看来,我们称之为摄位车,智能车也不为过。在当今人口爆炸,交通堵塞的社会,人们的出行方式必将发生质的变化。更加迷你型、便捷、炫酷实用、无污染的平衡车既可以健身娱乐,又能切实的解决中短距离的交通问题,也由此得到了广大群众的拥护和喜好。在理论研究方面,自平衡车作为高度灵敏、强耦合、非线性的不稳定物体,具备深远的研究价值和意义。是学习、研究和验证自动控制原理的绝佳选择。经过三个月的马拉松式学习与实践,双轮载人平衡车系统相对于传统的自动控制实验实现了以下基本功能和创新点:
(1) 可实现基本的原地平衡站立、前进后退;
(2) 平坦道路上可安全、平稳行驶;
(3) 低速行驶状态下可安全通过路面减速带;
(4) 最大爬坡20°;
(5) 最大负载80KG以上,续航20KM,最高时速10KM/H;
(6) 高亮前后车灯,方便晚上行驶;
(7) OLED实时倾角、编码器、主板温度信息显示;
(8) 超速自动报警;
(9) 倾角过大,转速过高或失控等,发出相对应声光提示;
(10) 自适应多种路面变化、重心变化,自动调整车体姿态,具有良好的鲁棒性和抗干扰能力。
自动控制系统的研究任重道远,双轮载人平衡车设计目前只是实现了其作为一辆思维车最基本的功能。基于无线控制、机器视觉的最佳路径规划等方面的研究还未能来得及学习和探索。未来朝着智慧化发展,平衡车也是如此,用“镜”看世界,透“芯”来学习。