【NUCLEO-L496ZG-P 试用体验】NUCLEO-L496ZG-P超声波测距

  • 247784937@qq.co
  • LV4工程师
  • |      2017-10-13 17:36:07
  • 浏览量 781
  • 回复:0
本帖最后由 247784937@qq.com 于 2017-10-13 17:39 编辑 本次采用的是HC-SR04超声波模块。产品特点 : HC-SR04超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能,距精度可达高到 3mm ;模块包括超声波发射器、接收器与控制电路。 基本工作原理: (1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信呈。 (2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回; (3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声 波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2; 测距时,被测物体的面积不少于0.5平方米且平面尽量要求平整,否则影响测量的结果 设置输入捕获引脚ECHO 设置发射引脚为Trig 输入捕获功能设置: 直接生成IAR程序 以下代码是输入捕获中断,其中执行的是获取高电平的时间 但有高电平信号是, blue led灯亮,否则灭 red led亮灭提示系统正在运行
uint8_t TIM5CH1_CAPTURE_STA;

uint32_t TIM5CH1_CAPTURE_VAL;



void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)

{

  //printf("HAL_TIM_IC\r\n");

  

  //if(htim->Instance == TIM4)

  //{

    if( (TIM5CH1_CAPTURE_STA&0x80) == 0)

    {

      if( (TIM5CH1_CAPTURE_STA&0x40) )

      {

        TIM5CH1_CAPTURE_STA |= 0x80;

        TIM5CH1_CAPTURE_VAL = HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);

        TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1);

        TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);

      }

      else

      {

        TIM5CH1_CAPTURE_STA = 0;

        TIM5CH1_CAPTURE_VAL = 0;

        TIM5CH1_CAPTURE_STA |= 0x40;

        BLUE_LED(1);

        __HAL_TIM_DISABLE(&htim5);

        __HAL_TIM_SET_COUNTER(&htim5,0);

        TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1);

        TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);

        __HAL_TIM_ENABLE(&htim5);

      }

    }

  //}

  

}
下面代码是防止高电平超时
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

  

  if(htim->Instance == TIM5)

  {

    //printf("HAL_TIM_Period\r\n");

    if( (TIM5CH1_CAPTURE_STA&0x80) == 0 )

    {

      if( (TIM5CH1_CAPTURE_STA&0x40) )

      {

        if( (TIM5CH1_CAPTURE_STA&0x3f) == 0x3f)

        {

          TIM5CH1_CAPTURE_STA |= 0x80;

          TIM5CH1_CAPTURE_VAL = 0XFFFFFFFF;

        }

        else

        {

          TIM5CH1_CAPTURE_STA++;

        }

      }

    }

  }

  

}
下面代码是trig引脚发送脉冲信号,开始测距
void TrigPlus(uint16_t xus)

{

  HAL_GPIO_WritePin(GPIOF,GPIO_PIN_7,GPIO_PIN_SET);

  delay_us(xus);

  HAL_GPIO_WritePin(GPIOF,GPIO_PIN_7,GPIO_PIN_RESET);

}

以下代码是获取了echo反馈信号,把时间转化为距离:距离=高电平时间*声速(340M/S)/2 并通过串口打印数值
TrigPlus(20); 
if( (TIM5CH1_CAPTURE_STA&0x80) )

    {

      TIM5temp = TIM5CH1_CAPTURE_STA&0x3f;

      TIM5temp *= 0xFFFFFFFF;

      TIM5temp += TIM5CH1_CAPTURE_VAL;

      printf("TIM5 Channel_1 Capture rising : %d us \r\n", TIM5temp);

      EchoDis = ((double)TIM5temp)/5.80;     //距离=高电平时间*声速(340M/S)/2

                                           //1m=1000mm

                                          //为什么除以58等于厘米,  Y米=(X秒*344)/2

			                 // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58 

      printf("HC-SR04 Dis : %f cm \r\n",EchoDis);

      TIM5CH1_CAPTURE_STA = 0;

      TIM5temp = 0;

      BLUE_LED(0);

    }
连接运行效果如下所示: 下面是测试输入捕获运行正常 这是利用超声波模块测的数据 实际测试了测试距离,准确度还是可以的,但是当模块倾斜时,误差就非常大。
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子