当前位置:   article > 正文

STM32 学习笔记4-智能小车-超声波避障_extern ultrasonicwave_distance

extern ultrasonicwave_distance

目录

什么是超声波?超声波测距原理?

硬件:

超声波传感器:

 车身结构件及其附件:

 软件:

逻辑控制策略:

代码实现:

main.c 主函数

UltrasonicWave.c 主函数:

backup:超声波测距工作原理



老规矩:Model X 特斯拉镇楼  (图文相关,Model X 鹰翼门 侧门防止磕碰,装了超声波传感器


什么是超声波?超声波测距原理?

超声波(ultrasonic (waves) )是一种机械波,其具有指向性强、能量消耗缓慢、传播距离相对较远等特点

波长:人类耳朵能听到的声波频率为为20HZ~20KHz,超声波一般为大于20KHz23 kHz到40 kHz

超声波测距原理:超声波常用的测距方法为回声探测法,s=340t/2,其他还相位检测法、声波幅值检测法。

误差影响因素:超声波是一种声波,声速V与温度关系很大,V = 331.4 + 0.607T式中,T为实际温度单位为℃,v为超声波在介质中的传播速度单位为m/s。一般要提高精度,需要做相应的温度补偿程序。


硬件:

超声波传感器:

型号: HC-SR04

ultrasonic sensor  包括四个引脚分别是  Vcc Input(trig 控制端)  output ( echo 接收端) Gnd

 

超声波内部原理图


 车身结构件及其附件:

如底板,车轮等 ,提供支撑与安装

驱动:2*直流电机

控制模块:单片机 STM32 F10系列    超声波控制模块相关芯片

电路图:


 软件:

逻辑控制策略:

初始化→检测障碍物→检测范围内无障碍物→前进

                                →检测范围外有障碍物→后退→右(左)转→检测障碍物

比如在检测到障碍物的时候,蜂鸣器会响等。

代码实现:

main.c 主函数

  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "motor.h"
  4. #include "keysacn.h"
  5. #include "IRSEARCH.h"
  6. #include "IRAvoid.h" //红外避障头文件
  7. #include "usart.h"
  8. #include "UltrasonicWave.h" //超声波头文件
  9. #include "timer.h" //计时器 计时头文件
  10. int main(void)
  11. {
  12. delay_init(); //初始化
  13. KEY_Init();
  14. IRSearchInit();
  15. IRAvoidInit();
  16. Timerx_Init(5000,7199); //定时器设置用来开启定时器计时,记录Echo变为低电平的时间。
  17. UltrasonicWave_Configuration(); //超声波模块初始化
  18. uart_init(115200); // 串口初始化为115200
  19. TIM4_PWM_Init(7199,0); //初始化PWM
  20. STM32_brake(500); //刹车函数0.5s
  21. keysacn();
  22. while(1)
  23. {
  24. //printf("测到的距离值为:%d\n",UltrasonicWave_StartMeasure());
  25. if(UltrasonicWave_StartMeasure()<40) //当距离小于40cm时,判断为有障碍物
  26. {
  27. ZYSTM32_back(50,500); //后退
  28. STM32_Right(50,500); //右转
  29. BEEP_SET; //蜂鸣器响
  30. }
  31. else
  32. {
  33. STM32_run(50,1); //无障碍物 直行
  34. BEEP_RESET; //蜂鸣器不响
  35. }
  36. }
  37. }

Timerx_Init函数

  1. #include "timer.h"
  2. //通用定时器3中断初始化
  3. //APB1
  4. //arr :
  5. //psc
  6. void Timerx_Init(u16 arr,u16 psc)
  7. {
  8. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  9. NVIC_InitTypeDef NVIC_InitStructure;
  10. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //
  11. TIM_TimeBaseStructure.TIM_Period = 5000; //
  12. TIM_TimeBaseStructure.TIM_Prescaler =(7200-1); //
  13. TIM_TimeBaseStructure.TIM_ClockDivision = 0; // :TDTS = Tck_tim
  14. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM
  15. TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //TIM_TimeBaseInitStruct
  16. TIM_ITConfig( //
  17. TIM2, //TIM2
  18. TIM_IT_Update | //TIM
  19. TIM_IT_Trigger, //TIM
  20. ENABLE //
  21. );
  22. NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM3
  23. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  24. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  25. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  26. NVIC_Init(&NVIC_InitStructure);
  27. // TIM_Cmd(TIM2, ENABLE); // TIMx
  28. }
  29. void TIM2_IRQHandler(void)
  30. {
  31. if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //
  32. {
  33. TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //
  34. }
  35. }

UltrasonicWave.c 主函数:

  1. #include "UltrasonicWave.h"
  2. #include "usart.h"
  3. #include "timer.h"
  4. #include "delay.h"
  5. /***超声波四个引脚定义******************/
  6. #define TRIG_PORT GPIOC //TRIG
  7. #define ECHO_PORT GPIOC //ECHO
  8. #define TRIG_PIN GPIO_Pin_0 //TRIG PC0 - TRIG
  9. #define ECHO_PIN GPIO_Pin_1 //ECHO PC1 - ECHO
  10. float UltrasonicWave_Distance; //计算出的距离
  11. /***超声 波测距模块******************/
  12. void UltrasonicWave_Configuration(void)
  13. {
  14. GPIO_InitTypeDef GPIO_InitStructure;
  15. EXTI_InitTypeDef EXTI_InitStructure;
  16. NVIC_InitTypeDef NVIC_InitStructure;
  17. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);
  18. GPIO_InitStructure.GPIO_Pin = TRIG_PIN; //PC0接 TRIG
  19. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设为推挽输出
  20. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  21. GPIO_Init(TRIG_PORT, &GPIO_InitStructure); // 初始化外设 GPIO
  22. GPIO_InitStructure.GPIO_Pin = ECHO_PIN; //PC7接ECH0
  23. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //设为输入
  24. GPIO_Init(ECHO_PORT,&GPIO_InitStructure); //初始化GPIOA
  25. //GPIOC.1 中断线以及中断初始化配置
  26. GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource1);
  27. EXTI_InitStructure.EXTI_Line = EXTI_Line1;
  28. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  29. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  30. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  31. EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设 EXTI寄存器
  32. NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //
  33. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级2
  34. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级2
  35. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  36. NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStructure中指定的参数初始化外设 NVIC寄存器
  37. }
  38. //-----------------------通道1中断函数---------------------------------------------
  39. void EXTI1_IRQHandler(void)
  40. {
  41. delay_us(10); //延时10us
  42. if(EXTI_GetITStatus(EXTI_Line1) != RESET)
  43. {
  44. TIM_SetCounter(TIM2,0);
  45. TIM_Cmd(TIM2, ENABLE); //开启时钟
  46. while(GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN)); //等待低电平
  47. TIM_Cmd(TIM2, DISABLE); //定时器2失能
  48. UltrasonicWave_Distance=TIM_GetCounter(TIM2)*5*34/200.0; //计算距离UltrasonicWave_Distance<150
  49. // U_temp = UltrasonicWave_Distance*10;
  50. // if(UltrasonicWave_Distance>0)
  51. // {
  52. // printf("distance:%f mm",UltrasonicWave_Distance*10);
  53. // }
  54. EXTI_ClearITPendingBit(EXTI_Line1); //清除EXTI线路挂起位
  55. }
  56. }
  57. /* 开始测距,发送一个大于10微秒的脉冲,然后测量返回的高电平的时间 */
  58. int UltrasonicWave_StartMeasure(void)
  59. {
  60. int u_temp;
  61. GPIO_SetBits(TRIG_PORT,TRIG_PIN); //送10微秒的高电平
  62. delay_us(20); //
  63. GPIO_ResetBits(TRIG_PORT,TRIG_PIN);
  64. u_temp = UltrasonicWave_Distance*10;
  65. return u_temp;
  66. }

uart_init ()主函数

  1. void uart_init(u32 bound){
  2. //GPIO
  3. GPIO_InitTypeDef GPIO_InitStructure;
  4. USART_InitTypeDef USART_InitStructure;
  5. NVIC_InitTypeDef NVIC_InitStructure;
  6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //
  7. //USART1_TX GPIOA.9
  8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  10. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  11. GPIO_Init(GPIOA, &GPIO_InitStructure);// GPIOA.9
  12. //USART1_RX GPIOA.10
  13. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  14. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  15. GPIO_Init(GPIOA, &GPIO_InitStructure);
  16. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  17. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
  18. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  19. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  20. NVIC_Init(&NVIC_InitStructure);
  21. //USART
  22. USART_InitStructure.USART_BaudRate = bound;//
  23. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  24. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  25. USART_InitStructure.USART_Parity = USART_Parity_No;
  26. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  27. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  28. USART_Init(USART1, &USART_InitStructure);
  29. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  30. USART_Cmd(USART1, ENABLE);
  31. }


backup:超声波测距工作原理

 

参考链接:

传感器-HC-SR04超声波传感器 - 知乎

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

闽ICP备14008679号