基于STM32F1的8路灰度传感器巡线小车实战指南
1. 硬件连接与传感器布局
做巡线小车的第一步,就是把8路灰度传感器和STM32F1正确连接起来。这里有个关键点:传感器的物理布局直接影响巡线效果。我建议采用一字型排列,间距控制在1.5-2cm(具体根据赛道宽度调整)。传感器太密容易误判,太宽又会漏检黑线。
接线时要注意:
- 每个传感器的VCC接3.3V,GND接共地
- 信号线分别接PA0-PA7(如果不够用可以扩展到PB0-PB1)
- 在VCC和GND之间加个0.1uF的滤波电容,实测能减少电源干扰
这里有个坑我踩过:千万别把传感器直接焊死在板子上。先用杜邦线连接,调试时方便调整间距。我之前有个项目因为传感器固定太死,后来发现间距不合适,只能全部重做。
2. ADC配置的实战技巧
STM32F1的ADC配置是核心环节。原始代码用了单次转换模式,但巡线需要快速连续采样,这里我推荐用扫描模式+连续转换:
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ScanConvMode = ENABLE;采样周期也有讲究:
- 239.5周期适合高精度但速度慢
- 71.5周期平衡速度与精度
- 13.5周期最快但噪声大
我的经验值是28.5周期,在12MHz ADC时钟下,8通道轮询大约1ms完成一次全采样,完全够用。
3. 数据处理与滤波算法
原始数据直接使用会有抖动,必须滤波。我试过三种方法:
- 移动平均滤波:简单但延迟大
- 中值滤波:抗脉冲干扰好
- 一阶滞后滤波:最适合实时系统
推荐这个一阶滤波实现:
float Filter(float new_val, float old_val) { return old_val * 0.7 + new_val * 0.3; }阈值判断也有技巧:不要用固定值!我在代码里看到3.15V的硬编码,这很危险。应该:
- 上电时自动校准,记录白底和黑线的电压值
- 动态计算中间阈值:(白值+黑值)/2
- 加入10%的迟滞区间防抖动
4. 控制策略优化
最简单的PD控制就能实现不错的效果,但要注意:
- 偏差计算:用加权平均代替简单位置判断
int position = (v0*0 + v1*1 + v2*2 + ... + v7*7)/(v0+v1+...+v7);- 参数整定:先调D后调P,避免震荡
- 输出限幅:电机PWM不要突然满幅变化
我常用的参数范围:
- Kp=0.3~0.8
- Kd=0.1~0.3
- 采样周期10ms
遇到急弯怎么办?加个前瞻判断:当最外侧传感器触发时,直接给最大转向量。这个技巧在比赛中特别管用。
5. 调试与性能优化
调试时一定要用printf输出各通道原始值,我习惯这样格式化:
printf("CH0:%-4d CH1:%-4d ... | P=%d D=%d OUT=%d\r\n", adc[0], adc[1], position, derivative, output);几个常见问题排查:
- 如果数值跳动大:检查电源滤波,缩短传感器引线
- 如果响应迟钝:降低滤波系数,提高采样率
- 如果总是跑偏:重新校准阈值,检查机械结构
最后分享一个提速技巧:当检测到长直道时,可以适当提高基础PWM占空比。我在去年比赛中用这个方法,圈速提升了15%。
