测距的方案非常多,但是最为经济的还得是超声波测距,但是远距离的超声波测距模块在市场上还是比较少见,所以我打算制作一个基于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的远程超声波测距仪具有测量准确、稳定可靠、易于扩展等优点,在实际应用中具有广泛的前景和价值。