news 2026/5/15 4:05:05

STM32F103C8T6核心板I2C驱动TOF10120激光测距,从接线到串口打印数据的保姆级教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32F103C8T6核心板I2C驱动TOF10120激光测距,从接线到串口打印数据的保姆级教程

STM32F103C8T6核心板驱动TOF10120激光测距模块实战指南

在嵌入式开发领域,精确的距离测量是实现智能避障、自动导航等功能的关键技术。本文将带您从零开始,使用STM32F103C8T6核心板(俗称"蓝桥杯开发板")通过I2C接口驱动TOF10120激光测距模块,实现厘米级精度的距离测量与串口数据输出。

1. 硬件准备与电路连接

1.1 器件选型与特性分析

TOF10120是一款基于飞行时间(Time of Flight)原理的激光测距模块,具有以下核心特性:

  • 测量范围:10cm-180cm(最佳精度区间)
  • 工作电压:3.3V-5V兼容设计
  • 通信接口:支持I2C和UART双模式
  • 数据输出:16位数字量,1mm分辨率
  • 响应时间:<100ms

模块引脚定义如下表所示:

引脚颜色功能定义连接说明
绿色SCLI2C时钟线
黑色SDAI2C数据线
白色TXD串口发送(可剪断)
黄色RXD串口接收(可剪断)
红色VCC电源正极(3.3V-5V)
黑色GND电源地

1.2 硬件连接实操

我们选择PB12/PB13作为I2C接口,具体接线步骤如下:

  1. 电源连接

    • TOF10120的VCC接开发板3.3V
    • GND接开发板GND
  2. 信号线连接

    // 引脚定义宏 #define I2C_SCL_PIN GPIO_Pin_12 // PB12 #define I2C_SDA_PIN GPIO_Pin_13 // PB13
  3. 冗余线处理

    • 剪断或折叠不用的串口线(白、黄线),避免干扰

注意:I2C总线需要上拉电阻(通常4.7kΩ),但STM32的GPIO已内置可配置上拉,可通过代码启用。

2. 开发环境配置

2.1 工程基础配置

使用Keil MDK开发环境,需进行以下关键设置:

  1. 目标设备选择

    • Device: STM32F103C8
    • Flash: 64KB
    • RAM: 20KB
  2. 时钟配置

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  3. 调试接口

    • 启用SWD调试(PA13/PA14)

2.2 I2C软件模拟实现

由于STM32标准外设库的硬件I2C存在稳定性问题,我们采用GPIO模拟方案:

void I2C_Start(void) { GPIO_SetBits(I2C_SDA_PORT, I2C_SDA_PIN); GPIO_SetBits(I2C_SCL_PORT, I2C_SCL_PIN); delay_us(5); GPIO_ResetBits(I2C_SDA_PORT, I2C_SDA_PIN); delay_us(5); GPIO_ResetBits(I2C_SCL_PORT, I2C_SCL_PIN); } unsigned char I2C_ReadByte(void) { unsigned char i, data = 0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(I2C_SDA_PORT, &GPIO_InitStructure); for(i=0; i<8; i++) { data <<= 1; GPIO_SetBits(I2C_SCL_PORT, I2C_SCL_PIN); delay_us(5); if(GPIO_ReadInputDataBit(I2C_SDA_PORT, I2C_SDA_PIN)) data |= 0x01; GPIO_ResetBits(I2C_SCL_PORT, I2C_SCL_PIN); delay_us(5); } return data; }

3. TOF10120驱动开发

3.1 寄存器配置关键点

TOF10120有两个重要工作模式需要配置:

  1. 数据输出模式

    • 地址0x08:0为滤波模式,1为实时模式
    • 滤波模式数据更稳定,实时模式响应更快
  2. 通信方式设置

    • 地址0x09:0为主动上报,1为被动查询

推荐初始化配置:

void TOF_Init(void) { uint8_t mode = 0; // 滤波模式 SensorWritenByte(devAddr, &mode, 0x08, 1); uint8_t comm = 1; // 被动查询 SensorWritenByte(devAddr, &comm, 0x09, 1); }

3.2 数据读取与处理

距离值存储在0x04(高字节)和0x05(低字节)寄存器中:

uint16_t Read_Distance(void) { uint16_t distance = 0; uint8_t buf[2]; SensorReadnByte(devAddr, buf, 0x04, 2); distance = (buf[0] << 8) | buf[1]; return distance; }

数据处理建议:

  • 添加移动平均滤波(5-10次采样)
  • 设置有效范围阈值(10-180cm)
  • 异常值丢弃机制

4. 系统集成与调试

4.1 串口输出实现

配置USART1(PA9/PA10)输出距离数据:

printf("Distance: %d cm\r\n", distance);

推荐串口助手设置:

  • 波特率:115200
  • 数据位:8
  • 停止位:1
  • 无校验

4.2 常见问题排查

以下是开发中可能遇到的典型问题及解决方案:

现象可能原因解决方法
读取值为0I2C地址错误确认设备地址为0xA4
数据跳变大电源干扰增加100uF电容
通信超时时序问题调整delay_us参数
测量不准物体表面特性避免镜面反射目标

4.3 性能优化技巧

  1. 中断优化

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  2. 低功耗设计

    • 间隔测量模式(非连续)
    • 空闲时关闭激光发射
  3. 多传感器融合

    • 结合红外或超声波传感器
    • 卡尔曼滤波算法实现

5. 进阶应用扩展

基于本项目的成熟实现,可进一步开发:

  • 三维扫描系统:通过舵机旋转构建空间点云
  • 智能跟随小车:结合PID算法实现距离保持
  • 手势识别:多点测距分析手部运动轨迹

实际项目中,我在开发室内导航机器人时发现,TOF10120在1米范围内的测量误差可控制在±1cm以内,完全满足大多数应用场景的需求。对于需要更高精度的场合,建议增加温度补偿算法,因为激光传感器的性能会受环境温度影响。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 4:00:48

10、高数----一元函数积分学的应用(1)几何应用

1、用定积分表达和计算平面图形的面积&#xff08;1&#xff09;曲线与以及所围成的平面图形的面积&#xff08;2&#xff09;曲线与与两射线与所围成的曲边扇形的面积例题&#xff1a;⭐️2、用定积分表达和计算旋转体的体积&#xff08;1&#xff09;曲线与及轴围成的曲边梯形…

作者头像 李华
网站建设 2026/5/15 3:59:16

Go语言进程守护工具Custodian:轻量级高可用进程管理实践

1. 项目概述&#xff1a;一个守护进程的诞生与价值在软件开发和系统运维的日常里&#xff0c;我们经常会遇到一些需要长期运行、状态监控和自动恢复的任务。比如&#xff0c;一个关键的API服务进程&#xff0c;我们希望它能在意外崩溃后自动重启&#xff1b;一个定时执行的脚本…

作者头像 李华
网站建设 2026/5/15 3:59:16

AI智能体技能开发:如何用测试驱动开发保障大模型应用质量

1. 项目概述&#xff1a;当AI智能体遇上测试驱动开发 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫 agent-skill-tdd 。光看名字&#xff0c;就能嗅到一股混合了前沿AI技术与经典工程实践的味道。简单来说&#xff0c;这个项目探讨的是如何将 测试驱动开发 这套久经…

作者头像 李华
网站建设 2026/5/15 3:55:04

基于Java与Azure AI的RAG架构智能问答系统构建指南

1. 项目概述&#xff1a;一个基于Java的智能搜索与问答应用 最近在构建企业级知识库或智能客服系统时&#xff0c;很多团队都会遇到一个核心挑战&#xff1a;如何让传统的全文搜索引擎“理解”用户的自然语言提问&#xff0c;并给出精准、结构化的答案&#xff0c;而不仅仅是返…

作者头像 李华
网站建设 2026/5/15 3:53:43

SVN的本地提交

一、下载SVN现在你有一个要被管理的文件夹并且下载好了SVN二、受管理的目录下建一个服务器&#xff08;Server&#xff09;&#xff0c;和要管理的文件夹一级&#xff0c;下图中被红色涂鸦的就是我要管理的文件夹2.1 双击进入svn_Serve的文件夹目录下&#xff0c;接下来如下图操…

作者头像 李华