这个色彩鲜艳的PCB 就是刚推出的嘉立创紫, 我感觉有点偏黑。 激光测距传感器 TMF8801的测试板。 TMF8801 的资料还需要给老外签订保密合同才可以得到,真是让人郁闷的事情。 TMF8801 的程序 说复杂也复杂,里面有上百个寄存器,如果全看下来,头会大三圈。 简单的说只有三块组成。 1 下载固件。 2 校验 3 采集。 下载固件是我最不能理解的,因为买芯片时,技术参数 上说的就是测距范围 2米多, 可以买回来只有670MM 左右。 询问技术支持,反馈说可能是没有加载 8801 的 firmware ,默认是 8701 的。 看来设计这个传感器主要是用与手机,用在别的地方只是搂草打兔子。 这个真的要吐槽一下, 固件数组有10K 多。其余的校验和采集 才不到1K 。 如果不用下载固件,可以用一个很小的MCU 就够使用了。 下载固件的主要程序参考 子先大神。 附连接如下: https://blog.csdn.net/ShenZhen_zixian/article/details/103727570 我主要是补了一些程序,构成完整的。 鉴于程序太大,请去我的Gitee去下载完整代码。 官方给的时LINX的程序,我担心涉及保密,就不方便说了。 /*************************************************************************************************************** TMF8801 get distance addr == 0x20 == rev_data = 唯一的编号 addr == 0x21 == rev_data = 置信度 0~63 addr == 0x23,0x22 == 结果 单位MM addr == 0x24 ,25,26.27 = SYS_CLCOK ****************************************************************************************************************/ extern unsigned char tmf8801_zxd; unsigned short int TMF8801_Get_Distance(void) { // DWORD_VAL SYS_CLOCK; unsigned char flag; unsigned char rev_data ; IIC_TMF8001_ReadByte(TMF8801_REGISTER_CONTENTS_REG, &flag, 1); if (flag == 0x55) { TMF8801_Clear_Interrupt(); IIC_TMF8001_ReadByte(TMF8801_RESULT_NUMBER_REG, rev_data, 8); //0x20 tmf8801_zxd = rev_data ; return (rev_data << 8) | rev_data ; } else return 0; } 他这个采集很有意思,还有个置信度的概念。 最小是0,最大是0X63. 0~99 . 我的理解是 这个传感器发射一堆的光脉冲,计算返回的飞行时间, 这里就有个概率的问题, 跑飞的和正确返回的脉冲得到一个距离的可信度。 我测试来看,只要置信度到50 , 这个得到距离就是真实可行的。 这个是官方最新的给的数组, 尽量用新的吧 const unsigned char app_buf = {0x03, 0x23, 0x00, 0x00, 0x00, 0x64, 0xD8, 0x04}; if(TMF8801_ResetDevice()==false) return false; //get factory calibration value // printf("start factory calibration\r\n"); if (TMF8801_Get_Factory_calibration() == false) { // printf("error\r\n"); return false; } //set factory calibration value TMF8801_Set_Factory_calibration(); if(TMF8801_ResetDevice()==false) return false; IIC_TMF8001_WriteByte(TMF8801_CMD_DATA7_REG, reg_data, 8); reg_data = 0x02; IIC_TMF8001_WriteByte(TMF8801_COMMAND_REG, reg_data, 1); DelayMs(50); TMF8801_Set_Interrupt(true); return true; } 下载固件的程序,请去看 子先的博文,照抄 就太多了。