1. 从零开始搭建循迹智能车的硬件准备第一次尝试做循迹智能车时我花了两周时间才搞明白硬件该怎么搭配。现在回想起来其实只要掌握几个关键点就能少走很多弯路。你需要准备的核心硬件包括主控芯片、电机驱动模块、电感传感器和电源系统。主控芯片建议选择STM32系列或者文章提到的CH32V103这类芯片性价比高且资料丰富特别适合初学者。电机驱动板的选择直接影响小车动力表现。我实测过L298N和TB6612两种驱动芯片后者发热更小且支持更高电流但价格稍贵。如果预算有限L298N完全够用记得加装散热片就行。电感传感器建议选用工字型电感这种电感对电磁场变化敏感实测循迹效果比普通电感稳定30%以上。电源系统是最容易被忽视的部分。我踩过的坑是直接用锂电池给整个系统供电结果电机启动时电压波动导致主控芯片重启。后来改用两套独立电源电机用7.4V锂电池控制系统通过稳压模块供电问题迎刃而解。硬件连接时要注意电感传感器最好用屏蔽线连接能有效减少电磁干扰。2. 电感传感器信号处理的实战技巧电感采集的信号处理是循迹精度的关键。刚开始我直接用原始ADC值做判断结果小车像醉汉一样左右摇摆。后来发现差比和算法才是稳定循迹的核心。这个算法的精妙之处在于(左电感值-右电感值)/(左电感值右电感值)既消除了电压波动影响又放大了偏差信号。具体实现时要注意几个细节首先ADC采样频率不能太低建议在1kHz以上。我在代码里做了10次采样取中值滤波有效消除了突发干扰。其次电感安装高度很有讲究离地5-8mm效果最佳。太高信号弱太低容易刮蹭地面。可以用3D打印个可调支架方便测试不同高度。信号处理部分的核心代码如下float get_adc(void){ int i,j; float ad_value[10],sum_value0; float temp; for(i0;i10;i) { ad_value1adc_convert(ADC_IN6_A6, ADC_12BIT); ad_value2adc_convert(ADC_IN8_B0, ADC_12BIT); ad_value[i]100*(ad_value2-ad_value1)/(ad_value2ad_value1); } // 中值滤波处理 for(j0;j9;j) { for(i0;i9-j;i) { if(ad_value[i]ad_value[i1]) { tempad_value[i]; ad_value[i]ad_value[i1]; ad_value[i1]temp; } } } for(i1;i9;i){ sum_valuead_value[i]; } return sum_value/8; }3. PID算法调参的实战心得PID算法听起来高大上实际用起来就是三个参数的组合游戏。刚开始调参时我完全凭感觉结果小车要么反应迟钝要么疯狂振荡。后来总结出一套阶梯调试法先调P再调D最后调I。P值决定反应速度从小开始慢慢加大直到出现轻微振荡D值用来抑制振荡一般取P值的1/10到1/5循迹小车通常可以不要I项。我的实测参数是kp1.39kd0.02551这个组合在直道和弯道都能稳定运行。调试时有个小技巧用蓝牙模块把实时误差值和PWM输出发到电脑上绘图比盯着小车看直观多了。遇到急弯时可以加入转向补偿我在代码里用error_anglekperrorkd(error-error_last)实现。舵机控制要注意限幅处理否则可能损坏舵机duty1740-(int16)error_angle; if(duty1796) duty1796; else if(duty1662) duty1662; timer_pwm_duty(PWM3_CH1_C6,duty1);4. 停车精准控制的实现方案文章提到的干簧管停车方案确实简单有效但需要预先埋磁铁。我试过三种停车方案干簧管、视觉识别和编码器计距。干簧管最稳定误差可以控制在1cm内视觉识别受光线影响大编码器需要定期校准。干簧管的接线很简单直接接GPIO口就行。代码里用状态机实现停车逻辑很关键if(gpio_get(D2)0) { stop; systick_delay_ms(100); } if(stop2) { // 执行停车动作 timer_pwm_duty(PWM4_CH4_B9,duty3); timer_pwm_duty(PWM4_CH1_B6,duty3); systick_delay_ms(100); while(1){ timer_pwm_duty(PWM4_CH4_B9,0); timer_pwm_duty(PWM4_CH1_B6,0); } }如果想更精准可以结合PID控制实现缓停。我的经验是提前20cm开始减速最后5cm用反向PWM制动这样停车更平稳。电机反转的时间需要实测调整一般100-200ms比较合适。5. 常见问题排查与性能优化调试过程中最头疼的问题是信号干扰。有次小车在特定位置总会失控最后发现是电机碳刷火花干扰了电感信号。解决方法有三个给电机并联104电容、电感信号线加磁环、在代码中加入软件滤波。另一个常见问题是循迹延迟。我发现主要瓶颈在ADC转换时间后来改用DMA方式采集ADC速度提升明显。如果使用STM32CubeMX配置记得开启ADC的DMA请求并设置连续转换模式。性能优化方面有几点很实用将频繁调用的函数声明为内联函数使用查表法代替复杂计算关键代码用寄存器直接操作合理利用硬件定时器中断比如电机PWM控制可以改用硬件定时器输出比软件模拟稳定得多timer_pwm_init(PWM4_CH4_B9, 12500, 0); timer_pwm_init(PWM4_CH3_B8, 12500, 0); timer_pwm_duty(PWM4_CH3_B8,1500);6. 进阶改进方向与创意扩展基础循迹实现后可以尝试更多有趣的功能。我做过一个自动调速版本直道全速前进入弯前自动减速。原理是通过历史误差值预测弯道曲率动态调整电机PWM占空比。代码核心是这样的float predict_curve fabs(error) 0.5*fabs(error-error_last); if(predict_curve 30) { motor_speed BASE_SPEED * 0.7; } else { motor_speed BASE_SPEED; }还可以加入蓝牙遥控功能用手机APP切换自动/手动模式。我用的HC-05模块成本不到20元。更复杂的可以加装摄像头做图像识别或者用多个电感实现十字路口判断。