基于STM32开路清障车控制系统设计

目 录

摘 要 I
Abstract II
引 言 1
1总体方案论证与设计 3
1.1设计方案 3
1.2主控模块的选型和论证 3
2系统硬件电路设计 5
2.1主控模块设计 5
2.1.1 STM32单片机概述 5
2.1.2 STM32单片机最小系统电路 5
2.2 MCU主要实现功能 6
2.3火焰传感器 7
2.4超声波模块 8
2.5驱动模块 10
2.6稳压模块 11
2.7继电器模块 12
3系统软件设计 14
3.1编程工具Keil简介 14
3.2程序设计原理 14
3.3小车功能设计 15
4系统调试 16
结 论 18
参考文献 19
附录1 系统原理图 21
附录2 主要程序 22
致 谢 30

摘 要

近年来随着科技的快速的向前推进,伴随着单片机及其应用方面的技术不断开发与优化,单片机大量应用于生活的各个领域,高性价比和功能更为强大的单片机甚至应用于军事科研领域,警用机器人就大量使用单片机作为主控芯片,更强大的功能,也为机器人完成复杂的任务提供高质量的保障。
为了应对未来复杂的战场和道路情况,警用机器人虽然可以完成城市反恐任务,但是对于复杂地形,却缺乏一定的环境适应能力,对于野外使用,阻碍众多;军队中的侦察和探明路况的任务,任务繁杂,但又是行军中不可或缺的重要一环,结合这两种情况,一种能够适应野外复杂地形,并且兼顾清理障碍的野外作战的开路清障车应运而生。开路清障车可以通过车载的各个高性能模块,应对道路上的各种突发情况,利用火力模块进行大型障碍物清理,火焰模块解除火情,从而降低野外行军风险,为部队快速开辟安全道路,实现快速高效的行军。
本次设计利用STM32单片机芯片为核心控制器实现开路清障车控制系统的逻辑控制,包含火焰传感器、驱动模块、超声波模块等外围电路。通过实践结果表明,以STM32系列芯片为主的设计可以满足整体需求,预期的功能均可实现。

关键词:单片机;警用机器人;超声波模块;传感器

Abstract

Along with the rapid advance of science and technology in recent years, with the continuous development and single-chip computer technology and its application to optimize, MCU used in every field of life in great quantities, cost-effective and more powerful SCM applied in military scientific research, and even police robot is extensive use of single chip microcomputer as main control chip, the more powerful features, also provides the high quality for the robot to accomplish complex tasks.
In order to cope with the complex battlefield and road situation in the future, although the police robot can complete the anti-terrorist task in the city, it lacks the ability to adapt to the environment for the complex terrain.The task of reconnaissance and road condition exploration in the army is complicated, but it is also an indispensable and important part of the march. In combination with these two situations, a kind of open road clearing vehicle that can adapt to the complex terrain in the field and take account of the obstacles in the field operation came into being.The open-circuit block removers can deal with various emergencies on the road through various high-performance modules on the vehicle, use the firepower module to clean up large obstacles, and the flame module to remove the fire, so as to reduce the risk of wild marching, open up a safe road for the troops quickly, and realize fast and efficient marching.
This design USES the STM32 micro controller chip as the core controller to realize the logic control of the open circuit troubleshooting vehicle control system, including the flame sensor, driving module, ultrasonic module and other peripheral circuits.The results of practice show that the design of STM32 series chips can meet the overall requirements and all the expected functions can be realized.

Keywords: Single Chip Microcomputer; Police robots; ultrasonic module; Sensor

引 言

1 作用和意义
在部队行军中,部队大都会派遣侦察兵,在前方进行侦察并探明路况,为大部队开拓道路,当遭遇到中大型的障碍物时候,需要汇报回大部队,大部队派出工兵或者装甲车进行爆破清理。对于瞬息万变的战场,这无疑会耗费大量的时间和精力甚至贻误战机。而在城市反恐作战中,特警配备有排爆机器人,用于运输危险品,远程排爆作业,用来降低人员伤亡,增加安全保障,可以应对一般的反恐作业[1]。
为了应对未来复杂的战场和道路情况,排爆机器人虽然可以完成城市反恐任务,但是对于复杂地形,却缺乏一定的环境适应能力,对于野外使用,阻碍众多;军队中的侦察和探明路况的任务,任务繁杂,但又是行军中不可或缺的重要一环,结合这两种情况,一种能够适用于适应野外复杂地形兼顾清理障碍的野外作战的开路清障开路车应运而生。可以为行军降低风险,节省人力物力[2]。
本次课题所研究的开路清障车车可以为大部队快速开辟行军路线,清理沿途障碍,对于不同的道路情况,可以进行灭火,开辟隔离区,清除道路障碍物,并且做到低风险高机动,可以大大节省部队行军所需的时间,同时此次的开路清障车整体所需材料简易,造价较低,也具有良好的推广性和实用性。
2 研究概况及意义
单片机的优点是体积小、扩展灵活、高性价比、高可靠性和功耗低,单片机从开始试验到现在的广泛应用,仅仅使用了几十年的时间,从最开始的大型设备,到现在的精密仪器都可以见到他们的身影。遍布于大多数电子设备之中。单片机是微型控制执行器的简称,它能够实现基本的计算机功能,是最简单的计算机,称得上是应用最多的计算机了,因为它小巧而精致,使用范围比较广阔。平常用到的手机、电脑、家用电器等产品中配有单片机,单片机在信息安全控制系统发挥出重大的作用[3]。本文利用单片机为核心控制实现了一个基于STM32的开路清障车控制系统。在设计之中,所使用到的硬件方面的模块有单片机主控模块、火焰传感器、驱动模块、超声波模块等。
本文先对要采用的主要芯片以及各个模块进行分析, 选择要制作物理对象的组件,选择一系列需要的组件,包括满足系统要求的各种指定型号,课题总体系统方案的设计,硬件方面具体的方案及实现,物理调试和试验完成后,记录每次调试和比较得到的数据[4]。
3 研究的具体工作
(1)采用火焰感知模块实现火情的感知,火焰模块中含有红外火焰传感器,以及灭火装置,检测火焰并解除火情。
(2)采用超声波模块实现对道路上障碍物检测,为车辆避障和清障提供准确的障碍物位置以及障碍物的清理情况。
(3)采用火力系统作为本次设计的主动清障单元,仿照枪械激发装置,发射弹药对目标障碍物进行清理,为车辆前进清除较大的障碍物,使车辆可以快速开辟安全通道,快速通过。
4 解决的主要问题
本课题是设计类课题,在设计之初,对于整体设计可能遇到的问题有了一个整体的预估,所需重点解决的问题:
(1)车辆稳定性不足:车辆的运行时候,由于地形复杂,有高坡,低谷,碎石等,这要求车辆要有足够的抓地力,为解决这个需求,本次设计中仿照涡轮增压的原理,利用风扇对车辆进行负压,使得其稳定性增加,同时负压能够使车辆可以承受射击装置。
(2)车辆清障方式单一:在清理大中型障碍物时,常用的将障碍物整体移走的方法难以实现,需要将中大型障碍物分割处理,再分次移开,为应对这种情况,本次设计采用枪械的发射装置对障碍物进行射击,击碎障碍物,然后进行进行清理。

1总体方案论证与设计

1.1设计方案
以基于STM32的开路清障车控制系统设计,根据功能来进行划分,包括:主要的控制模块(单片机最小系统)、进行检测的模块(火焰传感器、超声波模块)、驱动模块。在这个以单片机作为核心的基于STM32的开路清障车控制系统设计,作为主控的单片机模块是系统的核心处理部分,可以协调其他模块一起工作,下面就针对这几个模块的选型进行讨论。设计框图,如图1.1所示。
在这里插入图片描述

图1.1设计框图

1.2主控模块的选型和论证
本次设计从功能上进行分析,对于主芯片的选择,查阅了相关的资料,并综合的分析了在设计之中的实用性与可靠性,综合拟定的有以下两种比较可行的参考方案:
方案一、采用STC89C52单片机。STC89C52单片机是51系列的单片机,来源于STC公司,继承51系列单片机的优良传统[5]。而其中有8k的存储空间,可烧录进入大量的程序,具有很多传统的51系列单片机优秀的编写方式,更灵活、效率更高,在解决问题时也更有效。
方案二:STM32单片机是专为要求高性能、低成本、低功耗的嵌入式应用设计的,其STM32系列分类众多,可选择性更强,其中STM32F为通用系列,STM32F103为主流级单片机,拥有72MHZ的CPU,最高可以达到1M的Flash容量,且兼具电机控制功能,现在也是越来越流行的趋势。
本次设计中,需要用到多个电机,且需要对多个电机控制,这对软件和硬件都有一定的要求,52单片机虽然可以基本满足,但是操作起来极为繁琐,而STM32拥有更高的处理速度和更多的扩展功能,性价比更高,根据以上所述综合考虑,最终本次的课题设计的主芯片选择的是STM32系列单片机。

2系统硬件电路设计

2.1主控模块设计
2.1.1 STM32单片机概述
STM32这一款单片机是 ARM 公司推出了其全新的基于 ARMv7 架构的 32 位 CortexM3(72MHz) /M4(168MHz,额外增加了浮点运算)微控制器内核[6]。STM32作为最新一代的单片机,有更强大的功能,更高的性能比。所以,本次设计采用了STM32芯片,一方面它的性能高,方便学习更多新的嵌入式技术;另一外面,跟紧时代的步伐,让自己在未来步入社会的时候更具优势[7]。要完成本系统的设计,需要用到串口1、串口2、JTAG、LED、3.3v、5v引出等基本外设。串口1主要负责调试代码,与外接模块进行通信,直到各个模块能实现项目里的基本功能。连接过程中,应要认真对照着芯片原理图来进行,以防止接错线造成短路损坏模块。这个设计,我采用了高性能的ARM,这个芯片的最大运行速度为72MHZ,能在调节测试的过程中快速响应,能够高效率地处理各种复杂的运算。加上芯片本身丰富的资源,例如高精度的ADC、多个IO接口、还有I2C接口等,能适应各种各种的现场情况。
2.1.2 STM32单片机最小系统电路
单片机的最小系统电路,以STM32单片机和外部的一些电阻、晶振、电容等构建而成[8],接收来自各模块的信号并对其进行处理 , 然后将需要执行的命令信号再发往各模块, 主要负责协调各个模块的共同工作。
复位电路是单片机最小系统中必不可少的一个模块,单片机的复位按键是由按键,电容与电阻组成的,在按键开关为关闭状态时,电源供电,电阻本身没有反应,但是电容可以存储电量,在这个时候电路中的电流值非常的小,基本可以说是没有。相对于电源的电压VCC来说,复位IO口的引脚是处于低电平状态,这个时候,单片机的工作状态没有收到干扰。当按键开关为关闭状态时,电源系统就会变成回路,在这个时候复位引脚的电压相比电源按键的电压是一样的,为5V高电平,单片机发出复位指令。
晶振也是单片机最小系统里很重要的一部分,它由一个晶体和两个陶瓷电容器构成。其在单片机系统中的主要作用是结合内部的电路,产生单片机正常运行所必须的时钟频率,可以说它为单片机正常执行命令提供了重要的保障[9],通常情况下晶振电路提供的时钟频率越高,那么单片机的运行速度也就越快,从而系统工作的效率也会越高。在设计晶振电路时,需要注意晶振频率的选择,合适的晶振频率可以使本次系统发挥出最好的效果[10]。STM32F103C8T6原理图,如图2.1所示。
在这里插入图片描述

图2.1 STM32F103C8T6原理图

2.2 MCU主要实现功能
通过上文的设计分析,每一种情况所对应的流程设计对对应着一些传感器。为方便程序的运行,对各个方面做出了相应的程序设计。MCU主要功能软件设计实现如下:
高低电平控制实现,我们已经分析过了硬件电路,电磁铁的发生作用需要通过MCU输出的高低电平,单片机函数库中GPIO_SetBits(GPIOx,GPIO_Pin)和 GPIO_ResetBits(GPIO_GPIOx,GPI 0_Pin)分别将输出I/O 口置高、置低,如开启报警模块或者关闭报警模块时,PA12 口输出低电平配置GPIO_ResetBits(GPIOA,GPIO_Pin_12)[11]。
I/O 口上升/下降沿中断实现,MCU会检测到相应的I/O 口的下降沿对外围的模块进行操作。单片机的所有的GPIO管脚都可以作为外部中断输入口,我们在这个单片机上,可以设置多种情况,上升沿或者下降沿触发中断,还可以同时设置中断的优先级。
2.3火焰传感器
本设计的主要模块之一为火焰传感器,红外火焰传感器使用特制的红外线接受管来检测火焰,实时监测环境中的火焰值[12]。然后把火焰的亮度转化为高低变化的电平信号,输入到中央处理器中,中央处理器根据信号的变化做出相应的程序处理使得灭火风扇开始运作,从而达到消除火焰的作用。
火焰传感器检测火焰信号,火焰传感器的指示灯亮起,将接收到的信号通过STM32F103C8T6芯片的PA3接口传输给主控芯片,经处理将控制信号传递给各个模块,协调同步停车,并开启灭火装置,消除火情。火焰传感器内部原理图、火焰传感器原理图,如图2.2、2.3所示。

在这里插入图片描述

图2.2 火焰传感器内部原理图

在这里插入图片描述

图2.3 火焰传感器原理图

2.4超声波模块
本设计采用了HC-SR04超声波模块,在开路清障车上装载该模块让开路清障车检测到障碍物和与障碍物的距离,当到合适位置时便会启动其他模块协同清除障碍物。本次使用的超声波测距模块可以对2cm到400cm进行无接触测距感应,该模块由超声波发射器、接收器、控制电路组成[13]。
TRIG端口为触发控制信号接入端口,ECHO为回响信号输出端口,二者分别对应STM32F103C8T6芯片的PB11,PB10接口,当检测到前方有障碍物时,会将信号通过端口传给主控芯片,主控芯片将信号处理,将控制信号传输个各个模块,从而完成,检测、清除、正常通行一系列功能。HC-SR04超声波模块原理图、HC-SR04超声波模块工作流程图,如图2.4、2.5所示。

在这里插入图片描述

图2.4 HC-SR04超声波模块原理图

在这里插入图片描述

图2.5 HC-SR04超声波模块工作流程图

2.5驱动模块
本设计装载了电机驱动模块,本次使用的电机驱动L298N是非常常用的电机驱动模块其成本不高且是一种双桥电机驱动芯片,在较高电流时输出可以并联,双桥每个H桥都可以有2A电流,但注意的是其功率电压小于6V将无法正常工作,L298N驱动模块可以很好的满足本次的设计,其驱动芯片、电路原理图如下图2.6、2.7所示。
将四个驱动车辆前进的减速电机和一个负压模块电机连接在一个L298N电机驱动模块,发射装置和灭火模块连接在一个L298N电机驱动模块上,对不同的模块分开进行控制。
-在这里插入图片描述

图2.6 L298N驱动芯片

在这里插入图片描述

图2.7驱动模块

2.6稳压模块
本次设计使用的稳压模块能够很好的行使保护电路、热关断电路、限制电流等功能[14],稳压模块可以将输出的电压的分压电阻的输出与内部基准稳压值比较,如果发现电压偏差,可使用放大器对内部振荡器进行控制调整其输出占空比,进而调整输出电压稳定,稳压模块原理图如图2.8所示。
在这里插入图片描述

图2.8稳压模块
2.7继电器模块
本次设计中采用本次选用2路光耦-高低电平继电器模块,当LOW端与公共端接通时,为低电平触发;当HIGH端与公共端接通时,为高电平触发,光耦继电器就是固态继电器,用光耦驱动可控硅,控制光耦端给合适的电信号,这样,光耦另一端光三极管,得信号导通,驱动可控硅导通。继电器模块如图2.9所示。

在这里插入图片描述

图2.9继电器模块

3系统软件设计

3.1编程工具Keil简介
STM32单片机软件开发环境使用的是有德国的KEIL公司推出的keil软件[15]。根据不完全统计,全球大约十万的科研人员在使用这一款软件,在官网上可以看到起目前最新的版本是5.5。使用这一个版本不仅仅能够开发我们目前使用的STM32单片机,还可以开发由全球数百个开发公司所开发的芯片,知名的包括51,DSP等等。由它编译生成的代码效率极高稳定性很好并且能够实现程序的编译、编写、承接、调测、仿真等全部的开发流程。同时,使用Keil5也对STM32单片机的开发有了针对性的优化,相比较传统模式的开发方式原开发界面,这样一个编译器是非常好用的[16]。Keil5的界面,如图3.1所示。

在这里插入图片描述

图3.1 Keil uVision5

3.2程序设计原理
本文的程序设计内容主要包含数据分析、电机控制。在软件设计中如果采用的是传统的整体代码编写,出错的概率可能会有点大,甚至有时候可能连错在哪里都找不出来,这样花费的人力物力成本太大。所以本次软件的设计选择的是模块化的设计,模块化的设计将一个程序分成几个模块来编写,这里的模块指的是那些可以单独拿出来运行的程序。这样如果有错,就会很容易的就可以将它找出来,这样对于我们来说调试起来很方便。
模块化程序设计有以下好处:
(1)每个模块都是可以分开来写,而且调试起来也很方便;
(2)每个模块完成的功能都是独立,不会互相影响[17];
3.3小车功能设计
当小车开始驱动时,小车运行前进,当小车前进时检测到了火焰,开启灭火风扇进行灭火,灭火三秒后,再次检测火焰是否还在,若还在则绕行,未检测到则继续前行,当检测到路线有障碍物时,会开启火力系统,发动火力清理障碍物,五秒后,再次检测,若障碍物还在,无法清除,则绕行避开,若已清除检测不到,则继续前行。本设计的开路清障车程序功能设计,如图3.2所示。
在这里插入图片描述

图3.2小车功能流程图

4系统调试

系统测试最重要的目的是判断系统是否可以正常运行系统所开发的功能模块能否进行正常的操作以及程序代码中是否存在错误。测试程序是开发过程中的一个必不可少又极其重要的环节[18]。这是因为就算系统被认为设计的再完美其在进行程序测试时也会被发现一个此前从来没有被发现的错误。
在制作硬件电路之前,我们先根据实际需要的功能划分硬件模块,并且在AD里面画出其硬件原理图和PCB图,检查无误后开始焊接[19]。
在实际制作过程中也不是一帆风顺的,在硬件做好调试过程中,所测数据不变动、或不显示,经检查硬件电路,使用万用表量通断发现,部分导线可能不通,存在虚焊现象,导致整个设计无法正常运行。重新焊接该部分导线,焊接牢固后,问题才可以解决。
在后期调试过程中,前置的L298N驱动模块(连接发射装置和灭火装置)经常过热,并伴有塑料焦糊味,随后出现了,发射装置和灭火装置失灵,一时间设计搁置。在遇到硬件问题时,常用排除法排杂,所以先列出了可能存在的情况:存在虚焊情况,发射装置和灭火装置损坏,L298N驱动模块损坏等。先给发射装置和灭火装置外接电源,发现二者均可工作,且传感器均有反应,故排除二者损坏的可能,使用万用表对以上情况一一排除,首先排除了存在虚焊的情况,当检查驱动模块时,发现装置供电LED正常点亮,模块供电正常,用万用表检查模块各个元件,发现L298N驱动芯片损坏,于是更换了L298N驱动模块,装置可以正常使用,并且在后面调试时对连续调试时间进行缩短,给L298N驱动芯片足够的散热时间,延长其使用寿命。实物展示图、实物调试图,如图4.1、4.2所示。
在这里插入图片描述

图4.1 实物展示图
在这里插入图片描述

图4.2 实物调试图

结 论

本文开篇便先对系统进行了分析,并且向大家条理清晰有逻辑地介绍了设计的开发背景、设计思想和研究内容等。我们还对软件的设计方案进行了全局性的规划和详尽的设计。全局性的规划主要包括总体功能规划,系统总体结构规划等;最后我们还对整体设计进行了调试,并且对调试的结果进行了分析和总结[20]。这从很大程度上帮助我们进一步的找到系统的缺陷与需要进行升级优化处理的地方,大大的更便于后面,当设计作品出现问题时候,我们如何对整体作品进行排杂和维护。
基于总体设计方案,本文完成了系统的软件设计和硬件设计。通过实际操作验证了序列的准备和调试,取得了满意的效果。在这个进行毕业性的项目设计的过程中,我学习到了很多也成长了很多。在设计中,我对大学生涯所学的专业知识与其的实际应用有了更深入的理解和新的经验。基本上,我已经意识到我学到的知识并应用它,我也意识到规范化的整体设计流程的重要性以及整体作品的调试和维护的必要性。
通过这次毕业性的项目设计,使我得到了一次用专业所学习的知识、专业技术和能力分析以及一些解决相关问题方面得到更加完完整整的锤炼。使我在微型处理器的基础性的原理、微处理器方面实际使用的系统所需要开发的流程中,以及在常用编写程序设计思想路线和技巧(特别是 C 语言)的掌握方面都能往前面迈进了一步,为日后成为实用型奠定良好的基础。

参考文献

[1]耿文静, 吴华. 应用型本科院校《单片机原理及应用》课程教学研究[J]. 科技视界, 2017(04) :186
[2]汤辛华. 道路清障车的4大发展趋势[J]. 商用汽车,2009(01) :96-97
[3]金琦淳, 倪月, 刘清翔等. 案例式教学在《单片机原理及接口技术》课程中的应用[J]. 装备制造技术, 2015(01) :216-218
[4]肖军. 我国道路清障车现状及发展前景[J]. 商用汽车,2014(06) :24-30
[5]赵华峰. 基于单片机的家居智能系统设计与实现[J]. 信息与电脑(理论版),2018(22) :134-136
[6]郁美霞. 基于校园卡的智能储物柜人机交互系统的设计[D]. 兰州交通大学, 2015 :42-44
[7]李琪琪, 杨冲, 张芳芳等. 小区物业智能快递储物柜系统研究[J]. 现代物业(中旬刊), 2019(06) :30
[8]徐爱昆, 康怡琳, 顾珉光等. 智慧校园储物柜的多功能控制系统设计[J]. 单片机与嵌入式系统应用, 2019,19(01) :69-72
[9]张立立,尹国成,孙尚超. 基于MCU技术的数据采集系统的硬件设计与实现[J]. 电子世界,2013(21) :128+143
[10]宁志超. 基于ATmega16的六自由度果实采摘机械手控制系统的设计[D]. 东北农业大学,2010 :42-43
[11]宋珂. 自动售票机硬币处理装置控制系统的设计与开发[D]. 南京理工大学,2017 :54-55
[12]董刚. 智能小车运动控制系统研制[D]. 西安科技大学,2009 :32-33
[13]章叶骏. ASR机器人系统中无线语音控制系统的应用研究[D]. 合肥工业大学,2008 :25-26
[14]周柱. 基于STM32的智能小车研究[D]. 西南交通大学,2011 :24-26
[15]吴慧玲. 基于多传感器的移动机器人避障策略的研究[D]. 沈阳大学,2013 :45-46
[16]谢留威. 基于虚拟样机的气体连续发射轻小目标装置的研制[D].哈尔滨工业大学,2017 :47-49
[17]马庆乐. 基于路径规划及避障的自主导览互动讲解机器人研制[D]. 兰州理工大学,2017 :36-37
[18]王时群. 智能吸尘器红外避障控制系统研究[D]. 海南大学,2015 :24-25
[19]吴迪. 锂电池充电控制与管理方法研究[D]. 北京交通大学,2015 :45-46
[20]朱恩亮. 基于ARM的灭火机器人设计与制作[D]. 电子科技大学,2011 :25-26

附录1 系统原理图

在这里插入图片描述

在这里插入图片描述

附录2 主要程序

#include “delay.h”
#include “sys.h”
#include “usart.h”
#include “led.h”
#include “key.h”

//超声波硬件接口定义
#define HCSR04_PORT GPIOB
#define HCSR04_CLK RCC_APB2Periph_GPIOB
#define HCSR04_TRIG GPIO_Pin_11
#define HCSR04_ECHO GPIO_Pin_10

//超声波计数
u16 msHcCount = 0;

//定时器4设置
void hcsr04_NVIC()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;             
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       
NVIC_Init(&NVIC_InitStructure);

}

//IO口初始化 及其他初始化
void Hcsr04Init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);

GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;      
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);GPIO_InitStructure.GPIO_Pin =   HCSR04_ECHO;     
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);  
GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);   TIM_DeInit(TIM2);
TIM_TimeBaseStructure.TIM_Period = (1000-1); 
TIM_TimeBaseStructure.TIM_Prescaler =(72-1); 
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);          TIM_ClearFlag(TIM4, TIM_FLAG_Update);  
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);    
hcsr04_NVIC();
TIM_Cmd(TIM4,DISABLE);     

}

//打开定时器4
static void OpenTimerForHc()
{
TIM_SetCounter(TIM4,0);
msHcCount = 0;
TIM_Cmd(TIM4, ENABLE);
}

//关闭定时器4
static void CloseTimerForHc()
{
TIM_Cmd(TIM4, DISABLE);
}

//定时器4终中断
void TIM4_IRQHandler(void)
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update );
msHcCount++;
}
}

//获取定时器4计数器值
u32 GetEchoTimer(void)
{
u32 t = 0;
t = msHcCount*1000;
t += TIM_GetCounter(TIM4);
TIM4->CNT = 0;
delay_ms(50);
return t;
}

//通过定时器4计数器值推算距离
float Hcsr04GetLength(void )
{
u32 t = 0;
int i = 0;
float lengthTemp = 0;
float sum = 0;
while(i!=5)
{
TRIG_Send = 1;
delay_us(20);
TRIG_Send = 0;
while(ECHO_Reci == 0);
OpenTimerForHc();
i = i + 1;
while(ECHO_Reci == 1);
CloseTimerForHc();
t = GetEchoTimer();
lengthTemp = ((float)t/58.0);//cm
sum = lengthTemp + sum ;

}
lengthTemp = sum/5.0;
return lengthTemp;

}

void go() //前进
{
GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_6); //PB.5 输出高
GPIO_ResetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_7);
}

void stop() //停止
{
GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //PB.5 输出?
}

void left() //左
{
GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6); //PB.5 输出高
GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_7);

}

void right() //右
{
GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_7); //PB.5 输出高
GPIO_ResetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6);
}

//测试主函数
int main(void)
{
float length;
// u8 time_spear=0;
delay_init(); //延时函数初始化

 LED_Init();           //电机控制方向初始化KEY_Init() ;           //火焰传感器初始化spear_Init();          // 水弹枪初始化fan_Init();            //风扇初始化NVIC_Configuration(); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(9600);	 	//串口初始化为9600Hcsr04Init();printf("大海电子串口测试\r\n");  

Hcsr04Init();
printf(“超声波初始化成功!\n”);

while(1)
{

 length = Hcsr04GetLength();printf("距离为:%.3fcm\r\n",length);go();if(length<30)             								 //有障碍物{stop();GPIO_SetBits(GPIOA,GPIO_Pin_0);GPIO_ResetBits(GPIOA,GPIO_Pin_1);      //水单枪攻击delay_ms(1000);                        //延时三秒delay_ms(1000);  delay_ms(1000);  length = Hcsr04GetLength();            //再次检测障碍物if(length<30)            							 //障碍物没有清除{GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1);		left();                       		 //绕行delay_ms(500);  stop();		}		GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1);					}if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3) == 0 )      //检测到火焰
{	 stop();			 GPIO_SetBits(GPIOB,GPIO_Pin_4);						 //风扇转动GPIO_ResetBits(GPIOB,GPIO_Pin_5);delay_ms(1000);                        //延时五秒delay_ms(1000);  delay_ms(1000);  delay_ms(1000);                       delay_ms(1000);  if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3) == 0);   //火焰没有消失{left();                       		 //绕行delay_ms(500);  stop();					}GPIO_SetBits(GPIOB,GPIO_Pin_4|GPIO_Pin_5);						 //关闭风扇
}

// go();
// delay_ms(1000);
}
}

致 谢

从刚确定所需要完成的设计的课题以来,我首先是查找相关的及资料,然后资料的处理,并根据实际情况设计确定出最初的设计方案,从而达到进行升级方案。所以我翻阅了很多相关的书籍,在网上搜索相关的运用方法,加上老师和同学的帮助下,完成的设计达到了以前期望的要求。同时,通过这次实际操作设计,我们在每个方面能力都有一定的提高,学到了如何综合分析数据,整理相关的资料,使大学里学习的理论知识在根本上得到一次最完整的实践和提高。也为我以后的学习奠定了很好的基础。在导师的指导和同学帮助之下,我顺利地完成了本次毕业性的项目设计。在毕业的项目类目设计这段时间里,我认识到了自己的不足并努力的争取独自一个人完成我的设计,最终学习到了很多,学到了以前很多没有学到的知识,同时也巩固了所学过的知识。
感谢我的导师,胡海龙和于宏波导师孜孜不倦的指导,不论在理论还是实践方面都给我提了很多重要的意见,使我的毕业性的课题设计在正常流程的环境下进行,一步接着一步的无限接近完善,得以顺利完成。没有导师的帮助,只靠我一个人的努力是无法圆满完成这次毕业性的项目设计的。尽管我经常问您一些很基础的问题,但是您从来没有对此表示过一丝一毫的不耐烦,而是用智慧的光芒化解我所有疑惑。感谢在毕业项目设计中为我提供帮助的学院的老师和同学,以及在毕业项目设计中被我引用或参考的论著的作者,总之感谢在毕业项目设计期间给予我帮助的所有老师和同学,感谢你们对我的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/726404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker-自定义镜像

目录 1 前言 2 构建java应用的步骤及镜像结构图 2.1 构建步骤 2.2 镜像结构图 3 Dockerfile常用指令 4 Dockerfile的内容举例 4.1 一般形式 4.2 一般形式的优化 5 构建镜像 5.1 指令 5.2 实操 5.2.1 加载jdk镜像(基础镜像) 5.2.2 构建我们的镜像 5.2.3 使用我们的…

SpringCloud微服务-RabbitMQ快速入门

文章目录 RabbitMQ快速入门1、什么是MQ&#xff1f;2、RabbitMQ概述3、RabbitMQ的结构和概念4、常见消息模型5、HelloWorld RabbitMQ快速入门 1、什么是MQ&#xff1f; MQ &#xff08;MessageQueue&#xff09;&#xff0c;中文是消息队列&#xff0c;字面来看就是存放消息的…

Linux nmcli命令使用教程(nmcli指令)

文章目录 先区分两个概念&#xff1a;网络设备和网络连接网络设备网络连接网络连接的UUID nmcli可以为一个网络设备创建多个网络连接&#xff0c;但同一时刻只有一个能生效 Mastering Network Management with nmcli in Linux&#xff08;掌握Linux中使用nmcli进行网络管理&…

掌握 Vue3、Vite 和 SCSS 实现一键换肤的魔法步骤

前言 一个网站的换肤效果算是一个比较常见的功能&#xff0c;尤其是在后台管理系统中&#xff0c;我们几乎都能看到他的身影&#xff0c;这里给大家提供一个实现思路。 搭建项目 vitevue3搭建项目这里就不演示了&#xff0c;vite官网里面讲得很清楚。 注&#xff1a;这里使…

【Java项目介绍和界面搭建】拼图小游戏——作弊码、查看完整图片

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

实现qq音乐歌词滚动效果

闲来无事&#xff0c;听音乐的时候&#xff0c;突发奇想 实现该效果中&#xff0c;包含了根据声音高低生成音波的功能&#xff0c;有兴趣的直接下载代码即可 这是启动后的效果。

泛微OA本地部署项目

泛微OA本地部署 本文演示脱离公司服务器&#xff0c;在本地搭建泛微 OA。 本次演示的版本如下&#xff1a; ecology&#xff1a;e-9sql server 版本&#xff1a;2012jdk 版本&#xff1a;1.8 一、安装 VmWare、Centos 7 对于 VmWare、Centos 7的安装&#xff0c;此处不再一一…

力扣515. 在每个树行中找最大值(BFS,DFS)

Problem: 515. 在每个树行中找最大值 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1&#xff1a;BFS 套用BFS模板&#xff0c;直接在遍历树的某一层时将当前层的最大值存入数组中 思路2&#xff1a;DFS 回溯思想&#xff0c;在递归时不断更新可选列表&#xff08;根据…

【Flink网络数据传输(3)】RecordWriter的能力:实现数据分发策略或广播到下游InputChannel

文章目录 一.创建RecordWriter实例都做了啥1. 根据recordWrites数量创建不同的代理类2. 创建RecordWriters3. 单个RecordWriter的创建细节 二. RecordWriter包含的主要组件1. RecordWriter两种实现类分别实现分发策略和广播2. ChannelSelectorRecordWriter的发送策略2.1. Chann…

ArmSoM规划开发基于RK3576的开发套件

ArmSoM正计划推出一款新的产品&#xff0c;这款产品将采用强大的RK3576芯片。 本文将为您介绍我们的新产品搭载的RK3576性能参数&#xff0c;以及它如何为您提供卓越的性能和功能。 RK3576处理器 RK3576处理器是一款强大的处理器&#xff0c;具备出色的性能和多样化的功能&a…

8、Linux-软件安装:rpm和yum;配置yum阿里云镜像源

一、介绍 Linux安装软件有两种方式&#xff0c; ①rpm&#xff1a;安装已有的安装包&#xff0c;类似于Windows中双击exe的安装包程序 ②yum&#xff1a;拉取远程仓库的文件&#xff0c;类似于python的pip install 区别&#xff1a;假设软件A依赖软件B&#xff0c;软件B依赖…

【C++庖丁解牛】C++内存管理 | new和delete的使用以及使用原理

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1. C/C内存分布2. C语…

【C语言】走迷宫之推箱子

前言&#xff1a; 在上一篇文章当中我介绍了一个走迷宫的写法&#xff0c;但是那个迷宫没什么可玩性和趣味性&#xff0c;所以我打算在迷宫的基础上加上一个推箱子&#xff0c;使之有更好的操作空间&#xff0c;从而增强了游戏的可玩性和趣味性。 1. 打印菜单 void menu() {…

Day12:信息打点-Web应用源码泄漏开源闭源指纹识别GITSVNDS备份

目录 开源-CMS指纹识别源码获取方式 闭源-习惯&配置&特性等获取方式 闭源-托管资产平台资源搜索监控 思维导图 章节点 Web&#xff1a;语言/CMS/中间件/数据库/系统/WAF等 系统&#xff1a;操作系统/端口服务/网络环境/防火墙等 应用&#xff1a;APP对象/API接口/微…

Flink JobGraph构建过程

文章目录 前言JobGraph创建的过程总结 前言 在StreamGraph构建过程中分析了StreamGraph的构建过程&#xff0c;在StreamGraph构建完毕之后会对StreamGraph进行优化构建JobGraph&#xff0c;然后再提交JobGraph。优化过程中&#xff0c;Flink会尝试将尽可能多的StreamNode聚合在…

Sharding-JDBC源码解析与vivo的定制开发

作者&#xff1a;vivo IT 平台团队 - Xiong Huanxin Sharding-JDBC是在JDBC层提供服务的数据库中间件&#xff0c;在分库分表场景具有广泛应用。本文对Sharding-JDBC的解析、路由、改写、执行、归并五大核心引擎进行了源码解析&#xff0c;并结合业务实践经验&#xff0c;总结…

基于 Vue3 学习状态管理器:pinia

pinia 基本概念 Pinia 是 Vue 的存储库&#xff0c;Pinia和Vuex一样都是是vue的全局状态管理器&#xff0c;它允许跨组件/页面共享状态。实际上&#xff0c;其实Pinia就是Vuex5&#xff0c;官网也说过&#xff0c;为了尊重原作者&#xff0c;所以取名 pinia&#xff0c;而没有…

raylib库在CodeBlocks上的配置

raylib下载 raylib | A simple and easy-to-use library to enjoy videogames programming CodeBlocks

本地部署websocket服务端并结合内网穿透实现固定公网地址连接

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

CGAL 5.6.1 - Algebraic Foundations

1. 引言 CGAL 的目标是精确计算非线性对象&#xff0c;特别是定义在代数曲线和曲面上的对象。因此&#xff0c;表示多项式、代数扩展和有限域的类型在相关的实现中扮演着更加重要的角色。为了跟上这些变化&#xff0c;我们引入了这个软件包。由于引入的框架必须特别支持多项式…