找回密码
 立即注册
查看: 73|回复: 4

关于超声波测距计算

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:47
  • 最近打卡:2025-04-10 06:42:19

19

主题

39

回帖

373

积分

中级会员

积分
373
发表于 2025-4-9 19:03:33 | 显示全部楼层 |阅读模式
关于超声波测距计算,我正在玩超声波测距,按照说明书计算方法无法正常显示,求高手解惑

这是串口收到三个字节,说明书说通过下面的计算得到距离,


u32  time1,time;

time=((RX2_DATA[0]<<16)+(RX2_DATA[1]<<8)+RX2_DATA[2])/1000;



通过下面函数显示,
void Conut(void)
        {         
                       
                       
                if(time!=time1)
                                {
                                        time1=time;
                                        if(time1<4000)
                                                {
                                                        qian = time1/1000;
                                                        bai  = time1%1000/100;
                                                        shi  = time1%100/10;       
                                                        ge   = time1%10;
                                                 
                                                        OLED_P8x16Ch(40, 0, (qian+16));
                                                        OLED_P8x16Ch(48, 0, (bai+16));
                                                        OLED_P8x16Ch(56, 0, (shi+16));
                                                        OLED_P8x16Ch(64, 0, (ge+16));
                                                }
                                 else
                                         {
                                                        OLED_P8x16Ch(40, 0, (13));
                                                        OLED_P8x16Ch(48, 0, (13));
                                                        OLED_P8x16Ch(56, 0, (13));
                                                        OLED_P8x16Ch(64, 0, (13));
                                                 time=2100;                         
                                         }
                                 }                                 
        }
求高手看看什么原因
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-9 19:08:00 | 显示全部楼层
在超声波测距应用中,距离的计算通常基于超声波从发射到接收的时间差(即飞行时间,Time of Flight, ToF)。根据你提供的信息,你正在使用串口接收到的三个字节来计算距离,但遇到了无法正常显示的问题。以下是对该问题的详细分析和解决方案。

1. 超声波测距原理
超声波测距的基本原理是通过发射超声波脉冲,并测量其从发射到接收的时间差。根据声速和飞行时间,可以计算出目标物体与传感器之间的距离。公式如下:

\[ \text{距离} = \frac{\text{声速} \times \text{飞行时间}}{2} \]

其中,声速在常温下约为343米/秒(或34300厘米/秒),飞行时间通常以微秒(μs)为单位。

2. 数据处理与计算
根据你提供的信息,串口接收到的三个字节用于计算飞行时间。假设这三个字节分别代表时间的高位、中位和低位,那么飞行时间可以通过以下方式计算:

```c
u32 time1, time;
time = ((RX2DATA[0]

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-4-9 20:21:36 | 显示全部楼层
发现部分超声波测距模块发送完会输出一个脉冲干扰,程序处理时要跳过,具体建议用逻辑分析仪测一下输出的信号
以下是我几年前写的语音超声波测距程序,外挂语音OTP实现的,按需要移植
附超声波测距温度补偿excel计算器
  1. #include <STC8.H>
  2. #include <intrins.h>
  3. #define         TRIG        P30
  4. #define         ECHO        P31
  5. #define         BUSY        P32
  6. #define                DATA        P33
  7. #define                RST                P54
  8. #define                KEY                P55
  9. #define                BANDGAP        1188UL
  10. //                1                2                3                4                5                6                7                8
  11. //                无                一                二                三                四                五                六                七
  12. //                9                10                11                12                13                14                15                16
  13. //                八                九                十                百                点                当前        设置        距离
  14. //                17                18                19                20                21                22                23                24
  15. //                电压        电流        水位        温度        重量        单价        总价        厘米
  16. //                25                26                27                28                29                30                31                32
  17. //                米                伏                安                度                千克        元                零                滴
  18. bit Error;
  19. unsigned int Distance,Voltage;
  20. unsigned char Lenth,Play_Pointer,Buff_Pointer;
  21. unsigned char Number[10]={31,2,3,4,5,6,7,8,9,10};
  22. unsigned char Buff[16];
  23. unsigned int Integer,Decimal;
  24. /*----------------------------延时10us@STC-Y6@6MHz----------------------------*/
  25. void Delay_10us(void)
  26. {
  27.         unsigned char i;
  28.         i=18;
  29.         while(--i);
  30. }
  31. /*----------------------------延时x10us----------------------------*/
  32. void Delay_x10us(unsigned char x)
  33. {
  34.         while(x--)
  35.                 Delay_10us();
  36. }
  37. void Send(unsigned char x)
  38. {
  39.         unsigned char i;
  40.         RST=1;
  41.         Delay_x10us(10);
  42.         RST=0;
  43.         Delay_x10us(10);
  44.         for(i=0;i<x;i++)
  45.         {
  46.                 DATA=1;
  47.                 Delay_x10us(10);
  48.                 DATA=0;
  49.                 Delay_x10us(10);
  50.         }
  51.         Delay_x10us(10);
  52. }
  53. void Speak_Function(unsigned char x)
  54. {
  55.         Buff[Buff_Pointer]=x;
  56.         Buff_Pointer++;
  57. }
  58. void Speak_Number(unsigned char x)
  59. {
  60.         unsigned char integer_2,integer_1,integer_0,decimal_1,decimal_2,decimal_3;
  61.         integer_2=(unsigned char)(Integer%1000/100);
  62.         integer_1=(unsigned char)(Integer%100/10);
  63.         integer_0=(unsigned char)(Integer%10);
  64.         decimal_1=(unsigned char)(Decimal%1000/100);
  65.         decimal_2=(unsigned char)(Decimal%100/10);
  66.         decimal_3=(unsigned char)(Decimal%10);
  67.         if(integer_2>0)
  68.         {
  69.                 Speak_Function(Number[integer_2]);
  70.                 Speak_Function(12);
  71.                 if(integer_1==0)
  72.                 {
  73.                         if(integer_0!=0)
  74.                         {
  75.                                 Speak_Function(Number[integer_1]);
  76.                         }
  77.                 }
  78.                 else
  79.                 {
  80.                         Speak_Function(Number[integer_1]);
  81.                 }
  82.         }
  83.         else
  84.         {
  85.                 if(integer_1>1)
  86.                 {
  87.                         Speak_Function(Number[integer_1]);
  88.                 }
  89.         }
  90.         if(integer_1>0)
  91.         {
  92.                 Speak_Function(11);
  93.         }
  94.         if(integer_0==0)
  95.         {
  96.                 if(integer_2==0&&integer_1==0)
  97.                 {
  98.                         Speak_Function(Number[integer_0]);
  99.                 }
  100.         }
  101.         else
  102.         {
  103.                 Speak_Function(Number[integer_0]);
  104.         }
  105.         switch(x)
  106.         {
  107.                 case 1:
  108.                         Speak_Function(13);
  109.                         Speak_Function(Number[decimal_1]);
  110.                 break;
  111.                 case 2:
  112.                         Speak_Function(13);
  113.                         Speak_Function(Number[decimal_1]);
  114.                         Speak_Function(Number[decimal_2]);
  115.                 break;
  116.                 case 3:
  117.                         Speak_Function(13);
  118.                         Speak_Function(Number[decimal_1]);
  119.                         Speak_Function(Number[decimal_2]);
  120.                         Speak_Function(Number[decimal_3]);
  121.                 break;
  122.                 default:
  123.                 break;
  124.         }
  125. }
  126. void Speak(void)
  127. {
  128.         if(BUSY&&Lenth>0)
  129.         {
  130.                 Send(Buff[Play_Pointer]);
  131.                 Play_Pointer++;
  132.                 if(Play_Pointer==Lenth)
  133.                 {
  134.                         Play_Pointer=0;
  135.                         Lenth=0;
  136.                 }
  137.         }
  138. }
  139. void Speak_Distance(unsigned int temp)
  140. {
  141.         Buff_Pointer=0;
  142.         Integer=temp/10;
  143.         Decimal=temp%10*100;
  144.         Speak_Function(32);
  145.         Speak_Function(14);
  146.         Speak_Function(16);
  147.         Speak_Number(1);
  148.         Speak_Function(24);
  149.         Lenth=Buff_Pointer;
  150. }
  151. void Speak_Voltage(unsigned int temp)
  152. {
  153.         Buff_Pointer=0;
  154.         Integer=temp/1000;
  155.         Decimal=temp%1000;
  156.         Speak_Function(32);
  157.         Speak_Function(14);
  158.         Speak_Function(17);
  159.         Speak_Number(3);
  160.         Speak_Function(26);
  161.         Lenth=Buff_Pointer;
  162. }
  163. void Trig(void)
  164. {
  165.         TRIG=1;
  166.         Delay_x10us(100);
  167.         TRIG=0;
  168. }
  169. void Init(void)
  170. {
  171.         AUXR&=0x7F;                //设置定时器0时钟12T模式
  172.         TMOD=0x08;                //设置定时器模式:定时器0受INT0控制,16位自动重载模式
  173.         TF0=0;                        //清除定时器0中断标志
  174.         TH0=0;                        //初始化定时器0
  175.         TL0=0;                        //初始化定时器0
  176.         ET0=1;                        //打开定时器0中断
  177.         EA=1;                        //打开总中断
  178.         P3M0=0x00;                //初始化GPIO模式
  179.         P3M1=0x00;                //初始化GPIO模式
  180.         P5M0=0x00;                //初始化GPIO模式
  181.         P5M1=0x00;                //初始化GPIO模式
  182.         DATA=0;                        //初始化GPIO
  183.         RST=0;                        //初始化GPIO
  184.         TRIG=0;                        //初始化GPIO
  185.         Integer=0;                //初始化变量
  186.         Decimal=0;                //初始化变量
  187.         Error=0;                //初始化变量
  188.         ADCCFG=ADC_RESFMT;                //设置ADC转换结果右对齐,设置ADC时钟
  189.         ADC_CONTR=ADC_POWER|15;        //使能ADC
  190.         Delay_x10us(100);
  191.         ADC_CONTR|=ADC_START;        //启动ADC
  192.         while(!(ADC_CONTR&ADC_FLAG));
  193.         Voltage=ADC_RES<<8|ADC_RESL;
  194.         Voltage=BANDGAP*1024UL/Voltage;
  195.         Speak_Voltage(Voltage);
  196.         ADC_CONTR=0x00;
  197. }
  198. void main(void)
  199. {
  200.         Init();
  201.         while(1)
  202.         {
  203.                 if(!KEY&&!Lenth)
  204.                 {
  205.                         Error=0;
  206.                         TH0=0;
  207.                         TL0=0;
  208.                         Trig();
  209.                         while(!ECHO);
  210.                         TR0=1;
  211.                         while(ECHO);
  212.                         TR0=0;
  213.                         if(Error)
  214.                                 Distance=0;
  215.                         else
  216.                         {
  217.                                 Distance=TH0;
  218.                                 Distance<<=8;
  219.                                 Distance|=TL0;
  220.                                 Distance*=0.34645;
  221.                         }
  222.                         Speak_Distance(Distance);
  223.                 }
  224.                 Speak();
  225.         }
  226. }
  227. void Timer0_ISR(void) interrupt 1
  228. {
  229.         TR0=0;
  230.         TH0=0;
  231.         TL0=0;
  232.         Error=1;
  233. }
复制代码
超声波测距计算.xlsx (9.48 KB, 下载次数: 4)

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:194
  • 最近打卡:2025-05-02 01:39:20
已绑定手机

5

主题

39

回帖

788

积分

高级会员

积分
788
发表于 2025-4-9 20:24:39 | 显示全部楼层
RX2_DATA数组定义用的是u8?

定义个u32 TEMP

TEMP = (u32)RX2_DATA

再移位TEMP
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:47
  • 最近打卡:2025-04-10 06:42:19

19

主题

39

回帖

373

积分

中级会员

积分
373
发表于 2025-4-10 06:42:19 | 显示全部楼层
C_w*** 发表于 2025-4-9 20:24
RX2_DATA数组定义用的是u8?

定义个u32 TEMP

非常感谢,我就是怀疑数据类型的问题,经测试,没问题

        time=(u32)RX2_DATA[0];
        time3=(u16)RX2_DATA[1];
        time=((time<<16)+(time3<<8)+RX2_DATA[2])/1000;

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:02 , Processed in 0.140060 second(s), 76 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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