用STM32F103C8T6和CubeMX,从零到一搞定五路红外循迹小车(附完整代码和接线图)

张开发
2026/4/7 16:27:43 15 分钟阅读

分享文章

用STM32F103C8T6和CubeMX,从零到一搞定五路红外循迹小车(附完整代码和接线图)
从零构建STM32F103C8T6五路红外循迹小车CubeMX配置与实战避坑指南第一次拿到STM32开发板时看着密密麻麻的引脚和复杂的寄存器配置我完全不知道从何下手。直到用CubeMX完成第一个LED闪烁项目后才发现原来嵌入式开发可以如此直观。今天我们就用这个神奇的工具从焊接第一根杜邦线开始完整实现一个能识别复杂路径的五路红外循迹小车。1. 硬件准备与电路设计在淘宝搜索STM32小车套件会出现上百种选择但核心部件其实就几样。我建议优先选购带金属齿轮箱的TT马达转速在200RPM左右比塑料齿轮的更耐用。去年帮学弟调试时他们的塑料齿轮马达在三天内就出现了打滑现象。1.1 必备材料清单部件名称推荐型号数量注意事项主控板STM32F103C8T61注意要买带USB转串口的版本电机驱动L298N双路模块1建议选带散热片的改良版红外传感器TCRT5000五路模块1检查有无可调电位器供电系统18650电池盒3串带保护板更安全车体结构亚克力底盘套件1注意马达安装孔位匹配最容易忽略的细节红外模块的安装高度。通过实验发现传感器距地面1.2cm时检测效果最佳。太高会漏检黑线太低则容易刮擦地面。可以用螺母作为垫片来微调高度。1.2 关键电路连接图L298N的接线常让新手困惑其实记住两个要点使能端ENA/ENB需要接PWM信号电机接口采用对角控制原则// 典型接线对应关系 STM32 PA0 - L298N IN1 (左电机正极) STM32 PA1 - L298N IN2 (左电机负极) STM32 PA2 - L298N IN3 (右电机正极) STM32 PA3 - L298N IN4 (右电机负极) STM32 PA6 - L298N ENA (左电机PWM) STM32 PA7 - L298N ENB (右电机PWM)警告初次通电前务必用万用表检查所有电源线路我曾因5V和3.3V短路烧毁过两块芯片。2. CubeMX工程配置详解打开CubeMX时很多同学会直接点Generate Code其实前期配置才是项目的灵魂。我们重点看三个关键配置2.1 GPIO引脚分配策略五路红外传感器建议使用连续的GPIO端口这样代码会更整洁。比如全部接在GPIOB的PB0-PB4// 在main.h中定义更直观的别名 #define SENSOR1_Pin GPIO_PIN_0 #define SENSOR2_Pin GPIO_PIN_1 #define SENSOR3_Pin GPIO_PIN_2 #define SENSOR4_Pin GPIO_PIN_3 #define SENSOR5_Pin GPIO_PIN_4配置技巧在Pinout视图右键点击引脚选择Enter User Label可以添加自定义标签生成代码时会自动生成对应的宏定义。2.2 PWM电机调速配置使用TIM3的CH1和CH4生成两路PWM关键参数设置Clock Source选择InternalPrescaler设为7172MHz/(711)1MHzCounter Period设为9991MHz/(9991)1kHzPulse初始值设为300占空比30%实测发现1kHz的PWM频率既能保证电机平稳运行又不会产生可闻噪音。2.3 定时器中断配置添加一个基本定时器用于系统心跳比如TIM6配置Prescaler: 7199Counter Period: 9999 这样产生的中断频率是72MHz/(7200*10000)1Hz适合用于调试信息输出。3. 循迹算法深度优化原始代码只能处理简单直线我们引入状态机机制应对复杂路径。先定义传感器组合模式typedef enum { LINE_STRAIGHT, // 00100 LINE_LEFT, // 01100 LINE_RIGHT, // 00110 LINE_T_LEFT, // 11100 LINE_T_RIGHT, // 00111 LINE_CROSS, // 11111 LINE_LOST // 00000 } LineState;3.1 自适应速度控制算法直行时全速转弯时外侧轮加速void adjustSpeed(LineState state) { switch(state) { case LINE_LEFT: TIM3-CCR1 700; // 左轮70%占空比 TIM3-CCR4 300; // 右轮30% break; case LINE_RIGHT: TIM3-CCR1 300; TIM3-CCR4 700; break; default: TIM3-CCR1 500; TIM3-CCR4 500; } }3.2 十字路口处理策略遇到全黑线LINE_CROSS时根据前次转向方向决定if(currentState LINE_CROSS) { if(lastTurn LEFT) { smoothTurn(LEFT, 45); // 45度左转 } else { smoothTurn(RIGHT, 45); } delay_ms(200); // 确保完全通过路口 }4. 调试技巧与性能优化用STM32的SWD接口配合ST-Link调试器可以实时查看变量值。在Keil中设置Watch窗口监控关键参数传感器原始值GPIO输入状态PWM占空比CCR寄存器值当前状态机状态4.1 常见问题排查表现象可能原因解决方案电机抖动不转PWM频率过高调整Prescaler降低频率误检测黑线环境光干扰加装传感器遮光罩转弯不灵敏占空比差太小加大左右轮速差供电不稳定电池电量不足更换电池或增加电容4.2 卡尔曼滤波应用对于抖动严重的传感器信号可以添加简单滤波#define FILTER_GAIN 0.2f float filteredValue 0; void updateFilter(uint8_t raw) { filteredValue FILTER_GAIN * raw (1-FILTER_GAIN)*filteredValue; }记得在CubeMX中开启浮点运算支持FPU Settings。

更多文章