基于STM32与HJ-XJ5的五路灰度传感器PID巡线实战解析

张开发
2026/4/13 3:43:01 15 分钟阅读

分享文章

基于STM32与HJ-XJ5的五路灰度传感器PID巡线实战解析
1. 五路灰度传感器与STM32的硬件连接实战第一次用HJ-XJ5传感器时我犯了个低级错误——把电源接反了。这个五路灰度传感器虽然看起来简单但接线时有些细节必须注意。传感器左侧标有L2、L1中间是M右侧是R1、R2这个排列顺序直接影响后续的巡线算法设计。具体接线时VCC接5V电源GND接地五个信号输出端建议这样连接L2 → PC13L1 → PC4M → PE6R1 → PE5R2 → PA4这里有个坑要注意STM32的IO口需要配置为上拉输入模式。我在调试时发现如果使用浮空输入传感器输出会不稳定。建议在CubeMX里直接配置代码示例如下void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); // L2配置 GPIO_InitStruct.Pin GPIO_PIN_13; GPIO_InitStruct.Mode GPIO_MODE_INPUT; GPIO_InitStruct.Pull GPIO_PULLUP; HAL_GPIO_Init(GPIOC, GPIO_InitStruct); // 其他引脚类似配置... }传感器安装高度对检测效果影响巨大。经过多次测试建议距离地面1-2cm为最佳。太高会导致检测灵敏度下降太低容易刮擦地面。可以用尼龙柱固定既绝缘又方便调节高度。2. 传感器数据采集与处理技巧刚开始我用简单的数字量读取0/1发现小车总是醉驾似的左右摇摆。后来改用ADC读取模拟量效果立竿见影。HJ-XJ5虽然输出的是数字信号但内部其实是模拟检测我们可以通过改造电路获取模拟值。具体方法是断开传感器板上的比较器电路直接取出前级信号。改造后代码需要增加ADC采集部分void Get_Gray_Values(void) { HAL_ADC_Start(hadc1); L2_Value HAL_ADC_GetValue(hadc1); // 其他通道类似... // 归一化处理 L2_Norm (float)L2_Value / 4096.0f * 3.3f; }实测中发现三个常见问题及解决方案环境光干扰强光下误检测。解决方法是在传感器上方加装遮光罩我用黑色热缩管效果就不错。地面反光亮面地板会导致误触发。贴层磨砂膜在地面检测区域即可解决。响应延迟软件上可以加20ms的采样间隔硬件方面建议在信号线上加104电容滤波。3. PID巡线算法的嵌入式实现PID控制听起来高大上实际用起来就像骑自行车——调平衡的过程。位置式PID公式看起来复杂pwm Kp*e(k) Ki*∑e(k) Kd[e(k)-e(k-1)]但在代码里实现并不难。先定义PID结构体typedef struct { float Kp, Ki, Kd; int Error1; // 上次误差 int Error2; // 上上次误差 int Error_sum; // 误差累计 } PID_TypeDef;巡线偏差计算是关键。我用的加权算法效果很好int Calculate_Error(void) { if(L10 M1 R10) return 0; // 居中 if(L10 M1 R11) return 400; if(L10 M0 R11) return 500; // 其他情况类似... }调参经验分享先调Kp让小车能基本循迹但会有振荡再加Kd抑制振荡像给小车踩刹车最后调Ki消除静态误差但要小心积分饱和测试时建议先用小数值Kp0.5Ki0.01Kd0.34. 电机控制与系统整合PID输出最终要转化为电机控制。我用的是PWM驱动直流电机这里有个重要技巧——对左右电机采用差速控制。当检测到向左偏时应该左轮减速、右轮加速。电机驱动代码片段void Motor_Control(int pwm) { // 限制PWM范围 pwm (pwm 1000) ? 1000 : (pwm -1000) ? -1000 : pwm; if(pwm 0) { // 右转 __HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_3, pwm); // 右轮 __HAL_TIM_SET_COMPARE(htim4, TIM_CHANNEL_3, 1000); // 左轮 } else { // 左转 __HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_3, 1000); __HAL_TIM_SET_COMPARE(htim4, TIM_CHANNEL_3, -pwm); } }系统整合时要注意几个关键点定时中断建议用10ms定时器中断进行PID计算优先级设置电机控制中断优先级应高于其他任务安全保护增加急停开关和软件看门狗调试接口保留串口输出实时参数便于调试5. 常见问题排查指南调试时遇到最多的问题是小车画龙。这时候要按以下步骤排查检查传感器数据是否正常用LED或串口输出确认PID参数是否合理先从纯P控制开始测试电机响应是否对称单独给左右轮PWM测试检查电源是否充足电压不足会导致电机无力另一个头疼的问题是冲出赛道。这通常是因为转弯半径太小增大差速比或降低速度检测滞后缩短采样周期或优化算法赛道急弯可以预先录入赛道特征最后分享一个实用技巧在赛道关键位置如十字路口贴特定标记用额外的传感器检测可以显著提高可靠性。我在比赛中用这个方法循迹成功率提升了40%。

更多文章