历史上的今天
返回首页

历史上的今天

今天是:2025年08月21日(星期四)

正在发生

2020年08月21日 | STM32驱动URM04超声波测距模块

2020-08-21 来源:eefocus

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);

}


直接调用即可


推荐阅读

史海拾趣

FTCAP Fischer & Tausche Capacitor Group公司的发展小趣事

FTCAP Fischer & Tausche Capacitor Group公司的发展故事

故事一:德国制造的坚持

FTCAP Fischer & Tausche Capacitor Group自成立以来,始终坚守在德国本土进行电容器的生产和研发。这一决策源于公司对产品质量的不懈追求。在电子行业,德国制造以其精湛的工艺和严格的质量控制而闻名,FTCAP也不例外。通过缩短研发与生产之间的距离,FTCAP能够确保高效的生产流程和与客户的紧密协作,从而快速响应市场需求,提供高质量的产品。

故事二:多样化的产品线

FTCAP的产品线涵盖了从薄膜电容器到铝电解电容器的广泛范围,满足了不同行业对电容器的多样化需求。公司不仅生产标准规格的电容器,还根据客户的特定需求提供定制化的解决方案。这种灵活性和创新性使得FTCAP在竞争激烈的电子市场中脱颖而出,赢得了众多客户的信赖和好评。

故事三:技术创新与产品升级

近年来,FTCAP不断投入资源进行技术创新和产品升级。例如,公司推出的Enlight Energy Cap系列薄膜电容器,经过重新设计后,不仅性能更加优越,还增加了“Enlight”这一附加属性,进一步提升了产品的市场竞争力。此外,FTCAP还致力于提高电容器的能效和可靠性,以满足日益严格的环保和能效标准。

故事四:行业内的替代解决方案

凭借超过70年的电容器研发和生产经验,FTCAP在行业内建立了良好的声誉。当一些客户面临竞争对手产品无法满足其需求时,FTCAP能够提供定制化的电容器作为替代解决方案。这些定制产品不仅性能优越,而且能够完美匹配客户的设备和应用场景,帮助客户解决燃眉之急。

故事五:团队建设与企业文化

FTCAP的成功离不开其优秀的团队和独特的企业文化。公司注重员工的培训和发展,鼓励员工创新思维和团队合作。在FTCAP,员工们不仅拥有专业的技能和知识,还具备高度的责任感和使命感。他们共同努力,为公司的发展贡献自己的力量。此外,FTCAP还定期举办各种团建活动,增强员工之间的凝聚力和归属感,营造了一个和谐、积极的工作氛围。

AMOTECH(阿莫泰克)公司的发展小趣事

随着全球电子市场的不断发展,AMOTECH开始将目光投向海外市场。2004年,公司在山东建立了第一家海外工厂——山东AMOTECH公司,专注于全球定位系统天线的生产。这一举措标志着AMOTECH正式进军中国市场,为后续在中国市场的深入发展打下了基础。此后,公司不断加大对中国市场的投入,2006年在青岛建立办公室,2008年更是在青岛建立了中国第二工厂,进一步巩固和扩大了在中国市场的份额。

Centellax Inc公司的发展小趣事

Centellax深知人才是公司发展的核心动力。因此,公司一直致力于打造一支高素质、专业化的团队。通过招聘优秀的研发、销售、管理等人才,为公司的长期发展提供有力的人才保障。

在团队建设方面,Centellax注重培养员工的团队协作精神和创新能力。通过定期举办团队建设活动、培训课程等,提升员工的凝聚力和归属感。同时,公司还鼓励员工积极参与创新项目,为公司的技术进步和业务发展贡献智慧和力量。

Comtech AHA Corp公司的发展小趣事

Comtech AHA Corp在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和生产工艺,减少对环境的影响。此外,Comtech AHA Corp还积极参与社会公益事业,为社会发展贡献自己的力量。这种负责任的企业形象赢得了社会各界的广泛赞誉和支持。


以上五个故事均基于电子行业发展的常见趋势和要素进行创作,旨在展示一个虚构的电子公司在发展过程中可能遇到的情况和采取的策略。请注意,这些故事并不涉及任何真实公司的历史或经营情况。

Future Designs, Inc. (FDI)公司的发展小趣事

随着市场需求的不断变化,FDI不断投入研发,致力于技术创新。他们不仅优化了现有的GUI产品,还将其应用范围扩大到了更多领域,如医疗设备、工业自动化、汽车电子等。同时,FDI还拓展了产品线,推出了光电元件、射频/IF和RFID、编程器、开发系统以及集成电路(IC)等一系列产品。这些创新举措使得FDI在电子行业中的影响力不断扩大,市场份额逐步提升。

Continental公司的发展小趣事

近年来,大陆集团在特种商用车胎领域也取得了重要突破。2014年,大陆集团在亚洲国际物流技术与运输系统展览会上发布了一款全新的产品——SC8特种商用车胎。这款产品是专门针对亚洲物料搬运业而开发出来的,适用于仓库、饮料业、造纸业等多个行业。SC8轮胎具备超深的轮胎花纹和极佳的性能,为物料搬运业提供了更高效、更安全的解决方案。这一产品的推出进一步巩固了大陆集团在商用车胎领域的市场地位。

问答坊 | AI 解惑

Cadence仿真的原理是什么???

:L   面试~人家问我~ 很郁闷~  这个真不知道.   有那高手知道的 分享下~~谢谢~…

查看全部问答>

不能进行convert mdl to vhdl

如图 convert mdl to vhdl无法出现,不知道是什么原因。我用的是dsp builder8.0 和 MATLAB7.0 。 dsp builder8.0的license文件已经全部复制到quartus II的license文件里了。 谢谢各位高手了,我在做毕设《基于quartus II的DDS设计》,导师突然要 ...…

查看全部问答>

有没有办法提升仿真的速度?

最近用ModelSim进行VHDL代码的功能仿真,3秒的runtime居然要花将近20分钟才能仿真完。有没有什么选项设置可以让仿真更快一点?还是说是我的设计上有问题才导致那么慢?还是因为电脑配置不行?   有大虾有高招吗?…

查看全部问答>

三星S3C241O的中断问题

我最近在学华恒ARM9,用的是三星S3C2410当做到中断这个问题的时候,遇到了问题,还请各位大虾帮忙 问题如下: 1、不管我把中断置一还是置零都没看到区别,和芯片资料有出入,为什么会这样 2、我把中断待决寄存器和源待决寄存器的值读出来,发现 ...…

查看全部问答>

PCI9054 的BAR基地址自动更改?

各位大侠,小弟虚心请教一个问题: 我通过9054的BAR2对本地端进行一次写操作后(成功写入),BAR2基地址由E2020000变成了E2000000(同时BAR3由E2040000变成了E2000000),以至于再次写将无法成功写入.不知是怎么回事?. 通过BAR2进行读操作则不会出现该问 ...…

查看全部问答>

单片机C语言延时程序的计算问题

例如如何求下列程序延时时间: void Delay(unsigned int a) {     unsigned char i;       while(--a!=0)     {              for(i=0;i…

查看全部问答>

高手来帮帮:制作一个100Mhz的宽带放大器

我是非电子专业的,本科毕业设计要做一个带宽100Mhz的前置放大器。 用集成运放做。 如何既能保证带宽又增大放大倍数呀?? 有么适合的芯片推荐一下。 谢谢…

查看全部问答>

如何得到105读写U盘库?

不需要源代码。 有个库,应用代码即可。…

查看全部问答>

仿真器无法启用

我使用的仿真器型号为SEED-XDS560PLUS,驱动已经在官网上下载了最新的,可是安装完驱动,设备管理器里有个黄色的叹号。连接目标板我感觉仿真器没有被我的PC机识别。我用的目标板为SEED-DM6446试验箱,使用的CCS开发环境为CCS3.3.38.2…

查看全部问答>

51单片机与彩色触摸屏的问题,求大神指教

51单片机能用7寸左右的彩色触摸屏吗?求大神帮忙,谢谢了!…

查看全部问答>