智能车竞赛新手入门:从零搭建电磁循迹系统(附代码调试心得)

📅 2026/7/15 16:41:19
智能车竞赛新手入门:从零搭建电磁循迹系统(附代码调试心得)
1. 电磁循迹系统基础认知第一次接触智能车竞赛时我和大多数新手一样面对电磁组别满脑子问号——为什么不用摄像头电感怎么检测看不见的磁场为什么我的车总像醉汉一样走S形经过两个赛季的实战从省三到国一我发现电磁组其实是最适合新手的入门选择。它不像摄像头组需要复杂的图像处理也不像光电组对机械结构要求苛刻只要掌握几个核心原理就能让小车稳稳咬住赛道中线。电磁循迹的本质是磁场感应定位。赛道中心埋设的通电导线会产生20kHz交变磁场车底的水平电感就像磁感应天线。当小车居中时左右电感感应到的磁场强度对称偏离中线时靠近导线一侧的电感信号会增强。这个原理看似简单但要实现稳定循迹需要构建完整的信号链路电感选型常用工字电感如10mH或自制空心线圈电感值越大灵敏度越高但响应速度会下降信号调理LC谐振电路将20kHz信号放大检波可调电阻控制增益我常用10kΩ多圈电位器AD采样建议用12位以上ADCSTM32的ADC1/ADC2采样速率1kHz足够控制算法差比和计算偏差PID闭环是经典方案实际搭建时会发现同样的电路不同队伍效果天差地别。问题往往出在细节我的第一版电路没加磁屏蔽电机一启动信号就淹没在噪声里归一化处理时没考虑极值保护弯道急转时数值溢出导致翻车...这些经验后面会具体展开。2. 硬件搭建从散件到系统2.1 电磁模块设计要点电感布局决定检测性能。常见方案有三电感布局左右电感间距8-10cm适应标准赛道宽度中间电感用于特殊元素识别五电感布局增加检测冗余度适合高速场景竖置电感检测前瞻距离可达30cm但信号非线性严重我的省赛车用的是三电感后置竖电感方案。水平电感用0.3mm漆包线绕制80匝LC谐振电容选6.8nF实测谐振点19.8kHz。关键技巧线圈绕制要对称我用3D打印定位模具保证一致性谐振点要用示波器信号发生器实测扫频观察峰值加铜箔屏蔽层信号线用双绞线传输2.2 运放电路调试坑点信号放大电路我踩过三个大坑直接用电感输出电压计算偏差结果电源波动导致零点漂移使用单端放大电机干扰串入信号链没做硬件滤波微分噪声被PID放大最终方案是仪表放大器带通滤波// 推荐电路参数 Rg 10kΩ // 增益调节电阻 C1 C2 100nF // 二阶带通滤波 截止频率18-22kHz运放选用TI的INA826共模抑制比120dB实测在电机全速运行时信号波动3%。硬件滤波比纯软件滤波节省50%CPU资源这对资源紧张的MCU很重要。2.3 主控与驱动联调主控板布线要注意ADC走线远离PWM线我的教训平行走线导致底噪增加30%编码器接口用TIMx的编码器模式比外部中断稳定电机驱动PWM频率建议14-16kHz超过人耳听觉范围驱动电路推荐使用MOSFET半桥如IR2104CSD18536比L298N发热量降低70%。特别提醒一定要加死区时间我的车曾因上下管直通烧毁两片驱动芯片后来在代码中加入TIM_BDTRInitStruct.DeadTime 0x67; // 约2us死区 TIM_BDTRConfig(TIM1, TIM_BDTRInitStruct);3. 软件核心从信号到控制3.1 信号采集与归一化AD采样要避开电机干扰时段。我的策略是在PWM周期中点采样利用PWM中断void PWM_IRQHandler() { if(TIM_GetITStatus(TIM1, TIM_IT_Update)) { ADC_SoftwareStartConv(ADC1); // 触发采样 TIM_ClearITPendingBit(TIM1, TIM_IT_Update); } }归一化处理是稳定性的关键。建议采用动态阈值法#define SMOOTH_FACTOR 0.05f // 平滑系数 // 实时更新极值 if(ad_value max_val) { max_val max_val * (1-SMOOTH_FACTOR) ad_value * SMOOTH_FACTOR; } if(ad_value min_val) { min_val min_val * (1-SMOOTH_FACTOR) ad_value * SMOOTH_FACTOR; } // 归一化到0-100 normalized 100 * (ad_value - min_val) / (max_val - min_val 1e-6); // 防除零3.2 差比和算法优化新手常直接用左减右计算偏差这在弯道会非线性失真。差比和算法能更好适应不同曲率// 经典差比和公式 error (L - R) / (L R) * 100; // 我的改进版抑制突变 static float last_error 0; error 0.7f*(L - R)/(L R 1e-6) 0.3f*last_error; last_error error;实测在R50,L80时普通差值法输出30而差比和输出23更接近真实偏移比例。加入惯性环节后高速过弯时信号更平滑。3.3 PID控制实战技巧方向环PID调参记住三句话P决定反应速度太小转弯迟钝太大会画龙D抑制振荡一般取P的1/10到1/5I慎用机械对称好的车可以不用I项我的国赛参数1ms控制周期// 方向环PD参数 float dir_kp 1.2f; float dir_kd 0.15f; // 速度环PI参数 float speed_kp 0.8f; float speed_ki 0.02f;调试时先用临界振荡法找大致参数设ID0逐渐增大P直到小车开始高频摆动记录此时Ku和振荡周期Tu按Ziegler-Nichols公式计算初始参数Kp 0.6*Ku Kd Kp*Tu/84. 典型问题排查指南4.1 信号跳变问题现象直道行驶时偏差值突然突变检查项电感引脚是否虚焊用热熔胶固定运放供电电压是否稳定建议LDO单独供电ADC采样时钟是否与PWM谐波干扰改变采样时刻4.2 电机死区补偿当PWM占空比小于15%时电机可能因静摩擦力不转动。我的补偿方案// 死区补偿函数 int DeadZoneComp(int pwm) { if(abs(pwm) 15) return 0; return pwm (pwm0 ? 5 : -5); // 加偏置克服静摩擦 }4.3 弯道速度控制高速过弯容易冲出赛道建议根据偏差动态调节目标速度// 速度前馈控制 target_speed base_speed - abs(error)*0.3f; // 误差越大速度越低 if(target_speed min_speed) target_speed min_speed;5. 进阶优化方向5.1 动态参数调整在不同赛道段使用不同PID参数// 根据误差大小切换参数 if(fabs(error) 30) { // 大弯道 kp 1.5f; kd 0.2f; } else { // 小弯/直道 kp 0.8f; kd 0.1f; }5.2 机械结构优化调整电感离地高度建议1.5-2cm改变电池位置调节重心前移增加转向响应使用差速器替代双电机差速减少滑动摩擦5.3 元素识别策略通过中间电感识别特殊元素// 环岛检测逻辑 if(middle_sensor threshold last_middle threshold) { element_cnt; if(element_cnt 4) { // 进入环岛 SetSpecialMode(ISLAND); } } last_middle middle_sensor;调车是个需要耐心的过程我的国赛车迭代了27个硬件版本PID参数改了上百次。最难忘的是省赛前夜为了消除一个奇怪的转向延迟我们团队通宵发现是编码器线序接反...这些经历让我明白智能车比的不仅是技术更是对细节的执着。