基于stm32的12路超声波雷达方案设计与RS485/Modbus集成


前言

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

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

2)Modbus协议是什么?

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


一、UART和RS232、RS485的关系

通讯问题,和交通是一样的。串口通信,我们这里可以用公交来类比。

在这里插入图片描述

公交运行可以简单分成两个部分:

1、车站

2、公路

其中车站决定了车上装什么(人),怎么发送(班次)等。

当汽车跑在路上,就要遵守公路交通的规则,过桥有过桥的规则,高速有高速的规则,和车站没有关系了。

回到串口通讯,其实,UART就相当于车站,而RS232/RS485则对应于公路的规则

1.1 UART

UART,是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),既然是“器”,显然,它就是个设备而已,要完成一个特定的功能的硬件,它本身并不是协议。那么它要完成什么功能呢?它的最基本功能,是串行数据并行数据之间的转换。我们知道,计算机中的数据以Byte为基本单位,对一个Byte的存取是并行的,即,同时取得/写入8个bit。而串行通信,需要把这个Byte“打碎”,按照时间顺序来收发以实现串行。例如:

内存中的数据是: 1 1 1 0 0 1 0 1

串行发送的实际效果是(按时间排序【注1】):
1

0

1

0

0

1

1

1

接收则是上述过程的逆过程。

这就是UART做的最基本工作,进一步的,它还要控制“发车的班次”,比如确认一个Byte的这8个bit是什么时候开始的,又是什么时候结束的,两个班次之间至少要隔多长时间的缓冲,等等。这一部分,也具有协议的特征,但是相对于道路上的协议,更具有一般性,或曰,是与车在什么道路上开,相对独立的。

那么道路上的规定是什么样的呢?

1.2 RS232/RS485

RS232/RS485,是两种不同的电气协议,也就是说,是对电气特性以及物理特性的规定,作用于数据的传输通路上,它并不内含对数据的处理方式。比如,最显著的特征是:RS232使用3-15v有效电平,而UART,因为对电气特性并没有规定,所以直接使用CPU使用的电平,就是所谓的TTL电平(可能在0~3.3V之间)。

更具体的,电气的特性也决定了线路的连接方式,比如RS232,规定用电平表示数据,因此线路就是单线路的,用两根线才能达到全双工的目的;而RS485, 使用差分电平表示数据,因此,必须用两根线才能达到传输数据的基本要求,要实现全双工,必需用4根线

但是,无论使用RS232还是RS485,它们与UART是相对独立的,但是由于电气特性的差别,必须要有专用的器件和UART接驳,才能完成数据在线路和UART之间的正常流动。
RS232甚至规定了接口的具体样式,例如为DB9接口

总结: 从某种意义上,可以说,线路上存在的仅仅是电流,RS232/RS485规定了这些电流在什么样的线路上流动和流动的样式;在UART那里,电流才被解释和组装成数据,并变成CPU可直接读写的形式。

注1】这里是例子是小端发送模式,是基本的串口传输方式,但是,大端模式的串口传输模式也是存在的,少见而已。

UART可以这样理解:每个SOC芯片,内部都会有UART控制器,也就是上面的“车站”。但是通常说的UART指的是,一种串行通信协议。规定了数据帧格式,波特率等。

RS232和RS485:是规定了数据通信的电气特性。是物理层的概念,对应的物理期间有RS232或者RS485驱动芯片,将CPU经过UART传送过来的电压信号驱动成RS232或者RS485电平逻辑

异步串口是目前工业设备最主要的通讯接口之一。在具体的工业现场中,串口的电气接口以RS232和RS485最为普遍。串口大多以TTL信号形式从板卡的管脚输入输出,客户需要在自己的应用底板上加入相应的驱动电路单元,以获得所需的串口接口,如RS232或RS485。在实际的应用中,由于现场的设备串口接口的情况并不确定,这样就要求客户设备同时具备RS232和RS485两种接口的功能。
RS232接口是采用正负电平单极性信号,一般以3线制的接口最为普遍,信号包括RS232_TX、RS232_RX及GND,具有全双工通讯能力RS485接口采用一对TTL电平差分信号RS485_D-和RS485_D+,只能半双工通讯,在通讯方向(接收或发送)的切换方面,一般有两种方式:一种方式是利用TTL_TXD经过一定处理作为方向控制,这种方式也称为自动方向切换方式;另一种方式是使用串口的RTS控制线来控制方向,RTS有效时处于发送状态,无效时处于接收状态。

RS485接口连接器采用DB-9的9芯插头座,与智能终端RS485接口采用DB-9(孔),与键盘连接的键盘接口RS485采用DB-9(针)。

RS232和RS485定义是电气特性,影响的是数据在线路上的传输过程,RS232和RS485的收发器通过UART才能被CPU访问,所以,只要控制了UART,就可以控制串口的传输方式,而所谓的编程其实就是对UART编程,所以RS232个RS485从程序员视角是不可见的。 “那你就直接说RS485和RS232编程上没有区别不就完了?”

问题是,实际总比理论复杂,这里有一种 例外

RS232两根线实现全双工,两根线各做各的,互不影响,可以同时进行;
RS485虽然可以用四根线实现全双工,但是实际应用中比较少见,更常见的是只用两根线实现半双工,这样一来,就涉及到“收状态”和“发状态”的切换,这一切换又涉及两种情况:

1、驱动程序中已经含有对半双工情况下的接受切换,驱动程序会根据你读或写的动作,自动进行切换。这种情况下,RS485的编程就与RS232完全没有区别。
2、驱动程序不带自动切换,此时,为了完成切换,必须使用额外的GPIO连接RS485收发模块的接受使能端,在接受、发送数据之前,首先对使能端置位,使之处于正确的“接收”或“发送”状态。

"RS-485"是否与"半双工"等同?
答:否,RS-485接口可连接成半双工和全双工两种通信方式,半双工通信芯片有SN75176,SN751276,SN75LBC184,MAX485,MAX1478,MAX3082,MAX1483,全双工通信的有:SN75179,SN75180,MAX488-491,MAX1482 等

1.3 RS232 与 RS485 的区别:

(1)抗干扰性:

  1. RS485 接口是采用平衡驱动器和差分接收器的组合,抗噪声干扰性好。
  2. RS232 接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容 易产生共模干扰,所以抗噪声干扰性弱。

(2)传输距离:

  1. RS485 接口的最大传输距离标准值为 1200 米(9600bps 时),实际上可达 3000 米。
  2. RS232 传输距离有限,最大传输距离标准值为 50 米,实际上也只能用在 15 米左右。

(3)通信能力:

  1. RS-485 接口在总线上是允许连接多达 128 个收发器, 即具有多站能力,这样用户可以利用 单一的 RS-485 接口方便地建立起设备网络 。
  2. RS-232 只允许一对一通信。

(4)传输速率:

  1. 传输速率较低,在异步传输时,波特率为 20Kbps。
  2. RS-485 的数据最高传输速率为 10Mbps 。

(5)信号线:

  1. RS485 接口组成的半双工网络,一般只需二根信号线。
  2. RS-232 口一般只使用 RXD、TXD、GND 三条线,即"发送数据"、“接收数据"和"信号地” 。

(6)电气电平值:

  1. 逻辑"1"以两线间的电压差为+(2-6) V 表示;逻辑"0"以两线间的电压差为-(2-6)V 表 示 。
  2. 在 RS-232-C 中任何一条信号线的电压均为负逻辑关系。即:逻辑"1",-5- -15V;逻辑"0 " +5- +15V 。噪声容限为 2V。即要求接收器能识别低至+3V 的信号作为逻辑"0",高到-3 V 的信号作为逻辑"1" 。
  3. RS232 接口的信号电平值较高, 易损坏接口电路的芯片, 又因为与 TTL 电平不兼容故需使 用电平转换电路方能与 TTL 电路连接。
  4. RS485 接口信号电平比 RS-232-C 降低了,就不易损坏接口电路的芯片, 且该电平与 TTL 电平兼容,可方便与 TTL 电路连接。

1.4 RS232 与 RS485 的联系:

  1. 都可通过 DB-9 连接器连接.
  2. 接口均可采用屏蔽双绞线传输。
  3. 都是串行通信。
  4. 通信方式都是全双工。 (一般情况 485 是半双工)

由于有的设备是232接口的,有的是485接口的,如果有一台232接口的设备与一台485接口的设备通信,那就需要一个RS232/RS485转换器,把232接口的设备的232信号转换成485信号,然后再与485接口的设备通信。如果是两台232接口的设备要进行远距离的通信,那只要加上两个RS232/RS485转换电路就可以了。
市场上所谓的“无源RS232/RS485转换器”采用从计算机串口偷电技术,而“有源RS232/RS485转换器”在电路原理图与跟前者差不多,只是电源部分有所改动而已。

二、Modbus协议说明

2.1 什么是协议

在了解什么是Modbus之前,我们先来看下什么是 协议

协议是一个汉语词汇,读音为xié yì,意思是共同计议,协商;经过谈判、协商而制定的共同承认、共同遵守的文件

简单地说,在我们的单片机之间互相通信,以及单片机和上位机通信中,规定了不同的内容规范,这个规范是通信的双方都需要遵守的,这样就可以实现两者的通信。

而这个协议规范可以有很多种,来适应不同的设备以及通信要求等,我们常见的就有IIC SPI UART串口通信协议等等。而Modbus也是一个串行通信协议。

在这里插入图片描述

2.2 Modbus协议说明

Modbus诞生于1979年 莫迪康公司 后来被施耐德电气公司收购。Modbus提供通用语言用于彼此通信的设备和设备。
Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。Modbus作为目前工业领域应用最广泛的协议

最简单的说,Modbus就是一个总线通信协议,像IIC SPI这种,但是他 不依赖于硬件总线

Modbus之所以使用广泛,是有他的优点的

  • Modbus协议标准开放、公开发表且无版权要求
  • Modbus协议支持多种电气接口,包括RS232、RS485、TCP/IP等,还可以在各种介质上传输,如双绞线、光纤、红外、无线等
  • Modbus协议消息帧格式简单、紧凑、通俗易懂。用户理解和使用简单,厂商容易开发和集成,方便形成工业控制网络

举一个简单的例子,我们常用的IIC通信协议,需要在物理上连接iic总线,然后加上拉电阻,规定好物理层的高低电平。
在这里插入图片描述

而 Modbus协议是一种应用层报文传输协议,协议本身并没有定义物理层,定义了控制器能够认识和使用的消息结构,不管它们是经过何种网络进行通信的。 所以能够适应多种电气接口,因此使用非常广泛。

2.3 Modebus通信过程

注意Modbus是一主多从的通信协议

Modbus通信中只有一个设备可以发送请求。其他从设备接收主机发送的数据来进行响应,从机是任何外围设备,如I/O传感器,阀门,网络驱动器,或其他测量类型的设备。从站处理信息和使用Modbus将其数据发送给主站。

也就是说,不能Modbus同步进行通信,主机在同一时间内只能向一个从机发送请求,总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信。

从机不会自己发送消息给主站,只能回复从主机发送的消息请求。

在这里插入图片描述

并且,Modbus并没有忙机制判断,比方说主机给从机发送命令, 从机没有收到或者正在处理其他东西,这时候就不能响应主机,因为modbus的总线只是传输数据,没有其他仲裁机制,所以需要通过软件的方式来判断是否正常接收。

举例
现在,我们来探讨Modbus数据传输的方式,可以简单地理解成打电话。并且是单向通信的打电话

主机发送数据,首先需要从机的电话号码(区分每个从机,每个地址必须唯一),告诉从机打电话要干什么事情,然后是需要发送的内容,最后再问问从机,我说的话你都听清楚了没有呀,没有听错吧?

然后从机这里,得到了主机打过来的电话,从机回复主机需要的内容,主机得到从机数据,这样就是一个主机到从机的通信过程

就好比老师和你打电话,老师拨通了你的电话号,然后老师跟你说,小王呀,我这里需要你给我发东西,发的内容是上周的一周总结,你说好的,然后打开你电脑的文件夹,把你的周报发给老师,这就是一个通信过程。

2.4 Modbus存储区

既然从机存储数据,那么肯定要有一个存储区,那就需要文件操作,我们都知道这文件可以分为只读(-r)和读写(-wr)两种类型

并且存储的数据类型可以分为 :布尔量 和 16位寄存器

  • 布尔量比如IO口的电平高低,灯的开关状态等。
  • 16位寄存器比如 传感器的温度数据,存储的密码等。

Modbus协议规定了4个存储区 分别是0 1 3 4区 其中1区和4区是可读可写,1区和3区是只读。

Modbus协议规定了4个存储区 分别是0 1 3 4区 其中1区和4区是可读可写,1区和3区是只读。

区号名称读写地址范围
0区输出线圈可读可写布尔量00001-09999
1区输入线圈只读布尔量10001-19999
3区输入寄存器只读寄存器30001-39999
4区保持寄存器可读可写寄存器40001-49999

并且Modbus还给每个区都划分了地址范围 主机向从机获取数据时,只需要告诉从机数据的起始地址,还有获取多少字节的数据,从机就可以发送数据给主机

Modbus数据模型规定了具体的地址范围,每一个从机,都有实际的物理存储,跟modbus的存储区相对应,主机读写从机的存储区,实际上就是对从机设备对应的实际存储空间进行读写。

在这里插入图片描述

2.5 Modbus协议类型

在上面我们已经说明了Modbus可以在各种介质上传输,那么他的传输模式也分为三种。包括ASCII、RTU(远程终端控制系统)、TCP三种报文类型

串行端口存在多个版本的Modbus协议,而最常见的是下面四种:

  • Modbus-Rtu
  • Modbus-Ascii
  • Modbus-Tcp
  • ModbusPlus

Modbus RTU是一种紧凑的,十六进制表示数据的方式,Modbus ASCII是一种采用Ascii码表示数据,并且每个8Bit 字节都作为两个ASCII字符发送的表示方式。
RTU格式后续的命令/数据带有循环冗余校验的校验和,而ASCII格式采用纵向冗余校验的校验和。

Modbus协议使用串口传输时可以选择RTU或ASCII模式,并规定了消息、数据结构、命令和应答方式并需要对数据进行校验。ASCII 模式采用LRC校验,RTU模式采用16 位CRC校验。通过以太网传输时使用TCP,这种模式不使用校验,因为TCP协议是一个面向连接的可靠协议。

在这里插入图片描述
当然常用的就是RTU模式,ASCII一般很少

举一个简单的例子,如果我们需要发送一个数字10那么RTU模式下,只需要发送 0x0A 总线上传输数据形式为: 0000 1010
而ASCII码模式则将数据1和0转为’1’和’0’,需要发送0x31(1) 0x30(0)两个字节数据。总线上传输数据形式为: 0011 0001 0011 0000

Modbus RTU是一种紧凑的,十六进制表示数据的方式,Modbus ASCII是一种采用Ascii码表示数据,并且每个8Bit 字节都作为两个ASCII字符发送的表示方式。
RTU格式后续的命令/数据带有循环冗余校验的校验和,而ASCII格式采用纵向冗余校验的校验和。

Modbus协议使用串口传输时可以选择RTU或ASCII模式,并规定了消息、数据结构、命令和应答方式并需要对数据进行校验。ASCII 模式采用LRC校验,RTU模式采用16 位CRC校验。通过以太网传输时使用TCP,这种模式不使用校验,因为TCP协议是一个面向连接的可靠协议。

在这里插入图片描述

当然常用的就是RTU模式,ASCII一般很少

举一个简单的例子,如果我们需要发送一个数字10 那么RTU模式下,只需要发送 0x0A 总线上传输数据形式为: 0000 1010

而ASCII码模式则将数据1和0转为’1’和’0’,需要发送0x31(1) 0x30(0)两个字节数据。总线上传输数据形式为: 0011 0001 0011 0000

详细的我们等下再阐述

2.5.1 Modbus-RTU协议

2.5.2 Modbus报文帧结构

一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,本质就是一串数据。

Modbus报文是指主机发送给从机的一帧数据,其中包含着从机的地址,主机想执行的操作,校验码等内容

Modbus协议在串行链路上的报文格式如下所示:

在这里插入图片描述

从站地址功能码数据CRC/LRC
1 byte1 byteN bytes2 bytes
  • 帧结构 = 从机地址 + 功能吗 + 数据 + 校验
  • 从机地址: 每个从机都有唯一地址,占用一个字节,范围0-255,其中有效范围是1-247,其中255是广播地址(广播就是对所有从机发送应答)

  • 功能码: 占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改从机的数据,所以不同功能码对应不同功能.

  • 数据: 根据功能码不同,有不同功能,比方说功能码是查询从机的数据,这里就是查询数据的地址和查询字节数等。

  • 校验: 在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确

Modbus功能码

Modbus规定了多个功能,那么为了方便的使用这些功能,我们给每个功能都设定一个功能码,也就是指代码。

Modbus协议同时规定了二十几种功能码,但是常用的只有8种,用于对存储区的读写,如下表所示:

功能码功能说明
01H读取输出线圈
02H读取输入线圈
03H读取保持寄存器
04H读取输入寄存器
05H写入单线圈
06H写入单寄存器
0FH写入多线圈
10H写入多寄存器

当然我们用的最多的就是03和06 一个是读取数据,一个是修改数据。

CRC校验

错误校验(CRC)域占用两个字节包含了一个16位的二进制值。CRC值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。
比如主机发出01 06 00 01 00 17 98 04, 98 04 两个字节是校验位,那么从机接收到后要根据01 06 00 01 00 17 再计算CRC校验值,从机判断自己计算出来的CRC校验是否与接收的CRC校验(98 04主机计算的)相等,如果不相等那么说明数据传输有错误,这些数据就不能要。

CRC校验流程:

1、预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。

2 、把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。

3、将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。

4 、如果最低位为0:重复第三步(下一次移位);如果最低位为1:将CRC寄存器与一个预设的固定值(0A001H)进行异或运算。

5、重复第三步和第四步直到8次移位。这样处理完了一个完整的八位。

6 、重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。

7、最终CRC寄存器的值就是CRC的值。

此外还有一种利用预设的表格计算CRC的方法,它的主要特点是计算速度快,但是表格需要较大的存储空间,该方法此处不在阐述

在这里插入图片描述

下面我们来看详细的发送和接收数据:

1、主机对从机读数据操作

主机发送报文格式如下:

从站地址功能码起始(高)起始(低)数量(高)数量(低)校验
0x010x030x000x010x000x010xD5 0xCA

含义:

0x01:从机的地址
0x03:查询功能,读取从机寄存器的数据
0x00 0x01: 代表读取的起始寄存器地址.说明从0x0001开始读取.
0x00 0x01: 查询的寄存器数量为0x0001个 Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据; 寄存器地址对应着从机实际的存储地址
0xD5 0xCA: 循环冗余校验 CRC

从机回复报文格式如下:
| 从站地址 | 功能码 | 字节计数 | 字节1 |字节2 | 校验 |
|–|–|-|-|-|-|-|
| 0x01 | 0x03| 0x02| 0x01 | 0x00| 0x17| 0xF8 0x4A |

含义:

0x01:从机的地址
0x03:查询功能,读取从机寄存器的数据
0x02: 返回字节数为2个 一个寄存器2个字节
0x00 0x17:寄存器的值是0017
0xF8 0x4A: 循环冗余校验 CRC

2、主机对从机写数据操作

主机发送报文格式如下:

从站地址功能码数据地址(高)数据地址(低)数据(高)数据(低)校验
0x010x060x000x010x000x170x98 0x04

含义:

0x01:从机的地址
0x06:修改功能,修改从机寄存器的数据
0x00 0x01: 代表修改的起始寄存器地址.说明修改0x0000-0x0001的存储内容
0x00 0x17: 要修改的数据值为0017
0x98 0x04: 循环冗余校验 CRC

从机回复报文格式如下:

从站地址功能码数据地址(高)数据地址(低)数据(高)数据(低)校验
0x010x060x000x010x000x170x98 0x04

含义:

0x01:从机的地址
0x06:修改功能,修改从机寄存器的数据
0x00 0x01: 代表修改的起始寄存器地址.说明是0x0000
0x00 0x17:修改的值为0017
0x98 0x04: 循环冗余校验 CRC

从机的回复和主机的发送是一样的,如果不一样说明出现了错误

2.5.3 Modbus-ACSII协议

在消息中的每个字节都作为两个ASCII字符发送

十六进制的0-F 分别对应ASCII字符的0…9,A…F

也就是0x30~0x3A 0x41~0x46
在这里插入图片描述

下方是ascii的报文帧

  • 1个字节起始位

  • 2个字节地址位

  • 2个字节功能位

  • n个数据位,最小的有效位先发送

  • LRC(纵向冗长检测) 注意校验方式不同

  • 结束符 \r \n
    在这里插入图片描述

可以看到数据部分更加繁琐,正常我们使用都是用RTU格式,ASCII码格式有了解即可。

在这里插入图片描述
总结:
ModbusASCII有开始字符(和结束字符(CR LF),可以作为一帧数据开始和结束的标志,而ModbusRTU没有这样的标志,需要用时间间隔来判断一帧报文的开始和结束,协议规定的时间为3.5个字符周期,就是说一帧报文开始前,必须有大于3.5个字符周期的空闲时间,一帧报文结束后,也必须要有3.5个字符周期的空闲时间否则就会出现粘包的情况。

注意:针对3.5个字符周期,其实是一个具体时间,但是这个时间跟波特率相关。
在串口通信中,1个字符包括1位起始位、8位数据位(一般情况)、1位校验位(或者没有)、1位停止位(一般情况下),因此1个字符包括11个位,那么3.5个字符就是38.5个位,波特率表示的含义是每秒传输的二进制位的个位,因此如果是9600波特率,3.5个字符周期=/960038.5=0.00401s1000=4.01ms

2.5.4 Modbus-TCP协议

我们首先看下Modbus-TCP和Modbus-ACSII的区别

Modbus-TCP并不需要从从机地址,而是需要MBAP报文头

并且不需要差错校验,因为TCP本身就具有校验差错的能力
在这里插入图片描述

MBAP报文头格式如下:
在这里插入图片描述

其中事务处理表示符合协议标识符我们正常使用设置为0即可 长度为6个字节 0x0006

简单来说,也就是Modbus-TCP是在Modbus-ACSII的基础上,去掉校验,然后加上五个字节的0和一个06

最后附上 Modbus标准协议手册链接
Modbus标准协议手册

三、stm32+HC-SR04超声波模块,对外提供RS485和Modbus协议

3.1 硬件设计

  1. 超声波雷达模块
  • 超声波传感器:12个HC-SR04模块,每个模块有Trig和Echo引脚。
  • 连接方式:将每个HC-SR04模块的Trig和Echo引脚分别连接到STM32F103的GPIO引脚上。
  1. 微控制器
  • 微控制器:STM32F103系列,至少需要12个GPIO用于超声波模块的Trig和Echo信号。
  • 时钟设置:72MHz的系统时钟频率。
  1. 通信接口
  • RS485接口:采用MAX485芯片,实现RS485物理层通信。
  • 串口配置:STM32的USART接口用于与MAX485通信。
  1. 电源管理
  • 电源:汽车电源通常为12V,需要DC-DC转换器将12V转换为STM32和HC-SR04模块所需的5V和3.3V。

3.2 软件设计

  1. 底层驱动
  • GPIO驱动:配置GPIO引脚为输出模式(Trig)和输入模式(Echo)。
  • 定时器驱动:使用定时器捕获HC-SR04的Echo信号高电平时间,计算距离。
  • USART驱动:配置USART用于RS485通信,波特率根据具体需求设置,一般为9600或115200。
  1. 测距算法
  • 触发信号:发送至少10us的高电平到Trig引脚。
  • 捕获回波:定时器捕获Echo信号的高电平时间,通过时间计算距离。
  1. Modbus协议栈
  • 帧格式:实现Modbus RTU协议的帧格式,包括地址域、功能码、数据域和CRC校验
  • 读写操作:支持基本的读寄存器和写寄存器操作,读取超声波模块的测距数据。
  1. 数据处理
  • 距离测量:每个超声波模块测量到的距离存储在STM32的寄存器中。
  • 错误处理:处理测量超时或无效数据的情况,确保系统的可靠性。

3.3 实现步骤

硬件连接

  1. 超声波模块连接:将每个HC-SR04的Trig和Echo分别连接到STM32的GPIO引脚,例如:Trig1 -> PA0, Echo1 -> PA1, Trig2 -> PA2, Echo2 -> PA3,依此类推。
  2. RS485连接:MAX485的DI连接到STM32的TX引脚,RO连接到STM32的RX引脚,DE和RE引脚连接在一起并连接到STM32的一个控制引脚(例如PA4),用于控制发送和接收状态。
  3. 电源连接:确保所有模块都供电正常,STM32和HC-SR04都需要3.3V/5V供电,MAX485需要5V供电。

软件开发
1. 初始化

  • 配置系统时钟。
  • 初始化GPIO引脚。
  • 初始化定时器用于捕获Echo信号。
  • 初始化USART用于RS485通信。

2. 超声波测距

  • 触发每个HC-SR04模块,启动测距。
  • 捕获Echo信号高电平时间,通过定时器计算距离。
  • 将距离数据存储在寄存器中,供Modbus协议读取。

3. Modbus通信

  • 实现Modbus RTU协议的帧解析和生成。
  • 处理Modbus主站的请求,根据请求的功能码读取或写入寄存器。
  • 返回对应的距离数据或执行相应操作。

4. 测试与调试

  • 使用Modbus主站测试工具,验证通信协议的正确性。
  • 通过调试工具和串口监视器,调试距离测量和通信功能。

总结

本设计方案提出了一种基于STM32F103和HC-SR04超声波模块的12路车载超声波雷达系统。系统采用RS485接口和Modbus协议,确保了数据通信的可靠性和扩展性。通过精心设计的硬件和软件,系统能够提供精确的障碍物检测和距离测量,满足智能汽车对环境感知的需求。

在实际开发过程中,还需要考虑更多的技术细节和工程挑战,例如电磁兼容性(EMC)、电源管理、环境适应性等。此外,还需要进行详细的系统分析、设计迭代和严格的测试验证。

参考

深入理解UART、IIC、SPI与RS232以及RS485的区别

详解Modbus通信协议—清晰易懂

大神带你秒懂Modbus通信协议

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菲菲QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值