
1. 2018年山西省大学生电子设计竞赛自动循迹小车项目解析参加电子设计竞赛是工科学生提升实践能力的重要途径。2018年山西省大学生电子设计竞赛的第三题要求设计一款自动循迹小车这个题目考察了参赛者在嵌入式系统设计、传感器应用、控制算法等多个方面的综合能力。作为当年参赛并获奖的选手我将详细分享这个项目的完整实现过程。自动循迹小车需要完成的基本功能包括沿着指定轨迹行驶、检测路径上的金属物体、实时显示系统状态等。要实现这些功能我们需要合理选择硬件平台、设计可靠的电路、开发高效的算法并将所有模块有机整合。1.1 系统总体设计方案我们采用模块化设计思路将整个系统划分为以下几个主要部分主控模块STM32F103C8T6最小系统板循迹传感器模块五路红外对管阵列金属检测模块LDC1000电感数字转换器显示模块0.96寸OLED屏幕(SPI接口)电机驱动模块TB6612FNG双路驱动芯片电源管理模块LM2596降压电路AMS1117稳压电路这种模块化设计使得各功能相对独立便于调试和优化。主控芯片选用STM32F103C8T6是因为其性能足够强大价格适中开发资源丰富非常适合学生竞赛项目。提示在竞赛中建议选择自己熟悉的开发平台而不是盲目追求高性能芯片。熟练掌握一个平台比使用多个不熟悉的平台更有利于快速开发。2. 硬件系统设计与实现2.1 主控电路设计STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器具有72MHz主频、64KB Flash和20KB RAM完全满足本项目的需求。我们设计了最小系统板包括8MHz晶振和32.768kHz RTC晶振复位电路(10k上拉电阻0.1uF电容)BOOT选择跳线SWD调试接口所有IO口引出电源部分使用AMS1117-3.3V为MCU提供稳定电压并在电源输入端加入100uF电解电容和0.1uF陶瓷电容进行滤波。2.2 循迹传感器设计循迹采用五路红外反射式传感器排列间距为2cm可以检测宽度约1cm的黑色轨迹。每路传感器由红外发射管和接收管组成通过比较器输出数字信号。传感器电路关键参数发射管限流电阻100Ω接收管上拉电阻10kΩ比较器参考电压通过10kΩ电位器可调输出信号经74HC14施密特触发器整形后送入MCU实际调试中发现环境光对红外传感器影响较大我们通过以下方法提高可靠性在传感器上方增加遮光罩动态调整比较器阈值软件上采用多次采样取平均2.3 金属检测模块实现LDC1000是TI推出的电感数字转换器通过检测线圈电感变化来感知金属物体。我们设计了一个直径3cm的平面螺旋线圈作为传感器谐振频率约5MHz。LDC1000与STM32通过SPI接口通信关键配置参数RP_MAX 0xFFFFSENSORFREQ 0x14LDC1000_CLK 1MHz数据更新率 100Hz实际测试表明该模块可以可靠检测到直径1cm以上的硬币检测距离约1cm。为提高检测精度我们在软件中实现了动态基线校准和数字滤波算法。2.4 电机驱动与电源系统驱动部分选用TB6612FNG电机驱动芯片相比传统的L298N它具有效率高、发热小的优点。每个电机由PWM信号控制速度两个GPIO控制方向。电源系统设计要点输入电压7.4V锂电池主电源路径锂电池→开关→LM2596(5V)→各模块MCU电源路径5V→AMS1117(3.3V)→STM32电机电源路径锂电池→TB6612FNG(直接驱动)在每个电源输入端加入100uF0.1uF电容滤波3. 软件系统设计与算法实现3.1 系统软件架构我们采用前后台系统架构主循环处理主要功能定时器中断处理实时性要求高的任务。软件模块划分如下硬件驱动层GPIO、SPI、TIM、ADC等外设驱动传感器处理层循迹、金属检测数据处理控制算法层电机PID控制、路径决策人机交互层OLED显示、按键处理系统服务层延时、调试、状态监控3.2 循迹控制算法循迹算法的核心是根据传感器状态计算偏差然后通过PID控制调整电机转速。我们采用五路传感器定义如下状态编码传感器状态: [左2][左1][中][右1][右2] 偏差计算公式: error (-2*w2) (-1*w1) (0*mid) (1*r1) (2*r2) 其中w2,w1,mid,r1,r2为各传感器权重(0或1)PID控制实现要点只使用PD控制(比例微分)Kp30, Kd15 (通过实验调参得到)输出限幅±100控制周期10ms实际运行中发现单纯PD控制在弯道处容易振荡我们增加了以下改进根据偏差大小动态调整Kp在急弯处引入前馈控制对微分项进行低通滤波3.3 金属检测处理LDC1000返回两个主要参数RP(谐振阻抗)和L(电感值)。我们主要使用RP值进行金属检测处理流程如下初始化时采集环境RP值作为基线实时RP值与基线比较差值超过阈值则认为检测到金属检测到金属后小车停止2秒并记录位置继续行驶前重新校准基线为提高检测可靠性算法中还实现了移动平均滤波(窗口大小5)动态阈值调整多条件判断(结合RP和L变化)3.4 OLED显示实现0.96寸OLED(SSD1306驱动)通过SPI接口与STM32通信显示内容包括小车运行状态(运行/停止)检测到的金属物体数量传感器实时数据系统运行时间显示刷新率设置为10Hz通过双缓冲机制避免闪烁。我们开发了简单的GUI框架支持多页面切换和基本绘图功能。注意OLED的SPI接口时序要求较严格初始化时要正确配置GPIO速度和SPI时钟相位。我们遇到的最常见问题是显示乱码通常是由于时序配置不当造成的。4. 系统调试与优化4.1 硬件调试技巧电源调试上电前先用万用表检查各电源对地阻抗逐步上电先3.3V再5V最后电机电源观察各芯片温度异常发热立即断电传感器调试红外传感器用示波器观察比较器输出LDC1000通过串口打印RP和L值电机驱动先单独测试每路PWM输出常见硬件问题电机干扰导致MCU复位→加强电源滤波传感器信号抖动→增加硬件滤波电容SPI通信失败→检查引脚配置和时序4.2 软件调试方法使用ST-Link和Keil MDK进行在线调试通过串口打印关键变量值利用STM32的硬件断点功能分模块测试先验证底层驱动再整合调试中发现的一些典型问题及解决方案电机启动时循迹失效→增加软件启动延时金属检测误触发→优化滤波算法参数OLED显示残影→修改驱动初始化序列电池电压低时控制异常→增加低压检测4.3 竞赛现场应对策略准备多个备份方案关键芯片备件重要参数多套配置简化版程序(去除非必要功能)现场调试流程先快速验证基本功能再优化性能指标最后处理加分项时间管理建议第一天完成硬件搭建和基本功能第二天上午实现全部功能第二天下午优化和准备答辩预留最后2小时做整体测试5. 关键代码解析5.1 主控制循环int main(void) { HAL_Init(); SystemClock_Config(); // 外设初始化 MX_GPIO_Init(); MX_SPI1_Init(); MX_TIM2_Init(); // PWM定时器 MX_USART1_UART_Init(); // 模块初始化 Motor_Init(); Sensor_Init(); OLED_Init(); LDC1000_Init(); // 主循环 while (1) { Track_Process(); // 循迹处理 Metal_Detect(); // 金属检测 Display_Update(); // 显示更新 HAL_Delay(10); // 10ms周期 } }5.2 PID控制实现typedef struct { float Kp; float Kd; float last_error; } PID_Controller; int PID_Update(PID_Controller* pid, float error) { float output; float derivative; // 计算微分项(带低通滤波) derivative (error - pid-last_error) * 0.3 pid-last_derivative * 0.7; // PD控制 output pid-Kp * error pid-Kd * derivative; // 更新状态 pid-last_error error; pid-last_derivative derivative; // 输出限幅 if(output 100) output 100; if(output -100) output -100; return (int)output; }5.3 LDC1000数据处理#define RP_THRESHOLD 150 // RP变化阈值 #define SAMPLE_COUNT 5 // 移动平均窗口大小 uint16_t rp_buffer[SAMPLE_COUNT]; uint8_t buf_index 0; uint16_t rp_baseline 0; void LDC1000_Process(void) { uint16_t current_rp LDC1000_ReadRP(); uint32_t sum 0; uint8_t i; // 更新移动平均缓冲区 rp_buffer[buf_index] current_rp; buf_index (buf_index 1) % SAMPLE_COUNT; // 计算移动平均值 for(i 0; i SAMPLE_COUNT; i) { sum rp_buffer[i]; } uint16_t avg_rp sum / SAMPLE_COUNT; // 检测金属 if(abs(avg_rp - rp_baseline) RP_THRESHOLD) { Metal_Detected(); rp_baseline avg_rp; // 重置基线 } // 缓慢更新基线(1LSB/cycle) if(avg_rp rp_baseline) rp_baseline; else if(avg_rp rp_baseline) rp_baseline--; }6. 项目总结与改进方向经过实际测试我们设计的小车能够稳定循迹检测金属物体的准确率达到95%以上完全满足竞赛要求。在山西省赛中这个作品获得了一等奖的好成绩。从技术角度来看这个项目还有以下可以改进的地方硬件方面采用四层PCB板设计减少电磁干扰使用编码电机提高速度控制精度增加IMU传感器辅助路径修正软件方面移植RTOS实现更好的任务调度开发上位机调试工具实现更复杂的路径记忆算法功能扩展增加无线遥控功能实现多车协同添加摄像头进行视觉识别参加电子设计竞赛最重要的是过程而非结果。通过这个项目我们不仅掌握了STM32开发、传感器应用、控制算法等专业技术还培养了团队协作能力和工程思维。这些经验对我们后续的学习和工作都有很大帮助。