【鸿蒙开发】Hi3861学习笔记-超声波测距
00. 目录
文章目录
- 00. 目录
- 01. HC-SR04概述
- 02. HC-SR04参数
- 03. HC-SR04工作原理
- 04. HC-SR04时序
- 05. 硬件接线
- 06. 软件设计
- 07. 运行结果
- 08. 附录
01. HC-SR04概述
HC-SR04是一种基于超声波原理的非接触式距离测量模块,广泛用于机器人导航、障碍物检测等场景。其通过发射与接收超声波计算时间差实现测距,成本低廉且易于集成。
02. HC-SR04参数
核心特性
- 非接触测量:无需物理接触目标物,适用于灰尘、透明物体等复杂环境。
- 工作电压:5V DC,兼容Arduino、树莓派等开发板。
- 接口方式:双数字信号引脚(Trig触发测距,Echo接收回波),逻辑电平兼容3.3V/5V系统。
- 低功耗:静态电流<2mA,触发时约15mA。
技术参数
- 测量范围:2cm–400cm(理论值),实际有效范围约2cm–200cm。
- 分辨率:1mm(受环境噪声影响)。
- 测量精度:±3mm(理想条件下,温度补偿关闭时)。
- 波束角度:约15°锥形扩散,指向性较优。
- 响应时间:最小测量间隔≥60ms(防止声波干扰)。
- 工作温度:-15°C–70°C(低温可能影响声速计算)。
硬件结构
- 核心组件:
- 超声波发射器:40kHz频率超声波脉冲。
- 超声波接收器:捕捉反射波并转换为电信号。
- 控制电路:处理时序与信号放大。
- 引脚定义:
- VCC:5V供电。
- Trig:输入触发信号(10μs以上高电平)。
- Echo:输出高电平脉冲(持续时间与距离正相关)。
- GND:接地。
03. HC-SR04工作原理
1、利用IO口中Trig触发测距 ,要求:给出至少10us的高电平;
2、模块自动发出8个40KHz的方法,自动检测是否有信号返回;
3、有信号返回,通过IO口Echo输出一高电平;
4、高电平的时间超声波从发射到返回的时间,测试距离=(高电平时间*声速(340m/s))/2
04. HC-SR04时序
05. 硬件接线
06. 软件设计
bsp_sr04.h
#ifndef BSP_SR04_H
#define BSP_SR04_H#include "cmsis_os2.h"
#include "hi_io.h"
#include "hi_gpio.h"//管脚定义
#define TRIG_PIN HI_IO_NAME_GPIO_13
#define TRIG_GPIO_FUN HI_IO_FUNC_GPIO_13_GPIO#define ECHO_PIN HI_IO_NAME_GPIO_14
#define ECHO_GPIO_FUN HI_IO_FUNC_GPIO_14_GPIO#define TRIG(a) hi_gpio_set_ouput_val(TRIG_PIN,a)//函数声明
void sr04_init(void);
float sr04_read_distance(void);#endif
bsp_sr04.c
#include "bsp_sr04.h"
#include <unistd.h>
#include "hi_time.h"//超声波初始化
void sr04_init(void)
{hi_gpio_init(); // GPIO初始化// hi_io_set_pull(TRIG_PIN, HI_IO_PULL_UP); // 设置GPIO下拉hi_io_set_func(TRIG_PIN, TRIG_GPIO_FUN); // 设置IO为GPIO功能hi_gpio_set_dir(TRIG_PIN, HI_GPIO_DIR_OUT); // 设置GPIO为输出模式// hi_io_set_pull(ECHO_PIN, HI_IO_PULL_DOWN); // 设置GPIO下拉hi_io_set_func(ECHO_PIN, ECHO_GPIO_FUN); // 设置IO为GPIO功能hi_gpio_set_dir(ECHO_PIN, HI_GPIO_DIR_IN); // 设置GPIO为输入模式
}/******************************************************* 函数名 :GPIO_GetInputValue* 功能 :获取GPIO输入状态* 输入 :id, *val* 输出 :0/1*******************************************************/
hi_gpio_value ECHO = {0};
uint8_t GPIO_GetInputValue(hi_gpio_idx id,hi_gpio_value *val)
{hi_gpio_get_input_val(id,val);return *val;
}//读取超声波测量距离
//返回值:测量距离cm
float sr04_read_distance(void)
{static unsigned long start_time = 0, time = 0;float distance = 0.0;unsigned int flag = 0;TRIG(1); //拉高hi_udelay(20);TRIG(0); //拉低while(1){//判断高电平if(GPIO_GetInputValue(ECHO_PIN,&ECHO)==1 && flag==0){start_time = hi_get_us();//获取系统时间flag = 1;}//判断低电平if(GPIO_GetInputValue(ECHO_PIN,&ECHO)==0 && flag==1){time = hi_get_us() - start_time;//获取高电平持续时间break;}}//计算距离障碍物距离(340米/秒 转换为 0.034厘米/微秒, 2代表去来,两倍距离)distance = time * 0.034 / 2;return distance;
}
template.c
#include <stdio.h>
#include <unistd.h>#include "ohos_init.h"
#include "cmsis_os2.h"#include "bsp_led.h"
#include "bsp_sr04.h"//LED任务
osThreadId_t LED_Task_ID; //led任务IDvoid LED_Task(void)
{led_init();//LED初始化while (1) {LED(1); usleep(200*1000); //200msLED(0);usleep(200*1000); //200ms}
}
//LED任务创建
void led_task_create(void)
{osThreadAttr_t taskOptions;taskOptions.name = "LEDTask"; // 任务的名字taskOptions.attr_bits = 0; // 属性位taskOptions.cb_mem = NULL; // 堆空间地址taskOptions.cb_size = 0; // 堆空间大小taskOptions.stack_mem = NULL; // 栈空间地址taskOptions.stack_size = 1024; // 栈空间大小 单位:字节taskOptions.priority = osPriorityNormal; // 任务的优先级LED_Task_ID = osThreadNew((osThreadFunc_t)LED_Task, NULL, &taskOptions); // 创建任务1if (LED_Task_ID != NULL){printf("ID = %d, Create LED_Task_ID is OK!\n", LED_Task_ID);}
}//控制任务
osThreadId_t SR04_Task_ID; //任务IDvoid SR04_Task(void)
{uint8_t i=0;float dis=0;sr04_init();while (1) {i++;if(i%50==0){dis=sr04_read_distance();printf("检测距离:%.1fcm\r\n",dis);}usleep(10*1000); //10ms}
}
//任务创建
void sr04_task_create(void)
{osThreadAttr_t taskOptions;taskOptions.name = "sr04Task"; // 任务的名字taskOptions.attr_bits = 0; // 属性位taskOptions.cb_mem = NULL; // 堆空间地址taskOptions.cb_size = 0; // 堆空间大小taskOptions.stack_mem = NULL; // 栈空间地址taskOptions.stack_size = 1024*5; // 栈空间大小 单位:字节taskOptions.priority = osPriorityNormal1; // 任务的优先级SR04_Task_ID = osThreadNew((osThreadFunc_t)SR04_Task, NULL, &taskOptions); // 创建任务if (SR04_Task_ID != NULL){printf("ID = %d, SR04_Task_ID Create OK!\n", SR04_Task_ID);}
}/*** @description: 初始化并创建任务* @param {*}* @return {*}*/
static void template_demo(void)
{printf("-Hi3861开发板--HC-SR04超声波测距实验\r\n");led_task_create();sr04_task_create();//任务创建
}
SYS_RUN(template_demo);
07. 运行结果
08. 附录
下载:超声波测距资料(HC-SR04).rar