打印

stm32超声波模块测距

[复制链接]
9871|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a2582006460|  楼主 | 2013-7-29 07:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近写了一个超声波测距的m3程序。代码如下


代码可以实现功能,可是有时数值有抖动。我想让他不抖动,并提高其精确度不知有什么办法
沙发
a2582006460|  楼主 | 2013-7-29 07:41 | 只看该作者
本帖最后由 a2582006460 于 2013-7-29 07:46 编辑

我首先想的是多次测量求平均,代码修改后,显示的数明显不准了而且抖动的更厉害了。不知道为什么

捕获5.PNG (26.45 KB )

捕获5.PNG

使用特权

评论回复
板凳
wping1234| | 2013-7-29 08:55 | 只看该作者
1. TIM3计时的时候,其他所有的中断(所有的)关了没有?
2. 如果加滤波,建议取样10次,取消最大值、最小值后,再取平均值;

使用特权

评论回复
地板
a2582006460|  楼主 | 2013-7-29 09:57 | 只看该作者
wping1234 发表于 2013-7-29 08:55
1. TIM3计时的时候,其他所有的中断(所有的)关了没有?
2. 如果加滤波,建议取样10次,取消最大值、最小 ...


我只开了TIM3的中断,还没用到。还有串口的初始化应该开了串口中断。这会有影响?我不取平均值的时候测得距离值非常好啊。

使用特权

评论回复
5
a2582006460|  楼主 | 2013-7-29 09:59 | 只看该作者
不是这问题我关了TIM3的中断,串口的也关了。还是有问题。我取过平均值后比没取平均值抖动的还厉害,而且测得只都不对了

使用特权

评论回复
6
IJK| | 2013-7-29 11:13 | 只看该作者
time =( (time*0.034) * 0.5 ) * 100;
这么做不好,其实就相当于如下这样:
time = time*17/10;

使用特权

评论回复
7
wping1234| | 2013-7-29 21:47 | 只看该作者
本帖最后由 wping1234 于 2013-7-29 21:50 编辑

你程序里几个数值的类型比较乱。
1楼里面,你将TIM3->CNT,赋值给一个double的time;
4楼里面,你将一个double,赋值给一个u32;
LCD-shownumber里面也是的。
不知道会不会造成这个问题;
在C51里面会出问题的;你还是强制转换一下,看能否好一些;

另外,TIM3->CNT=0这一句能否起作用?
我看我们的EK300超声测距仪(mwtech.taobao.com)的软件设计中,用的是TIM2->EGR |= TIM_EGR_UG;,没直接给CNT赋值。
        //set TIM2: 10Khz, 0.1ms,
        RCC->APB1ENR |=RCC_APB1ENR_TIM2EN;
        TIM2->ARR=65535;
        TIM2->PSC=199;
        //TIM2->CNT=0;
        TIM2->EGR |= TIM_EGR_UG;
        UT_DELAY();
        UT_DELAY();
        TIM2->CR1 |=TIM_CR1_CEN;
你也试一下tim3->EGR的UG直接置位。


使用特权

评论回复
8
a2582006460|  楼主 | 2013-7-30 15:18 | 只看该作者
wping1234 发表于 2013-7-29 21:47
你程序里几个数值的类型比较乱。
1楼里面,你将TIM3->CNT,赋值给一个double的time;
4楼里面,你将一个dou ...

tim3->EGR的UG直接置位
我试过了效果是一样的。寄存器TIMx->CNT是可读可写的,我现在想提高其其精度。测距我可以做到
我是想问为什么我加了这几句话,测距就不对了
                i=0;
                Distance=0;
                for(j=0;j<10;j++)
                {
                        Distance_temp=Get_Distance();        //得到距离
                        Distance=Distance + (Distance_temp * 0.1);
                }
就是测得10次求其平均值

使用特权

评论回复
9
a2582006460|  楼主 | 2013-7-30 15:31 | 只看该作者
a2582006460 发表于 2013-7-30 15:18
tim3->EGR的UG直接置位
我试过了效果是一样的。寄存器TIMx->CNT是可读可写的,我现在想提高其其精度。测 ...

数据转换说的好,以后会注意。不过这样直接复制指挥丢失一部分数据,只是降低了精度罢了。没有太大的问题。我用了数值转换。显示的数值还是有问题。我的去品滚之的算法是不是有什么问题啊。

使用特权

评论回复
10
wping1234| | 2013-7-30 16:14 | 只看该作者
你的ARR设置了么?
还有,超声波探测是在开阔的场地测量,如果有了阻碍,没你可能会不一样。

要是还调不出来,你把程序发给我看看。
我怀疑不是这儿一小块的事情。

使用特权

评论回复
11
wping1234| | 2013-7-30 16:16 | 只看该作者
另外你注意一下,
for(j=0;j<10;j++)
                {
                        Distance_temp=Get_Distance();        //得到距离
                        Distance=Distance + (Distance_temp * 0.1);
***********************这里增加以下延时,是不是超声波板不能这么快重新测量*************
                }

使用特权

评论回复
12
a2582006460|  楼主 | 2013-7-30 18:08 | 只看该作者
wping1234 发表于 2013-7-30 16:16
另外你注意一下,
for(j=0;j

好了,的确是操作太快。这都被你想到了。哈哈

使用特权

评论回复
13
hkcj| | 2013-7-30 18:57 | 只看该作者
找到问题就好  问题解决了就好  

使用特权

评论回复
14
wping1234| | 2013-7-30 19:55 | 只看该作者
a2582006460 发表于 2013-7-30 18:08
好了,的确是操作太快。这都被你想到了。哈哈

我们的系统上,这块是自己设计的电路;
所以发多快都没有问题。

扯了这么久,解决了就好。

使用特权

评论回复
15
Zoiphy| | 2013-8-29 22:45 | 只看该作者
我也在做超声测距,不知道为什么数据不变啊

使用特权

评论回复
16
a2582006460|  楼主 | 2013-9-1 09:27 | 只看该作者
Zoiphy 发表于 2013-8-29 22:45
我也在做超声测距,不知道为什么数据不变啊

实验11 超声波测距实验·.zip (703.59 KB)
上传个简单的实例你看看吧

使用特权

评论回复
17
604603487| | 2013-9-1 12:25 | 只看该作者
用中断做试试,中断嵌套定时器使能和关闭,判断上升沿,下降沿

使用特权

评论回复
18
然未觉| | 2014-5-5 23:36 | 只看该作者
支持楼主,新手拿来参考一下

使用特权

评论回复
19
拿起书本| | 2014-5-6 15:28 | 只看该作者
数据不变感觉应该是信号的问题。首先要观察信号是否正常。然后再看软件。

使用特权

评论回复
20
zwj26| | 2014-5-12 16:02 | 只看该作者
看了 对我蛮有用的 谢谢!

使用特权

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

本版积分规则

28

主题

150

帖子

0

粉丝