一、超声波模块

一、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;
}
相关推荐
典则15 分钟前
STM32FreeRtos入门(四)——任务状态和调度
stm32·单片机·嵌入式硬件
充哥单片机设计21 分钟前
【STM32项目开源】基于STM32的智能天然气火灾监控
stm32·单片机·嵌入式硬件
充哥单片机设计24 分钟前
【STM32项目开源】基于STM32的智能仓库火灾检测系统
stm32·单片机·嵌入式硬件
就叫飞六吧2 小时前
普中stm32大Dap烧录流程
stm32
A9better3 小时前
嵌入式开发学习日志38——stm32之看门狗
stm32·嵌入式硬件·学习
小莞尔3 小时前
【51单片机】【protues仿真】基于51单片机智能路灯控制系统
c语言·stm32·单片机·嵌入式硬件·51单片机
辰哥单片机设计13 小时前
TT直流减速电机(STM32)
stm32
A9better13 小时前
嵌入式开发学习日志36——stm32之USART串口通信前述
stm32·单片机·嵌入式硬件·学习
思诺学长13 小时前
BMS(电池管理系统)的主要功能和架构简述
单片机·嵌入式硬件
czhaii14 小时前
全局不关总中断的 RTOS / CosyOS-II for STCAI MCU
单片机