智能车制作

标题: 【原创】K60之超声波测速方案(本人已验证) [打印本页]

作者: andyxu    时间: 2014-5-23 13:57
标题: 【原创】K60之超声波测速方案(本人已验证)
技术不高,只为分享。

      有帖子说,因为看见“周期最好60ms以上,所以就不太想用超声波了”,确实,在没看到王童鞋的“建议重新学习计数器/定时器”时,我还没有什么灵感和想法。
      以前没灵感是因为野火的三天学会K60只给出了pit_init周期中断函数,如果用周期中断对 超声波的高电平测时间显然不可能,偶然发现了PIT模块中的Timer Load Value Register (PIT_LDVALn)、Current Timer Value Register (PIT_CVALn)这两个寄存器。
      PIT模块用bus_clock作频率源,从PIT_LDVALn递减到0,产生中断又装载PIT_LDVALn值。那么为测量echo端的高电平时间,只要知道如下图所示的第二个时间节点时的PIT_CVALn值就行。根据公式(PIT_LDVALn - PIT_CVALn)*总线时钟周期*声速/2。
[attach]60134[/attach]
实现过程如下:
1.trig脚  简单随意的来个10微秒以上的脉冲;
2.echo脚 设成跳变沿触发中断,在第1步之后,开启引脚中断;
             在第一个上升沿中断开启 PITn中断,中断周期可以设定为60毫秒(这个值PIT_LDVALn 自己设定);
             在第二个下降沿中断读取PIT_CVALn值,然后关闭PITn定时器和IO口中断,结束此次测量。
3.还有注意PITn产生中断就说明没有接收到返回来的波,(即前面没障碍或很远),也结束此次测量。


      虽然还没用砖头测试,但是测墙面还是很准的,1.5m还是可以保证的(若以直道4m/s的速度,假设完成一次测距要100ms,那么小车走过的距离是40cm,因此1.5m应该可以了)。

通过这次我发现仅用提供的库可能还是不够的,得看看K60内部强大的资源了。



作者: 小洋洋    时间: 2014-5-23 19:03
新版的野火库已经有PIT计时功能。
作者: wensenchao    时间: 2014-5-23 19:58
我能说我一直用PIT_CVAL0测算法的运行时间么
作者: andyxu    时间: 2014-5-23 20:53
wensenchao 发表于 2014-5-23 19:58
我能说我一直用PIT_CVAL0测算法的运行时间么

自己研究得比较少,拿来主义多一点,所以……

作者: 仰望,蘫迗    时间: 2014-5-23 21:46
用周期中断对超声波的高电平测时间是可以实现的`~~~
作者: 开灰机的灰机    时间: 2014-5-23 21:57
野火库里不是有个什么PIT_TIME_GET  

这个就是读的PIT_LDVALn 值吧
作者: andyxu    时间: 2014-5-23 22:14
仰望,蘫迗 发表于 2014-5-23 21:46
用周期中断对超声波的高电平测时间是可以实现的`~~~

我知道是可以的,只是不太妥当,有更好更精确的方法而已

作者: andyxu    时间: 2014-5-23 22:15
开灰机的灰机 发表于 2014-5-23 21:57
野火库里不是有个什么PIT_TIME_GET  

这个就是读的PIT_LDVALn 值吧

直接读寄存器就可以了

作者: emper    时间: 2014-5-24 13:48
是定时器的输入捕捉吗
作者: andyxu    时间: 2014-5-24 20:42
emper 发表于 2014-5-24 13:48
是定时器的输入捕捉吗

普通的IO中断

作者: 碛北的孤狼    时间: 2014-6-2 01:21
我用的也是野火的库,咋没找到PIT_CVALn呢,还希望指点一下啊

作者: 碛北的孤狼    时间: 2014-6-2 01:22
仰望,蘫迗 发表于 2014-5-23 21:46
用周期中断对超声波的高电平测时间是可以实现的`~~~

能不能详细的说下方法啊??
作者: 仰望,蘫迗    时间: 2014-6-2 21:30
碛北的孤狼 发表于 2014-6-2 01:22
能不能详细的说下方法啊??

直接用周期性中断写个计数器就行了

作者: 碛北的孤狼    时间: 2014-6-2 21:35
仰望,蘫迗 发表于 2014-6-2 21:30
直接用周期性中断写个计数器就行了

哦,谢谢啦,那我试试吧

作者: 碛北的孤狼    时间: 2014-6-3 20:24
wensenchao 发表于 2014-5-23 19:58
我能说我一直用PIT_CVAL0测算法的运行时间么

能不能请教你一下,你是如何用PIT_CVAL0算时间的吗?就拿超声波来说吧,返回的高电平的时间如何算啊。我的野火的库里只有PIT_CVAL0 没有找到PIT_CVALn啊??
作者: 碛北的孤狼    时间: 2014-6-3 20:27
仰望,蘫迗 发表于 2014-5-23 21:46
用周期中断对超声波的高电平测时间是可以实现的`~~~

能不能请教你一下,如何周期中断来测高电平的时间啊?如果说用普通IO中断的话,那如何找到高电平的时间呢?想了好久还是没想明白,能不能指点一下哦!

作者: 碛北的孤狼    时间: 2014-6-3 21:01
在第一个上升沿中断开启 PITn中断,中断周期可以设定为60毫秒(这个值PIT_LDVALn 自己设定);
在第二个下降沿中断读取PIT_CVALn值,能不能问下你的第一个上升沿中断,第二个下降沿中断,是如何识别出来的吗??
作者: 仰望,蘫迗    时间: 2014-6-3 21:24
碛北的孤狼 发表于 2014-6-3 20:27
能不能请教你一下,如何周期中断来测高电平的时间啊?如果说用普通IO中断的话,那如何找到高电平的时间呢 ...

我们是用跳变沿捕捉的,上升沿的时候读个计数器值,然后下降沿再读一次,两次作差就是了

作者: 碛北的孤狼    时间: 2014-6-3 21:56
仰望,蘫迗 发表于 2014-6-3 21:24
我们是用跳变沿捕捉的,上升沿的时候读个计数器值,然后下降沿再读一次,两次作差就是了

哦。知道啦,谢谢啦
作者: andyxu    时间: 2014-6-3 21:57
碛北的孤狼 发表于 2014-6-3 21:56
哦。知道啦,谢谢啦

就是这样的,喵

作者: 碛北的孤狼    时间: 2014-6-3 21:59
andyxu 发表于 2014-6-3 21:57
就是这样的,喵

那个总线的时钟周期咋找到呢?
作者: 碛北的孤狼    时间: 2014-6-3 22:05
碛北的孤狼 发表于 2014-6-3 21:56
哦。知道啦,谢谢啦

那时钟周期咋找到啊??能不能指教下哦?
作者: andyxu    时间: 2014-6-4 08:11
碛北的孤狼 发表于 2014-6-3 22:05
那时钟周期咋找到啊??能不能指教下哦?

你可以自己配置各个时钟的频率  在 k60_fire.h里面
/*********************   自定义 时钟频率 分频因子   ********************/
#include "Fire_kinetis_MCG_CFG.h"   //参考这文件可以 选配 PRDIV、VDIV 。定义MCG分频因子 :
#define PRDIV             19        // MCG_CLK_MHZ = 50u/(PRDIV+1)*(VDIV+24)
#define VDIV              16
#define CORE_DIV          0         //  core = mcg/ ( CORE_DIV  + 1 )
#define BUS_DIV           1         //  bus  = mcg/ ( BUS_DIV   + 1 )
#define FLEX_DIV          1         //  flex = mcg/ ( FLEX_DIV  + 1 )
#define FLASH_DIV         3         //  flash= mcg/ ( FLASH_DIV + 1 )
/***********************************************************************/



作者: 碛北的孤狼    时间: 2014-6-4 09:13
andyxu 发表于 2014-6-4 08:11
你可以自己配置各个时钟的频率  在 k60_fire.h里面
/*********************   自定义 时钟频率 分频因子 ...

哦。谢谢啦
作者: BMN李    时间: 2014-6-20 09:44
你是怎么判断上升沿和下降沿的?跳变沿进入中断,然后判断电平?
作者: andyxu    时间: 2014-6-20 10:13
BMN李 发表于 2014-6-20 09:44
你是怎么判断上升沿和下降沿的?跳变沿进入中断,然后判断电平?

跳变沿进入中断,然后用PIT里面的时钟定时

作者: BMN李    时间: 2014-6-20 10:42
andyxu 发表于 2014-6-20 10:13
跳变沿进入中断,然后用PIT里面的时钟定时

知道啊。我问的是怎么判断上升沿和下降沿。。。

作者: andyxu    时间: 2014-6-20 14:11
以K60为例,不是GPIO都有中断功能 配置一下就行
作者: 尘梦忆无言    时间: 2014-6-27 22:05
请问大神,我用的超声波在检测地面的时候测距挺准的,但是在检测面积比较小的东西,比如砖头和手掌的时候,在上升沿采集的数据会停止不变,这样算出来的距离就是乱的。不知道大神有木有遇到,肿么破啊?
作者: andyxu    时间: 2014-6-27 22:34
尘梦忆无言 发表于 2014-6-27 22:05
请问大神,我用的超声波在检测地面的时候测距挺准的,但是在检测面积比较小的东西,比如砖头和手掌的时候, ...

在上升沿采集的数据停止不变是什么意思,我测试过,如果是障碍(两块砖头叠起来)那个侧面还是能检测的,

作者: 尘梦忆无言    时间: 2014-6-28 11:20
andyxu 发表于 2014-6-27 22:34
在上升沿采集的数据停止不变是什么意思,我测试过,如果是障碍(两块砖头叠起来)那个侧面还是能检测的, ...

计算距离用的是高电平的时间,就是在上升沿和下降沿分别采集T口返回来的数值(我们用的是T口作为接收端),红色是上升沿采回来的值,黄色是在下降沿采回来的值,另一个是计算的距离,正常的情况下红色是和黄色的波形相近的,计算出来的距离就很正常,但是有时候红色的就不变,不知道是为什么。不知道这是为什么啊?大神的波形是什么样的啊?
[attach]61349[/attach]
作者: 尘梦忆无言    时间: 2014-6-28 11:21
尘梦忆无言 发表于 2014-6-28 11:20
计算距离用的是高电平的时间,就是在上升沿和下降沿分别采集T口返回来的数值(我们用的是T口作为接收端) ...

下边的图蓝色是下降沿和上升沿的差值

作者: v8266    时间: 2014-6-29 20:03
仰望,蘫迗 发表于 2014-6-3 21:24
我们是用跳变沿捕捉的,上升沿的时候读个计数器值,然后下降沿再读一次,两次作差就是了

如果你读到的这个计数值已经很小的话,那不是还没有等到下降沿就产生中断了?

作者: 仰望,蘫迗    时间: 2014-6-29 20:56
v8266 发表于 2014-6-29 20:03
如果你读到的这个计数值已经很小的话,那不是还没有等到下降沿就产生中断了?

那就看你计时器的频率咯

作者: 重生    时间: 2014-6-29 21:24
哈哈,我记得我好像说过周期60ms这个问题,也是在王大神的帖子下面,但不知道楼主说的是不是我咯。。。。这个方案肯定是可行的,但是我更担心超声波的是它的探测范围,太广 会引入干扰,不过我也没有尝试过,当时为了省这个麻烦就直接换了方案了,但是看貌似有人已经做出来了而且效果不错。。楼主是如何做的?
作者: v8266    时间: 2014-6-29 21:38
你好,我按照你的说法谢了下面的代码,但是没反应,能否帮我看看

主函数
  if(HC_SR04_start==0)
  {
    Trig=1;
    delayus(30);
    Trig=0;
    enable_irq(3 + 87);//使能PTD中断
    HC_SR04_start=1;
  }



    if(HC_SR04_start==1) //说明第一次进入中断,接收到高电平,超声波开始计时
    {
      disable_irq(68+2); //关闭PIT2中断

      PIT_TCTRL(PIT2) &= ( ~PIT_TCTRL_TEN_MASK & ~PIT_TCTRL_TIE_MASK );   //关闭 PITn定时器、

PITn中断
      PIT_LDVAL2 = 60*50000;//给初值 总线频率50M   60ms?

      PIT_TCTRL(PIT2) |= ( PIT_TCTRL_TEN_MASK | PIT_TCTRL_TIE_MASK );   //使能 PITn定时器,并开

PITn中断
      enable_irq(68+2);//使能PIT2

      HC_SR04_start=2;
    }
    else if(HC_SR04_start==2)//第二次中断
    {
      timeend   = PIT_CVAL2;
      disable_irq(3+87); //关闭PTD中断
      disable_irq(68+2); //关闭PIT2中断

      time      = 60*50000-timeend;
      distance  = time/50000*340/2;

      HC_SR04_start=0; //重新计算
    }


作者: andyxu    时间: 2014-6-30 09:47
v8266 发表于 2014-6-29 21:38
你好,我按照你的说法谢了下面的代码,但是没反应,能否帮我看看

主函数

HC_SR04_start 这个标志位应该在中断里面进行改变的,也就是说 上升沿到来置1,下降沿到来置2,还有  PIT不需要用到中断

作者: v8266    时间: 2014-6-30 10:43
andyxu 发表于 2014-6-30 09:47
HC_SR04_start 这个标志位应该在中断里面进行改变的,也就是说 上升沿到来置1,下降沿到来置2,还有  PIT ...

PIT不需要用到中断?不是60ms中断吗?

    if(HC_SR04_start==0)  //主函数
    {
      Trig=1;
      exti_init(PORTD,12,either_down);//还没有开中断
      delayus(30);
      Trig=0;
      enable_irq(3 + 87);//PTD
    }


  DisableInterrupts;   //中断函数
  HC_SR04_start++;
  if(PORTD_ISFR & (1 << 12))         //PTD12触发中断
  {
    PORTD_ISFR  |= (1 << 12);        //写1清中断标志位
    if(HC_SR04_start==1) //说明第一次进入中断,接收到高电平,超声波开始计时
    {
      pit_init_ms(PIT2,60);
    }
    if(HC_SR04_start==2)
    {
      timeend   = PIT_CVAL2;
      disable_irq(3+87); //PTD
      disable_irq(68+2); //PIT
      time      =60*bus_clk_khz-timeend;
      distance  = time/bus_clk_khz*340/2;
      HC_SR04_start=0;
    }
  }
  EnableInterrupts;

还是不行 数据乱跳

作者: 寒江    时间: 2014-7-3 21:09
赞一个
作者: Jyoun    时间: 2014-7-7 12:28
赞~~我们另一组用128和超声波,检测50cm,2.8+稳定通过。
作者: Jyoun    时间: 2014-7-7 12:32
其实定时器可以一直开,记录两次中断时,定时器寄存器差值就行了,注意定时器记满后标志一下,再处理就行。没必要单独开关定时器。
作者: andyxu    时间: 2014-7-7 12:34
Jyoun 发表于 2014-7-7 12:32
其实定时器可以一直开,记录两次中断时,定时器寄存器差值就行了,注意定时器记满后标志一下,再处理就行。 ...

恩恩  因为我理解的不够透彻,所以用的也就不够透彻,确实不必要频繁开关的,你说的对

作者: Jyoun    时间: 2014-7-7 12:38
andyxu 发表于 2014-7-7 12:34
恩恩  因为我理解的不够透彻,所以用的也就不够透彻,确实不必要频繁开关的,你说的对

关键是,按我说的方法,可以做到n路(受外部中断限制,n也不能太大,不然也不准确)同时捕捉,比如我用超声波的同时,可以再捕捉rc遥控器的脉冲信号的宽度,而不需要单独操作定时器。

作者: andyxu    时间: 2014-7-7 12:44
Jyoun 发表于 2014-7-7 12:38
关键是,按我说的方法,可以做到n路(受外部中断限制,n也不能太大,不然也不准确)同时捕捉,比如我用超 ...

恩恩  最大程度的利用资源并且简化了CPU的操作

作者: champer    时间: 2014-7-7 15:36
MARK
作者: ww2811    时间: 2014-7-7 23:06
超声波的摆法应该很特别的吧?你们怎么摆的?
作者: andyxu    时间: 2014-7-7 23:46
ww2811 发表于 2014-7-7 23:06
超声波的摆法应该很特别的吧?你们怎么摆的?

一般想法都是左右各一个嘛,高度、两间距、倾斜角度  调节一下

作者: fltsqh    时间: 2014-7-8 19:44
这两个寄存器Timer Load Value Register (PIT_LDVALn)、Current Timer Value Register (PIT_CVALn)怎么调用啊,怎么查值,我写了一下,但IAR报错啊
N=PIT_LDVAL1_TSV;
n=PIT_CVAL1_TVL;  
求大神指点!!!
作者: 傲气杰杰    时间: 2014-7-9 21:40
大神求教怎么写超声波、、、、
作者: andyxu    时间: 2014-7-9 23:31
fltsqh 发表于 2014-7-8 19:44
这两个寄存器Timer Load Value Register (PIT_LDVALn)、Current Timer Value Register (PIT_CVALn)怎么调用 ...

current_timer_val = PIT_CVAL0;

作者: 傲气杰杰    时间: 2014-7-10 13:35
开灰机的灰机 发表于 2014-5-23 21:57
野火库里不是有个什么PIT_TIME_GET  

这个就是读的PIT_LDVALn 值吧

我问下,PIT_TIME_GET这个函数的益处时间怎么设置?

作者: fltsqh    时间: 2014-7-11 13:28
andyxu 发表于 2014-7-9 23:31
current_timer_val = PIT_CVAL0;

不行啊,我这么写IAR会报错
Error[Pe020]: identifier "PIT_CVAL0" is undefined F:\智能车\程序\[拉普兰德K60固件库]LPLD_OSKinetis_V303\LPLD_OSKinetis_V3\project\测距3\app\LPLD_PeriodicInterrupt.c 78




作者: andyxu    时间: 2014-7-11 14:00
fltsqh 发表于 2014-7-11 13:28
不行啊,我这么写IAR会报错
Error: identifier "PIT_CVAL0" is undefined F:\智能车\程序\[拉普兰德K60固 ...

好吧,忘记说了,我的是野火库

作者: Bugs    时间: 2014-7-16 15:55
赞一个
作者: 夜夜夜夜丶    时间: 2014-7-16 16:39
你们有没有发生坡道和障碍的冲突!
作者: wuguangnan110    时间: 2014-7-16 16:59
厉害!
作者: 情绪控先森-    时间: 2014-7-16 18:16
wensenchao 发表于 2014-5-23 19:58
我能说我一直用PIT_CVAL0测算法的运行时间么

闻大神 看看你超声波方案

作者: 情绪控先森-    时间: 2014-7-16 22:40
参考了你的贴子,其中:
在第一个上升沿中断开启 PITn中断,中断周期可以设定为60毫秒(这个值PIT_LDVALn 自己设定);
在第二个下降沿中断读取PIT_CVALn值,然后关闭PITn定时器和IO口中断,结束此次测量。

请问上升沿还是下降沿触发的中断你是怎么判断的?
作者: 情绪控先森-    时间: 2014-7-16 23:14
仰望,蘫迗 发表于 2014-6-3 21:24
我们是用跳变沿捕捉的,上升沿的时候读个计数器值,然后下降沿再读一次,两次作差就是了

怎么确定是上升沿还是下降沿触发的?

作者: 仰望,蘫迗    时间: 2014-7-17 02:18
两个都有
作者: andyxu    时间: 2014-7-17 06:35
情绪控先森- 发表于 2014-7-16 23:14
怎么确定是上升沿还是下降沿触发的?

就用了io口跳变沿

作者: 情绪控先森-    时间: 2014-7-17 14:16
andyxu 发表于 2014-7-17 06:35
就用了io口跳变沿

跳变沿怎么区分是上升沿还是下降沿啊?

作者: 情绪控先森-    时间: 2014-7-17 14:55
情绪控先森- 发表于 2014-7-16 23:14
怎么确定是上升沿还是下降沿触发的?

请问你是设置成跳变沿触发?还是上升沿触发?还是下降沿触发?然后怎么两次进入中断如何做的区分?

作者: andyxu    时间: 2014-7-17 15:32
恩恩,跳变沿触发,用一个变量记录上升和下降
作者: hcc12cumt    时间: 2015-4-4 21:13
小洋洋 发表于 2014-5-23 19:03
新版的野火库已经有PIT计时功能。

你好,请问你有这个带计时功能的库函数吗?谢谢

作者: yuanxiyun    时间: 2015-5-22 21:38
wensenchao 发表于 2014-5-23 19:58
我能说我一直用PIT_CVAL0测算法的运行时间么

同学可以详细说一下,你是如何测算法的执行时间的,谢谢,

作者: 罩骁MI    时间: 2016-3-11 15:17
顶!!!!!!
作者: 784653186    时间: 2016-5-4 12:29
感谢楼主写超声波的思路以及王童鞋不用重复开启定时器的提示,事实证明这样写真的挺好用。

作者: 想什么呢    时间: 2017-7-19 19:26
楼主大大有写好的程序吗   可不可以借我参考下   最近快被超声波搞疯了




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2