本文主要是介绍stm32项目(13)——基于stm32的倒车雷达装置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.功能设计
使用stm32f103zet6,(某原子精英板)。利用一个超声波模块:HCSR04,测距(使用了简单滤波算法:测十次数据,去掉最大值、去掉最小值,求平均值),将距离信息实时显示在LCD屏幕上。设定一个距离阈值,当所测距离小于阈值时,蜂鸣器报警,LED灯亮,同时屏幕上显示一副“注意危险”的图片。距离大于阈值的时候,蜂鸣器不响,LED灯不亮,屏幕不显示图片。
(需要代码的直接移步到第五节)
所实现的实物图如下所示:
2.实现思路
超声波模块的资料参考我的这篇博客:
基于PIC16F877A的智能台灯设计。-CSDN博客https://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文库https://download.csdn.net/download/guangali/88634609
这篇关于stm32项目(13)——基于stm32的倒车雷达装置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!