一、超声波模块

一、SR04超声波模块

说明:

原理

(1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信呈。(即mcu输出一个高电平持续10us脉冲信号。)

(2)ECHO引脚自动发送 8 个 40khz 的方波,自动检测是否有信号返回;有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;

(即:通过mcu检测该引脚的电平状态。)

修改配置systick

配置tim:

c 复制代码
/* 	滴答定时器配置1ms 
	SystemCoreClock/1000    1ms中断一次
	SystemCoreClock/100000	 10us中断一次
	SystemCoreClock/1000000 1us中断一次
 */
  HAL_SYSTICK_Config(SystemCoreClock/(1000000));
  /* 系统滴答定时器时钟源 */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  /* 系统滴答定时器中断优先级配置 */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
	

  uint64_t count=0;
  uint64_t time_end=0;

//定时器配置,设定一个10us的更新中断。
  htim4.Instance = TIM4;
  htim4.Init.Prescaler = 120-1;//1hmz=1us
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim4.Init.Period = 10-1;//10 us

  HAL_TIM_Base_Start_IT(&htim4);
//在中断回调里进行自加处理
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* 根据形参判断进入回调函数的是哪个定时器 */
  if(htim == &htim4)
  {
		count++;
  }
}

int16_t sonar_mm(void)		//测距并返回单位为毫米的距离结果
{
	uint32_t Distance,Distance_mm = 0;
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_SET);					//输出高电平
	HAL_Delay(15);//延时15微秒
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_RESET);				//输出低电平
	while( HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_1)==0);//等待低电平结束
	count=0;//计时清零
	while(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_1)==1);//等待高电平结束
	time_end=count;	//记录结束时的时间
	if(time_end/100<38)		//判断是否小于38毫秒,大于38毫秒的就是超时,直接调到下面返回0
	{
		Distance=(count*346)/2;	//计算距离,25°C空气中的音速为346m/s
		Distance_mm=Distance/100;	//因为上面的time_end的单位是10微秒,所以要得出单位为毫米的距离结果,还得除以100
	}

	return Distance_mm;	//返回测距结果
}

float sonar(void)	//测距并返回单位为米的距离结果
{
	uint32_t Distance,Distance_mm = 0;
	float Distance_m=0;
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_SET);//输出高电平
	HAL_Delay(15);//延时15微秒
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_RESET);						//输出低电平
	while( HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_1)==0);//等待低电平结束
	count=0;//计时清零
	while(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_1)==1);//等待高电平结束
	time_end=count;		
	if(time_end/100<38)
	{
		Distance=(time_end*346)/2;
		Distance_mm=Distance/100;
		Distance_m=Distance_mm/1000;
	}

	return Distance_m;
}
相关推荐
代码游侠6 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
xuxg20058 小时前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
CODECOLLECT10 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen10 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
全栈游侠13 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
Lsir10110_13 小时前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
深圳市九鼎创展科技15 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计16 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
風清掦17 小时前
【江科大STM32学习笔记-05】EXTI外部中断11
笔记·stm32·学习
小龙报17 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机