红外超声波雷达

一. 采用stm32F103和HC-SR04超声波模块, 使用标准库或HAL库+ 定时器中断,完成1或2路的超声波障碍物测距功能。

CubeMX配置:

1、RCC配置外部高速晶振——HSE

2、SYS配置:Debug设置成Serial Wire

ADC1配置:配置ADC-IN1模数转换


TIM2配置:设置定时器TIM2每1us向上计数一次,通道1为上升沿捕获并连接到超声波模块的ECHO引脚

GPIO配置:PA5接到了HC-SR04的TRIG触发引脚,默认输出低电平

TIM1配置:由上面可知HC-SR04的使用需要us级的延迟函数,HAL库自带只有ms的,所以需要自己设计一个定时器

超声波模块代码

#include "SR04.h"

float distant;      //测量距离
uint32_t measure_Buf[3] = {0};   //存放定时器计数值的数组
float distances[5]={0};
uint8_t  measure_Cnt = 0;    //状态标志位
uint32_t high_time;   //超声波模块返回的高电平时间
uint8_t n=0;


//===============================================读取距离
void SR04_GetData(void)
{
switch (measure_Cnt){
	case 0:
         TRIG_H;
         delay_us(30);
         TRIG_L;
    
		measure_Cnt++;
		__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
		HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);	//启动输入捕获       或者: __HAL_TIM_ENABLE(&htim5);                                                                                    		
        break;
	case 3:
		high_time = measure_Buf[1]- measure_Buf[0];    //高电平时间
		distant=(high_time*0.00034)/2;  //单位cm
		distances[n]=distant;
		n++;
	   if(n>=5){// 采用1、4、6、4、1的高斯核进行滤波
		n=0;
		distant=(distances[0]+4*distances[1]+6*distances[2]+4*distances[3]+distances[4])/16;
			printf("\r\n检测距离为:%.2f-cm-\r\n",distant);
		 }
		measure_Cnt = 0;  //清空标志位
        TIM2->CNT=0;     //清空计时器计数
		break;
				
	}
}


//===============================================us延时函数
    void delay_us(uint32_t us)//主频72M
{
    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
    while (delay--)
	{
		;
	}
}

//===============================================中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//
{
	
	if(TIM2 == htim->Instance)// 判断触发的中断的定时器为TIM2
	{
		switch(measure_Cnt){
			case 1:
				measure_Buf[0] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//获取当前的捕获值.
				__HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);  //设置为下降沿捕获。
				measure_Cnt++;                                            
				break;              
			case 2:
				measure_Buf[1] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//获取当前的捕获值.
				HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_1); //停止捕获   或者: __HAL_TIM_DISABLE(&htim5);
				measure_Cnt++;  
                        
		}
	
	}
	
}

效果展示

二. 当前智能汽车上一般配置有12路超声波雷达,这些专用超声波雷达内置了MCU,直接输出数字化的测距结果,一般硬件接口采用串口RS485,通信协议采用modbus。请思考:

1)RS485与RS232(UART)有什么不同?

1. 通信方式

RS485:

差分信号传输:使用一对平衡信号线(A和B)进行差分传输,可以有效抵抗电磁干扰,提高通信可靠性。
多点通信:支持多点总线结构,最多可以连接32个驱动器和32个接收器(有扩展可支持更多设备)。
半双工/全双工:通常采用半双工通信(两线制),但也可以实现全双工通信(四线制)。

RS232:
单端信号传输:使用单端信号传输,相对于地传输信号,抗干扰能力较差。
点对点通信:只能实现点对点通信,通常只连接两个设备(一个发送,一个接收)。
全双工:可以同时发送和接收数据。

2. 信号电平

RS485:
差分信号电平:典型情况下,差分电压在+5V和-5V之间。
RS232:
单端信号电平:逻辑高电平(通常为-3V到-15V),逻辑低电平(通常为+3V到+15V)。

3. 传输速率

RS485:
支持较高的传输速率,通常可以达到10 Mbps(距离越短速率越高)。
RS232:
传输速率较低,通常为115200 bps,最高可达1 Mbps(距离越短速率越高)。


2)Modbus协议是什么?


Modbus协议是一种用于电子控制器之间通信的开放式协议,最早由Modicon(现为施耐德电气的一部分)在1979年开发。它已成为工业自动化和控制系统中广泛使用的通信标准。Modbus协议主要用于连接监控计算机与远程终端单元(RTU),以及不同种类的传感器和仪表之间的数据交换。

Modbus协议的主要特点


开放性:Modbus是一个开放协议,这意味着任何制造商都可以免费使用它来开发自己的Modbus设备。

简单性:Modbus协议相对简单,易于实现,特别适合资源有限的嵌入式系统。

灵活性:Modbus可以在多种通信介质上传输,包括串行通信(RS232、RS485)、以太网(Modbus TCP/IP)、以及通过各种无线技术。

Modbus的通信方式


Modbus RTU(Remote Terminal Unit):

传输方式:使用RS232或RS485串行通信。
数据帧格式:数据以二进制形式传输,包含地址、功能码、数据、校验码(CRC)等字段。
适用场景:多用于工业现场,支持远距离和多点通信。
Modbus ASCII:

传输方式:使用RS232或RS485串行通信。
数据帧格式:数据以ASCII码形式传输,每个字节用两个ASCII字符表示,具有起始符(冒号)、地址、功能码、数据、校验码(LRC)、结束符(回车换行)。
适用场景:较少使用于工业现场,通常在一些需要与人进行交互或需要易读性的场景中使用。
Modbus TCP/IP:

传输方式:使用以太网通信。
数据帧格式:封装在TCP/IP报文中,适用于以太网环境。
适用场景:工业自动化系统中需要快速、可靠的通信,常用于PLC、HMI、SCADA系统之间的数据交换。

Modbus协议的工作模式

主/从(Master/Slave)模式

主设备(Master)发起通信,发送请求,等待从设备(Slave)的响应。
从设备(Slave)被动响应主设备的请求,不能主动发送数据。
适用于Modbus RTU和Modbus ASCII通信模式。
客户端/服务器(Client/Server)模式:

客户端(Client)发起通信,发送请求,服务器(Server)被动响应。
适用于Modbus TCP/IP通信模式。

Modbus帧结构

Modbus通信中的数据帧结构大致如下:

地址域:标识目标设备的地址。
功能码:表示执行的操作,例如读写寄存器。
数据域:包含具体的操作数据。
错误校验码:用于检测通信错误(如CRC或LRC)。


Modbus协议的应用

工业自动化:广泛用于PLC、DCS、SCADA系统的集成和数据交换。
能源管理:电力监控系统、智能电表等。
过程控制:工厂自动化、过程监控、传感器数据采集。


3)如果让你设计一款 12路车载超声波雷达,采用 stm32F103+HC-SR04超声波模块,对外提供RS485和Modbus协议,你的设计方案是什么?


设计一款12路车载超声波雷达系统,采用STM32F103微控制器和HC-SR04超声波模块,并对外提供RS485和Modbus协议通信,涉及多个硬件和软件层面的细节。以下是一个详细的设计方案:

a、硬件设计


1. 主要组件
微控制器:STM32F103
超声波模块:12个HC-SR04
RS485收发器:如MAX485
电源管理:稳压电源模块,为系统提供稳定的5V和3.3V电压
其他:电容、电阻、连接线等
2. 硬件连接
HC-SR04超声波模块连接:

每个HC-SR04模块需要连接4个引脚:VCC、GND、Trig和Echo。
VCC和GND连接到电源和地。
Trig和Echo引脚分别连接到STM32F103的GPIO引脚。
RS485通信模块连接:

使用MAX485或类似的RS485收发器模块。
收发器的DE和RE引脚可以连接在一起,由STM32F103的GPIO控制(使能和禁用)。
DI引脚连接到STM32F103的UART TX引脚,RO引脚连接到STM32F103的UART RX引脚。
电源管理:

使用DC-DC稳压模块将车载电源(如12V)降压到5V,用于供电HC-SR04模块和STM32F103。
可能需要进一步降压到3.3V供电STM32F103(如果它需要3.3V)。

b、软件设计

1. STM32F103固件开发
开发环境:使用Keil uVision或STM32CubeIDE。

外设初始化:

初始化GPIO,用于HC-SR04模块的Trig和Echo引脚。
初始化USART,用于RS485通信。
初始化定时器,用于测量HC-SR04的回声脉冲宽度。
超声波测距功能:

为每个HC-SR04模块配置一个Trig引脚和一个Echo引脚。
通过Trig引脚发送10µs的高电平脉冲,触发超声波发送。
使用定时器捕获Echo引脚的高电平持续时间,并计算距离。
多路超声波测距:

采用轮询或定时触发方式,逐个触发12个HC-SR04模块,并读取测量结果。
2. Modbus协议实现
Modbus RTU协议栈:

实现Modbus RTU主/从模式(通常作为从设备)。
实现基本的Modbus功能码,例如读取保持寄存器(0x03)、写单个寄存器(0x06)、写多个寄存器(0x10)等。
数据处理和存储:

将超声波测得的距离数据存储在特定的寄存器中,以便通过Modbus协议读取。
每个HC-SR04模块对应一个或多个寄存器。
RS485通信:

实现RS485收发控制,在发送数据前使能发送,在接收数据后禁用发送。
处理Modbus请求和响应,通过RS485接口进行数据交换。

  • 13
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于STM32的超声波雷达检测系统是一种利用STM32微控制器和超声波传感器技术结合的新型检测系统。该系统通过发送超声波脉冲并测量它们被目标物体反射回来的时间来实现距离测量。与传统的红外线或激光雷达相比,超声波雷达具有成本低廉、反射目标大和测距精度高等优点,因此在自动驾驶汽车、智能家居和工业自动化等领域有着广泛的应用前景。 STM32微控制器作为系统的核心,具有强大的计算和控制能力,能够实现超声波信号的快速处理和数据的准确采集。超声波传感器则用于发射和接收超声波信号,并将接收到的信号转换为距离信息。通过STM32微控制器的编程,可以实现对超声波传感器的驱动和信号处理,实现对目标物体的距离测量和位置检测,从而为用户提供准确的检测数据。 除了距离测量外,基于STM32的超声波雷达检测系统还可以实现障碍物检测、环境监测和目标跟踪等功能。通过合理的算法设计和STM32的高性能计算能力,系统可以实时地对检测到的数据进行处理和分析,提供及时的反馈和控制。这将为各种智能设备和系统的应用提供可靠的支持,丰富了物联网和智能化技术的应用领域。 总之,基于STM32的超声波雷达检测系统不仅具有较高的测距精度和对目标反射能力,还能实现多种功能的检测和应用,具有很大的市场潜力和发展前景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值