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

相关文章

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

MyCat分库分表的项目实践

《MyCat分库分表的项目实践》分库分表解决大数据量和高并发性能瓶颈,MyCat作为中间件支持分片、读写分离与事务处理,本文就来介绍一下MyCat分库分表的实践,感兴趣的可以了解一下... 目录一、为什么要分库分表?二、分库分表的常见方案三、MyCat简介四、MyCat分库分表深度解析1. 架构原理2. 分

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日

在.NET项目中嵌入Python代码的实践指南

《在.NET项目中嵌入Python代码的实践指南》在现代开发中,.NET与Python的协作需求日益增长,从机器学习模型集成到科学计算,从脚本自动化到数据分析,然而,传统的解决方案(如HTTPAPI或... 目录一、CSnakes vs python.NET:为何选择 CSnakes?二、环境准备:从 Py

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca