OpenEdv-开源电子网

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

分享一个TFMINI激光测距传感器的程序

[复制链接]

7

主题

33

帖子

0

精华

高级会员

Rank: 4

积分
808
金钱
808
注册时间
2017-9-30
在线时间
208 小时
发表于 2018-8-9 10:00:30 | 显示全部楼层 |阅读模式
       前段时间在做一个项目时,用到了一块TFMINI激光测距的传感器,在编写程序时,自己也遇到了一些问题,跟大家分享一下。
       首先,简要介绍一下这个传感器的基本情况。
       TFmini 是一款小型激光雷达模组。主要实现实时、无接触式的距离测量功能,具有测量准确、稳定、高速的特点。TFmini 产品经过光路与算法优化,已最大程度减小外界环境对测距性能的影响。但限于工作原理,测距范围仍会受到环境光照强度和被测目标反射率不同程度的影响。

       ①:TFmini 的测距盲区,为 0-30cm,该范围内的数据不可信。
       ②:TFmini 在极限环境下的测距范围,一般为 0.3-3m,极限条件是指室外强光(夏天正午室外的光照强度约 100klux 左右)下对黑色目标物(10%反射率)探测。
       ③:代表 TFmini 在一般日照条件下(70klux 左右)测量白色目标物的测距范围,包含②的范围,为 0.3-7m。
       ④:代表 TFmini 在室内或环境光很弱的情况下,测距范围为 0.3-12m。

简而言之,这个传感器能够实现元距离较为精确的距离测量。
       TFmini 采用串口数据通信协议。通信接口 UART默认波特率 115200,数据位 8,停止位 1,奇偶校验 None。TFmini 有两种数据输出格式,标准数据输出格式(默认)和 pixhawk 数据格式。
       标准数据输出格式(默认):数据结构:每个数据包为 9Byte。包含距离信息(Dist)、信号强度信息(Strength)、测距档位(Mode)、数据校验字节(CheckSum)等。数据格式为 16 进制(HEX)。具体数据编码详见表 。
1.PNG

       在我的项目中,我用的就是这个默认数据格式。我将这传感器与串口2相连。用串口2接收传感器发送的数据包,并将数据帧解析出来。在这个地方我停滞了很久,原因就是我在串口接收数据时,处理的不到位,导致解析的数据异常。同时,我也查了相当多的资料、论坛,CSDN啥的逛了好久,也借鉴了其他人的方法,包括利用空闲中断啥的,依旧没有解决。没办法,自己就用仿真器仿真调试,一步一步运行,终于解决了这个问题。说来丢人,还是怪自己C语言掌握不牢,在编写解析程序时犯了几个错误。

       下面是我调试成功的程序。主要的就是在串口接收中断里的处理。

       首先,还是常规的串口2配置:
   [mw_shl_code=c,true]#include "tfmini.h"
#include "delay.h"
#define USART2_REC_LEN   200
#define EN_USART2               1
#define Data_Head            0X59   
#define        Data_Length            9   
u16 USART2_RX_BUF[USART2_REC_LEN];     
u16 TFMINI_Distance;   
void USART2_Init(u32 bound)   
{
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
   USART_InitTypeDef USART_InitStructure;
   NVIC_InitTypeDef NVIC_InitStructure;
                 
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;            
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;            
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;             
    GPIO_Init(GPIOA, &GPIO_InitStructure);  

   //USART2相关初始化
        USART_InitStructure.USART_BaudRate = bound;        
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;  
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;       
        USART_Init(USART2, &USART_InitStructure);            
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);        
        USART_Cmd(USART2, ENABLE);                          

        //Usart2 NVIC配置
          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
          NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;               
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                       
          NVIC_Init(&NVIC_InitStructure);                            
}            

[/mw_shl_code]
        接下来就是串口接收数据帧的处理了:        [mw_shl_code=c,true]void USART2_IRQHandler(void)
{
      static u8 seri_count=0;
      u16 check_sum=0;                          //D£Ñéoí
      u8 i;
      static u8 flag;
      if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
     {       
                                                 
       if(USART_ReceiveData(USART2) == Data_Head)
      {
         flag = 1;
      }
                       
      if(flag)
     {       
          USART2_RX_BUF[seri_count++] =USART_ReceiveData(USART2);
                               
         if(seri_count == Data_Length)       
         {
             if(USART2_RX_BUF[0]==Data_Head && USART2_RX_BUF[1]== Data_Head)
             {
                for( i = 0; i < Data_Length-1; i++)
               {
                  check_sum += USART2_RX_BUF;             //&#188;&#198;&#203;&#227;D£&#209;éoí
               }
               if((check_sum & 0x00ff)== USART2_RX_BUF[8])  TFMINI_Distance = USART2_RX_BUF[2] + USART2_RX_BUF[3]* 256;
              //        printf("dis=  %d \r\n",data);
                seri_count = 0;
                flag=0;
            }                                               
        }       
    }
   }  
}[/mw_shl_code]       在此,给大家提供一个解决思路。如果有更好的方法,欢迎大家跟我讨论。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2018-4-28
在线时间
19 小时
发表于 2018-9-27 09:41:57 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2018-8-16
在线时间
25 小时
发表于 2019-1-14 19:06:39 | 显示全部楼层
可以加QQ沟通下吗,最近也在学习这个,感谢。QQ1552613466
回复 支持 反对

使用道具 举报

0

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2018-8-16
在线时间
25 小时
发表于 2019-1-14 19:18:53 | 显示全部楼层
谢谢!
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2356
金钱
2356
注册时间
2013-11-27
在线时间
247 小时
发表于 2019-3-27 20:26:37 | 显示全部楼层
用串口DMA解放CPU
回复 支持 反对

使用道具 举报

0

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2019-1-6
在线时间
31 小时
发表于 2019-5-13 23:48:22 | 显示全部楼层
老哥请问你测出来的数据稳定准确吗,我测得数据有点不稳..
回复 支持 反对

使用道具 举报

7

主题

33

帖子

0

精华

高级会员

Rank: 4

积分
808
金钱
808
注册时间
2017-9-30
在线时间
208 小时
 楼主| 发表于 2019-5-14 20:05:18 | 显示全部楼层
chenjiawei 发表于 2019-5-13 23:48
老哥请问你测出来的数据稳定准确吗,我测得数据有点不稳..

还是比较精确的
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2019-6-9
在线时间
5 小时
发表于 2019-6-9 17:22:19 来自手机 | 显示全部楼层
能加一下QQ吗,1259216392,我想咨询一下大佬
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2019-7-8
在线时间
6 小时
发表于 2019-7-8 09:42:55 | 显示全部楼层
你好,我debug的时候老是效验的时候进不去,就check == buf【8】 这句进不去  能解释一下嘛  
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2018-11-30
在线时间
9 小时
发表于 2019-7-26 12:01:26 | 显示全部楼层

老哥,能不能分享一下完整的程序,急求
回复 支持 反对

使用道具 举报

0

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2020-12-31
在线时间
27 小时
发表于 2021-7-26 21:36:00 | 显示全部楼层
老哥,能不能分享一下完整的程序,急求
回复 支持 反对

使用道具 举报

0

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2020-12-31
在线时间
27 小时
发表于 2021-7-26 21:36:21 | 显示全部楼层
老哥,能不能分享一下完整的程序
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 10:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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