打印
[STM32F1]

VSCODE STM32 裸机之超声波测距(HC-SR04)

[复制链接]
1818|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
开发环境:VSCODE(gcc编译链)+STM32CubeMX(也可以使用HUAWEI-LiteOS-Studio) 。
代码:链接:https://pan.baidu.com/s/1uXfIR0GFQOBZPl1NfQP08w  
提取码:6b0c

基本工作原理:
(1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信呈。
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声
波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;




以上时序图表明你只需要提供一个 10uS 以上脉冲触发信号,该模块内部将
发出 8 个 40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号。
回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号
时间间隔可以计算得到距离。公式:uS/58=厘米或者 uS/148=英寸;或是:距离=
高电平时间*声速(340M/S)/2;建议测量周期为 60ms 以上,以防止发射信号对
回响信号的影响。

HAL库代:
void HCSR04_Read_Data(float *cmA,float *cmB,uint16_t *cmC)
{
   

        while(ECHO_IN() ==1);
       
        TRIG_H();                                       
        delay_us(1);     //10uS 以上脉冲触发信号              
        TRIG_L();
       
        while(ECHO_IN() ==0);           //ECHO_IN为0时,无信号
    htim6.Instance->CNT = 0;        //清空
        HAL_TIM_Base_Start(&htim6);     //开启定时器
        while(ECHO_IN() ==1);           //有信号返回,ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间
        HAL_TIM_Base_Stop(&htim6);                //关闭定时器
       
    //测试距离=(高电平时间*声速(340M/S))/2;
        *cmA =(((htim6.Instance->CNT)*340)/1000000.0)/2*100;   //声速换算
        *cmB = ((htim6.Instance->CNT))/58.0 ;                                   //厘米换算
        *cmC = ((htim6.Instance->CNT))/58;                                           //整数换算
          
}
固件库3.5代码

void HCSR04_Read_Data(float *cmA,float *cmB,uint16_t *cmC)
{
        while(ECHO_IN() ==1);
       
        TRIG_H();                                       
        delay_us(15);    //10uS 以上脉冲触发信号
        TRIG_L();
       
        while(ECHO_IN() ==0);   //ECHO_IN为0时,检ECHO_IN为0时,无信号
        TIM_SetCounter(TIM6,0); //清空
        TIM_Cmd(TIM6,ENABLE);   //开启定时器
        while(ECHO_IN() ==1);   //有信号返回,ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间
        TIM_Cmd(TIM6,DISABLE);        //关闭定时器
       
        //测试距离=(高电平时间*声速(340M/S))/2;
        *cmA =((TIM_GetCounter(TIM6)*340)/1000000.0)/2*100;   //声速换算  
        *cmB = (TIM_GetCounter(TIM6))/58.0 ;                                                                        //厘米换算
        *cmC = (TIM_GetCounter(TIM6))/58;                                                                                        //整数换算
       
}









使用特权

评论回复
沙发
cyclefly| | 2021-11-6 13:49 | 只看该作者
这个测试精度怎么样,
我也需要测距
但是看这个价格太便宜,一直没用,担心精度不够

使用特权

评论回复
板凳
zero949079783|  楼主 | 2021-11-6 14:22 | 只看该作者
cyclefly 发表于 2021-11-6 13:49
这个测试精度怎么样,
我也需要测距
但是看这个价格太便宜,一直没用,担心精度不够 ...

只能达到厘米级的精度。显示可以测到毫米

使用特权

评论回复
地板
cyclefly| | 2021-11-6 15:14 | 只看该作者
好的,回头也试试
学习了

使用特权

评论回复
5
zero949079783|  楼主 | 2021-11-6 17:46 | 只看该作者
cyclefly 发表于 2021-11-6 15:14
好的,回头也试试
学习了

要高精度可以用激光测距,可以达到毫米级

使用特权

评论回复
6
xch| | 2021-11-9 18:52 | 只看该作者
做得好可以到1um 分辨率吧。

使用特权

评论回复
7
zero949079783|  楼主 | 2021-11-9 19:15 | 只看该作者
xch 发表于 2021-11-9 18:52
做得好可以到1um 分辨率吧。

1US计时,小数点后面最多3位

使用特权

评论回复
8
xch| | 2021-11-9 19:18 | 只看该作者
zero949079783 发表于 2021-11-9 19:15
1US计时,小数点后面最多3位

不是1μS,是1μm。1uS 分辨率是幼儿园级别的玩具。

使用特权

评论回复
9
zero949079783|  楼主 | 2021-11-9 19:21 | 只看该作者
xch 发表于 2021-11-9 19:18
不是1μS,是1μm。1uS 分辨率是幼儿园级别的玩具。

看你在什么产品上面

使用特权

评论回复
10
guijial511| | 2021-11-9 21:05 | 只看该作者
这个能到1um?

使用特权

评论回复
11
paotangsan| | 2021-12-3 13:32 | 只看该作者
裸机的实时性如何

使用特权

评论回复
12
renzheshengui| | 2021-12-3 13:33 | 只看该作者
测距范围能有多少啊

使用特权

评论回复
13
tpgf| | 2021-12-3 13:36 | 只看该作者
精度能达到多少啊

使用特权

评论回复
14
wakayi| | 2021-12-3 13:37 | 只看该作者
超声波的限制是什么

使用特权

评论回复
15
wowu| | 2021-12-3 14:31 | 只看该作者
开发环境友好吗

使用特权

评论回复
16
xiaoqizi| | 2021-12-3 14:34 | 只看该作者
系统能提高性能吗

使用特权

评论回复
17
zero949079783|  楼主 | 2021-12-4 00:00 | 只看该作者
xiaoqizi 发表于 2021-12-3 14:34
跑系统能提高性能吗

硬件是基础,软件是灵魂,你觉得呢

使用特权

评论回复
18
hearstnorman323| | 2022-11-19 16:50 | 只看该作者
如何定时器测量呢?               

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

81

帖子

1

粉丝