17届智能车竞赛技术报告 | 常熟理工学院-昆承湖二队

举报
tsinghuazhuoqing 发表于 2022/09/25 01:31:45 2022/09/25
【摘要】 学 校:常熟理工学院     队伍名称:昆承湖二队    参赛队员:赵海宁 顾有朋 肖晴带队教师:李鑫        简 介: 本文结合了常熟理工学院昆承湖二队的队员们在准备第...

学 校:常熟理工学院     
队伍名称:昆承湖二队    
参赛队员:赵海宁 顾有朋 肖晴
带队教师:李鑫       

简 介: 本文结合了常熟理工学院昆承湖二队的队员们在准备第十七届智能车大赛无线充电组中的研究成果。三轮车模为G车模,核心处理器采用TC264处理器,软件平台为ADS开发环境。本文主要介绍智能小车的机械结构,软硬件结构及设计开发过程。车模通过总钻风MT9V032摄像头传感器检测赛道元素以识别赛道,通过1024线带方向编码器采集车轮速度,使用PID控制算法调节电机和小车的运转和转向,实现对车运动速度和运动方向的开环控制。充电方案选择LCC为2F的超级储能电容充电,以供驱动电机使用。

关键词 关键词:TC264无线充电PID控制图像识别

引 言
目 录
Contents
总体方案
无线充电组比赛要求
机械结构设计
摄像头的选择与安装
硬件设计
电源模块设计
驱动模块设计
充电接收模块设计
150KHz信号
检测板设计
LED灯板
人机交互界面
软件设计
原始图像获取与处理
赛道边线处理及计算
PID控制算法介绍
PID三个环节的作用
三轮车模的运行控制
开发调试
开发环境:AURIX
Development Studio
上位机调试
总 结

 

01   言


  国大学生智能车竞赛是面向全国大学生的一种具有探索性工程的实践活动,是教育补倡导的大学生科技竞赛之一。

  本竞赛以智能汽车为研究对象,以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,旨在促进高等学校素质教育,培养大学生综合知识运用能力、基本工程实践能力和创新意识。比赛涉及控制、传感技术、电子、计算机、机械等多个学科的专业知识,注重于对学生的知识融合和动手能力的培养,对高等学校控制及汽车电子学科学术水平的提高,具有良好的推动作用。

  单片机选用英飞凌公司提供的 32 位 微控制器 TC264 作为核心控制单元,选用逐飞科技的130°MT9V034总钻风摄像头作为传感器,增加无线充电模块、电机驱动模块以及相应控制程序,在主办方提供的三轮车模上,制作完成一辆能够自主识别赛道元素、在赛道上规定位置能够停车充电的模型汽车。其目的在于充分利用2F的储能电容储存的能量驱动电机,以尽可能短的时间完成赛道。

  此这份报告中,我们主要通过对整体方案、机械、硬件、算法等方面的介绍,详细阐述我队在此智能汽车竞赛中的思想和创新。具体表现在电路的创新设计、算法以及辅助调试模块等方面的创新。在准备比赛的过程中,队员查阅了大量的专业资料,反复地调试汽车模型的各项参数,都为此次智能汽车竞赛付出了艰苦的劳动。

 

02 体方案


2.1 无线充电组比赛要求

  (1)任务要求:

  赛道环境为室内往返赛道。车模完成从车库出发赛道往返两周入库;车模上储能电容上限小于2F;赛道上(包括车库)设置3~4个无线充电线圈;计时标准:从出库到入库时间间隔;车模上要求显示储能电容电压;用于车模控制,显示电压等电路允许使用电池供能;车模电机、舵机所需要的电源则需要来自于储能2F电容。

  (2)车模:

  使用三轮F/G车模,不允许自制车模。

  (3)传感器:

  允许使用摄像头、CCD、光电管进行赛道和环境检测。

  (4) 伺服电机

  车模上的伺服电机是指除了车模原有驱动车轮的电机之外的电机,包括舵机、步进电机或者其它种类的电机。 车模上的伺服电机数量不能够超过三个。

  (5) MCU平台

  在无线充电组中,主控芯片限定使用Infineon。

2.2 机械结构设计

  由于没有前轮控制舵机,三轮车模需要通过后轮差速进行转向,因而我们需要将整车的重心向后进行压,将大部分PCB板以及电池放在了车的后端,已达到其转向快的效果,因而我们在此设想上搭建了三轮车模,车模图片如下。

▲ 图2.2.1 三轮车模俯视图和右视图

▲ 图2.2.1 三轮车模俯视图和右视图

2.3 摄像头的选择与安装

  在选择智能汽车识别赛道的传感器中,我们分别测试了电感采集电磁线与摄像头识别赛道元素两种不同的方案,由于室内往返赛道不铺设电磁线,因此我们选择使用摄像头识别赛道元素的方案。

  总转风摄像头是一款基于MT9V032芯片设计的CMOS摄像头,是逐飞科技独家研发的一款高性能,在恩智浦竞赛市面上性能最优,最适合高速情况下的图像采集的全局快门摄像头。

  为了让三轮车模尽可能地有较远的前瞻,并且今年的车模尺寸并没有限制,我们经过多次调试,选择了最为合适的高度与位置架设摄像头。如上三轮车模右视图所示。

 

03 件设计


  能车电路部分由最小系统模块、电源模块、无线接收模块、电机驱动模块、传感器模块(摄像头传感器、超级电容电压采集模块)、以及调试模块组成。

3.1 电源模块设计

  电源是智能车各个模块能量的来源,电源工作不稳定,整个系统将不能正常工作。由于今年无线充电组只有电机驱动的MOS管H桥部分使用2F的超级电容供电,所以可以不用过多追求简洁,而是追求更好的性能。

  车模中的电路板是系统的核心部分,在拼接电路前我们需要分析车模的功能需求设计具体电路,进而再进一步地进行集成等等。

  在三轮车模的运行中,我们需要满足这些模块功能:电机驱动模块、摄像头采集模块、无线串口通信模块(与上位机通信)、ADC电感采集模块(用于读取电容相关的电压返回值、用于150khz信号检测板供电)、按键调参模块(包括屏显、按键以及Flash储存)、蜂鸣器以及为以上所有模块供电的供电模块等等。

  由于我们使用的是2s锂电池(规格为7.4V 2000mA充满电电压为8.4V)所以我们设计的供电模块电路需要将电池电压稳定为5V3.3V对各模块进行输出,为满足此需求我们使用了TPS76850TPS7333两款稳压芯片完成,且通过0欧姆电阻对数字地、模拟地、功率地进行隔离。

  TPS76850是微功耗低压差线性电源芯片,具有完善的保护电路功能。使用该芯片只需要极少的外围元件就能构成高效稳压电路。与AMS1117相比,TPS76850拥有更低的工作压降和更小的静态工作电流,可以使电池获得相对更长的使用时间。由于热损失小,无须专门对其进行散热处理,且其纹波很小,因而可以为单片机及其模块进行稳定供电。

  同样的TPS7333也因有着更好的性能、更全面的功能被我们采用进行5V3.3V的稳压处理。

  供电电路原理图如下所示:

▲ 图3.1.1 三轮车供电电路原理图

▲ 图3.1.1 三轮车供电电路原理图

  其中3V3电源为1024线方向编码器、摄像头MT9V032、 ISP114显示屏、蜂鸣器以及人机交互模块供电。5V电源为无线串口、150Khz信号检测版以及降3V3电源电路供电。

3.2 驱动模块设计

  驱动电路对电流的要求更严格,电流线要格外加粗,同时为了利于散热,我进行了大片覆铜,抛弃布线,同时必须采用隔离芯片防止烧坏单片机。

  由于无线充电组使用超级电容为电机驱动供电,并且可以只使用电容为H桥单独供电,因此需要选择内阻尽可能更小,但是过流能力不能太弱的MOS管的组成H桥。我们尝试了很多种的电机驱动方案,先是传统的栅极驱动和H桥,再是BTN电路驱动,HIP4082方案驱动,最终经过多次尝试,我们选择了DRV8701方案作为电机驱动电路。

▲ 图3.2.1 电机驱动方案

▲ 图3.2.1 电机驱动方案

  DRV8701E拥有6~45V的电压工作范围,且无需外部升压,在晶体管方面我们最终经过多次尝试也选择了TPH1R403NL,在隔离芯片上我们选择了性能较好的SN74LVC245进行保护。我们以此元件进行了电路的搭建最终绘制出PCB文件,打板后经测试有着不错的效果。

3.3 充电接收模块设计

  无线充电组比赛规定发射线圈由组委会提供,接收线圈可由选手自制或者购买成品。发射线圈的频率为150kHZ

  制作接收电路的时候,一修改接收线圈串联以及并联的电容将接收LCC谐振频率也调整到150kHz。如果接收线圈没有谐振在150kHz,就会使得接收功率大大降低,同时也会使得电能发送模块输出级出现失谐,进而降低输出级的效率,严重时可能会引起发送模块热保护或者电路烧毁。

  在制作接收线圈谐振回路的时候,需要特别注意高频功率信号所引起的线圈和谐振电容的损耗。接收线圈需要使用多股纱包线进行绕制。谐振电容需要选择NPO高频电容,电容耐压等级需要能够达到谐振电压的2~3倍。耐压值过低,电容会由于过压引起内部短路或者断裂。

  将接收到的高频电压转换成直流电压可以使用倍压整流、或者全波整流,不使用半波整流方式。整流所使用的二极管一般使用大电流的肖特基二极管。

  现阶段主流充电方案有LCLCCLC+恒功率三种方案。

▲ 图3.3.1 功率电路板

▲ 图3.3.1 功率电路板

  使用LC串联谐振,整流后直接接入超级充电。优势:设计简单;易谐振,谐振匹配要求不高。缺点:效率低(达不到50%,即25W以下)。

  使用LCC结构,本质是恒流充电。优势:设计超大电流,理论上可实现最大效率60%-80(平均功率最大30-40W)。缺点:适应能力较差,对线圈位置,线圈高度,要求高;对电容、电感和二极管等有极大要求,电容电感参数调节困难;易过热,电流实际难以做很高;

▲ 图3.3.2 LCC充电结构

▲ 图3.3.2 LCC充电结构

  恒功率充电。使用半桥buck电路结合软件算法反馈。优势:实测效率高(最高90%以上);安全性好,鲁棒性强,适用广泛,不易出现LCC中过热现象。缺点:软硬件结合,且软件控制算法复杂,实现难度高,对线圈大小和位置有一定的要求。

  在今年充电方案的选择上我们选择了LCC补偿网络外加桥式整流,四个二级管可以更好的收割能量。

  谐振部分用于谐振的电容必须采用C0G高频电容,耐压值必须大于100V,整流部分所用的整流二极管选择SVT12100V二极管,该二极管耐压值高、电流大、正向压降较低、价格也很便宜且封装散热性能较好。电压检测部分用于实时检测电容电压,用两个电阻进行分压且接入稳压二极管,防止输出电压超过3.3V损坏单片机。

3.4 150KHz信号检测板设计

  由于今年的规则需要在赛道上进行停车充电,并且发射线圈放于赛道下方,无法通过摄像头进行判断,因此我们需要另外的模块对充电线圈进行检测。我们所采用的是龙邱的基于2SK241150KHz导航信号进行放大检波电路的方案。打板后经过调试可以在1m范围内检测到发射线圈的存在,并且在靠近以后可以较精准的确定发射线圈的具体位置。

▲ 图3.4.1 检测板原理图

▲ 图3.4.1 检测板原理图

3.5 LED灯板

  今年需要设计一个LED显示板,用来实时显示电容所剩电压,并且灯板所用驱动芯片需使用英飞凌所提供的芯片。我们所使用的是逐飞开源的LED灯板方案,使用的驱动芯片是TLD2331

▲ 图3.5.1 LED 灯板原理图

▲ 图3.5.1 LED 灯板原理图

3.6 人机交互界面

  通过五项按键以及8pin拨码,配合eeproomflash可以进行按键调参,内部存储数据,即使掉电也不会丢失数据。

▲ 图3.6.1 人机交互界面

▲ 图3.6.1 人机交互界面

 

04 件设计


4.1 原始图像获取与处理

  我们使用的是总钻风MT9V032灰度摄像头,其采集数据的方式分行中断与场中断。摄像头一行一行地采集图像,当采集完一行后触发行中断信号,并进行下一行的采集,以此进行直到触发行中断信号的次数等于采集图像的像素高度,触发场中断,此时也就完成了一次整张图像的采集,进而传输给上位机并且准备下一张图像的采集。

  由于赛道是由黑色的边缘以及白色的主路部分构成,因而如果可以采集提取赛道的边缘黑线,便可以通过计算其中线得出实时的偏差值,以此为误差进行车模的转向调控。而总钻风MT9V032灰度摄像头传输给单片机的是0~255位的灰度数组,我们可以通过图像二值化的方法将黑线在数值上体现为0,其余部分为1进而检测黑线的位置。所以我们需要有一个阈值来鉴别每一张图像上黑白的临界点,避免出现黑线过粗或是过细的问题。

  这种方法在图像处理的过程中仅仅有黑白两种元素,可以使图像处理更加简单。但由于摄像头高度较低,在实际的运行中当小车运行到不同的区域中的由于光线不均匀使得设定的单一阈值不同。也可以采用其他的二值化方法,例如大津算法等二值化算法。在经过对比后,我们对大津算法进行了优化,优化了时序的同时保证了图像一定的稳定性。但是限于芯片的运算能力,我们选择了根据不同环境设定固定阈值的方法。

4.2 赛道边线处理及计算

  在提取边缘点的过程中,我们的原则是:“在绝不能出错的前提下,尽可能完整地提取出赛道的两条边线”。因此在此过程中,我们需要考虑各种意外场景可能对寻线造成的影响,并排除这些干扰。只有将所有情况考虑完全,才能保证寻线的可靠性,为后续的方向控制打下坚实的基础。

  提取出赛道左右边沿之后,就可以推算出赛道中线。但是在很多情况下,这样推算出的中线并不完整,比如在弯道上就会出现丢边的情况,有一边的边线摄像头是看不到的,因此就需要进行补线。在丢左边的情况下,可以根据找到的右边线的趋势来补出中线,同理丢右边的情况也可以根据左边的趋势进行补线。中线计算完成之后,选取相邻几行的中线列数的加权平均值与图像中心列数之差作为偏差量。
  此偏差量就可以代入转向环进行PID控制。

4.3 PID控制算法介绍

  在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称 PID 控制,又称 PID 调节。PID 控制器问世至今已有近 70 年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用 PID 控制技术最为方便。即当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用 PID 控制技术。PID 控制,实际中也有 PIPD 控制。

  PID 控制器是一种线性控制器,它根据给定值与实际输出值构成控制偏差。将偏差的比例(P)、积分(I)和微分(D)通过线性组合构成控制量,对被控对象进行控制,故称 PID 控制器。

  原理框图如下图所示:

▲ 图4.1.1 PID控制

▲ 图4.1.1 PID控制

  在整个智能车系统中,使用的主要控制算法就是PID控制。PID分为三个环节:P比例环节,I积分环节,D微分环节。PID控制简单的说就是将误差进行比例放大,积分误差补偿,微分阻尼,将输出反馈回输入,构成一个闭环系统,提升系统的稳定性。在PID控制系统中
  输出=KP偏差+KI偏差和+KD*(偏差-上次偏差)

  其实在简单的控制系统或者小车精度、速度要求不高的情况下使用开环控制是没有问题的,但是一旦车速提高,由于小车抖动,车身偏移,速度达不到预期等情况,会使小车误差越积越大,最终对小车稳定性造成致命影响。这时PID控制就显得尤为重要了。

4.4 PID三个环节的作用

  • 比例环节:P是将系统误差进行比例放大,P值越大,系统的响应速度就越快,但同时系统产生的震荡也越大。
  • 微分环节:D算法能够根据系统偏差的变化趋势控制输出,能够减缓由于P算法引起的系统震荡。
  • 积分环节:当只有P算法和D算法存在时,系统误差永远存在,这时就需要引进I算法,I算法在系统偏差不为0时,不断对其进行累加(该偏差可能为负值),直到系统偏差为0。在一定范围内,I值越大,系统消除误差的速度越快。

▲ 图4.4.1 调整PID个参数对于系统造成的影响

▲ 图4.4.1 调整PID个参数对于系统造成的影响

  需要注意的是,P、I、D这三个值需要找到一个平衡点,PID中每一个值都不能设置得过大,否则系统会产生名为“过冲”的反效果,这会使小车产生震荡。

4.5 三轮车模的运行控制

  在三轮车模的运行过程中,需要控制电机的转速以达到寻迹的效果,由于三轮车模没有控制舵机,因而只能通过差速来实现转向控制,因而三轮车模的双电机既需要控制其运行速度,又需要控制其转向,相互之间产生干扰,故我们小组采用了串级PID进行控制,即使用两个PID控制串联控制。

▲ 图4.5.1 串激PID控制原理

▲ 图4.5.1 串激PID控制原理

  从串级控制的工作过程看来,两个控制器是串联工作的,以外环控制器为主导,保证外环主变量稳定为目的,两个控制器协调一致,互相配合。尤其是对于二次干扰,内环控制器首先进行“粗调”,外环控制器再进一步“细调”。因此控制品质必然优于简单控制系统,串级控制系统在结构上仅仅比简单控制系统多了一个内环回路,可是实践证明,对于相同的干扰,串级控制系统的控制质量是简单控制系统无法比拟的。就外环回路看是一个定值控制系统,但内环回路可看成是一个随动控制回路。外环控制器按负荷和操作条件的变化不断纠正内环控制器的设定值,使内环控制器的设定值适应负荷和操作条件的变化。如果对象中有较大非线性的部分包含到了内环回路中,则负荷和操作条件变化时,必然使内环回路的工作点移动而影响其稳定性。但在串级结构中,内环回路的变化对整个系统的稳定性影响很小,所以从这个意义上说,串级控制系统能够适应不同负荷和操作条件的变化。

▲ 图4.5.2 无线串口模块

▲ 图4.5.2 无线串口模块

  而最终经过我们小组的多次试验,使用串级PID后车模的运行效果远比直接使用两个独立的PID进行输出的效果更好。因此我们采用了该方案作为电机驱动的核心控制方法。至此,我们已完成了三轮车模的简单控制方案选择。

 

05 发调试


5.1 开发环境:AURIX Development Studio

  AURIX Development Studio(以下简称ADS)是英飞凌公司于2019年底推出的免费的集成开发环境,支持英飞凌TriCore内核AURIX 系列MCUADS是一个完整的开发环境,包含了Eclipse IDEC编译器、Multi-core调试器、英飞凌底层驱动库(low-level driver,iLLD),同时对于编辑、编译及调试应用代码没有时间及代码大小的限制。

5.2 上位机调试

  为了分析小车在赛道上的运行情况,我们需要分析小车在运行过程中采集到的各种数据,但我们人不可能为了观察小车显示屏上的数据值,跟着小车跑,此时就要用到串口通信,将小车采集到的数据发送到电脑。

  因此为了获取车模在行驶时的运行数据,我们在主板上引出来无线串口模块,可以通过串口发送数据可以实时获取信息。

▲ 图5.2.1 上位机界面

▲ 图5.2.1 上位机界面

 

06   结


  此份技术报告中,我们主要介绍了准备比赛时的基本思路,包括机械,电路,以及最重要的控制算法的创新思想。

  我们使用C语言编程,利用比赛推荐的开发工具调试程序,经过小组成员不断讨论、改进,终于设计出一套比较通用的,稳定的程序。在这套算法中,我们结合路况调整车速,做到直线加速,弯道减速,保证在最短时间跑完全程。

  在这几个月的备战中,我们学到很多知识,逐渐对单片机控制、电路设计等有了比较好的认识,在场地、经费方面都的到了学校和学院的大力支持,在此特别感谢常熟理工学院以及电气院的创新实验室,也感谢一直支持和关注智能车比赛的学校和学院领导以及各位老师。同时也感谢比赛组委会能组织这样一项很有意义的比赛。

  这个比赛凝聚着我们每个人的心血和智慧,通过我们不断的面对困难解决困难,最终这份经验将永伴我们一生,成为我们最珍贵的回忆。

  ■ 参考文献

[1]蔡栩嘉,刘海刚,陈冠成,李勇祥,庄越.摄像头智能小车设计与控制算法研究[J].工业控制计算机,2018,31(12):98-101.
[2]颜循进.恩智浦杯全国智能车竞赛之PID调节[J].科技风,2020(10):263.
[3]王晓明.电动机的单片机控制[M].北京.北京航空航天大学出版社.2002
[4] 卓晴。公众号对于无线充电组的推文,2022.
[5] 邵贝贝.单片机嵌入式应用的在线开发方法. 北京, 清华大学出版社, 2001.
[6] 闫琪等.智能车设计“飞思卡尔杯”从入门到精通.北京,北京航天航空大学出版社, 2014.
[7] 潘新民, 王燕芳. 微型计算机控制技术. 北京, 高等教育出版社, 2001.
[8] 谭浩强. C程序设计(第二版). 北京, 清华大学出版社, 2001.

  ■ 附录A 部分参考源代码

int core0_main(void)
{
    disableInterrupts();
    get_clk();//获取时钟频率  务必保留
    //在此处调用各种初始化函数等
    mt9v03x_init(); //摄像初始化
    ips114_init();  //液晶初始化
    key_Init();
    Boma_init();
    my_flash_init();
    encoder_init();  //编码器初始化
    Motor_init();    //电机初始化
    LED_init();      //LED初始化
    ADC_init();      //ADC初始化
    Didi_init();     //蜂鸣器初始化

    pit_interrupt_ms(CCU6_0, PIT_CH0, 5);
    pit_interrupt_ms(CCU6_0, PIT_CH1, 1);
    //    等待所有核心初始化完毕

    IfxCpu_emitEvent(&g_cpuSyncEvent);
    IfxCpu_waitEvent(&g_cpuSyncEvent, 0xFFFF);
    enableInterrupts();

    while(1)
    {
        if(mt9v03x_finish_flag == 1)
        {
            mt9v03x_finish_flag = 0;//在图像使用完毕后  务必清除标志位,否则不会开始采集下一幅图像
            Get_Bin_Image(5, mt9v03x_image);    // 转换为01格式数据,01原图;23边沿提取
            SaiDaoLeiXing= pdsdlx(Bin_Image);
            Get_Center_Line();
            ZNC_data_tiaojie();

            if(!DIP3) //如果第三个拨码按下 关闭屏幕显示
            {
                ips114_showint8(190,0,chazhi1);
                ips114_showuint8(190, 1, g_ucFlagFork);
                ips114_showuint8(190, 2, g_ucFlagT_L);
                ips114_showuint8(190, 3, g_ucFlagT_R);
                ips114_displayimage032(Bin_Image[0],MT9V03X_W,MT9V03X_H);                    
        }
    }
}

/*****************************************************/
/******************充电线圈检测函数*******************/
/*根据信号检测板返回的adc返回值检测充电线圈在赛道上的位置*/
void Charging_scan()
{
    if((adc_result_board) > 300 && (supply_voltage <= charging_start_value))
        speed_change1 = 1;
    else
        speed_change1 = 0;

    if(speed_change1)
        Speed_set = 180;
    else
        Speed_set = 380;

    if(ADC_flag == 0) //检测线圈标志位,此标志位的意思为是否检测充电线圈
        //在赛道上远离线圈正常行驶时或停下来正在充电时,此标志位置0,表示需要检测
    {
            if((adc_result_board >= 1900) && (ADC_GET == 0) && (supply_voltage <= charging_start_value))  //如果检测到adc返回值大于停车阈值将这个状态作为一个标志位储存
            {
                ADC_GET = 1;
            }

            if((ADC_GET) && (supply_voltage <= charging_start_value))
            {
                motor_PID_control(0,0);
            }
            //停下充电第二个阶段 此时电容电压大于开始充电阈值直到小于结束阈值
            else if((ADC_GET) && (supply_voltage >= charging_start_value) && (supply_voltage < charging_end_value))
            {
                motor_PID_control(0,0);
            }
            //若充到电容电压大于结束阈值结束充电
            //此时将检测线圈标志位置1,在此时结束检测线圈,防止在离开线圈区域由于电容电压在结束充电阈值上下波动,造成小车抖动,费时又耗电,万一线圈在元素周围直接G
            else
            {
                motor_PID_control(Speed_set+speed,Speed_set-speed);
                speed_change1 = 0;
            }
            if(supply_voltage >= charging_end_value)
                Charge_end = 1;
            if(Charge_end)
                ADC_flag = 1;
        //在远离刚刚行驶过的线圈之后及时将检测线圈标志位拉回0,防止影响下个充电线圈的检测
    }
    //在充电结束阶段,检测线圈标志位置1之后,直接行驶,拒绝小车留恋线圈
    else
    {
        motor_PID_control(Speed_set + speed,Speed_set - speed);
    }

    if(adc_result_board < 1500)
    {
        ADC_flag = 0;
        Charge_end = 0;
    }
}

//模式0,大津法阈值
/*************************************************************************
 *  函数名称:short GetOSTU (unsigned char tmImage[LCDH][LCDW])
 *  功能说明:大津法求阈值大小
 *  参数说明:tmImage : 图像数据
 *  函数返回:无
short GetOSTU (unsigned char tmImage[LCDH][LCDW])
{
    signed short i, j;
    unsigned long Amount = 0;
    unsigned long PixelBack = 0;
    unsigned long PixelshortegralBack = 0;
    unsigned long Pixelshortegral = 0;
    signed long PixelshortegralFore = 0;
    signed long PixelFore = 0;
    float OmegaBack, OmegaFore, MicroBack, MicroFore, SigmaB, Sigma; // 类间方差;
    signed short MinValue, MaxValue;
    signed short Threshold = 0;
    unsigned char HistoGram[256];              //

    for (j = 0; j < 256; j++)
        HistoGram[j] = 0; //初始化灰度直方图

    for (j = 0; j < LCDH; j++)
    {
        for (i = 0; i < LCDW; i++)
        {
            HistoGram[tmImage[j][i]]++; //统计灰度级中每个像素在整幅图像中的个数
        }
    }

    for (MinValue = 0; MinValue < 256 && HistoGram[MinValue] == 0; MinValue++);        //获取最小灰度的值
    for (MaxValue = 255; MaxValue > MinValue && HistoGram[MinValue] == 0; MaxValue--); //获取最大灰度的值

    if (MaxValue == MinValue)
        return MaxValue;         // 图像中只有一个颜色
    if (MinValue + 1 == MaxValue)
        return MinValue;        // 图像中只有二个颜色

    for (j = MinValue; j <= MaxValue; j++)
        Amount += HistoGram[j];        //  像素总数

    Pixelshortegral = 0;
    for (j = MinValue; j <= MaxValue; j++)
    {
        Pixelshortegral += HistoGram[j] * j;        //灰度值总数
    }
    SigmaB = -1;
    for (j = MinValue; j < MaxValue; j++)
    {
        PixelBack = PixelBack + HistoGram[j];     //前景像素点数
        PixelFore = Amount - PixelBack;           //背景像素点数
        OmegaBack = (float) PixelBack / Amount;   //前景像素百分比
        OmegaFore = (float) PixelFore / Amount;   //背景像素百分比
        PixelshortegralBack += HistoGram[j] * j;  //前景灰度值
        PixelshortegralFore = Pixelshortegral - PixelshortegralBack;  //背景灰度值
        MicroBack = (float) PixelshortegralBack / PixelBack;   //前景灰度百分比
        MicroFore = (float) PixelshortegralFore / PixelFore;   //背景灰度百分比
        Sigma = OmegaBack * OmegaFore * (MicroBack - MicroFore) * (MicroBack - MicroFore);   //计算类间方差
        if (Sigma > SigmaB)                    //遍历最大的类间方差g //找出最大类间方差以及对应的阈值
        {
            SigmaB = Sigma;
            Threshold = j;
        }
    }
return Threshold;                        //返回最佳阈值;
}

  

  ■ 附录B 主板原理图与PCB

▲ 图6.1 电路板PCB图

▲ 图6.1 电路板PCB图

▲ 图6.2 电路板PCB图

▲ 图6.2 电路板PCB图

▲ 图6.3 电路板PCB图

▲ 图6.3 电路板PCB图

▲ 图6.4 电路板PCB图

▲ 图6.4 电路板PCB图


● 相关图表链接:

文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。

原文链接:zhuoqing.blog.csdn.net/article/details/126771382

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。