注册 登录
查看: 2027|回复: 9

基于k60,驱动tof10120激光测距的问题

[复制链接]
发表于 2019-4-21 19:34:52 | 显示全部楼层 |阅读模式
求解:我的tof10120利用串口驱动,无法接收到信号,串口用蓝牙就能接收发送信号都没问题,换成tof就凉凉,大神帮帮我呀(初学智能车小学弟)
include "common.h"
#include "OLED.h"

/*******************************全局变量********************************/
char Res;
char usart_rxcmd_flag;
unsigned char USART_RX_BUF[16];
char usart_rxcmd_cnt;
char usart_rx_timeout;

unsigned char dcalib_flag=0; //若为0,取均值
unsigned short lenth_buf[10];  //获取的十组距离数据
unsigned short lenth_cnt=0;  //获取十组数据(lenth_buf[lenth_cnt])
unsigned short lenth,avelenth;  //距离,平均距离
unsigned char ok_flag;  //设置成功
unsigned char fail_flag;  //设置失败

/********************************函数声明*******************************/
void init();
void CalAveLenth();
void CalDisplay_Length();
void isr();

/**************************************
*初始化
*UART
*LED
*OLED
**************************************/
void init()
{

/**************************************
*初始化
**************************************/
  UART_InitTypeDef uart_init_structure;
  uart_init_structure.UART_Uartx = UART5;  //使用UART5
  uart_init_structure.UART_BaudRate = 9600; //设置波特率9600
  uart_init_structure.UART_RxPin = PTE9;  //接收引脚为PTE9
  uart_init_structure.UART_TxPin = PTE8;  //发送引脚为PTE8
  uart_init_structure.UART_RxIntEnable = TRUE;
  uart_init_structure.UART_RxIsr = isr;
  LPLD_UART_Init(uart_init_structure);
  LPLD_UART_EnableIrq(uart_init_structure);


/************************************
*LED初始化
************************************/

    GPIO_InitTypeDef gpio_init_struct;
    /*********LED引脚初始化***********/
    gpio_init_struct.GPIO_PTx  =PTA;
    gpio_init_struct.GPIO_Pins =GPIO_Pin17;
    gpio_init_struct.GPIO_Dir  = DIR_OUTPUT;
    gpio_init_struct.GPIO_Output = OUTPUT_H;
    gpio_init_struct.GPIO_PinControl = IRQC_DIS;
    LPLD_GPIO_Init(gpio_init_struct);
    LPLD_GPIO_Output(PTA,17);

/************************************
*OLED初始化
************************************/

    /*********OLED引脚初始化***********/
    gpio_init_struct.GPIO_PTx  =PTC;
    gpio_init_struct.GPIO_Pins =GPIO_Pin16|GPIO_Pin17|GPIO_Pin18|GPIO_Pin19;  //OLED引脚GPIO_Pin16_19
    gpio_init_struct.GPIO_Dir  = DIR_OUTPUT;
    gpio_init_struct.GPIO_Output = OUTPUT_H;
    gpio_init_struct.GPIO_PinControl = IRQC_DIS;
    LPLD_GPIO_Init(gpio_init_struct);
    OLED_Init();
}

/************************************
*取平均值
*************************************/
void CalAveLenth()
{  
  unsigned char i;
  unsigned short sum,max,min;

  max=0;
  min=9999;
  sum=0;
  for(i=0;i<10;i++)
  {
    if(lenth_buf[i]>max)
      max=lenth_buf[i];
    else if(lenth_buf[i]<min)
      min=lenth_buf[i];

    sum+=lenth_buf[i];
  };
  if((max-min)>10)
  {
    if(lenth_cnt>0)
      avelenth=lenth_buf[lenth_cnt-1] ;
    else
      avelenth=lenth_buf[9] ;
  }
  else
    avelenth=(sum-max-min)/8 ;
}

/************************************
*读取距离
*************************************/
void CalDisplay_Length()
{
  unsigned char i;
  unsigned short tmp;
  unsigned char dispbuf[18]={"L=               "};

  for(i=0;i<16;i++)
  {
    dispbuf[i+2]=USART_RX_BUF[i];
    if(USART_RX_BUF[i]=='m')
    {
      if(USART_RX_BUF[i+1]=='m')
      {
        dispbuf[i+3]=USART_RX_BUF[i];
        dispbuf[i+4]=0;
        dispbuf[i+5]=0;
        dispbuf[i+6]=0;
        if(i>0)
          tmp=USART_RX_BUF[i-1]-0x30;
        if(i>1)
          tmp+=(USART_RX_BUF[i-2]-0x30)*10;
        if(i>2)
          tmp+=(USART_RX_BUF[i-3]-0x30)*100;
        if(i>3)
          tmp+=(USART_RX_BUF[i-4]-0x30)*1000;
        lenth=tmp;
        lenth_buf[lenth_cnt]=tmp;
        lenth_cnt++;
        if(lenth_cnt>=10)
          lenth_cnt=0;
        break;
      }
    }
  }
  if(dcalib_flag==0)
  {
    CalAveLenth();
    if(avelenth>=1000)
    {
      dispbuf[2]=avelenth/1000+0x30;
      dispbuf[3]=avelenth/100%10+0x30;
      dispbuf[4]=avelenth/10%10+0x30;
      dispbuf[5]=avelenth%10+0x30;
      dispbuf[6]='m';
      dispbuf[7]='m';
    }
    else if(avelenth>=100)
    {
      dispbuf[2]=avelenth/100%10+0x30;
      dispbuf[3]=avelenth/10%10+0x30;
      dispbuf[4]=avelenth%10+0x30;
      dispbuf[5]='m';
      dispbuf[6]='m';
      dispbuf[7]=0x00;
    }
    else if(avelenth>=10)
    {
      dispbuf[2]=avelenth/10%10+0x30;
      dispbuf[3]=avelenth%10+0x30;
      dispbuf[4]='m';
      dispbuf[5]='m';
      dispbuf[6]=0x00;
      dispbuf[7]=0x00;
    }
    else
    {
      dispbuf[2]=avelenth%10+0x30;
      dispbuf[3]='m';
      dispbuf[4]='m';
      dispbuf[5]=0x00;
      dispbuf[6]=0x00;
      dispbuf[7]=0x00;
    }
    clear_line(3);
    LED_P6x8Str(0,3,dispbuf);
  }
  for(i=0;i<16;i++)
  {
    USART_RX_BUF[i]=0;
    dispbuf[i+2]=0;
  }
}

/***********************************
*uart接收中断函数
***********************************/
void isr()
{
  LED_P6x8Str(0,1,"isr");

  if(usart_rx_timeout>0)
  {
    usart_rx_timeout--;
    if(usart_rx_timeout==0)
    {
      if((USART_RX_BUF[0]=='o')&&(USART_RX_BUF[1]=='k'))
      {
        ok_flag=1;  
        fail_flag=0;   
        LED_CLS();
        LED_P6x8Char(0,3,'O');
      }
      else
        if((USART_RX_BUF[0]=='f')&&(USART_RX_BUF[1]=='a')&&(USART_RX_BUF[2]=='i')&&(USART_RX_BUF[3]=='l'))
        {
          ok_flag=0;
          fail_flag=1;
          LED_CLS();
          LED_P6x8Char(0,3,'F');
        }
        else
        {
          usart_rxcmd_flag=1;
          usart_rxcmd_cnt=0;
        }
    }
  }
}

void main ()
{
  init();
  LED_P6x8Str(0,0,"Testing......");
  LPLD_UART_PutCharArr(UART5,"s5-0#",8);//被动接收(主动接收也试过,没用)
  while(1)
  {
    LPLD_UART_PutCharArr(UART5,"r6#",8);
    while(LPLD_UART_GetChar_Present(UART5))
    {
      Res = LPLD_UART_GetChar(UART5);
      if(usart_rxcmd_flag==0) //设置结果返回
      {
        USART_RX_BUF[usart_rxcmd_cnt] = Res
        usart_rx_timeout=5;
        usart_rxcmd_cnt++;
        if(usart_rxcmd_cnt>(16-1))
          usart_rxcmd_cnt=0;
      }
    }
    if(usart_rxcmd_flag==1)  //距离数据
    {
      CalDisplay_Length();  //显示距离
      usart_rxcmd_flag=0;
    }
  }
}


回复

使用道具 举报

发表于 2019-4-24 13:22:18 | 显示全部楼层
你用的是串口的吗?
串口直接发送距离的吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-26 15:14:18 | 显示全部楼层
宇丶 发表于 2019-4-24 13:22
你用的是串口的吗?
串口直接发送距离的吗?

我根据买家发的例程改的,具体的网上资料太少了,不知道呀

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-26 15:15:57 | 显示全部楼层
冰峰 发表于 2019-4-26 15:14
我根据买家发的例程改的,具体的网上资料太少了,不知道呀

我用示波器查看tof的接收端,根本就没有信号波动呀
回复 支持 反对

使用道具 举报

发表于 2019-4-27 17:36:21 | 显示全部楼层
问题解决没?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-29 22:04:25 | 显示全部楼层

并没有

回复 支持 反对

使用道具 举报

发表于 2019-5-10 19:55:47 | 显示全部楼层
请问你们的TOF10120在哪家店买的,我们最近也想用TOF10120,谢谢
回复 支持 反对

使用道具 举报

发表于 2019-5-18 20:16:13 | 显示全部楼层
请问楼主试过用IIC读取吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-20 21:55:45 | 显示全部楼层
格式化#往昔记忆 发表于 2019-5-18 20:16
请问楼主试过用IIC读取吗?

试过了,没什么用,希望做好的,分享一下

回复 支持 反对

使用道具 举报

发表于 2019-6-18 20:23:37 | 显示全部楼层
冰峰 发表于 2019-4-26 15:14
我根据买家发的例程改的,具体的网上资料太少了,不知道呀

用两个引脚,然后再主函数控制计时溢出就好了。

回复 支持 反对

使用道具 举报

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

本版积分规则

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