stm32项目(13)——基于stm32的倒车雷达装置

2023-12-18 15:44

本文主要是介绍stm32项目(13)——基于stm32的倒车雷达装置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.功能设计

        使用stm32f103zet6,(某原子精英板)。利用一个超声波模块:HCSR04,测距(使用了简单滤波算法:测十次数据,去掉最大值、去掉最小值,求平均值),将距离信息实时显示在LCD屏幕上。设定一个距离阈值,当所测距离小于阈值时,蜂鸣器报警,LED灯亮,同时屏幕上显示一副“注意危险”的图片。距离大于阈值的时候,蜂鸣器不响,LED灯不亮,屏幕不显示图片。

(需要代码的直接移步到第五节)

        所实现的实物图如下所示:

2.实现思路

        超声波模块的资料参考我的这篇博客:

基于PIC16F877A的智能台灯设计。-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/guangali/article/details/131705213        我们使用stm32单片机的pwm功能,在32单片机的PA8管脚,输出一个高电平时间为10us的pwm脉冲,完成对HCSR04模块的触发。其配置代码如下:

void TIM1_PWM_Init(u16 arr,u16 psc)
{  GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能//设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 80KTIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_CtrlPWMOutputs(TIM1,ENABLE);	//MOE 主输出使能	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能	 TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器TIM_Cmd(TIM1, ENABLE);  //使能TIM1}

        然后再使用PA0脚的捕获功能,就可以测到模块上,超声波返回所用的高电平时间。这样就能根据声速和时间算出距离了! 捕获的配置代码如下:

//定时器2通道1输入捕获配置TIM_ICInitTypeDef  TIM2_ICInitStructure;void TIM2_Cap_Init(u16 arr,u16 psc)
{	 GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	//使能TIM2时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;  //PA0 清除之前设置  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入  GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_ResetBits(GPIOA,GPIO_Pin_0);						 //PA0 下拉//初始化定时器2 TIM2	 TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值 TIM_TimeBaseStructure.TIM_Prescaler =psc; 	//预分频器   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位//初始化TIM2输入捕获参数TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 	选择输入端 IC1映射到TI1上TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;	//上升沿捕获TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;	 //配置输入分频,不分频 TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波TIM_ICInit(TIM2, &TIM2_ICInitStructure);//中断分组初始化NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级0级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断	TIM_Cmd(TIM2,ENABLE ); 	//使能定时器2}u8  TIM2CH1_CAPTURE_STA=0;	//输入捕获状态		    				
u16	TIM2CH1_CAPTURE_VAL;	//输入捕获值//定时器2中断服务程序	 
void TIM2_IRQHandler(void)
{ if((TIM2CH1_CAPTURE_STA&0X80)==0)//还未成功捕获	{	  if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){	    if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到高电平了{if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了{TIM2CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次TIM2CH1_CAPTURE_VAL=0XFFFF;}else TIM2CH1_CAPTURE_STA++;}	 }if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//捕获1发生捕获事件{	if(TIM2CH1_CAPTURE_STA&0X40)		//捕获到一个下降沿 		{	  			TIM2CH1_CAPTURE_STA|=0X80;		//标记成功捕获到一次上升沿TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获}else  								//还未开始,第一次捕获上升沿{TIM2CH1_CAPTURE_STA=0;			//清空TIM2CH1_CAPTURE_VAL=0;TIM_SetCounter(TIM2,0);TIM2CH1_CAPTURE_STA|=0X40;		//标记捕获到了上升沿TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);		//CC1P=1 设置为下降沿捕获}		    }			     	    					   }TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位}

        简单的滤波算法如下:

//处理数据的函数   去掉最大值  去掉最小值  然后取平均
u32 Average_distance(u32* pData,u8 Cnt)
{u32 i, j = 0, k = 0xFFFF, average = 0;          //j保存最大值  k保存最小值for( i = 0; i < Cnt; i++ ){if( pData[ i ] > j ) j = pData[ i ];if( pData[ i ] < k ) k = pData[ i ];average += pData[ i ];                  //将数组里的数累加}average = average - j - k;                 //减去最大值最小值average = average / (Cnt - 2);              //取平均return average;
}

3.课题意义

基于STM32的倒车雷达课题具有以下意义:

1. 提高车辆安全性:倒车雷达可以帮助驾驶员有效地检测到后方障碍物,及时发出警告,减少倒车事故的发生,提高车辆的安全性。

2. 降低事故损失:倒车事故往往会导致车辆损坏和人员伤亡,借助倒车雷达可以减少事故风险,降低事故损失。

3. 方便驾驶操作:倒车雷达可以辅助驾驶员进行倒车操作,避免人为操作的偏差和误判,提供更准确的反馈信息,使驾驶操作更加方便和轻松。

4. 推动技术创新:基于STM32的倒车雷达课题促进了传感器、信号处理、嵌入式系统等技术领域的研发和创新,推动了整个车载电子技术的发展。

5. 实用性和商业化应用:倒车雷达是一种被广泛应用于汽车行业的技术,符合市场需求,具有实际应用和商业化前景。基于STM32的倒车雷达课题有助于培养相关领域的专业人才和技术团队,为相关企业的产品研发和市场竞争提供支持。

综上所述,基于STM32的倒车雷达课题具有提高车辆安全性、降低事故损失、方便驾驶操作、推动技术创新以及商业化应用等重要意义,对于汽车行业和相关领域的发展都具有积极的促进作用。

4.国内外研究现状 

基于STM32单片机的倒车雷达在国内外都有一定的研究和应用现状。以下是一些关于国内外研究现状的概述:

国内研究现状:
1. 学术研究:国内的高校和研究机构进行了一些关于基于STM32的倒车雷达的研究,主要集中在传感器选择、信号处理算法、驱动电路设计等方面。这些研究主要以科研和学术交流为目的,为倒车雷达技术的发展做出了一定贡献。
2. 工程应用:一些国内汽车制造商和电子设备厂商已经开始应用基于STM32的倒车雷达技术到实际产品中。这些应用主要涉及倒车雷达传感器的选择与集成、倒车雷达系统的设计与开发等方面。

国外研究现状:
1. 学术研究:国外的研究机构和高校在基于STM32的倒车雷达方面的研究相对较多,主要集中在算法的优化与改进、系统的集成与测试等方面。这些研究致力于提高倒车雷达的性能和功能,探索新的技术和方法。
2. 工业应用:国外的汽车制造商和电子设备厂商普遍采用基于STM32的倒车雷达技术,将其应用到汽车防撞系统中。这些应用涉及到传感器的选择与集成、算法的开发与优化、系统的设计与测试等方面。

综上所述,基于STM32单片机的倒车雷达在国内外都有一定的研究和应用现状。虽然在学术研究方面相对较多,但工程应用也在逐渐发展,促进了倒车雷达技术的进步与实际应用。随着人们对汽车安全性的关注度不断提升,相信基于STM32的倒车雷达技术将有更广阔的研究和应用前景。

5.完整工程

基于stm32f103zet6的倒车雷达装置资源-CSDN文库icon-default.png?t=N7T8https://download.csdn.net/download/guangali/88634609

这篇关于stm32项目(13)——基于stm32的倒车雷达装置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/508951

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

电力系统中的A类在线监测装置—APView400

随着电力系统的日益复杂和人们对电能质量要求的提高,电能质量在线监测装置在电力系统中得到广泛应用。目前,市场上的在线监测装置主要分为A类和B类两种类型,A类和B类在线监测装置主要区别在于应用场景、技术参数、通讯协议和扩展性。选择时应根据实际需求和应用场景综合考虑,并定期维护和校准。电能质量在线监测装置是用于实时监测电力系统中的电能质量参数的设备。 APView400电能质量A类在线监测装置以其多核

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

SpringBoot项目是如何启动

启动步骤 概念 运行main方法,初始化SpringApplication 从spring.factories读取listener ApplicationContentInitializer运行run方法读取环境变量,配置信息创建SpringApplication上下文预初始化上下文,将启动类作为配置类进行读取调用 refresh 加载 IOC容器,加载所有的自动配置类,创建容器在这个过程

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免

2. 下载rknn-toolkit2项目

官网链接: https://github.com/airockchip/rknn-toolkit2 安装好git:[[1. Git的安装]] 下载项目: git clone https://github.com/airockchip/rknn-toolkit2.git 或者直接去github下载压缩文件,解压即可。