基于STM32智能循迹送货小车(一)硬件选型与电路设计详解 1. 项目背景与核心需求最近在实验室带学生做智能小车项目时发现很多新手在硬件选型阶段就会遇到选择困难症。市面上STM32型号五花八门电机驱动模块性能参差不齐更别说红外传感器的布局玄学了。今天我就以四驱智能循迹送货小车为例手把手带你搞定硬件选型与电路设计那些事儿。这种小车本质上是个移动式控制系统需要同时处理环境感知循迹避障、运动控制电机驱动和任务调度送货逻辑。去年我带学生比赛时就遇到过因L298N散热不足导致小车趴窝的尴尬情况。所以硬件设计不仅要考虑功能实现更要关注稳定性和扩展性。2. 主控芯片选型实战2.1 STM32F103C8T6为何成为首选拆开任何一款教学用智能小车十有八九会看到这块蓝色的小板子。STM32F103C8T6核心板之所以成为经典靠的是这三个杀手锏外设资源与引脚分配4个PWM定时器TIM1-TIM4刚好驱动四个电机12路ADC可接多路红外传感器3个USART分别接蓝牙、调试口和备用接口成本优势 相比同性能的国产芯片ST原厂芯片批量采购价能控制在25元以内而国产替代品如GD32F103价格甚至更低。生态支持 用STM32CubeMX生成代码时所有外设都有可视化配置界面。上周我测试用TIM1生成4路PWM从配置到电机转起来只用了15分钟。注意新版STM32CubeIDE已经支持中文界面对新手更加友好。建议安装时勾选F1系列的全部软件包。2.2 核心板电路设计要点拿到核心板后别急着接线先确认这三个关键电路电源转换电路AMS1117-3.3将5V转为3.3V输入电容建议用10μF钽电容输出端加0.1μF去耦电容复位电路 典型RC复位10kΩ电阻0.1μF电容配合NRST引脚Boot模式选择BOOT0接10k下拉电阻预留测试点方便烧录时切启动模式// 电机PWM初始化示例HAL库 TIM_OC_InitTypeDef sConfigOC {0}; htim1.Instance TIM1; htim1.Init.Prescaler 71; // 72MHz/(711)1MHz htim1.Init.CounterMode TIM_COUNTERMODE_UP; htim1.Init.Period 999; // 1MHz/(9991)1kHz PWM HAL_TIM_PWM_Init(htim1); sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 500; // 初始占空比50% HAL_TIM_PWM_ConfigChannel(htim1, sConfigOC, TIM_CHANNEL_1);3. 电机驱动模块深度对比3.1 L298N的实战技巧虽然L298N看起来像上古神器但在调试阶段反而更推荐使用原因很简单——不容易烧。去年用TB6612时学生接错线瞬间就冒烟而L298N顶多发烫。几个关键使用技巧供电方案当使用12V电池时插入5V使能跳帽可输出5V给核心板此时必须确保核心板GND与模块共地散热改造 实测连续工作30分钟后芯片温度可达70℃。建议拆除原装散热片涂抹硅脂后安装更大散热片或用12V电脑风扇辅助散热电机接线技巧 四驱小车建议将同侧电机并联这样只需两个L298N就能驱动四个电机。注意并联后电流会叠加单个电机堵转电流约800mA所以总电流不要超过2A。3.2 TB6612FNG的高阶玩法如果要做PCB集成TB6612FNG绝对是首选。它的优势不只是体积小更在于效率提升参数L298NTB6612FNG工作电压5-35V2.5-13.5V持续电流2A1.2A峰值电流3A3.2A待机电流6mA0.1μA实际测试发现三个关键点VM和VCC都接5V时电机转速约为额定转速的60%在STBY引脚加10k上拉电阻避免意外待机PWM频率建议在1-10kHz之间超过20kHz会出现转矩下降// TB6612控制真值表 #define MOTOR_FORWARD (IN11, IN20) #define MOTOR_BACKWARD (IN10, IN21) #define MOTOR_BRAKE (IN11, IN21) #define MOTOR_STOP (IN10, IN20)4. 红外循迹模块的布局玄学4.1 TCRT5000的阈值调试很多教程只告诉你用电位器调灵敏度但没说明白背后的原理。其实关键在于反射距离与输出特性曲线安装高度离地最佳距离5-8mm可用螺母作为垫片调整高度阈值测定# 简易阈值测定代码示例 while True: white_val read_ADC() # 读取白纸值 black_val read_ADC() # 读取黑线值 threshold (white_val black_val) // 2 print(推荐阈值:, threshold)模块排列方案一字排列简单但转弯反应慢扇形排列检测提前量适合高速循迹我的独家方案前3后1布局前面三个呈120°扇形后面一个用于校验4.2 抗干扰设计实验室日光灯、窗外阳光都会干扰红外传感器。这几个方法亲测有效在传感器接收端套上热缩管在代码中加入软件滤波// 移动平均滤波 #define FILTER_LEN 5 uint16_t filter_buf[FILTER_LEN]; uint16_t IR_filter(uint16_t new_val) { static uint8_t index 0; filter_buf[index] new_val; if(index FILTER_LEN) index 0; uint32_t sum 0; for(uint8_t i0; iFILTER_LEN; i) { sum filter_buf[i]; } return sum / FILTER_LEN; }在传感器供电端加10μF电容5. 电源系统设计精髓5.1 锂电池管理方案18650锂电池虽然便宜但直接使用存在隐患。推荐这套方案双电池并联每节带保护板防止过放总容量达到4000mAh以上充电管理使用TP4056充电模块充电电流设为1A0.5C电量监测// 简易电量检测 float get_battery_voltage() { uint16_t adc_val read_ADC(BAT_ADC_CH); return adc_val * 3.3 / 4096 * (R1R2)/R2; // 分压电阻比例 }5.2 LM2596降压电路魔改原装LM2596模块的电位器容易松动建议更换为多圈精密电位器输出端加220μF固态电容输入输出压差不要超过12V实测数据输入电压输出电流效率12V1A92%9V2A88%7V3A82%6. 扩展功能预留设计6.1 超声波避障接口HC-SR04模块有三大坑3.3V系统需要电平转换Echo信号要加RC滤波1kΩ0.1μF测量周期建议大于60ms推荐电路VCC --┬-- 5V │ [10k] │ Trig ─┘ Echo --┬-- 3.3V │ [1k] │ 0.1μF │ GND6.2 蓝牙模块的隐藏功能HC-05模块除了通信还能这样用通过AT指令修改波特率默认38400绑定指定手机MAC地址进入低功耗模式ATSLEEP1// 蓝牙指令解析示例 if(strstr(bluetooth_buf, #M1F)) { motor_forward(SPEED_MAX); oled_show(Moving Forward); }7. 常见坑点解决方案电机干扰MCU在电机两端并联104电容电源线用绞线方式布线红外误触发在传感器VCC串10Ω电阻地线采用星型接法程序跑飞启用独立看门狗IWDGvoid IWDG_Init(void) { hiwdg.Instance IWDG; hiwdg.Init.Prescaler IWDG_PRESCALER_32; // 32kHz/321kHz hiwdg.Init.Reload 1000; // 1秒超时 HAL_IWDG_Init(hiwdg); }最后提醒大家焊接完成后一定要先做通电测试不插主控板测量各模块供电电压用万用表蜂鸣档检查电源短路逐步上电观察电流变化