OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 61428|回复: 43

HC-SR04超声波测距模块驱动程序(STM32)

[复制链接]

23

主题

143

帖子

1

精华

高级会员

Rank: 4

积分
933
金钱
933
注册时间
2012-4-23
在线时间
68 小时
发表于 2012-8-6 14:55:31 | 显示全部楼层 |阅读模式
这个是自己写的HC-SR04超声波测距模块驱动程序,使用诺基亚的拆机屏5110显示。

如果需要用1602显示的话也可以修改一下使用,只要5110的驱动自己换成1602的就可以了,如果没有1602的可以搜索一下论坛,我之前也发过1602的驱动。

实际测量过程发现测量静态的比较稳定,动态的很不稳定,3米范围内比较稳定。

可能是我哪里没考虑到,要是有经验同学发现我哪里遗漏或者错了还希望提醒一下。





ULTRASONIC.zip

316.07 KB, 下载次数: 16377

HC-SR04超声波测距模块.pdf

221.65 KB, 下载次数: 11400

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2013-8-18
在线时间
7 小时
发表于 2013-10-4 18:31:28 | 显示全部楼层
楼主,我用了你的程序,发现有问题哎,测不出来,而且经我测试你的程序会一直会输出这样的结果109489099923000860000000000.000000
不懂这是什么原因,我的测试如下:

主函数如下:


#include <stm32f10x.h>
#include "time.h"
#include "delay.h"
#include "usart.h"
#include "ultrasonic.h"
int main(void)
{
float temp;
SystemInit();
USART_Config(9600);
Ultran_Init();
while(1)
{
printf("11111\n");//添加了这句
Ultra_Ranging(&temp);
printf("%f\n",temp);
}
}

Ultra_Ranging函数修改如下:

void Ultra_Ranging(float *p)
{
u8 i;
u32 j;
float Ultr_Temp;
for(i=0;i<5;i++)
{
TRIG_Send=1;
delay_us(20);
TRIG_Send=0;
while(!ECHO_Reci);
while(ECHO_Reci)
{
delay_us(10);
j++;
printf("222222\n");//只添加了这句话
}
Ultr_Temp+=340/2*j*10;
j=0;
delay_ms(60);//
}
*p=Ultr_Temp/5/1000000;
}

串口打印结果如下:




222222
222222
222222
222222
222222
222222
222222
109489099923000860000000000.000000
11111
222222
222222
222222
222222
222222
222222
222222
222222


以后打印出来的结果是重复的!也就是temp的输出结果只为109489099923000860000000000.000000并没有改变

请问这是为什么?










回复 支持 1 反对 0

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2013-3-29
在线时间
0 小时
发表于 2013-4-25 22:38:51 | 显示全部楼层
如何判断模块是否工作呢,我也类似写了个程序,但发现模块每次读出来的就一个值~
而且发现不接电源模块只接地也能工作,这问题在哪!
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-6 15:50:02 | 显示全部楼层
附件呢?
回复 支持 反对

使用道具 举报

9

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
287
金钱
287
注册时间
2012-3-19
在线时间
37 小时
发表于 2012-8-6 16:32:25 | 显示全部楼层
哥们儿,难道不懂得怎么发附件?
回复 支持 反对

使用道具 举报

头像被屏蔽

263

主题

455

帖子

1

精华

禁止访问

积分
1212
金钱
1212
注册时间
2011-9-25
在线时间
12 小时
发表于 2012-8-6 19:17:26 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

23

主题

143

帖子

1

精华

高级会员

Rank: 4

积分
933
金钱
933
注册时间
2012-4-23
在线时间
68 小时
 楼主| 发表于 2012-8-6 19:29:29 | 显示全部楼层
回复【3楼】499734424:
---------------------------------

因为后来发现有问题就先下了,怕误导大家,现在再传上去。
回复 支持 反对

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1704
金钱
1704
注册时间
2012-5-10
在线时间
440 小时
发表于 2012-8-8 11:51:03 | 显示全部楼层
你测的准么,超声波测距很不好用,远点的东西就会因为角度问题,回收不到声波,
测距的小模块好像就只有这个了吧,其他的就非常的贵了
如有技术问题,微信扫头像交流,STM32,JAVA,服务器
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-6-2
在线时间
1 小时
发表于 2012-12-4 21:39:27 | 显示全部楼层
不错
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2013-4-4
在线时间
0 小时
发表于 2013-6-8 13:21:32 | 显示全部楼层
回复【8楼】流浪牧辰:

如何判断模块是否工作呢,我也类似写了个程序,但发现模块每次读出来的就一个值~
而且发现不接电源模块只接地也能工作,这问题在哪!

---------------------------------
同上,读出来都是差不多大的值,也不随距离变化。
回复 支持 反对

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2013-6-17
在线时间
7 小时
发表于 2013-6-17 17:34:13 | 显示全部楼层
楼主 你好 请问我用你的程序计算完单位是厘米还是米。。貌似测得不是很准确
回复 支持 反对

使用道具 举报

9

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-2-5
在线时间
0 小时
发表于 2013-8-9 10:46:39 | 显示全部楼层
回复【10楼】ljh407055315:

楼主 你好 请问我用你的程序计算完单位是厘米还是米。。貌似测得不是很准确

---------------------------------
void Ultra_Ranging(float *p)
{
u8 i;
u32 j;
float Ultr_Temp;
for(i=0;i<5;i++)
{
TRIG_Send=1;
delay_ms(10);
TRIG_Send=0;
while(!ECHO_Reci);
while(ECHO_Reci)
{
delay_us(10);
j++;
}
Ultr_Temp+=340/2*j*10;//模块最大可测距3m 
j=0;
delay_ms(60);//防止发射信号对回响信号的影响
}
*p=Ultr_Temp/5/1000000; 
}
我对这两个单位换算不是很明白Ultr_Temp+=340/2*j*10;//模块最大可测距3m 
*p=Ultr_Temp/5/1000000;
回复 支持 反对

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2013-6-17
在线时间
7 小时
发表于 2013-8-9 21:02:44 | 显示全部楼层
回复【11楼】云中的太阳:
---------------------------------
我用另一种计算方法解决了!!测的准确度还可以!!不过还是谢谢你啊
回复 支持 反对

使用道具 举报

50

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
492
金钱
492
注册时间
2013-2-2
在线时间
0 小时
发表于 2013-8-12 14:58:44 | 显示全部楼层
回复【9楼】Earthman:
---------------------------------楼主,你的问题解决了吗
回复 支持 反对

使用道具 举报

50

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
492
金钱
492
注册时间
2013-2-2
在线时间
0 小时
发表于 2013-8-12 15:00:17 | 显示全部楼层
回复【12楼】ljh407055315:
---------------------------------
哥们,你的超声波程序可以用吗
回复 支持 反对

使用道具 举报

50

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
492
金钱
492
注册时间
2013-2-2
在线时间
0 小时
发表于 2013-8-12 15:31:15 | 显示全部楼层
回复【8楼】流浪牧辰:
---------------------------------
楼主,你的问题解决了吗?我也碰到和你一样的问题
回复 支持 反对

使用道具 举报

2

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2012-10-23
在线时间
2 小时
发表于 2014-1-10 12:00:42 | 显示全部楼层
HC-SR04超声波测距模块 电平是5v的,stm32是3.3v的 ,请问你是怎么匹配的呢?直接加限流电阻,还是用到了三极管呢?  请问有必要用到三极管吗?
回复 支持 反对

使用道具 举报

2

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2012-10-23
在线时间
2 小时
发表于 2014-1-10 12:02:14 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------

HC-SR04超声波测距模块 电平是5v的,stm32是3.3v的 ,原子哥知道怎么匹配吗?直接加限流电阻,还是要用到三极管呢?
回复 支持 反对

使用道具 举报

9

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2014-7-18
在线时间
0 小时
发表于 2014-7-20 10:59:52 | 显示全部楼层
测得挺准的  不错  谢谢啦!!
Stm32 F0/F103
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-6-29
在线时间
0 小时
发表于 2014-7-21 17:29:37 | 显示全部楼层
--------------------------回复【8楼】流浪牧辰:
你好,我想问一下你的问题是怎么解决的?
回复 支持 反对

使用道具 举报

17

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2014-4-12
在线时间
0 小时
发表于 2014-7-25 10:27:23 | 显示全部楼层
显示用的其他的硬件。。。。。
规格严格,功夫到家
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-6-29
在线时间
0 小时
发表于 2014-7-25 12:09:26 | 显示全部楼层
回复【21楼】FMX_2011:
---------------------------------
就是我用输入捕获,捕获高电平的持续时间,然后在串口上打印出来,可是输出的总是一个值,为什么呢?
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-7-31
在线时间
0 小时
发表于 2014-8-13 17:29:53 | 显示全部楼层
[mw_shl_code=c,true]LZ 为啥我用TIM定时不好使呢 你看我程序有问题吗 打印到串口上都是0[/mw_shl_code] [mw_shl_code=c,true]#include "delay.h" #include "sys.h" #include "key.h" #include "usart.h" #include "stm32f10x_tim.h" //ALIENTEK Mini STM32开发板范例代码2 //按键输入实验 //技术支持:www.openedv.com //广州市星翼电子科技有限公司 void TIM2_IRQHandler(void) { if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_12)==0) GPIO_SetBits(GPIOE,GPIO_Pin_12); else GPIO_ResetBits(GPIOE,GPIO_Pin_12); TIM_ClearFlag(TIM2, TIM_FLAG_Update); } void Tim2_Init(u16 prr,u16 prc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeInit(TIM2);//复位TIM2定时器 TIM_TimeBaseStructure.TIM_Period = prr; TIM_TimeBaseStructure.TIM_Prescaler = prc; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure); TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); } void GPIOs_Init() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PA7 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 echo GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PA8 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出 Trig GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_ResetBits(GPIOA,GPIO_Pin_8);//初始设置为低电平 } void TrigSetBit() { GPIO_SetBits(GPIOA,GPIO_Pin_8); } void TrigResetBit() { GPIO_ResetBits(GPIOA,GPIO_Pin_8); } uint8_t ReadEcho() { return GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7); } int main(void) { u16 t; u16 count; float length; SystemInit(); uart_init(9600); Tim2_Init(49999,71); GPIOs_Init(); KEY_Init(); //初始化与按键连接的硬件接口 delay_init(); delay_ms(5); while(1) { t=KEY_Scan(0); //得到键值 if(t==KEY0_PRES||t==KEY1_PRES||t==WKUP_PRES)//如果三个按键有一个按下了 就进行一次测距 { printf("one try\n"); TrigSetBit(); delay_us(20); TrigResetBit(); TIM2->CNT=0; while(ReadEcho()==0); TIM_Cmd(TIM2, ENABLE); while((ReadEcho()==1)&&(TIM2->CNT<TIM2->ARR-10)); TIM_Cmd(TIM2,DISABLE); count=TIM2->CNT; length=count/58.0; printf("%d s",count);//向串口打印测距对应的计数值 printf("\n"); printf(" \n"); printf("one try completed\n"); delay_ms(200); } } } [/mw_shl_code]
我之前 还是过用 SysTick 也不好使。。。http://www.openedv.com/posts/list/0/37778.htm?privmsg=25314&&sysid=4#213217
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-7-31
在线时间
0 小时
发表于 2014-8-13 17:32:27 | 显示全部楼层
LZ 你写 其实有一点小漏洞 就是太近了会测不准。。。(我的意思指贴上了)
回复 支持 反对

使用道具 举报

1

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2014-6-11
在线时间
0 小时
发表于 2014-8-15 04:23:30 | 显示全部楼层
小白问一下怎么换驱动。。。。。。
我们互相帮助
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2015-2-6
在线时间
0 小时
发表于 2015-2-6 16:48:25 | 显示全部楼层
回复【8楼】流浪牧辰:
---------------------------------
你的问题解决了么??
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-5-13
在线时间
0 小时
发表于 2015-5-14 22:11:58 | 显示全部楼层
楼主 你好 我用你的程序这里有一点问题
--------------------------------- 
void Ultra_Ranging(float *p) 

u8 i; 
u32 j; 
float Ultr_Temp; 
for(i=0;i<5;i++) 

TRIG_Send=1; 
delay_ms(10); 
TRIG_Send=0; 
while(!ECHO_Reci); 
while(ECHO_Reci) 

delay_us(10); 
j++; 

Ultr_Temp+=340/2*j*10;//模块最大可测距3m  
j=0; 
delay_ms(60);//防止发射信号对回响信号的影响 

*p=Ultr_Temp/5/1000000;  



一直在
while(ECHO_Reci) 

delay_us(10); 
j++; 

循环

什么原因呢?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2015-7-6
在线时间
7 小时
发表于 2015-7-6 15:35:19 | 显示全部楼层
回复【24楼】Mackle:
-------------------------
测量的最近距离是2cm
最远距离4m到10m不等
精度3mm
仅供参考
回复 支持 反对

使用道具 举报

2

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-4-18
在线时间
3 小时
发表于 2015-7-20 18:16:08 | 显示全部楼层
回复【23楼】Mackle:
---------------------------------请问你的问题解决了没,我现在也是,串口输出全是0
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-5-29
在线时间
2 小时
发表于 2015-8-27 22:13:06 | 显示全部楼层
谢谢楼主,先试一下
长路漫漫,唯剑作伴。
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2015-10-7
在线时间
0 小时
发表于 2015-10-9 11:11:40 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-6-30
在线时间
8 小时
发表于 2015-12-30 12:10:04 | 显示全部楼层
学习一下,谢谢楼主分享。
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-6-30
在线时间
8 小时
发表于 2016-1-4 21:33:16 | 显示全部楼层
打印出来不稳定,前后数据出现相差1.7cm,公式修改成UltrasonicWave_Distance=TIM_GetCounter(TIM2)*34/20.0;
QQ图片20160104213247.png
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
229
金钱
229
注册时间
2015-11-2
在线时间
38 小时
发表于 2016-3-20 20:25:43 | 显示全部楼层
谢谢楼主了!
回复 支持 反对

使用道具 举报

3

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
305
金钱
305
注册时间
2016-4-21
在线时间
26 小时
发表于 2016-5-7 13:05:01 | 显示全部楼层
感谢感谢
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-4-24
在线时间
7 小时
发表于 2016-5-12 18:15:24 | 显示全部楼层
楼主这个程序不行的。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-7-27
在线时间
1 小时
发表于 2016-7-27 20:34:07 | 显示全部楼层
wwwio 发表于 2015-5-14 22:11
楼主&nbsp;你好&nbsp;我用你的程序这里有一点问题
---------------------------------&nbsp;
void&nbsp;Ult ...

我和你是一样的情况,无论是自己写的,还是用别人的都会在接收echo电平的时候出现接收不到电平然后死循环的情况。朋友你解决了吗,能说明一下是怎么回事吗,谢谢了
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2016-9-12
在线时间
8 小时
发表于 2016-9-12 10:16:57 | 显示全部楼层
lz497544867 发表于 2016-7-27 20:34
我和你是一样的情况,无论是自己写的,还是用别人的都会在接收echo电平的时候出现接收不到电平然后死循环 ...

请问朋友你解决了吗?
回复 支持 反对

使用道具 举报

3

主题

21

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2014-8-14
在线时间
14 小时
发表于 2016-9-16 10:25:15 | 显示全部楼层
搞机不搞基 发表于 2016-9-12 10:16
请问朋友你解决了吗?

可能是高电平延时时间少了。改成delay_us(40);
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-11-7
在线时间
3 小时
发表于 2016-11-9 11:16:01 | 显示全部楼层
@ljh407055315:  我能看看你弄的超声波测距程序部?初学者,自己写了一个,弄了好久也没有弄出来!想参考参考你们大神的!看自己出错在哪里!
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-11-19
在线时间
8 小时
发表于 2016-12-7 11:12:04 | 显示全部楼层
用不了
回复 支持 反对

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
发表于 2017-3-13 08:41:59 | 显示全部楼层
ljh407055315 发表于 2013-8-9 21:02
回复【11楼】云中的太阳:
---------------------------------
我用另一种计算方法解决了!!测的准确度还可 ...

你好,你用的什么方法呀
回复 支持 反对

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-12-5
在线时间
22 小时
发表于 2017-3-15 15:22:39 | 显示全部楼层
请问一个,我的程序用jlink驱动SW方式下载烧录进去后测距离完全正常,但是重新上电后,距离都几百米等错距离,这是为什么?
回复 支持 反对

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
发表于 2017-4-27 14:52:28 | 显示全部楼层
xsx127 发表于 2012-8-8 11:51
你测的准么,超声波测距很不好用,远点的东西就会因为角度问题,回收不到声波,
测距的小模块好像就只有这 ...

你好,遇到超声波测距数据有点飘该怎么办啊?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-21 20:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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