首页 > 其他分享 >STM32驱动HC-SR04 超声波测距模块(HAL)

STM32驱动HC-SR04 超声波测距模块(HAL)

时间:2022-12-08 19:58:07浏览次数:108  
标签:capture SR04 HAL 捕获 STM32 TIM USER htim1

 输入捕获主要参考这位大佬

链接:https://blog.csdn.net/as480133937/article/details/99407485

一、HC-SR04简单介绍

HC-SR04超声波模块常用于机器人避障、物体测距、液位检测、公共安防、停车场检测等场所。HC-SR04超声波模块主要是由两个通用的压电陶瓷超声传感器,并加外围信号处理电路构成的.

实物图:

 

接口定义:

序号 接口定义 说明
1 Vcc 供电电源
2 Trig 触发信号
3 Echo 反馈信号
4 Gnd

新版的HC-SR04增加UART和IIC功能,但我是老版的的,只有GPIO模式。

GPIO模式:

 

 外部单片机给模块Trig脚一个大于10 US的高电平脉冲;模块Echo脚会给出一个与距离等比的高电平脉冲信
号,可根据脉宽时间“T”算出:
距离=T*C/2(C为声速)
声速温度公式:c= (331.45+0.61t  /°C) m/s(其中330.45是在0°C)
0°C声速:330.45M/S
20°C声速:342.62M/S
40°C声速:354.85M/S
0°C-40℃声速误差7%左右。实际应用,如果需要箱确距离值,必需要考虑温度影响.做温度补偿.

二 、STM32CubeMX设置

定时器1通道1开启输入捕获

 

PSC=71、重装值 :0xffff (65535)

 

 上升沿触发

开启中断

 再开启一个串口用来发送距离

 

三、代码

一些变量

/* USER CODE BEGIN PM */
uint32_t capture_Buf[3] = {0};   //存放计数值
uint8_t capture_Cnt = 0;    //状态标志位
uint32_t high_time;   //高电平时间
float    distance;   //距离
/* USER CODE END PM */

串口重定向

/* USER CODE BEGIN 0 */
void Usart3Printf(const char *format, ...)
{

 uint8_t UartTxBuf[100];
 uint16_t len;
 va_list args;
 va_start(args, format);
 len = vsnprintf((char*) UartTxBuf, sizeof(UartTxBuf) , (char*) format,args);
 va_end(args);
 HAL_UART_Transmit(&huart3, UartTxBuf, len,1000);
}
/* USER CODE END 0 */

 

 全部的函数

  /* USER CODE BEGIN WHILE */
  while (1)
  {
      switch (capture_Cnt){
      case 0:
        SR04_Start();
         capture_Cnt++;
        __HAL_TIM_SET_CAPTUREPOLARITY(&htim1, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
        HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1);    //启动输入捕获       或者: __HAL_TIM_ENABLE(&htim1);
        break;
        
      case 3:
        high_time = capture_Buf[1]- capture_Buf[0];    //高电平时间
        distance = (high_time / 1000000.0) * 340.0 / 2.0 * 100.0;
        Usart3Printf("%.2f cm\n",distance)    ;
        
        HAL_Delay(1000);   //延时1S
        capture_Cnt = 0;  //清空标志位        
        break;
                
    }

    /* USER CODE END WHILE */

 

/* USER CODE BEGIN 4 */

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    
    if(htim->Instance==TIM1)
    {
          switch(capture_Cnt){
            case 1:
            capture_Buf[0] = HAL_TIM_ReadCapturedValue(&htim1,TIM_CHANNEL_1);//获取当前的捕获值.
            __HAL_TIM_SET_CAPTUREPOLARITY(&htim1,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);  //设置为下降沿捕获
            capture_Cnt++;
            break;
            case 2:
            capture_Buf[1] = HAL_TIM_ReadCapturedValue(&htim1,TIM_CHANNEL_1);//获取当前的捕获值.
            HAL_TIM_IC_Stop_IT(&htim1,TIM_CHANNEL_1); //停止捕获   或者: __HAL_TIM_DISABLE(&htim1);
            capture_Cnt++;    
        }
    
    }
    
}

/* USER CODE END 4 */

 

具体流程:

1.设置TIM1 CH1为输入捕获功能;

2.设置上升沿捕获;

3.使能TIM1 CH1捕获功能;

4.捕获到上升沿后,定时器当前计数值存入capture_buf[0],改为捕获下降沿;

5.捕获到下降沿后,定时器当前计数值存入存入capture_buf[1],关闭TIM2 CH1捕获功能; capture_Cnt=3;

6. 高电平时间: capture_buf[1] - capture_buf[0]   计算  distance = (high_time / 1000000.0) * 340.0 / 2.0 * 100.0;  发送到上位机 重新启动输入捕获

四、串口显示

 

可以测量距离,有时会出现73013376.00 cm错误数据,没找到原因。

 

 


 

 

标签:capture,SR04,HAL,捕获,STM32,TIM,USER,htim1
From: https://www.cnblogs.com/CC-C/p/16966981.html

相关文章

  • STM32CubeIDE COMP与DAC配合使用
    1、配置DAC  2、配置COMP,COMP1_INP设置成SwtichwithDAC_OUT1使两者内部相连,即外部输入引脚COMP1_INM会与DAC_OUT1引脚的电平比较,大于或者小于设定DAC电压阈值会触......
  • MicroPython——将固件烧写到STM32开发板上
    博主是在win10环境下,将MicroPython固件烧录到stm32F407开发板上。因为博主想学一波STM32F407,有python基础,但c语言基础一般,觉得学库函数觉得太过复杂,且以后方向可能不太搞嵌......
  • (转)理解Heap Profling名词-Shallow和Retained Sizes
    ​​http://rdc.taobao.com/team/jm/archives/900​​​有包含HeapProfling功能的工具(MAT,Yourkit,JProfiler,TPTP等)都会使用到两个名词,一个是S......
  • stm32f407VE6 点亮一个流水灯完整程序
    include"stm32f4xx.h"#include"delay.h"intmain(){//***-必须初始化延时函数-***delay_init(168);//初始化延时函数//第一步:首先配置......
  • Halcon探索学习 | 3 数据类型
    halcon数据类型:A.object图形参数(图像image、区域region、轮廓xld)图像image: 1.通道count_channels(image1,Channels) 2.大小get_image_size(image1,Wid......
  • HMI智能串口屏——在STM32开发板上的实战应用及其详解
    HMI智能串口屏——在STM32开发板上的实战应用及其详解​​一、HMI智能串口屏使用步骤​​​​二、附录​​一、HMI智能串口屏使用步骤安装USARTHMI软件(一般买的串口屏里......
  • Halcon快速入门
    前言一,HALCON概述1.1,HALCON安装二,HALCON架构2.1,算子2.1.1,参数和数据结构2.2,拓展包2.3,接口2.3.1,HALCON-Python接口2.3.2,HALCON-C接口2.3.3,HALCON-C++......
  • 串口基础 (HAL)
    一、扫描模式CubMAX配置介绍:模式选择:Asynchronous 异步通信Synchronous 同步通信SingleWire(Half-Duplex)单线/半双工MultiprocessorCommunication多处理......
  • cv2.resize函数报错:error: (-215:Assertion failed) func != 0 in function ‘cv::hal
    文章目录​​报错​​​​错误代码​​​​解决​​报错在使用cv2.resize()对图片调整大小时遇到了以下错误。img_array=cv2.resize(img_array,(1024,1024))cv2.error:......
  • 暴力升级你的 ST-Link 及 STM32CubeIDE
    原文https://github.com/armink/HackSTLinkUpgrade背景一些ST-Link在使用最新的IDE时,经常提示需要升级其固件,但是升级始终失败,提示容量不足。在KeilMDK上可能就......