• 3
    回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

【 DigiKey DIY原创大赛】-基于STM32G030的远程超声波测距仪

测距的方案非常多,但是最为经济的还得是超声波测距,但是远距离的超声波测距模块在市场上还是比较少见,所以我打算制作一个基于STM32G030的远程超声波测距模块,可以完成在1千米以内的通信距离,测量距离可以从20cm-300cm的模块,解决超声波测距仪的远程通信问题。这样的话就可以实现多个位置、远距离的超声波测距的需求。整个模块支持RS485通信接口,支持Modbus-RTU 协议,可以通过上位机远程读取工作。同时还可以实现超声波矩阵、超声波测距网络的敷设,应用与各个行业中。

基于STM32G030的远程超声波测距仪是一种利用超声波技术进行距离测量的设备,其核心在于STM32G030微控制器与超声波传感器的协同工作。

一、工作原理

超声波测距仪通过超声波传感器发射超声波脉冲,并接收由目标反射回来的回波。根据超声波在空气中的传播速度和时间差(发射到接收的时间),可以计算出目标与传感器之间的距离。计算公式为:距离=声速×时间差/2(因为超声波需要往返)。

二、硬件组成

STM32G030微控制器:作为测距仪的核心控制单元,负责控制超声波传感器的发射与接收、处理数据以及输出结果。超声波传感器:通常采用分体式模块(如HC-SR04),由超声波发射头和接收头组成。发射头负责发射超声波脉冲,接收头则负责接收反射回来的回波。电源模块:为STM32G030微控制器和超声波传感器提供稳定的电源供应。显示模块(可选):用于显示测量结果,如LCD或OLED显示屏。通信模块(可选):如Wi-Fi、蓝牙等,用于将测量结果远程传输至其他设备或云平台。

原理图

PCB 示意图

三、软件设计

STM32CubeMX配置

选择STM32G030芯片,配置系统时钟、GPIO引脚(用于连接超声波传感器的Trig和Echo引脚)、定时器等外设。配置定时器为微秒级计数器,用于测量超声波的传输时间。

代码编写

初始化STM32G030微控制器和超声波传感器。编写超声波发射与接收的逻辑代码,包括发送Trig信号、检测Echo信号的上升沿和下降沿、读取定时器计数值等。根据读取的定时器计数值和声速计算距离。将计算结果通过显示模块显示出来或通过通信模块远程传输。

主函数的处理如下

void get_Data(struct CSB_Get  *CSB_Struct)
{
	int i=0;
  unsigned int Status=CSB_Struct->Stttus;
	unsigned int Data=0;
	if(CSB_Struct->Channel_Count>CSB_Struct->Channel_MAX)
		{
				CSB_Struct->Channel_Count=0;/*-- 如果当前通道计数大于 最大通道--那么这次就作废---*/
				return ;
		}
	else
		{
				switch(Status)
				{
					
					/*--------*/
					case Status_Ideal:/*--数据采集之前的数据初始化工作 ---*/
					{   
							for(i=0;i<CSB_Struct->Channel_MAX;i++)
							{
								CSB_Struct->CSB_Data_Stable[i]=CSB_Struct->CSB_Curent_Data[i];
								SysTemInfo.Sys_Data.CSB_Data[i]=CSB_Struct->CSB_Curent_Data[i]/1000;
							}
							select(CSB_Struct->Channel_Count);                    /*-- 选择发送通道 --*/                              
							CSB_Struct->TimeOut_Flag=0;                           /*-- 超时标志清零--*/
							CSB_Struct->UART_GetData_Flag=0;                      /*-- 串口接收数据标志清零--*/
							CSB_Struct->Uart_GetData_Count=0;                     /*-- 串口接收数量计数清零 ---*/
							CSB_Struct->CSB_Curent_Data[CSB_Struct->Channel_Count]=0;/*当前通道长度清零--*/
						  CSB_Struct->TimeStart_Flag=1;
						  CSB_Struct->TimeOutCount=0;
							CSB_Struct->Uart_Data[0]=0;
							CSB_Struct->Uart_Data[1]=0;
							CSB_Struct->Uart_Data[2]=0;
						  CSB_Struct->Stttus=Status_SendCND;

						
					}break;
					case Status_SendCND:
					{   
							select(CSB_Struct->Channel_Count);                    /*-- 选择发送通道 --*/
						  Send_Cmd();                                           /*-- 发送超声波的数据采集命令 --*/
              timer_enable(TIMER1);                                 /*-- 开启定时器  -------*/
							CSB_Struct->Uart_Data[2]=0;
						CSB_Struct->Stttus=Status_WaitReply;
						
					}break;
					case Status_WaitReply :
					{
					  if(CSB_Struct->UART_GetData_Flag==1)
						{
							Data  =(Data|(CSB_Struct->Uart_Data[0]<<16) |(CSB_Struct->Uart_Data[1]<<8)|(CSB_Struct->Uart_Data[2]));
							CSB_Struct->CSB_Curent_Data[CSB_Struct->Channel_Count]=Data;
							CSB_Struct->Channel_Count++;
							CSB_Struct->Stttus=Status_Ideal;
						}
						/*-- 如果超时 --*/
						if(CSB_Struct->TimeOut_Flag==1)
						{
						   CSB_Struct->Stttus=Status_TimeOut;
						}
					
					
					}break;
					case Status_TimeOut:  /*-- 直接跳转到空闲模式,继续下一个通道的测量 ----*/
					{
						
						CSB_Struct->Channel_Count++;
						CSB_Struct->TimeStart_Flag=0;
						CSB_Struct->TimeOutCount=0;
						timer_disable(TIMER1);                                 /*-- 开启定时器  -------*/
					  CSB_Struct->Stttus=Status_Ideal;
					}break;
					/*--------*/
					default:
					{
							CSB_Struct->TimeOut_Flag=0;                           /*-- 超时标志清零--*/
							CSB_Struct->UART_GetData_Flag=0;                      /*-- 串口接收数据标志清零--*/
							CSB_Struct->Uart_GetData_Count=0;                     /*-- 串口接收数量计数清零 ---*/
							CSB_Struct->Uart_Data[0]=0;
							CSB_Struct->Uart_Data[1]=0;
							CSB_Struct->Uart_Data[2]=0;
						  CSB_Struct->Channel_Count=0;
						  CSB_Struct->TimeStart_Flag=0;
						  timer_disable(TIMER1);                                 /*-- 开启定时器  -------*/
					}
				}
    }

}
/*-------------------------------------------------------------------------------------
==  函数名    : 
==  描  述    : 
==  输入参数  :
==  返回值    :NULL
==  备  注    :NULL
---------------------------------------------------------------------------------------
*/
void CSB_Init(struct CSB_Get  *CSB_Struct)
{                        
	CSB_Struct->TimeOut_Flag=0;                           /*-- 超时标志清零--*/
	CSB_Struct->UART_GetData_Flag=0;                      /*-- 串口接收数据标志清零--*/
	CSB_Struct->Uart_GetData_Count=0;                     /*-- 串口接收数量计数清零 ---*/
	CSB_Struct->CSB_Curent_Data[CSB_Struct->Channel_Count]=0;/*当前通道长度清零--*/
	CSB_Struct->Uart_Data[0]=0;
	CSB_Struct->Uart_Data[1]=0;
	CSB_Struct->Uart_Data[2]=0; 
	CSB_Struct->Channel_MAX=8;                       /*--  设置最大通道数量为8  --*/
	CSB_Struct->TimeOutSet=100;                      /*--  设置超时时间为100ms  --*/
	CSB_Struct->Channel_Count=0;                     /*--  设置当前通道为通道1 ---*/

}

四、性能优化与注意事项

提高测量精度

选用高精度的超声波传感器和定时器。考虑温度对声速的影响,进行温度补偿。

减少盲区

分体式超声波传感器的盲区较小(约2cm),适用于近距离测量。如需减小盲区,可考虑使用更高频率的超声波或优化传感器设计。

避免干扰

确保超声波传感器周围无其他干扰源(如其他超声波设备、强磁场等)。在测量过程中保持传感器与目标之间的直线传播路径。

低功耗设计

通过优化代码和硬件配置实现低功耗运行。在不需要测量时关闭不必要的外设和模块以降低功耗。

五、应用场景

基于STM32G030的远程超声波测距仪可广泛应用于工业自动化、机器人导航、智能家居、环境监测等领域。例如,可用于测量机器人与障碍物之间的距离以实现自主避障;或用于监测水位、距离等参数以实现智能控制。

综上所述,基于STM32G030的远程超声波测距仪具有测量准确、稳定可靠、易于扩展等优点,在实际应用中具有广泛的前景和价值。

全部回复(3)
正序查看
倒序查看
小张张
LV.1
2
11-25 16:36

欢迎大家多多交流啊!

0
回复
小张张
LV.1
3
11-25 16:36

资料都是可以开源的,欢迎大家一起讨论学习。

0
回复
miky1188
LV.6
4
11-27 13:31

不错!

0
回复