找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5773|回复: 2
收起左侧

超声波精确测距 毫米级测距时间分辨率将如何改?

[复制链接]
ID:168638 发表于 2017-8-14 13:24 | 显示全部楼层 |阅读模式
5黑币
  1. /***********************************************************************************************************/
  2. //HC-SR04 超声波测距模块 DEMO 程序
  3. //晶振:11.0592
  4. //接线:模块TRIG接 P1.2  ECH0 接P1.1
  5. //串口波特率9600
  6. //精度为米级别的,毫米级测距时间分辨率将如何改?
  7. /***********************************************************************************************************/         
  8. #include"chao.h"

  9. unsigned int  time=0;
  10. unsigned int  timer=0;
  11. float         S=0;
  12. bit           flag =0;
  13.         
  14. /*******************************************************************************
  15. * 函 数 名       : Conut
  16. * 函数功能                 : 数据处理
  17. * 输    入       : 无
  18. * 输    出             : 距离S
  19. *******************************************************************************/
  20. float Conut(void)
  21. {
  22.         time=TH0*256+TL0;
  23.         TH0=0;
  24.         TL0=0;
  25.         S=(time*1.87)/100;     //算出来是CM
  26.         if(flag==1)                    //超出测量
  27.         {
  28.                 flag=0;
  29.                  S=0;
  30.                   return S;
  31.         }
  32.         return S;
  33. }

  34. /*******************************************************************************
  35. * 函 数 名       : delayms
  36. * 函数功能                 : 延时函数
  37. * 输    入       : ms
  38. * 输    出             : 无
  39. *******************************************************************************/
  40. void delayms(unsigned int ms)
  41. {
  42.         unsigned char i=100,j;
  43.         for(;ms;ms--)
  44.         {
  45.                 while(--i)
  46.                 {
  47.                         j=10;
  48.                         while(--j);
  49.                 }
  50.         }
  51. }

  52. /*******************************************************************************
  53. * 函 数 名       : StartModule
  54. * 函数功能                 : 启动模块
  55. * 输    入       : 无
  56. * 输    出             : 无
  57. *******************************************************************************/
  58. void  StartModule()                        
  59. {
  60.           Trig = 1;                                             //启动一次模块
  61.           _nop_();
  62.           _nop_();
  63.           _nop_();
  64.           _nop_();
  65.           _nop_();
  66.           _nop_();
  67.           _nop_();
  68.           _nop_();
  69.           _nop_();
  70.           _nop_();
  71.           _nop_();
  72.           _nop_();
  73.           _nop_();
  74.           _nop_();
  75.           _nop_();
  76.           _nop_();
  77.           _nop_();
  78.           _nop_();
  79.           _nop_();
  80.           _nop_();
  81.           _nop_();
  82.           Trig = 0;
  83. }

  84. /*******************************************************************************
  85. * 函 数 名       : ChaoShengBoInit
  86. * 函数功能                 : 超声波模块初始化函数,允许T0中断,开启定时器,开启总中断
  87. * 输    入       : 无
  88. * 输    出             : 无
  89. *******************************************************************************/
  90. void ChaoShengBoInit()
  91. {
  92.         TMOD=0x21;                   //设T0为方式1,GATE=1;
  93.         SCON=0x50;
  94.         TH1=0xFD;
  95.         TL1=0xFD;
  96.         TH0=0;
  97.         TL0=0;
  98.         TR0=1;  
  99.         ET0=1;             //允许T0中断
  100.         TR1=1;                           //开启定时器
  101.         TI=1;
  102.         EA=1;                           //开启总中断
  103. }

  104. /*******************************************************************************
  105. * 函 数 名       : CaiJi
  106. * 函数功能                 : 超声波数据采集并转换为数字信号
  107. * 输    入       : 无
  108. * 输    出             : 无
  109. *******************************************************************************/
  110. void CaiJi(void)
  111. {  
  112.          StartModule();
  113.          while(!Echo);                //当RX为零时等待
  114.          TR0=1;                            //开启计数
  115.          while(Echo);                //当RX为1计数并等待
  116.          TR0=0;                                //关闭计数
  117.      Conut();                        //计算
  118.          delayms(100);                //100MS

  119. }  

复制代码

回复

使用道具 举报

ID:111517 发表于 2017-8-20 00:08 | 显示全部楼层
网上看的一些资料说这个模块精准度最大也就在在3mm,自己实际用过达到这么高的精确度,如果非要那么高的精确度的话是不是需要采取补偿手段。

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:111634 发表于 2017-8-21 10:16 | 显示全部楼层
超声波传递速率与介质、温度有关。探测精度有绝对精度和相对精度之分,把概念搞清楚。什么3mm?如果是倒车测距,绝对精度也就是0.5cm.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表