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

相关文章

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

Python项目打包部署到服务器的实现

《Python项目打包部署到服务器的实现》本文主要介绍了PyCharm和Ubuntu服务器部署Python项目,包括打包、上传、安装和设置自启动服务的步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录一、准备工作二、项目打包三、部署到服务器四、设置服务自启动一、准备工作开发环境:本文以PyChar

多模块的springboot项目发布指定模块的脚本方式

《多模块的springboot项目发布指定模块的脚本方式》该文章主要介绍了如何在多模块的SpringBoot项目中发布指定模块的脚本,作者原先的脚本会清理并编译所有模块,导致发布时间过长,通过简化脚本... 目录多模块的springboot项目发布指定模块的脚本1、不计成本地全部发布2、指定模块发布总结多模

SpringBoot项目删除Bean或者不加载Bean的问题解决

《SpringBoot项目删除Bean或者不加载Bean的问题解决》文章介绍了在SpringBoot项目中如何使用@ComponentScan注解和自定义过滤器实现不加载某些Bean的方法,本文通过实... 使用@ComponentScan注解中的@ComponentScan.Filter标记不加载。@C

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择