基于单片机的平衡车控制系统设计 (程序源代码+视频+pdf电路板原理图)

摘  要

智能汽车的数据采集、智能控制、远程操控的研究成为一项重大课题。本课题是基于单片机的平衡智能车控制系统设计,采用摄像头检测技术对平衡小车的位置和运行情况进行实时监测,并基于摄像头图像处理实现平衡智能汽车的路线规划,从而实现平衡车的全方位监控、导航自动驾驶。

本文首先介绍了我国平衡智能汽车的发展现状和本课题平衡车设计平衡工作原理。然后选用MM32F3277作为主控芯片,进行硬件设计,对系统基于MM32F3277芯片利用立创EDA软件进行了原理图和印制电路板的设计。接着通过摄像头和电磁检测技术采集路面路径信息进行平衡车行驶定位,基于平衡车在轨道和姿态上的偏移来产生控制量,利用车轮的差速实现平衡车的转向与直立控制。其次根据平衡车电机转速,对平衡车进行速度控制;多种传感器协同配合,实现了平衡车在不同情况下、不同任务类型之间的切换,灵活性和高效性得以体现。最后根据各传感器反馈数据设计控制程序。

最终本文对该项目的平衡车进行全方位系统测试,小车在复杂路径下完成了直立和高速平稳行驶。结果表明:该项目设计已达到要求,能够预测平衡小车的自动驾驶,实现全方位监控。

关键词:平衡车 ;平衡控制 ;PID控制器 

Abstract

The research of data acquisition, intelligent control and remote control of intelligent vehicle has become an important topic. This topic is based on the MCU balance intelligent car control system design, the use of camera detection technology to balance the car's position and operation of real-time monitoring, and based on the camera image processing to achieve the balance intelligent car route planning, so as to achieve the balance of the car's omni-directional monitoring, navigation automatic driving.

This paper first introduces the development of China's balance intelligent vehicle and the balance of the design of the balance of the working principle. Then choose MM32F3277 as the main control chip, the hardware design, the system based on MM32F3277 chip using Licon EDA software schematic and printed circuit board design. Then the road path information is collected by the camera and electromagnetic detection technology for the driving location of the balancing car. The control quantity is generated based on the deviation of the balancing car in the track and attitude, and the steering and upright control of the balancing car are realized by the difference of the wheels. Secondly, according to the motor speed of the balancing car, speed control of the balancing car; A variety of sensors cooperate to achieve the balance vehicle in different situations, different task types between the switch, flexibility and efficiency can be reflected. Finally, the control program is designed according to the feedback data of each sensor.

Finally, this paper carries out all-round system test on the balance car of the project, and the car completes the upright and high-speed smooth running under the complex path. The results show that the design of the project has met the requirements, and can predict the automatic driving of the balanced car, and achieve all-round monitoring.

Keywords: balance car; balance control; PID controller

目录

第一章 引言

1.1概述

1.2国内外研究现状

1.2.1 国外研究现状

1.2.2 国内研究现状

1.3 课题研究内容及章节安排

  总体方案的确定以及硬件选型

2.1总体方案的确定

2.2芯片选型

2.3 车模选型

2.4 传感器选型

2.4.1 姿态传感器

2.4.2 编码器模块

2.4.3 电感检测模块

2.4.4 摄像头模块

2.5 人机交互

2.5.1 OLED模块

2.5.2 EC11旋转编码器

2.5.3 无线串口透传模块

第三章  硬件电路设计

3.1控制系统硬件设计方案

3.2主控板设计

3.2.1 最小系统

3.2.2电源管理

3.2.3传感器检测

3.2.4人机交互

3.2.5电机驱动

3.2.6电磁信号放大电路设计

3.3印制电路板设计

3.3.1缩短连线长度

3.3.2元器件布局

3.3.3减少电路干扰

3.3.4焊接注意事项

第四章 软件功能设计

4.1软件总体结构图

4.2系统子程序流程

4.2.1系统初始化程序

4.2.2 1ms定时器中断服务程序

4.2.3 5ms定时器中断服务程序

4.2.4 10ms中断服务程序

4.2.5串级PID算法

4.2.6 人机交互调试

第五章 系统测试

5.1系统硬件调试

5.1.1蜂鸣器和LED测试

5.1.2 OLED模块测试

5.1.3摄像头测试

5.1.4编码器测试

5.1.5陀螺仪测试

5.1.6电感测试

5.1.7电机测试

5.2系统软件调试

结 语

参考文献

致谢

附录1:主控板原理图

附录2主控板PCB

附录3主要程序代码

第一章 引言

1.1概述

两轮自平衡控制系统具有非线性、多变量等特性,可以实现在特定环境下多轮机械臂所不能实现的复杂动作。随着人工智能趋于成熟,对不同图像、语音进行识别以及大数据预测均会在不同程度上采用人工智能的技术,在人工智能的驱动下,设计并改进“利用摄像头导航的、直立行走的平衡智能车”显得尤为重要[1]。人工智能将使无人驾驶进一步发展,近些年来,自动驾驶技术的研究广受追捧,自动驾驶技术正在逐渐完善。许多企业或单位逐步加大投入自平衡车研发力度。此外,对于国内大部分新兴企业和单位来说,在人工智能的大背景之下进行平衡车研究和设计,无疑都具有非常大的利益的。未来平衡车的发展与当今社会的人工智能紧紧相连。

自动驾驶汽车是智能交通系统中的一个关键环节,它能够消除非自然因素的干扰,从而保障汽车的行驶安全,同时也是缓解交通拥挤和提高能源利用效率的一种有效方法。伴随着相关技术的迅速发展和产业链的发展,对两轮平衡智能车的要求不断提高,涌现出更多的实验和测试去增强智能车行驶时的稳定性。 在这样的一个背景之下,两轮平衡车的发展无疑更上一层楼,两轮平衡车拥有更好的灵活性,此外,在节能减排的今天,电动车成为未来主导车型的有力竞争者,这使得两轮平衡车在交通运输系统中拥有更好的发展前景。

双轮平衡车运用“动态平衡”原理,运用二代移动补偿算法,通过ICM20602型姿态传感器,对车身的微小姿态变化进行准确的检测[2]。为使车身达到动态平衡,本设计利用伺服控制系统调节电机[3]。

1.2国内外研究现状

智能车被叫做无人驾驶汽车,此外,还被叫作轮式移动机器人。此类机器人可以根据预先设定的程序的基础上自主式学习决定未来动作,是能够自动感知、判断决策,并且具有高级自动驾驶的能力。智能车在作为西方国家的重点研究对象已有几百年历史,其中包括“智能车辆系统” (Intelligent Vehicle Highway Systems,简称 IVHS)[4]。

1.2.1 国外研究现状

2002年,在以 DSP为核心的基础上,来自瑞士工业大学的研究人员 Felix Grasser等人,研究出一款基于倒立摆控制系统的机器人原型,利用DSP芯片实现对轮式移动机器人的远程操控。该方法通过对陀螺、马达变送器的线性状态空间控制器进行处理,使其达到稳定的目的。操控人员在不用跟随系统的前提下就可以远距离控制系统的运动状态,使得Joe在严酷的环境下依旧具备正常行驶、站立、工作的能力。数据表明,Joe的最大移动速度已达5.44km/h,高于成年人的正常行走速度。

美国的SegwayLLC公司研发出一款运行不受天气情况的限制两轮平台电动车——Segway,操控者平稳站立于该电动车上时,电动车依然能保持动态平衡前进。此平衡车主要依据“动态稳定”的基本原理进行设计。“动态稳定”是一种在运动过程中根据自身运动的某些特性自我感知并保持系统相对平衡的能力。平衡车行驶过程中,系统可以利用加速度计测量平衡车的倾角以及加速度等数据,也可以通过电机测速编码器以及其他传感器检测车体运行的速度等参数,检测频率为100次/s的频率。根据检测的参数对比从而判断车辆运行时的状态,通过数据的编码和调整维持平衡车自身的平衡以及速度和转向。

1.2.2 国内研究现状

与欧美、日本等想比,我国在平衡机器人领域方面的研究起步较晚。近年来,平衡车的研究工作在企业和各大高校中陆续展开,其间做出了大量研究工,设计出较多智能车。

2003年,一辆名叫Free Mover的两轮平衡车由中国科学技术大学张培仁团队研制而出。作为我国首台平衡车,Free Move采用嵌入式微控制器作为的控制单元。该车体运行速度的检测使用到编码器传感器,Free Move还使用加速度计以及陀螺仪测量角度,加速度等数据。该系统在设计过程中所要输出力矩由的极点配置的控制算法计算得出,以求实现平衡控制。行驶过程中,操控者身体的前后仰能改变平衡车的运行方向,从而实现小车的向前运动以及向后运动。研究成果如图1-1所示。

2004 年,台湾国立中央大学在前人的研究基础上继续推进,运用自适应模糊控制算法。该平衡小车使用Ti 出品的数字信号处理芯片—— DSP 28XX系列控制器,将倾角计和陀螺仪作为传感器,同时利用编码器进行采集[5]。研究成果如图1-2所示。

                   

图1-1 Free Mover展示图            图1-2 台湾国立中央大学研制成果          

2005年,哈尔滨工业大学王晓宇等研制出名为Sway的两轮自平衡机器人[6]。该机器人的动力学模型建立依据为拉格朗日方程。该机器人的研发中,采用自适应控制方法实现对该机器人的平衡控制[7]。姿态传感器选用陀螺仪和加速度计,实现对小车角度,角加速度等数据的实时检测;为控制行驶车速,保持行驶过程中的平衡状态,设计过程中采用滤波融合输出姿态信息,使用差分进行驱动[8]。研究成果如图1-3。

图1-3 Sway

2011 年,香港易步科技公司推广Robstep易步车作为我国市场上第一款双轮的载人平衡车, 体态小巧轻盈,续航能力较强,可作为较好的代步工具[9]。Robstep易步车如图 1-4所示。

       

图 1-4 Robstep             图1-5  Ninebot

2013年,天津纳恩博科技有限公司推出了一款名为 Ninebot的载人平衡车[10],如图1-5所示。Ninebot的用户体验很好,它的外形很简单,它的首要目标就是代步。      

2015 年,小米公司推出“九号平衡车”[11]。“九号平衡车”重量仅为 12.8kg,时速的最大值为 16km/h,远超于成年人的正常行走速度。行驶过程中,平衡车能与手机的无线通讯连接,从而实现对平衡车的操控。“九号平衡车”如图 1-6 所示

2021 年,腾讯Robotics X 实验室正式推出轮腿式机器人,Ollie。Ollie以腿为辅,轮为主,实现了腿式和轮式的结合。设计过程中采用非线性控制,使其摆脱模型可线性化区间的束缚,这一设计提高了机器人的平衡能力,使其在较大大角度倾斜路面仍具能稳定行驶能力。Ollie在结构和功能方面的突破,发挥了轮腿式机器人的形态优点,参考价值和实际意义较大。Ollie如图 1-7 所示。

   

图 1-6  小米九号平衡车           图 1-7  机器人Ollie

国内智能车与各大高校的教学也联系紧密,越来越多的高校也认识到人工智能的重要性,学校开设人工智能相关的专业和课程,联合举办一些人工智能、智能车等领域的比赛。“全国大学生智能汽车竞赛”是国内高校在智能车设计方面的重要表现形式目前进行到第十六届主要任务为:在赛道上实现智能车的平稳、快速行驶,同时对路径进行识别、巡线[12]。各高校智能汽车设计技术已经愈发成熟。各大高校也踊跃了一大批的兴趣爱好者加入其中,这也使得智能车在设计上竞相角逐,不断推动智能车在高校的发展。目前在全国大学生智能车竞赛中,主要车型包括两轮直立车型、四轮车型、三轮车型、单车车型、越野车型、麦轮车型。比赛内容丰富、形式多样,参与者需要完成各种极具挑战性任务。为增强竞争力,促使佳绩频出,各大高校极力提高智能车的性能,由此推动了各大高校对车模机械结构设计、算法实现不断优化的狂潮。在近几年的举办赛中,南京工业大学接连斩获国奖,分别在第十三届第十五届智能车竞赛荣获全国一等奖目前南京工业大学依然保持继续冲击国奖的实力。

在近些年绿色出行的倡导下,为响应全球节能减排的号召汽车动力系统正在朝着新能源和电力变革。在国家战略发展要求的指引下,新能源汽车和电动车行动取得了良好的发展成果,国家也陆续为电动系统研发和新能源科技创新发展拨款支持,我国汽车企业面临着一个良好的电动车发展机遇,节能电动汽车拥有极好的发展前景[13]。智能平衡车产品技术更新研究具有重要意义。

1.3 课题研究内容及章节安排

本课题是以MM32F3277作为控制芯片,基于多种传感器相互配合完成平衡车控制系统设计。课题运用自平衡原理和巡线识别技术,使用摄像头系统进行路径导航。编写规划算法控制,实现小车的精准姿态控制和巡线控制。

为实现以上功能,本课题分析了相应电路的工作原理、相应控制算法的原理,并设计相应电路进行打板测试,针对平衡智能汽车的主控板及各传感器模块进行编程设计。本文总体章节安排如下:

第一章介绍选题背景以及智能小车的研究意义。同时分析对比国内外目前在平衡智能车领域的发展状况,说明本课题的研究内容及章节安排。

第二章主要说明系统的总体方案设计,详细说明选择的芯片、车型和其他传感器的应用原理特点。

第三章具体介绍了平衡车的硬件方案,包括主控板设计,相关模块设计,重要参数说明,也讲述了印制电路板设计细节。

第四章具体介绍了软件功能设计的过程。针对摄像头图像处理、导航控制、PID控制算法等重要功能代码进行描述。

第五章介绍平衡车在整体系统完成设计之后的实际运行情况,制作过程相关参数调试及数据记录。并简要总结毕业设计过程中解决和未解决的问题,描述项目中还存在的一些问题,提出未来要如何改进、解决。

  总体方案的确定以及硬件选型

2.1总体方案的确定

本文采用ICM20602型位姿传感器,对车身的微小姿态变化进行准确的测量,并利用伺服控制系统驱动电机,进行相应的调整,以保持整个车体的动态平衡控制平衡;此外使用摄像头采集路径图像并进行程序图像处理,配合伺服电机完成转向和速度控制,实现平衡车的全方位监控、预测自动驾驶;最后可以使用无线模块发送路径实时图像到PC机进行调试。本课题实现的系统框图如图2-1所示。

图2-1 平衡车系统框图

2.2芯片选型

课题要求使用二值化和灰度摄像头进行路径识别,因此要求MCU具有较强的处理能力。综合国内市面通用MCU性能及价格,最终选择灵动微电子的MM32 MCU。灵动微电子是中国本土领先的通用32位MCU产品供应商,近年,国际形势变化莫测,国内进口芯片面临尴尬的“卡脖子”现象,为摆脱这一窘境,国内芯片研究行业为之努力。在此背景下,本课题支持国产芯片,经过综合对比,最终以灵动微电子的MM32F3277作为主控芯片。MM32F3277具有丰富的外设和快捷的执行指令能力,表2-1为MM32F3277芯片的产品资源及规格。

表2-1 MM32F3277G9P产品资源

产品资源

规格

CPU频率

120MHz

通用(16bit)

2

通用(32bit)

2

基本

2

高级

2

UART

8

IC2

2

SPI

3

12S

3

CAN

1

USB-OTG FS

1

GPIO端口数

116

12位ADC

个数

3

通道数

21

DAC

2

工作电压

2.0-5.5V

封装

LQFP144

2.3 车模选型

本课题平衡车车模设计参考全国大学生智能汽车竞赛规则,选择在大赛官方规则中指定的直立车模基础上进行改装。大赛所使用的两轮直立车模主要有D车车模和E车车模。D车车模底板相对较短,整体车身相对小巧且较重。与此相反,E车轮距较大,车身较长且较轻。所以在对比两款车模的机械特性后,发现D车车模重心较低更方便平衡的调试。两轮直立D车和E车车模实物图如图2-2、图2-3所示。

图2-2 两轮D车模实物            图2-3 两轮E车模实物

2.4 传感器选型

2.4.1 姿态传感器

在姿态传感器的选择上,对比了MPU6050和ICM20602两款传感器主要特性对比见表2-2。

表2-2 MPU6050和ICM20602对比

ICM20602

MPU6050

六轴加速度计陀螺仪

三轴加速度计陀螺仪

IICSPI通信协议

标准IIC通信协议

陀螺仪灵敏度误差±1%

陀螺仪噪声4 mdps/√Hz

加速度计噪声100μg/√Hz

测量精度:16384LSB/g

ICM20602模块实物如图2-4所示。ICM20602加速度计和陀螺仪的灵敏度轴和旋转方向如图2-5所示。

平衡车稳定性设计依赖姿态传感器测量数据的准确性和实时性,ICM20602拥有非常高的精度,而且集成加速度计和陀螺仪。ICM20602解决了整合加速器时间轴和陀螺仪之差的问题,有效节省了器件封装的空间,适合平衡车的制作。

       

图2-4 ICM20602模块实物            图2-5 ICM20602灵敏度轴和旋转方向

2.4.2 编码器模块

增量式编码器[14]的工作原理是通过将位移变换为周期电信号,并将其转化为计数脉冲,利用脉冲数目来表达位移的大小[15]。本课题采用1024线带方向迷你编码器,此编码器的轴旋转一圈,编码器输出1024脉冲,图2-6为编码器实物图,增量式编码器的工作原理示意图如图2-7所示。

图2-6 1024线带方向迷你编码器实物

图2-7增量式编码器工作原理

2.4.3 电感检测模块

本课题采用5电感获取电磁信号,经过市场比对,最终选用钛氧体磁芯工字型电感。该电感套管包装和磁屏蔽,提高了机械和电路抗干扰性能。良好的可耗性和电气特性;大电流,小阻抗,体积小,适合本课题设计。课题选用LC选频谐振电路,此电路不仅对消除20kHz之外的干扰信号具有显著的作用,还利于提高信号检测的信噪比。电感实物图如图2-8所示。

图2-8 电感实物图

在此项目中, 设计的LC电路的基本波形为20 kHz,在考虑到电容的技术指标及造价的基础上,本方案选择了6.8 nF电容,最接近理论谐振电容6.33 nF,其电感 L为10 mH。其LC并联电路原理图如图2-9所示。

图2-9 LC并联电路图

其谐振频率计算公式为:

(2-1)

2.4.4 摄像头模块

本课题采用MT9V032进行图像检测,MT9V32集成了复杂的片上摄像功能,具有2 x 2和4 x 4分档,以提高更小分辨率下的操作灵敏度。此外,MT9V032采用了半导体的突破性低噪声CMOS成像技术[16],提高了CCD图像质量(基于信噪比和低光灵敏度),同时保持了CMOS固有的尺寸、成本和集成优势[17]。MT9V032实物如图2-10所示。

图2-10 摄像头实物

MT9V032输出的是一个具有 FPS调节功能的灰度图,帧数最小可以调整为0帧,最大可以调整到500帧,这个帧数范围内可以任意切换,并且在这个帧数范围内的图像都非常稳定。MT9V032图像输出的速度较快,例如设置FPS为50,分辨率为120*188,图像输出的时间只有3.5ms左右,使得采集时间仅3.5ms左右,这为处理图像预留出更多的时间。此外,MT9V032具有自动曝光功能,当环境变亮,摄像头会自动减少曝光时间,反之,像头会自动增加曝光时间,因此摄像头在不同的环境下均使用。以下是MT9V032摄像头拍摄的图片对比,如图2-11所示。

图2-11 MT9V032拍摄图对比

2.5 人机交互

2.5.1 OLED模块

人机交互作为调试的重要组成部分,能够使用OLED模块显示角度、角加速度、PID参数等一系列实时数据。OLED和普通的液晶显示屏相比较具有较大的优势,OLED同时具备内部光源,不需要外置背光源。OLED视角广,非畸变角度均能看清屏幕显示内容。另外OLED反应速度快,可以在最快的时间显示打印内容。OLED是全固态的,具有良好的抗振性,这一特性确保了在使用过程中OLED不易损坏。最后OLED使用简单,在使用过程中针对屏幕像点位置界面的简单设计,就可以将UI菜单的显示能力发挥到极致[18]。OLED模块实物如图2-12所示。

图2-12 OLED模块实物

2.5.2 EC11旋转编码器

课题选用EC11旋转编码器作为人机交互的输入器件,EC11旋转编码器主要特性见表2-3,EC11旋转编码器实物图如图2-13。

图2-13 EC11旋转编码器

表2-3 EC11旋转编码器主要特性

主要特性

规格

震荡

小于等于3ms

滑动杂讯(突变)

小于等于2ms

滑动噪声

3.5V以上

开关特性

(OFF:3.5以上

ON:1.5以下)

机械性能

360°无止挡点

2.5.3 无线串口透传模块

本课题的无线透传使用的是一对一的无线通信方式,即一个无线转串口仅与一个无线转串口连接。无线透传模块的使用可以将摄像头采集到的实时图像发送到PC端进行监测,拥有无线通信模块便可以更加便捷地进行特殊元素调试。无线模块的正反面图2-14所示。

图2-14 无线模块正反面

第三章  硬件电路设计

3.1控制系统硬件设计方案

本课题的硬件主要分为五个部分:最小系统、稳压电路、传感器、辅助调试电路和电机驱动部分。课题设计的最小系统中除了主芯片以外,还设计晶振电路、外置时钟电路和复位电路,MCU是单片机的“大脑”;稳压电路将外接电源的电压分别转化为各模块工作电压;主控板上预留传感器接口供外部传感器使用,课题使用的传感器主要包括摄像头、姿态传感器、编码器等;辅助调试电路主要包括按键、旋转编码器、显示屏、无线串口等电路;电机驱动部分是驱动电机的电路,在本设计中,所有电路包括电机驱动电路均设计到一块主控板上。系统硬件电路结构如图3-1所示。

图3-1 硬件整体方案结构图

3.2主控板设计

3.2.1 最小系统

课题MCU原理图如图3-2所示。

 

 

图3-2 MCU原理图

以MM32F3277芯片设计的最小系统的晶振电路选用8MHZ有源晶振,其原理图如图3-3所示。

图3-3 晶振电路

复位电路如图3-4所示

图3-4 复位电路

3.2.2电源管理

外置7.2V电源为主控板供电,稳压电路采用XL1509-5.0E1芯片将7.2V电压转化为5V电压。5V电压通过LR1801G-33-SH2-R稳压电路转化为3.3V为摄像头以及编码器供电;5V电压通过RT9013-33GB稳压电路转化为3.3V为芯片供电,其原理图如图3-5所示。

图3-5 稳压电路

3.2.3传感器检测

本课题基于单片机的平衡车车设计采用了各种传感器,MT9V032摄像头18P接口如图3-6所示。编码器和ICM20602作为传感器获取各种信息,需要在主控板上留出相应接口,其接口如图3-7所示。

图3-6 摄像头接口

图3-7 编码器、ICM20602及串口接口

3.2.4人机交互

课题设计采用0.96寸OLED显示屏,通信方式为SPI串口通信协议。EC11旋转编码器和按键配合OLED屏使用,ECLL旋转编码器可分为四种工作状态:逆时针旋转、顺时针旋转、单击和双击。课题设计了6个黄绿色和蓝色交替放置的LED灯,其中1个绿灯用于5V稳压电路;1个蓝灯用于CPU3.3V供电电路;另外4个LED灯供人机交互或者程序调试使用。课题设计了一个有源蜂鸣器作为人机交互的声音响应器件。电路接口如图3-8所示。

图3-8 人机交互

3.2.5电机驱动

电机驱动电路采用RT9624驱动芯片,该芯片可用电源供电,RT9624内置自举二极管,性能优越。RT9624芯片性价比高,对比市面上大部分MOS驱动负载能力较强。此外RT9624还具有驱动电流大和死区电压小的优点。驱动电路采用N沟道场效应管AON7418,驱动电路如图3-9所示。

图3-9 电机驱动电路

3.2.6电磁信号放大电路设计

课题选用GS8632-SR运算放大器搭建电感采集运算放大电路,GS8632-SR具有6MHz高增益带宽、低输入偏置电流1pA,性能卓越。图3-10为运放电路的原理图。

图3-10 运放电路图

运算放大器放大倍数计算原理图如图3-11。

图3-11 运算放大器原理图

其中,放大倍数公式为公式3-1。

(3-1)

本课题放大倍数Av = -300。

3.3印制电路板设计

主控板PCB如图3-12所示,主控板上对电流导线宽度做出不同程度的设计,对大电流导线进行了加宽处理。主控板上还放置了散热孔,可预防电流过大造成的过热、甚至烧坏主控板现象的发生。印制电路板的地线设计至关重要,模拟地和数字地分开,本设计中主控板针对模拟地和数字地分别设计了铺铜,同时起到了接地和抗干扰作用。

图3-12 主控板PCB图

3.3.1缩短连线长度

针对部分容易受到其他信号干扰的元器件要隔开走线,尽量减少干扰,输入引流线和输出端不要相邻放置,尽可能分开。考虑到信号导线与电流导线之间存在干扰,信号线应尽量与电流导线隔开走线。对于部分稳压芯片输入较高电压、输出低电压,压差较大,为防止发生意外短路,应当在加大它们之间的距离。

3.3.2元器件布局

特别注意将其他元件注意远离摄像头,摄像头信号线受大电流干扰,图像会失真。本设计中,布局时将摄像头接口放置到主控板的边缘,并且摄像头接口距离芯片相对较近,减小信号线走线长度。此外,特别的进行了电机驱动电源线和地线进行了加宽和开窗处理,开窗有效地避免产生耦合造成串扰,不过需要特别注意使用时的短路问题。

3.3.3减少电路干扰

本课题设计了双面PCB,PCB底层实物图见图3-13。将最小系统除芯片以外的元器件放置到PCB的底层,减少PCB体积的同时尽可能减少各电路之间的干扰。PCB底层还放置了各种传感器接口,其中包括陀螺仪接口。陀螺仪精度要求较高但其信号易受干扰,将陀螺仪接口放置到PCB背面能有效减少干扰。

图3-13 主控板PCB底层实物图

3.3.4焊接注意事项

对于发热元件,还应当考虑散热问题,布局是尽量放置到底层。PCB设计时,应当考虑到焊盘的设置,焊盘中心孔要比元器件导线直径大;焊盘还不宜太大,焊盘过大易造成虚焊。

第四章 软件功能设计

4.1软件总体结构图

课题系统软件按照模块化设计,模块化程序设计易于程序调试以及优化。总程序主要包含程序初始化、定时1ms中断、定时5ms中断、定时10ms中断以及人机交互五个部分,系统软件总体接头图如图4-1所示。

图4-1 软件结构图

总体软件设计流程图如图4-2,系统运行首先初始化各模块;执行中断服务程序,判断时间1ms、5ms和10ms是否达到,若时间达到,则分别读取电感值、陀螺仪数据、编码器计数以及摄像头图像采集;根据传感器传回的数据进行串级PID控制,输出PWM控制电机;通过预先设定的停车信息判断平衡车是否达到停车标志,若不满足停车标志,则返回中断服务程序;若满足停车标志,程序则执行停车退出程序。

图4-2 总体软件流程图

4.2系统子程序流程

4.2.1系统初始化程序

系统启动后,首先进行初始化程序。初始化程序先进行单片机接口初始化,如设置串口波特率以及数据传输位数。之后进行程序初始化,程序主要对LED、OLED、UI界面、按键、旋转编码器、蜂鸣器、ICM20602、电机PWM输出、编码器、摄像头进行初始化以及配置5ms和1s产生中断,系统初始化程序流程图如图4-3所示。

图4-3 初始化流程图

摄像头主要参数配置如下:

#define IMAGE_HEIGHT 60//图像高度

#define IMAGE_WIDTH 80//图像宽度

#define IMAGE_SIZE (IMAGE_WIDTH * IMAGE_HEIGHT / 8)

#define CAMERA_FPS 100//摄像头帧数

int16 MT9V03X_CFG[CONFIG_FINISH][2]=

{

{AUTO_EXP,     0},     // 自动曝光设置 范围1-63 0为关闭

{EXP_TIME,    450},     // 曝光时间

{FPS, CAMERA_FPS},     // 图像帧率

{SET_COL, MT9V03X_W}, // 图像列数量 范围1-752     

{SET_ROW, MT9V03X_H},// 图像行数量 范围1-480

{LR_OFFSET, 0}, // 图像左右偏移量 正值右偏,负值左偏

{UD_OFFSET, 0}, // 图像上下偏移量 正值上偏 负值下偏

{GAIN, 32}, // 图像增益 范围16-64     

{INIT, 0} // 摄像头开始初始化

};

4.2.2 1ms定时器中断服务程序

定时器1产生1ms中断,1ms中断下能够更快地更新电感值,利于实时精准巡航控制。定时器1每1ms产生一次中断,用于5电感值获取,1ms中断流程图如图4-4。

图4-4 1ms中断流程图

程序每1ms进行一次电感值采集,1ms中断服务代码和注释如下:

void TIM5_IRQHandler (void)

{

  onTimer1Updated();             //定时器1 获取五电感的值

  onTimer3Updated();            //定时器3 FPS定时累加器触发

 uint32 state = TIM5->SR;     // 读取中断状态

  TIM5->SR &= ~state; // 清空中断状态

}

电感采集到的电压值浮动较大,需要进行滤波,本设计采用窗口滑动滤波。本课题采用的窗口滑动算法针对5个电感进行加权取均值处理,此方法滤波的数据更加接近实际值,滤波部分的代码和注释如下:

const float filter_weight[WIN_SIZE] = { 10, 15, 20, 25, 30, 40, 50, 60, 70, 80};

float SlidingFilter_result = 0.0f;

float SlidingFilter_weight_sum = 0.0f;

float SlidingFilter(float array[WIN_SIZE], float value)  //滑动滤波

{

//窗口滑动

for(int i = 0; i < WIN_SIZE - 1; i++)

{

array[i] = array[i + 1];

}

array[WIN_SIZE - 1] = value;

  SlidingFilter_result = 0.0f;

  SlidingFilter_weight_sum = 0.0f;

for(uint8 i = 0; i < WIN_SIZE; i++)

{

SlidingFilter_result += filter_weight[i] * array[i];  //加权

SlidingFilter_weight_sum += filter_weight[i];

}

if(SlidingFilter_weight_sum != 0)   

{

SlidingFilter_result = SlidingFilter_result / SlidingFilter_weight_sum;

}

return SlidingFilter_result;   //滤波值作为电感参数值

}

课题设计了5电感,拟合电感中线部分选用3电感拟合,3电感拟合中线较5电感拟合中线数据浮动小,最终采用3电感差比和计算得出电感中线,电感拟合中线采用差比和公式计算中线,电感拟合中线代码和注释如下:

#define RATIO 55                                 //差比和-比例系数

float numerator = (float)(left_ad * (- RATIO) + mid_ad * 0 + right_ad * (RATIO));                  //三电感检测

float denominator = (float)(left_ad + mid_ad + right_ad);    

result = (numerator / denominator) ;                   //差比和公式

car_info.inductor_mid_line_ = result;                  //电感中线

4.2.3 5ms定时器中断服务程序

本课题主程序中断服务程序中使用定时器0配置5ms定时中断,每间隔5ms运行一次该中断服务函数。主要控制程序放到此中断下,另外利用5ms中断服务程序采集姿态数据和获取编码器脉冲计数。5ms中断服务程序流程图如图4-5。

图4-5 5ms中断流程图

5ms中断服务程序代码和注释如下:

void TIM2_IRQHandler (void)

{

  GetEncoder();                    //编码器计数

  onTimer0Updated();               //姿态传感器获取姿态数据,控制程序

  uint32 state = TIM2->SR;           // 读取中断状态

  TIM2->SR &= ~state;   // 清空中断状态

}

ICM20602传感器采集到的数据采用卡尔曼滤波,由于ICM20602安装带来的误差,程序进行了轻微的校准,其代码和注释如下:

get_icm20602_accdata_spi();  //获取ICM20602加速度计数据

get_icm20602_gyro_spi();    //获取ICM20602陀螺仪数据

Gyro_X = icm_gyro_x+6;     //x轴角度                 

Gyro_Y = icm_gyro_y-5;      //y轴角度                

Gyro_Z = icm_gyro_z-8;       //z轴角度               

Accel_X = icm_acc_x;         //x轴加速度           

Accel_Y = icm_acc_y;         //y轴加速度           

Accel_Z = icm_acc_z;         //z轴加速度

Accel_Angle=-atan2(Accel_X,Accel_Z)*180/PI;    //计算角加速度    

Gyro_Y=Gyro_Y/16.4;        //以Y轴角度作为平衡车的俯仰角

编码器脉冲计数可转化为车轮转速,5ms周期内通过车轮转动1米长度编码器脉冲数来标定车轮转速,代码和注释如下:

#define K_ENC_V 1.9635f                           //测试标定系数

int32 num1 = tim_counter_get_count(ENC_L_PULSE_TIM);//获取脉冲计数

tim_counter_rst(ENC_L_PULSE_TIM);                 //计数清零

int32 num2 = tim_counter_get_count(ENC_R_PULSE_TIM);//获取脉冲计数

tim_counter_rst(ENC_R_PULSE_TIM);                //计数清零

if(gpio_get(ENC_L_DIR)) num1 = -num1;          //确定左轮正反转编码器数值正负

if(!gpio_get(ENC_R_DIR))  num2 = -num2;       //确定右轮正反转编码器数值正负

uint8 type = (uint8)event.value[0];

int32 result = (int32)event.value[1];

car_info.speed_left = -(float) (K_ENC_V * result);        //左边传感器

car_info.speed_right = (float) -(K_ENC_V * result);       //右边传感器

4.2.4 10ms中断服务程序

摄像头图像获取采用10ms中断,图4-6为图像处理中断服务流程图。FPS累加器在定时1ms中断服务中累加至1s,用于获取图像采集的帧率。

图4-6 图像中断服务流程图

摄像头拟合中线的主要依据是图像边线的变化情况,根据边线变化辨析图像点进行中线拟合中线代码和注释如下:

float fix_k = car_info.fix_k;    //根据直立角度修改补线系数

car_info.fix_k = 0.5f * (0.023*(car_info.angle_y + 44) + 0.85);  

if(LeftEdge[i] != 0 && RightEdge[i] != IMAGE_WIDTH)//中线判断,没有丢线

    {

      MiddleLine[i] = (LeftEdge[i] + RightEdge[i]) * fix_k;  

    }

    else if(LeftEdge[i] == 0 && RightEdge[i] != IMAGE_WIDTH)//丢了左线

    {

      LeftLose++;                    //记录只有左线丢的数量

      if(LeftLoseStart == 0)

        LeftLoseStart = i;

      if((RightEdge[i] - LeftEdge[i]) >= (RightEdge[i + 1] - LeftEdge[i + 1] + 1))

//突变      

      {

        MiddleLine[i] = MiddleLine[i + 1];             //用上一行的中点

      }

      else

      {

        MiddleLine[i] = RightEdge[i] - Width[i] * fix_k;   //正常的话就用半宽补

      }

    }

    else if(LeftEdge[i] != 0 && RightEdge[i] == IMAGE_WIDTH)  //丢了右线

    {

      RightLose++;                       //记录只有右线丢的数量

      if(RightLoseStart == 0)

        RightLoseStart = i;

      if((RightEdge[i] - LeftEdge[i]) >= (RightEdge[i + 1] - LeftEdge[i + 1] + 1))

//突变

      {

        MiddleLine[i] = MiddleLine[i + 1];   //用上一行的中点

      }

      else

      {

        MiddleLine[i] = LeftEdge[i] + Width[i] / 2;//正常的话就用半宽补

      }

    }

    else if(LeftEdge[i] == 0 && RightEdge[i] == IMAGE_WIDTH)//两边都丢了线 

    {

      AllLose++;

      if(i == IMAGE_HEIGHT - 1)//如果是首行就以图像中心作为中点

      {

        MiddleLine[i] = IMAGE_WIDTH / 2;

      }

      else

      {

        MiddleLine[i] = MiddleLine[i + 1];//如果不是首行就用上一行的中线作为本行中点

      }

}

平衡车的寻航中线由电感拟合中线和摄像头拟合中线加权组成,根据行驶过程中的路径情况合理调整摄像头回归中线的方式,行驶至路径弯道突变的道路需要减小摄像头占比,加大电感占比,通过此方法来增强平衡车的转向控制;平衡车行驶复杂路径时可依照图像变化规划行驶路径。部分中线处理代码和注释如下:

car_info.mid_line_=car_info.inductor_mid_line_*0.65f+car_info.camera_mid_line_ * 0.35f;                                       //正常巡航

car_info.mid_line_=car_info.inductor_mid_line_*0.9f+car_info.camera_mid_line_ * 0.1f;                                         //俯仰角大于26°

car_info.mid_line_=car_info.inductor_mid_line_*0.25f+car_info.camera_mid_line_ * 0.75f;                                       //发现圆环

car_info.mid_line_=car_info.camera_mid_line;       //进入三岔道路

4.2.5串级PID算法

本课题平衡车系统设计采用串级PID控制算法[19]。课题设计的串级PID算法实现原理如图4-7所示。

图4-7 串级PID原理框图

平衡车控制系统中使用串级PID。闭环控制中,设定期望速度,由于平衡车的加速减速主要是通过改变平衡车的平衡倾角(机械零点),当给定了期望速度以后,由最外环速度环的PID计算出需要改变的的向前或者向后的倾角,速度环的输出结果和平衡倾角相加就可以将速度控制过渡到角度控制。角度环作为外环,角度的变化来自最内环角速度的俯仰角变化PID计算得出。本设计中,速度环、角度环和角速度环均采用5ms控制一次。设计完以上三个环以后再加一个转向环,转向环依据中线的偏差进行PID控制。图4-8为串级PID控制算法流程图。

图4-8 串级PID控制流程图

角速度环、角度环和速度环PID控制参数代码如下:

setPIDParam(&Ang_gyro_PID, 3.2, 0.14f, 0.2f);  //设置直立角速度PID参数 setPIDParam(&Angle_PID, 4.5f, 0.0f, 10.0f);   //设置直立角度PID参数

setPIDParam(&Speed_PID, 20.0f, 0.0f, 30.0f);   //设置速度PID参数

Radius = PlacePID_Control(pid_turn , car_info.mid_line_);   //转向外环

Direct_Last = Direct_Last*0.3 + Direct_Parameter*0.7;//更新上次角速度环结果

changeSetPoint(&Speed_PID, 150);//设定速度 单位 cm/s

changeSetPoint(&Angle_PID,angle0);         //角度环

Angle_PID.set_point = SlidingFilter(win_speed_angle,set_angle);

changeSetPoint(&Ang_gyro_PID,-Tar_Ang_Vel_Y); //角速度环

Theory_Duty += -PID_Increase(&Ang_gyro_PID, (int32)(car_info.angle_v_x*10));

//占空比

float PID_Realize2(PID *sptr, float NowData)  

{

float Realize;

sptr->Dis_Err = sptr->set_point - NowData;

Realize = sptr->K_p * sptr->Dis_Err

+ sptr->K_d *(sptr->Dis_Err  - sptr->last_error);

sptr->last_2_error = sptr->last_error;

sptr->last_error = sptr->Dis_Err;   

sptr->LastData  = NowData;

return Realize;

}

4.2.6 人机交互调试

人机交互的输入器件主要采用EC11旋转编码器和按键,人机交互流程图如图4-9。OLED作为显示界面。人机交互设计中,旋转编码器单击设置为选中进入下一级,滚轮逆时针转光标下移,滚轮顺时针转光标上移,双击返回上一级。此外,可以使用无线透传将传感器参数和摄像头图像传送至PC端调试。

图4-9 人机交互流程图

人机交互的UI主菜单显示界面代码如下:

display_fresh = 1;//重绘

if(Items != NULL) {

  free(Items);

  Items = NULL;

 MenuItem menuItems[] = {

        {0, 1, 1, "1.camera", NULL, 0},

        {0, 2, 2, "2.inductor", NULL, 0},

        {0, 3, 3, "3.encoder", NULL, 0},

        {0, 4, 4, "4.feature", NULL, 0},

        {0, 5, 5, "5.flag", NULL, 0},

        {0, 6, 6, "6.6axis", NULL, 0},

        {0, 7, 7, "7.pid", NULL, 0},

        {0, 8, 8, "8.param", NULL, 0},

      };

      Items = (MenuItem *)malloc(sizeof(menuItems));

      memcpy(Items, menuItems, sizeof(menuItems));

      ItemNums = sizeof(menuItems) / sizeof(MenuItem);

      CurItem = 0;

第五章 系统测试

5.1系统硬件调试

课题设计的第一版PCB打板焊接完成如图5-1所示,第一版PCB由于引脚选取的不恰当,使得摄像头信号线和OLED信号线复用。测试时通过飞线达到设计要求,其中摄像头的一根信号线和编码器的一条信号线,如图5-1中芯片的旁的两根黑色导线即为飞线。第一版在使用过程中存在摄像头图像间接性失真的问题,经过排查发现摄像头FPS接口一信号线引脚虚焊,使用焊接刀头重新焊接,问题得以解决。

图5-1 第一版PCB实物图

吸取了第一版PCB的经验教训,第二版设计的PCB正反面如图5-2和图5-3所示。

图5-2 修订版PCB正面实物图         图5-3 修订版PCB反面实物图

焊接完成的PCB先使用万用表检查是否短路,然后在安装到平衡车上之前使用线性电源代替电池给电路板供电,使用万用表测量稳压电路的输入和输出电压是否正常;表5-1为电路板初次上电供电测量值。

表5-1电路板初次上电供电测量

测量供电

单次测量值(V)

CPU

3.33

摄像头

3.35

编码器

3.33

UART1

4.95

UART2

5.01

ICM20602

4.99

测试完电路供电都没有异常后将电路板按照硬件设计安装到平衡车上,最终搭建完成的平衡车如图5-4所示。

图5-4平衡小车实物图

5.1.1蜂鸣器和LED测试

首先进行点灯和蜂鸣器测试。编写程序依次点亮4个LED灯,使蜂鸣器鸣叫和停止鸣叫,测试发现LED和蜂鸣器均工作正常。

5.1.2 OLED模块测试

编写程序测试OLED显示模块,在屏幕上不同行不同列打印数字测试OLED,经过测试UI显示按照程序变化,OLED测试成功。

5.1.3摄像头测试

初始化摄像头之后,直接通过MT9V032摄像头获取路径信息,并将采集到的图像显示到液晶显示屏上。通过观察对比摄像头采集的图像与现实的画面是否一致来检查摄像头是否工作正常,测试显示显示摄像头工作正常。

5.1.4编码器测试

左右轮分别获取速度,并将左右速度显示到UI上。测试过程中用手转动分别转动左右轮,向前转轮子的时候,可在屏幕上看到对应的数值为正,测试过程中,左右转轮子和获得的数据是相反的,因此在程序中进行了修改使其符合程序要求。

5.1.5陀螺仪测试

在显示屏上依次打印出三个角度值和三个角速度值,将平衡车置于不同角度观察角度变化;不同力度摆动平衡车观察角速度变化,区分各个轴的角度和角速度变化。

5.1.6电感测试

把5电感获取数据依次从左到右打印到显示屏上,把平衡车放在赛道上的不同位置,观察5个电感值变化。测试中,需要调整5个电感显示的数据位置同安装位置一致。

5.1.7电机测试

测试程序中单独对两个轮子给定正值占空比和负值占空比,调整轮子得到正值占空比时向前转,负值占空比时反方向转。

5.2系统软件调试

平衡小车进行调试时,通过OLED屏幕实时显示摄像头采集巡航信息,根据实际情况进行软件调试。图5-5为平衡车位于直线行驶道路上摄像头反馈图像;图5-6为平衡车行驶至三岔路口摄像头采集到的图像,经过三岔路口的图像变化。软件进行三岔路口识别、标识和补线程序设计,以便小车选择通过三岔路口。

图5-5 直线行驶图像                       图5-6 三岔路口图像

通过调试,平衡小车可以完成圆环、十字路口、坡道、三岔路口等复杂路径高速稳定运行。圆环运行图像、十字路口运行图像、三岔运行图像、坡道运行图像依次如图5-7、图5-8、图5-9、图5-10所示。

图5-7 圆环运行图像                 图5-8 十字路口运行图像

图5-9 三岔运行图像                 图5-10 坡道运行图像

结 语

本课题是基于单片机的平衡车控制系统设计。课题设计了一套平衡车软硬件控制系统,主要完成了MM32F3277开发板设计、平衡小车机械结构设计以及系统软件设计。经过阅读文献,查阅相关资料,本课题选择尝试串级PID控制算法编写程序。设计逐个模块完成程序调试,调试过程中发现问题并根据实际情况进行针对优化。串级PID的设计,将速度和预先设定的速度变化通过PID计算,加到平衡角度变化就可以实现角度控制。平衡车的倾斜角度控制和角速度俯仰角变化进行PID计算可以实现相互串联,成功的将三个环串联起来,参数的调整上相比较分离速度和角度控制不需要特别精确,方便在短时间内调出预期成果。串级PID控制算法对于角速度环和角度环契合要求较高,本设计最终利用串级PID控制算法实现平衡小车的高速稳定自动控制,达到了预期效果。

课题设计依然存在需要优化的地方:

  1. 由于对串级PID控制算法开发欠缺,经验不足。调试过程中的参数设置不够理想,平衡车行进间直立控制略显僵硬,平衡车串级PID控制算法还有待研究。
  2. 在电路板设计上,部分电路原理理解不是非常透彻。再部分芯片的选型上电路板设计能力还有待进一步提高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值