当前位置:   article > 正文

STM32简单小项目——模拟超声波雷达倒车_chao超声波雷达编程

chao超声波雷达编程

项目简介:

         项目是实现模拟雷达倒车,随着超声波模块检测到的车距大小,有源蜂鸣器发出不同频率警报声同时OLED上显示测得距离。

        项目硬件部分:主芯片STM32F103C8T6、0.96寸OLED显示屏、有源蜂鸣器模块、HC-SR04超声波模块、ST-LINK烧录器、杜邦线若干、跳线若干。

        项目软件部分:用到了STM32的内部定时器TIM2以及GPIO口。

模块介绍:

        有源蜂鸣器:工作原理是当输入低电平时,蜂鸣器内部的震荡源被激活,从而发出声音,无需额外的驱动信号,我们通过控制主芯片给蜂鸣器低电平的时间可以发出不同频率声响。

        

        HC-SR04超声波模块:一款常用于测距的非接触式传感器,其测距范围在2cm至400cm之间,测距精度高达3mm,宽电压3V-5.5V。其工作原理是给模块接入电源和地线;通过Trig引脚(控制端)输入一个持续10微秒以上的高电平脉冲信号(最佳时间是40-50微秒),触发模块发射超声波;当超声波遇到障碍物并返回时,Echo引脚(接收端)的电平会发生变化,从0变为1,此时可以启动定时器开始计时;当模块接收到返回的超声波信号时,Echo引脚的电平再次变化,从1变为0,此时停止定时器计数;最后,根据定时器记录的时间以及声音在空气中的速度340m/s,就可以通过公式s=(vt)/2计算出所测的距离。

代码(采用STM32标准库开发):

        超声波模块初始化配置: 模块配置需要用到TIM2定时器中断和GPIO口,具体的配置方法可以看我另一篇文章(STM32F103C8T6内部定时器中断控制LED和USART串口通信代码-CSDN博客)这里超声波模块的TIM2预分频器值配置为0,自动重载值配置为720,使定时器每10微秒进一次中断;Trig和Echo引脚接在STM32任意GPIO口,Trig配置为推挽输出模式,Echo配置为下拉模式(因为Echo在没有电平变化时默认为低电平),本项目Trig接PA0,Echo接PA1。

        自定义发送超声波函数:给Trig引脚45微秒的高电平唤醒超声波模块发送超声波,然后再至低电平;用一个while循环等待Echo引脚变高电平,随后开启定时器开始计时;每次启动定时器前要将计数变量清零,确保下次计数准确。

        自定义接收超声波有返回值函数:while循环等待Echo引脚变低电平,结束计时,通过公式计算返回距离,这里需要注意单位的换算,本项目最后在OLED显示的是cm/s的单位。

  1. void Chaosb_Init()
  2. {
  3. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
  4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  5. GPIO_InitTypeDef GPIO_InitStructure;
  6. GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;//推挽输出
  7. GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0;
  8. GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
  9. GPIO_Init(GPIOA,&GPIO_InitStructure);
  10. GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPD;//下拉输入
  11. GPIO_InitStructure.GPIO_Pin= GPIO_Pin_1;
  12. GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
  13. GPIO_Init(GPIOA,&GPIO_InitStructure);
  14. TIM_InternalClockConfig(TIM2);//开启内部时钟
  15. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  16. TIM_TimeBaseInitStructure.TIM_ClockDivision= TIM_CKD_DIV1;
  17. TIM_TimeBaseInitStructure.TIM_CounterMode= TIM_CounterMode_Up;
  18. TIM_TimeBaseInitStructure.TIM_Period= 720;//自动重载 10微秒
  19. TIM_TimeBaseInitStructure.TIM_Prescaler= 0;//预分频
  20. TIM_TimeBaseInitStructure.TIM_RepetitionCounter= 0;
  21. TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
  22. TIM_ClearFlag(TIM2,TIM_FLAG_Update);//更新标志位
  23. TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启中断源
  24. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组
  25. NVIC_InitTypeDef NVIC_InitStructure;
  26. NVIC_InitStructure.NVIC_IRQChannel= TIM2_IRQn;
  27. NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;
  28. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 2;
  29. NVIC_InitStructure.NVIC_IRQChannelSubPriority= 1;
  30. NVIC_Init(&NVIC_InitStructure);
  31. TIM_Cmd(TIM2,DISABLE);//关闭定时器
  32. }
  33. //发送超声波
  34. void Trig_Init()
  35. {
  36. GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
  37. Delay_us(45);
  38. GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
  39. while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==RESET);//等待Echo变高电平
  40. Distance=0;
  41. TIM_Cmd(TIM2,ENABLE);//开启定时器
  42. }
  43. //接收开始计时
  44. uint16_t Echo_Init()
  45. {
  46. while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==SET);//等待Echo变低电平
  47. TIM_Cmd(TIM2,DISABLE);//关闭定时器
  48. return sdu=((Distance * 0.00001) * 34000) / 2;
  49. }

        蜂鸣器模块初始化配置: 蜂鸣器模块I/O引脚可以选择接在STM32任意GPIO口配置为推挽输出模式,本项目I/O引脚接PB10。

        自定义不同发声频率函数:通过switch来选择在不同距离区间内的不同警报声,可以通过调节Delay的延迟值来发出自己想要的警报声。

  1. void Buzzer_Init()
  2. {
  3. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  4. GPIO_InitTypeDef GPIO_InitStructure;
  5. GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;
  6. GPIO_InitStructure.GPIO_Pin= GPIO_Pin_10;
  7. GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
  8. GPIO_Init(GPIOB,&GPIO_InitStructure);
  9. }
  10. void Buzzer_dangw(int i)//不同发声频率选择
  11. {
  12. switch(i)
  13. {
  14. break;
  15. case 1:
  16. GPIO_ResetBits(GPIOB,GPIO_Pin_10);
  17. Delay_ms(350);
  18. GPIO_SetBits(GPIOB,GPIO_Pin_10);
  19. Delay_ms(350);
  20. break;
  21. case 2:
  22. GPIO_ResetBits(GPIOB,GPIO_Pin_10);
  23. Delay_ms(250);
  24. GPIO_SetBits(GPIOB,GPIO_Pin_10);
  25. Delay_ms(250);
  26. break;
  27. case 3:
  28. GPIO_ResetBits(GPIOB,GPIO_Pin_10);
  29. Delay_ms(150);
  30. GPIO_SetBits(GPIOB,GPIO_Pin_10);
  31. Delay_ms(150);
  32. break;
  33. case 4:
  34. GPIO_ResetBits(GPIOB,GPIO_Pin_10);
  35. Delay_ms(50);
  36. GPIO_SetBits(GPIOB,GPIO_Pin_10);
  37. Delay_ms(50);
  38. break;
  39. }
  40. }

        主函数:对各模块初始化,自定义shift()函数用(>=大于或等于&&<=小于或等于)配置不同距离区间响应对应想要的警报声,这里的OLED配置借鉴了江协科技代码配置,文章下面链接有本项目源码,有需要的小伙伴可以自取。

  1. #include "stm32f10x.h" // Device header
  2. #include "OLED.h"
  3. #include "Delay.h"
  4. #include "chaosb.h"
  5. #include "Buzzer.h"
  6. uint16_t T,Distance;
  7. void shift()
  8. {
  9. GPIO_SetBits(GPIOB,GPIO_Pin_10);
  10. if(T >= 30 && T <= 50)
  11. {
  12. Buzzer_dangw(1);
  13. }
  14. if(T >= 10 && T <= 30)
  15. {
  16. Buzzer_dangw(2);
  17. }
  18. if( T <= 10)
  19. {
  20. Buzzer_dangw(4);
  21. }
  22. }
  23. int main(void)
  24. {
  25. Chaosb_Init();
  26. OLED_Init();
  27. Buzzer_Init();
  28. OLED_ShowString(1,1,"Distance: cm");
  29. while(1)
  30. {
  31. Trig_Init();
  32. Echo_Init();
  33. T=Echo_Init();
  34. OLED_ShowNum(1,10,T,2);
  35. Delay_ms(100);
  36. shift();
  37. }
  38. }
  39. void TIM2_IRQHandler(void)
  40. {
  41. if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
  42. {
  43. Distance++;
  44. }
  45. TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
  46. }

        实物图:

 

以上内容都是自己自学和理解,如有理解不正确的地方,可在评论区指出或者私信我进行更改,大家共同进步,希望这篇文章对大家有帮助。

链接:https://pan.baidu.com/s/1MDg97XEr52u4GPAf6ZvH5g?pwd=444a 
提取码:444a 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/755429
推荐阅读
相关标签
  

闽ICP备14008679号