STM32驱动URM04超声波测距模块

发布者:书香门第最新更新时间:2020-08-21 来源: eefocus关键字:STM32  驱动URM04  超声波测距模块 手机看文章 扫描二维码
随时随地手机看文章

URM04简介:


URM04采用了RS485串行通信总线的架构,支持多传感器的并行工作,有着两个RS-485接口,最多支持32个超声波的并联,

内置温度传感器辅助校正距离值,同时支持温度的测量

应用场合:移动机器人,停车场,安全检测,超声波空间定位。

性能描述:

工作电源:+5V

接口方式:RS485  RS485总线通讯,

超声波距离测量:

最大距离4cm―500cm

测量范围角度: 60度

芯片型号:Atmel公司的ATmega8芯片  MAX202 MAX485 ST温度测量芯片


测量流程:

1触发超声波与温度测量指令

发送指令后,超声波开始测量,温度开始测量,无返回值


2延时30MS


超声波最大测距5米,反射路径10米,声速度331米/秒)  10/331=0.03021  //30MS


3超声波测距读取指令

测量完一次之后,数据会被存储在ATmega8芯片中,只有发送读取指令,才会有数据返回


返回值:

测量成功返回16位距离数据,两字节0XFF表示测量失败


4温度读取指令:

与超声波只有命令字节不同


返回值:

调试经验:

1注意超声波要接的是5V,不是3.3V,使用下载器时一般都是3.3V供电,这就导致在线调试没有数据,应该给板子供上电,下载器不供电,超声波接到5V电源口,并且检测下是不是5V.


2.测距时不要距离太近,会导致数据不准确     PS:  太近超声波会有回波干扰 


3.超声波测距的性能与被测物表面材料有很大关系,如毛料、布料对超声波 的反射率很小,会严重影响测量结果。


4.测距等待一定的时间,如果超时后依然没有数据返回,就放弃,而进行下一次测量。


4.URM04 V2.0 如果与主板有数据交流,其上的LED灯会一闪一闪的


5.URM04 V2.0 的波特率为固定值19200。或115200


关于这个找了半天发现是在10年七月之后买的都是19200 之前买的都是115200,

6 UATR接收数据的中断要改!!可以自己根据返回的数据特征做相应处理,或者接受8个字节直接退出 


话不多说我们直接看代码:


超声波数据测量

/*! 

*  @brief      超声波数据测量

 *  @since      v1.0

 *  @param  device   超声波地址

 *  @author     Z小旋

 */

void MeasureDistance(u8 device) {

 

int i = 0;

    u8 Scmd[6]={0x55,0xaa,0x00,0x00,0x01,0x00};  //触发超声波与温度测量指令

u8 Tcmd[6]={0x55,0xaa,0x00,0x00,0x02,0x00};  //超声波测距读取指令

//SUM效验和

Scmd[2] = device;

Tcmd[2] = device;

Scmd[5] = Scmd[0]+Scmd[1]+Scmd[2]+Scmd[3]+Scmd[4];  //SUM校验和

    Tcmd[5] = Tcmd[0]+Tcmd[1]+Tcmd[2]+Tcmd[3]+Tcmd[4];  //SUM校验和

// 触发距离测量。

  for(i=0; i<6; i++) 

{

        USART_SendData(USART1, Scmd[i]);

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束

     

  }

  delay_ms(30);                  //延时30ms  

  //  发送命令读取测量距离

  for(i=0; i<6; i++) 

{

        USART_SendData(USART1, Tcmd[i]);

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束

    

  }  

  delay_ms(3);

}

发送温度就是将Tcmd[4]改为0x03   自行修改即可


超声波ID改变

/*! 

*  @brief      超声地址改变

 *  @since      v1.0

 *  @param  device   超声波地址

 *  @return 1 表示成功 0表示失败

 *  @author     Z小旋

 */

int ID_Change(u8 device) {

 

int i = 0;

u8 data[8];

    u8 Scmd[7]={0x55,0xaa,0xAB,0x01,0x55,0x11,0x00};  //触发超声波与温度测量指令

Scmd[5] = device;  

 

  for(i=0; i<7; i++) 

  {

    USART_SendData(USART1, Scmd[i]);

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束

    Scmd[6] += Scmd[i];

  }

  delay_ms(20);    

  for(i=0; i<10; i++) //获取十位返回数据,检测是否含有0x01

  {

     if(USART_RX_BUF[i]==0x01) 

{

return 1;

}  

  }

 

return 0;

}

 


超声波接收数据

/*! 

*  @brief      URM04v2超声波传感器返回测量的距离或温度

 *  @since      v1.0

 *  @param  None

 *  @return     测量距离  -1表示上次测量超出范围或不成功

 *  @author     Z小旋

 */

  

int ReadDistance() 

{

u8 data[8];

    unsigned int temp;   

    int counter = 0;

    int result = -1;  

int i = 0,j = 0;

for(i=0;i<200;i++)   //数据缓存区最大为200 我们就循环200次

{

    if(USART_RX_BUF[i]==0x55&&USART_RX_BUF[i+1]==0xAA)  //检测到回复的字头

    {    

    for(j=0; j<8; j++) 

    {

    data[j] = USART_RX_BUF[i];      //获取返回数据

    i++;

    }

    if(data[3] == 2 && data[4] == 2)    //如果为距离   桢长度为2 命令字为2

        {

    

               //  result = (((unsigned int)data[5])<<8))|data[6];   数据合并  如果需要测到255以上用这个

                result =  data[6];    //返回所测距离  最大255

    } 

    if(data[3] == 2 && data[4] == 3)     //如果为温度    桢长度为2 命令字为3

    {

    if(data[5]>=0xf0)   //高四位都为1 温度为正

   

                    // result= ((data[5]-0xf0)*256-data[6])/10; //返回所测温度

    result= ((unsigned int)(data[5]-0xf0)+data[6])/10;  //返回所测温度  

   

    else   温度为负

    { 

      //result= ((data[5])*256-data[6])/10; //返回所测温度

                      result= ((unsigned int)(data[5]<<4))|data[6];  //返回所测温度

    }

    }

    USART_RX_STA=0;

    return result;

    }

    else 

    {

    delay_us(250);

    counter++;

    if(counter==200) //如果50ms还没有数据返回,退出测量并返回-1

    { 

    return result;

    }

    }

    }

}

 


这里只接收低八位,保证最大能到2.55米 ,如果需要测得远用注释的那行就行,还有很多事,本来想写一套完整库,但是没很多时间,就到这里吧,没有心情去继续完善这个了,万分抱歉,很您可以参考一下,希望能有一点用 ,不足的就是接收数据,需要修改UATR的接收中断的数据处理,我改的不满意,就不上传了


您可以自行修改,还有要注意检测不到数据需要及时退出,不要死等,单片机里最好不要有可能是死循环的存在


void distance()

{

  int Distance=0;

  MeasureDistance(0x11);

  Distance = ReadDistance();

  delay_ms(1000);

}


直接调用即可


关键字:STM32  驱动URM04  超声波测距模块 引用地址:STM32驱动URM04超声波测距模块

上一篇:初学stm32-库函数开发流水灯实现
下一篇:【STM32】 定时器---正交解码编码器模式详解

推荐阅读最新更新时间:2024-11-17 16:09

STM32外部中断(EXTI)分析和应用
本篇博文基于STM32F103ZET6芯片,与大多数STM32F10x芯片兼容; 代码基于ST官网提供的3.5.0标准库 如有不足之处,还望前辈多多指教; 一些需要了解的基础知识 STM32每个GPIO口都可以作为外部中断输入口使用 每个中断都设有状态位 每个中断/事件都有独立的触发和屏蔽设置。 STM32103有19个外部中断(但是供GPIO口使用的中断只有16个) 分别是: 0~15:对应外部中断IO的输入中断 16 : 连接到PVD输出 17 :连接到RTC闹钟时间 18 :连接到USB唤醒事件 这里会容易出现一个问题说:STM32F103ZET6的GPIO管脚一共有6*16即96个GPIO管脚,如何对应只有0~15
[单片机]
<font color='red'>STM32</font>外部中断(EXTI)分析和应用
做单片机设计,STM32 GPIO外部中断你必须知道
一、STM32中断分组: STM32 的每一个GPIO都能配置成一个外部中断触发源,这点也是 STM32 的强大之处。STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0为第一组,那么依此类推,我们能得出一共有16 组,STM32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F103 的19 个外部中断为: 线 0~15:对应外部 IO 口的输入中断。 线 16:连接到 PVD 输出。
[单片机]
做单片机设计,<font color='red'>STM32</font> GPIO外部中断你必须知道
STM32-蜂鸣器实验
一,蜂鸣器介绍 蜂鸣器分有源蜂鸣器和无源蜂鸣器,这里的源指的是震荡源 一般我们使用有源蜂鸣器,如图:   有两个引脚,较长的一端为正极,较短的一段为负极 二,蜂鸣器硬件连接: 蜂鸣器负极连接在STM32的PB8引脚: 错误的连接方法: IO口接蜂鸣器接地 错误的臆想: IO口输出高电平,蜂鸣器正负极产生电压差,蜂鸣器发出声响 错误分析: STM32IO口电流驱动能力非常有限,不能通过IO口驱动大功率硬件,需要通过三极管来驱动(三极管的放大作用),将IO口输出的小电流放大为大电流(放大倍数β) R38作用: STM32芯片复位后IO口默认为浮空状态,IO口电平是不确定的,有可能跳边的电流经过三极管被放大使蜂鸣器
[单片机]
STM32-蜂鸣器实验
STM32笔记---DMA(USART)的演示
 这里有个小小的例子,来演示DMA模块与系统程序并行工作。   用串口以低波特率发送一个10K的数据,花费近10s时间,此时按照以往方法,CPU要不断等待数据发送、送数据;或者送数据、进中断、送数据,处理起来比较消耗时间。   使用了DMA功能以后,用户程序中只需配置好DMA,开启传输后,再也不需要操心,10K数据完成后会有标志位或中断产生,期间可以做任何想做的事,非常方便。   这个是相应的代码例子,基于STM32F103VBT6 /****************************************************************************** * 本文件实现串口发送功能(通过重构
[单片机]
STM32快速初始化引脚 一行代码完成引脚初始化
前言 平时开发STM32的时候,经常涉及到初始化引脚,便编写了一个快速初始化引脚函数,可分别在F1、F4使用,建议放在sys.c中 硬件准备 STM32开发平台 程序设计 对于STM32F1平台: //以下宏定义等内容放在sys.h #define PA RCC_APB2Periph_GPIOA #define PB RCC_APB2Periph_GPIOB #define PC RCC_APB2Periph_GPIOC #define PD RCC_APB2Periph_GPIOD #define PE RCC_APB2Periph_GPIOE #define PF RCC_APB2Periph_GPIOF #defin
[单片机]
STM32的IIC应用详解1
概要 IIC(IIC,inter-Integrated circuit),两线式串行总线,用于MCU和外设间的通信。 IIC只需两根线:数据线SDA和时钟线SCL。以半双工方式实现MCU和外设之间数据传输,速度可达400kbps。 多主机I2C总线结构 注意SDA和SCL两根总线需要上拉,使总线处于空闲状态。 IIC协议 空闲状态 协议规定,SDA和SCL同时为高电平时,总线处于空闲状态。上拉电阻保证电平处于高电平。 起始信号和停止信号 起始信号:SCL为高电平时,SDA电平发生高到低的跳变 停止信号:SCL为高电平时,SDA电平发生低到高的跳变 应答信号 发送器每发送完一个字节(8个脉冲),在第9个脉
[单片机]
<font color='red'>STM32</font>的IIC应用详解1
023_STM32之PID算法原理及应用
(一)PID控制算法(P:比例     I:积分    D:微分) (二)首先先说明原理,使用的是数字PID算法,模拟PID算法在计算机这样的系统中是不能够直接使用的,数字PID算法又分为位置式PID控制算法和增量式PID控制算法,那么下面从原理上说明这两种算法 (三)原理分析如图 (四)从上面图中我们可以得到定义 定义变量 用户设定值: SV 当前值(实际值): PV 偏差: E = SV - PV (五)如果我们在一段时间内就从传感器读取一个值,那么我们就可以得到一个实际值的数据序列,,那么我们也会得到一个偏差值的序列 读取时间:  t(1) t(2)    ------  t(k
[单片机]
023_STM32之PID算法原理及应用
STM32如何高效接收串口数据?
硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 DMA,直接内存存取,可以用它的双手释放CPU的灵魂,所以,本文通过USART3进行串口收发,接受使用DMA的方式,无需CPU进行干预,当接受完成之后,数据可以直接从内存的缓冲区读取,从而减少了CPU的压力。 具体的代码实现如下: usart_driver.h 封装了接口,数据接收回调函数类型,基本数据结构等; usart_driver.c 函数原型实现,中断服务函数实现等; 拷贝这两个文件即可,可以根据目录下的参考用例,进行初始化。 头文件usart_driver.h已经声明了外部函数可能用到的接口; USART3_DR的地
[单片机]
<font color='red'>STM32</font>如何高效接收串口数据?
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved