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

2023-12-18 13:50:11

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_CH1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 80K
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
	TIM_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中指定的参数初始化外设TIMx

  TIM_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_tim
	TIM_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

文章来源:https://blog.csdn.net/guangali/article/details/135059968
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。