智能车 有来有往 单收单发超声波模组 STM32CubeMx HAL库

运行环境

  • Windows10
  • STM32CubeMX___Version 6.1.0
  • Keil5(MDK5)___Version 5.27

简介

这是一个针对智能车 有来有往 单收单发超声波模组的一个教程


 模组图片

智能车 有来有往 单收单发超声波模组 STM32CubeMx HAL库_第1张图片

一、参数简介

最远接收距离:
>5 米
最短接收距离:
<4 厘米
最大接收角度:
>90 度
数据波动范围:
<3 毫米
模块工作电压:
5V
模块工作方式:
串口
模块发送频率:
50HZ
模块通信波特率:
115200

二、使用过程

发送超声波模块: 发送超声波模块 只需要上电即可。 发送超声波模块 上电后,
送超声波模块 上的 LED 会快闪,此时证明, 发送超声波模块 已经在正常工作了。
(注: 发送超声波模块 上面留有了 RX TX,这是用来刷超声波固件。)
接收超声波模块: 发送超声波模块 通上电之后。
需要将 发送超声波模块 接收超声波模块 对准,此时 接收超声波模块 需上的 LED
会快闪。
此时证明 接收超声波模块 已经接收到 发送超声波模块 发射的超声波。
此时 接收超声波模块 上接收到的数据即是发送和接收超声波的距离数据。
值得注意的是,2 个超声波发射头需要对准,才会通信成功, 发送超声波模块
需上电即可工作(发送上的 LED 闪烁),此时只是证明了 发送超声波模块 已经成
功发射出超声波,但并不能证明 接收超声波模块 会接收到数据,只有接收到 发送
超声波模块 的声波后, 接收超声波模块 上的 LED 闪烁后,才能证明这两者已经通
信成功。 接收超声波模块 才会有距离数据输出。

三. 数据格式

接收超声波 已经接收到 发送超声波 的数据后, 接收超声波 模块上的
LED 灯会快速闪烁,会通过串口以 50Hz 的频率发送出距离数据。
数据格式是:0XA5+两个字节数据(16 进制),距离的单位是 mm,
例如:返回数据是: A5
00 C8,意思就是:200mm。
数据的含义是什么呢?
0XA5 是帧头,另外 2 个是数据存储字节。
A5
00
C8
帧头
高八位数据存储字节
低八位数据存储字节
如何解算:很简单,把 2 个字节数据移位然后逻辑运算即可。
如下:
distance_left = dat_left[1]<<8 | dat_left[2];

四、STM32CubeMx的配置

1、开启时钟 

智能车 有来有往 单收单发超声波模组 STM32CubeMx HAL库_第2张图片

2、下载配置

智能车 有来有往 单收单发超声波模组 STM32CubeMx HAL库_第3张图片

3.开启一个串口

智能车 有来有往 单收单发超声波模组 STM32CubeMx HAL库_第4张图片

4.打开NVIC

智能车 有来有往 单收单发超声波模组 STM32CubeMx HAL库_第5张图片

五、代码详解

 1.头文件包含

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

 2.变量定义,以及中断逻辑处理

/* USER CODE BEGIN 0 */
 unsigned char   dat_left[3];							//存放超声波串口接收的字节数
 unsigned char   num_left;			 							//超声波数据接收变量
 int            distance_left;					//计算出来的距离

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if( huart == &huart2 )
	{
		HAL_UART_Receive_IT(&huart2,&dat_left[num_left],sizeof (num_left));
		
			if(dat_left[0] != 0xA5)
		{
					num_left = 0;
		}
		else 
			num_left++;
			
    if(num_left==3)
		{
			    num_left = 0;
					distance_left = dat_left[1]<<8 | dat_left[2]; 
		}
}
}


#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);//注意把&huart1改为自己的stm32使用的串口号
 
	return ch;
}


/* USER CODE END 0 */

3.开启中断接受

  /* USER CODE BEGIN 2 */

	HAL_UART_Receive_IT(&huart2,&dat_left[num_left],sizeof (num_left));
  /* USER CODE END 2 */

4.连续接受

  while (1)
  {

		printf("distance_left=%d\r\n",distance_left);
		HAL_Delay (100);
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

六、总结

市面上大部分的 智能车的单收单发模组原理都一样,最关键的是掌握核心串口处理函数,切勿急躁,静心能事半功倍,欲速则不达。

你可能感兴趣的:(stm32,嵌入式硬件,物联网,单片机,arm)