
简介面向基于STM32的智能扫地机器人小车控制系统开发这套资料以STM32F103C8T6为主控覆盖超声波避障、MPU6050姿态检测、红外感应识别、行走电机驱动与电源管理等典型外设适合嵌入式初学者、课程设计与毕业设计用作完整项目参考。资料包共1034个文件压缩后仅41.49MB包含Keil工程源码h、c、d等文件、Altium Designer绘制的原理图与PCB文件、Visio格式的系统框图和详细程序流程图以及PDF/Text说明文档和演示图片从硬件电路到软件逻辑形成完整闭环。目前已有74人学习下载资源按目录归类整理提供多个版本的源码迭代记录可直接编译并烧录验证便于对照实物理解扫地机器人的功能分层与任务调度也可作为二次开发和功能扩展的起点整体结构清晰适合快速搭建原型并完成功能调试。 拿到这套 STM32F103C8T6 扫地机器人小车全套开发资料的时候我的习惯是先看系统框图而不是先打开源码。原因很简单绝大多数嵌入式项目资料最让人头疼的就是代码跟电路对不上号流程图和实际行为两张皮。这套资料把源码、原理图、PCB、系统框图和流程图都放在一起正好把一条完整的“电路—程序—行为”链路串了起来。整个项目不算复杂主控是一块 STM32F103C8T6 最小系统板外围是电机驱动、避障传感器、电源管理再加上可选蓝牙和显示模块。但正因为不复杂它非常适合用来完整理解一个单片机产品怎么从图纸变成跑得起来的实物。这篇文章我会按硬件、PCB、软件、调试四个阶段过一遍把资料里真正值钱的取舍和踩坑点挑出来讲。1. 先拆清楚这套小车的完整组成从系统框图反推硬件需求拿到资料第一件事不是看代码而是看系统框图。这张图画清楚了一辆车为什么需要这些模块各模块之间怎么通信电源怎么流、数据怎么走。扫地机器人小车和普通遥控小车最大的区别在于“自主性”它要自己检测障碍、自己决定转向、自己判断有没有清扫干净。所以系统框图里的每个模块都有明确分工缺一个整个逻辑就断一截。1.1 扫地机器人小车到底需要哪些模块这套资料里的系统框图模块划分大概是这样模块关键器件作用与主控的接口主控STM32F103C8T6运行控制逻辑、输出PWM、处理传感器数据内部资源电机驱动TB6612FNG放大控制信号驱动两个直流减速电机TIM1 PWM、GPIO方向引脚感知系统红外避障传感器、HC-SR04超声波检测前方和侧方障碍GPIO、TIM2输入捕获电源系统5V稳压、3.3V LDO分别给电机驱动、传感器、主控供电给各模块供电交互接口串口、OLED、蓝牙模块可选调试输出、状态显示、遥控USART1、I2C/SPI从这张表能看出来硬件选型都是围绕“能跑起来、还能扩展”来定的。红外传感器便宜、响应快适合做近距检测超声波测距范围大能判断障碍物离车还有多远。两者互补这也是真机上常见的低成本方案。1.2 为什么选 STM32F103C8T6资源边界决定方案形态STM32F103C8T6 这颗芯片的资源是 64KB Flash、20KB RAM、最高72MHz主频带多个定时器和 USART。放在今天来看不算多但对扫地小车这种控制类项目完全够用你不需要跑复杂算法也不需要大缓存需要的是多路 PWM、稳定的 GPIO 输入、一个定时器捕获超声波回波这些 F103C8 天然都有。更重要的一点是这颗芯片的资料生态太成熟了。无论标准库还是 HAL 库网上都有大量的例程遇到问题搜得到答案。对入门者来说资料多本身就是一种生产力。目前市场上还有不少国产替代型号硬件引脚基本兼容采购成本更低但烧录时要注意器件 ID 和配置差异这点我在后面调试部分会提到。另外要提醒一句资源边界决定方案形态。如果你打算做视觉识别扫地机要跑摄像头和图像处理那 F103C8 就不够用得上 H7 甚至 MPU 级别的平台。这套资料的价值是让你理解一颗资源有限的芯片上怎么把功能做得恰到好处。2. 原理图设计的取舍电源、电机驱动与传感器接口原理图是整个项目的“宪法”。很多新手拿到厂家 Demo 板就照着画结果动不动就复位、电机一启动单片机就死机根源往往不是代码而是原理图上电源和地没处理好。这套资料的原理图部分给了我不少启发重点在三个地方供电架构、电机驱动、传感器接口。2.1 供电架构怎么搭才不掉链子电机是典型的脉冲负载启动瞬间电流能达到 1A 甚至更高这会对电源轨造成剧烈冲击。如果主控和电机共用一根细的电源线电压跌落会直接导致 MCU 复位。所以供电架构的核心原则是功率电源和逻辑电源要分开走然后在电源入口统一汇合。这套小车如果用的是 4 节 5 号电池电池电压约 6V经过防反接二极管后直接给电机驱动供电再通过一颗 LDO 降到 3.3V 给主控如果换 7.4V 锂电池则需要先做一级 5V 降压再给电机驱动板最后转 3.3V 给控制侧。设计原理图时在电池入口放一个 100uF 电解电容吸收电机突变电流在 MCU 电源引脚附近放一个 10uF 加多个 0.1uF 陶瓷电容做高频去耦能解决很大一部分“莫名复位”问题。这里有个容易忽略的点LDO 的输入输出压差。如果电池满电是 8.4V用普通 1117 直接降到 3.3V压差 5.1V电流稍大一点发热就很可观。所以锂电方案一定要先降到 5V然后再用 3.3V LDO不要试图一个 LDO 从高压直接落到 3.3V。2.2 电机驱动和传感器接口的关键细节电机驱动芯片为什么要选 TB6612 这类集成 H 桥而不是直接拿三极管搭因为直流电机不但需要大电流还需要正反转控制和 PWM 调速集成 H 桥把这两件事都封装好了外围电路非常少。用法上要特别注意 STBY 使能脚有的驱动板默认不拉高代码里漏了这一步PWM 即使输出正常电机也不动很隐蔽。传感器接口这块红外避障模块通常是数字电平输出遮挡时输出低电平接到 MCU 的 GPIO 时最好确认模块有没有内部上拉没有的话要在原理图里补一个上拉电阻。HC-SR04 超声波的 Echo 脚返回的是 5V 电平如果 MCU 是 3.3V 系统建议在原理图上加一个电阻分压网络避免长期超压输入。这个细节很多参考原理图都会漏但实际运行中很容易造成引脚损坏或读数异常。再补充一个原理图工具层面的小技巧用 AD 画原理图时如果有部分物料不贴装可以利用元件属性的 Variant 功能来区分正常器件和 NC 器件。比如蓝牙模块预留但不焊接就在同一个原理图上通过 Variant 管理 BOM 和装配变体这样图纸和生产文件都能对得上不会出现“明明没贴料原理图上却写着有”的混乱情况。3. PCB Layout 里的空间与干扰问题小板子更要较真原理图决定了“电气上对不对”PCB 决定了“实物上稳不稳”。扫地小车是电机加传感器加单片机混合的系统电机产生的大电流和电磁干扰与单片机这类敏感电路放在同一块板子上布局布线稍不留神轻则 PWM 波形畸变重则死机复位。这套资料的 PCB 文件把几个关键原则体现得很清楚。3.1 元器件布局顺序从电机端到控制端布局最忌讳想到哪摆到哪。我的做法是先定连接器位置然后按“电机驱动靠近电机端子、主控居中、传感器接口朝板边、晶振靠近 MCU、下载口放在角落”的顺序来排。电机驱动靠近电机连接器能把大电流功率回路控制在最小面积内减少对外辐射主控放在板子中间到各个外设的走线距离均匀传感器接口放板边方便安装和走线出线。晶振离 MCU 越近越好这条不是玄学是减少振荡电路受干扰的路径。下载调试口放在板角落日常接 ST-Link 更方便也不会被其他排线挡到。功率部分和控制部分在布局上形成清晰分区这个思路很值得沿用。整个板子可以看作是“功率流从左往右控制流从右往左”的格局信号交叉少走线也顺。3.2 大电流回路、地线与敷铜的常见雷区电机回路的电流回流路径是最容易被忽略的。电机驱动芯片附近的地要和 MCU 的数字地在入口处单点汇合不要铺一整块地让电机电流随便乱窜。如果电机地和控制地在板子上大面积相连电机启动时地平面电压会被抬高MCU 读到的传感器电平和复位逻辑都会受影响。具体到布线电机驱动到电机端子的走线要尽量宽至少 30mil 以上或者直接用铺铜连接电源入口也要预留足够宽度的走线。电机瞬间电流大走线细了压降大到驱动芯片上的电压就不够电机自然没劲。底层大面积敷铜是推荐的但敷铜时要注意把电机驱动下方的地单独隔开或者用开槽的方式引导回流路径防止功率噪声串到控制区。如果后续要加 2.4G 蓝牙模块PCB 上还要留出天线净空区。天线区域下方不能铺铜、不能走线否则天线阻抗被影响通信距离会明显缩水。这是很多人画小板子时没注意的问题等硬件焊好调试才发现蓝牙连不上再改板至少一等就是两周。4. 从系统框图和流程图落到源码状态机与 PWM 实现硬件只是舞台真正让小车跑起来的是源码。这套资料里的源码目录对应流程图一步步拆得很细主循环状态机、电机 PWM 控制、避障传感器采集、超声波测距。我建议读者拿到代码后先对着流程图读一遍主函数再回头看你刚才画的原理图这样逻辑就很顺了。4.1 主循环状态机让扫地逻辑可读又可改扫地机器人小车的控制逻辑本质上是一个状态机。流程图里一般画成上电初始化、等待启动、前进、检测障碍、转向/后退、再前进。用代码实现时我最推荐用一个枚举加 switch 的主循环结构typedef enum { STATE_IDLE, STATE_FORWARD, STATE_TURN_LEFT, STATE_TURN_RIGHT, STATE_BACK } RobotState; RobotState currentState STATE_IDLE; while (1) { switch (currentState) { case STATE_IDLE: if (startButtonPressed()) currentState STATE_FORWARD; break; case STATE_FORWARD: setMotorSpeed(LEFT_MOTOR, 180); setMotorSpeed(RIGHT_MOTOR, 180); if (obstacleDetected(LEFT_SENSOR)) currentState STATE_TURN_RIGHT; else if (obstacleDetected(RIGHT_SENSOR)) currentState STATE_TURN_LEFT; else if (obstacleDetected(FRONT_SENSOR)) currentState STATE_BACK; break; // 其他状态处理... } delayMs(20); }为什么用状态机而不是写一堆 if 串行阻塞因为状态机把每个时刻“该干什么”和“什么时候切换”分开了。后面要加蓝牙遥控只需要增加一个 STATE_REMOTE把遥控指令作为切换条件不需要推翻整个代码结构。流程图里的每个判断框在代码里就是一次状态转换对应关系一目了然。4.2 TIM1 输出 PWM 与避障逻辑的编码要点电机调速最常用的手段是 PWM。STM32F103C8T6 的 TIM1 是高级定时器使用它输出 PWM 时有一个典型坑必须开启主输出使能MOE否则引脚上永远是低电平电机根本不会转。HAL 库里通常配置为TIM_HandleTypeDef htim1; htim1.Instance TIM1; htim1.Init.Prescaler 72 - 1; // 1MHz 计数频率 htim1.Init.Period 1000 - 1; // PWM 频率 1kHz HAL_TIM_PWM_Init(htim1); HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_1); __HAL_TIM_MOE_ENABLE(htim1); // 高级定时器必须开 MOE如果你不想碰高级定时器完全可以用 TIM2/TIM3 这些通用定时器少了 MOE 这一道手续新手不容易踩坑。PWM 频率我习惯设为 1kHz 左右太低电机会有可闻噪声太高驱动芯片开关损耗也上去了。避障逻辑的默认策略是三路红外左右各一个前向一个。前进时如果前向传感器检测到障碍先刹车后退再按障碍所在方向决定左转还是右转侧向传感器主要用来防止在沿墙行走时撞墙。简单版本做到这个程度就能稳定运行了。想让小车清扫更高效后续可以加“弓字型清扫”算法用超声波判断已走距离再决定下一行走方向。4.3 什么时候该上 FreeRTOS很多初学者一上来就想着移植 FreeRTOS觉得实时操作系统更高级。但在这个小车上裸机状态机完全够用代码清晰、调试直接、内存占用低。真的需要上 FreeRTOS通常是你同时要处理的事情变多了比如蓝牙遥控指令接收、OLED 屏幕刷新、三个方向传感器轮流采集、超声波测距、电池电压检测、电机 PWM 控制这些任务如果都塞进 while(1) 里要么刷新频率互相拖累要么代码乱成一团。移植 FreeRTOS 时最需要注意的是 SysTick 冲突。STM32 的 HAL_Delay 依赖 SysTick而 FreeRTOS 的时基默认也是 SysTick两者会打架。解决办法是把 HAL 时基改成其它定时器或者让 FreeRTOS 使用别的时基源。移植后把传感器采集、电机控制、遥控解析拆成独立任务每个任务管理好自己的阻塞和唤醒整个程序就清爽很多。但记住这是在裸机已经能稳定运行之后再做的优化不是为了用而用。5. 装机调试实录几个典型故障的完整排查链路实物焊接和调试阶段问题往往比设计阶段多。这里记录我调试过程中遇到的高频故障以及完整的排查思路而不是单纯给结论。因为下次你遇到的问题大概率不会是同一个但排查链路是通用的。5.1 串口打印先让系统“开口说话”单片机不会说话出了问题全靠串口打印来还原现场。这套资料里的源码已经预留了串口调试接口推荐在代码里把printf重定向到 USART1并且用一个宏控制日志开关。#ifdef DEBUG_ENABLE #define DBG_PRINT(fmt, ...) printf(fmt, ##__VA_ARGS__) #else #define DBG_PRINT(fmt, ...) #endif调试时打印哪些信息第一状态机的状态切换日志能看到小车当前在做什么第二传感器原始电平能判断硬件检测是否正确第三PWM 占空比和方向引脚电平能确认指令有没有真正发出去。串口打印看起来基础但能帮你把“软件逻辑问题”和“硬件连接问题”快速分开。5.2 电机不转和误判避障的排查全过程电机不转是最常见的问题我的排查顺序是固定的先量电源驱动芯片的 VM 和 VCC 有没有电MCU 的 3.3V 是否稳定。检查 STBY 使能脚很多驱动板不拉高这个脚整片驱动都在睡眠状态。写死 PWM 输出在代码里把占空比固定为 50%如果电机转了说明问题在调速逻辑如果还不转用示波器或逻辑分析仪测 TIM1_CH1 引脚有没有波形。测方向控制脚PWM 有了但 AIN1/AIN2 如果没有形成差分电平电机也不会转。最后查共地驱动板和 MCU 各自供电但没共地控制信号永远没有参考电平。避障误判的坑则不太一样。比如红外传感器在强烈阳光下会频繁误报因为环境光里的红外分量干扰了光电接收管。排查链路是先用串口把三路传感器的原始电平打出来观察在无障碍的情况下是否稳定。如果不稳定先调传感器模块上的电位器阈值让它在环境光下不触发如果还是不行就得给传感器加遮光罩或者用软件多次采样去抖。再严重的情况就要考虑用超声波做二次确认两个传感器同时说“有障碍”才认为是真障碍。这套资料里最让我认可的地方就是它把系统框图和流程图当作一等公民而不是随便画两张图应付了事。我在带新人的时候最强调的就是先读框图和流程图把硬件资源和软件逻辑的映射关系建立起来再去啃源码。这个项目麻雀虽小但电源架构、电机驱动、传感器信号调理、状态机、PWM 控制这些知识点全都有非常适合作为从零到一理解嵌入式产品的完整样例。后续想扩展的话加蓝牙遥控、灰度循迹、电池电量检测都是很自然的方向顺着这套资料往下改就可以了。本文还有配套的精品资源点击获取