共计 1827 个字符,预计需要花费 5 分钟才能阅读完成。
现象观察:红外信号的噪声之谜
第一次用示波器抓取红外对管信号时,我看到的波形像心电图一样疯狂跳动。明明小车在直线赛道上,ADC 读数却在±200 范围内波动(12 位分辨率下),这种噪声直接导致电机频繁正反转,车子走起来像喝醉了一样左右摇摆。

通过频谱分析仪可以看到两个主要干扰源:
- 50Hz 工频干扰(来自实验室供电系统)
- 200-300Hz 的高频噪声(电机碳刷火花导致)
三大解决方案实战对比
1. 纯阈值判断法:简单但危险
if(adc_left > threshold) turn_right();
else if(adc_right > threshold) turn_left();
- 优点:代码简单,不占资源
- 致命缺陷:在阈值附近会剧烈震荡,实测抖动幅度达±5cm
2. 加权滑动平均滤波:有所改善但不够
// 5 点加权平均滤波示例
int filtered_val = (last_val[0]*3 + last_val[1]*2 + last_val[2]*1) / 6;
- 响应速度比普通平均滤波快 20%
- 但机械延迟导致的过冲依然存在,直角弯容易冲出赛道
3. PID 控制:最终选择的方案
重点说说微分项的神奇作用:当检测到赛道突然左拐时,微分项会立即给出一个反向制动信号,提前抵消小车的惯性摆动。这就像老司机过弯时会提前收油门一样自然。
Arduino 代码全解析
红外信号预处理(带死区的环形缓冲)
#define BUFFER_SIZE 8
int adc_buffer[BUFFER_SIZE];
int buffer_index = 0;
int get_filtered_adc(int raw_adc) {
// 更新环形缓冲区
adc_buffer[buffer_index] = raw_adc;
buffer_index = (buffer_index + 1) % BUFFER_SIZE;
// 死区过滤微小波动
if(abs(raw_adc - last_val) < DEAD_ZONE)
return last_val;
// 计算中位数
int temp[BUFFER_SIZE];
memcpy(temp, adc_buffer, sizeof(temp));
bubble_sort(temp); // 省略排序实现
return temp[BUFFER_SIZE/2];
}
时间复杂度:O(n) 排序,但对小规模数据完全可接受
增量式 PID 核心算法
// 匈牙利命名法:b_表示布尔型,f_表示浮点型
float f_PID_Control(float fCurrentError) {
static float fLastError = 0, fIntegral = 0;
// 比例项:当前偏差
float fProportional = fKp * fCurrentError;
// 积分项:历史偏差累积(带抗饱和)fIntegral += fKi * fCurrentError;
fIntegral = constrain(fIntegral, -fMaxIntegral, fMaxIntegral);
// 微分项:变化趋势预测
float fDerivative = fKd * (fCurrentError - fLastError);
fLastError = fCurrentError;
return fProportional + fIntegral + fDerivative;
}
实战测试数据
| 赛道材质 | 最大抖动幅度 (cm) | 恢复时间 (ms) |
|---|---|---|
| 白纸 | 0.8 | 120 |
| 木地板 | 1.5 | 200 |
| 磨砂玻璃 | 2.1 | 300 |
直角弯测试时,传统方法平均偏移 15cm,PID 控制可将偏差控制在 5cm 内。
六个血泪教训
- 传感器离地高度保持在 1.5-2cm 最佳,间距建议等于赛道黑线宽度
- 锂电池电压从 8.4V 降到 7V 时,需动态调整 PWM 最大值:
pwm_max = map(analogRead(VOLTAGE_PIN), 0, 1023, 200, 255); - 遇到长直道时,积分项会累积过大,必须加入 clamping 限制
- 电机两端一定要并联续流二极管!我们烧过 3 个 L298N 才明白
- 差分安装红外对管(一前一后)可提前感知弯道趋势
- 轮胎打滑时,可以临时增大微分系数抑制振荡
进阶思考
当赛道出现交叉线时,单纯依靠红外会完全失效。这时候 MPU6050 的角速度数据就能帮大忙——通过记录小车的历史转向习惯,可以预测下一秒可能的路径走向。比如连续左转 300ms 后,突然丢失黑线,大概率需要继续左转寻找新路径。
这个方案我们正在试验中,感兴趣的可以一起探讨如何融合多传感器数据。下次准备尝试用卡尔曼滤波来优化,不过那是另一个复杂的故事了 …
正文完
发表至: 未分类
近一天内
