| 四路巡线模块 | MSPM0G3507 |
|---|---|
| 5V | 5V |
| GND | GND |
| X1 | X1 |
| X2 | X2 |
| X3 | X3 |
| X4 | X4 |
.png)


控制原理
Four_linewalking.c
xxxxxxxxxx//带死区处理的位置式PID float APP_IR_PID_Calc(int8_t actual_value){ float IRTrackTurn = 0; int8_t error; static int8_t error_last=0; static float IRTrack_Integral;//积分 error=actual_value; IRTrack_Integral +=error; //位置式pid IRTrackTurn=error*IRTrack_Trun_KP +IRTrack_Trun_KI*IRTrack_Integral +(error - error_last)*IRTrack_Trun_KD; if (IRTrackTurn > (MAX_SPEED - MOTOR_DEAD_ZONE)) IRTrackTurn = (MAX_SPEED - MOTOR_DEAD_ZONE); if (IRTrackTurn < (MOTOR_DEAD_ZONE - MAX_SPEED)) IRTrackTurn = (MOTOR_DEAD_ZONE - MAX_SPEED); return IRTrackTurn;}//得到四路循迹模块的数据void Four_GetLineWalking(int *LineL1, int *LineL2, int *LineR1, int *LineR2){ *LineL1 = LineWalk_L1_IN; *LineL2 = LineWalk_L2_IN; *LineR1 = LineWalk_R1_IN; *LineR2 = LineWalk_R2_IN;}//画地为牢循迹反逻辑void LineWalking(void){ int8_t err = 0; Four_GetLineWalking(&LineL1, &LineL2, &LineR1, &LineR2);//获取黑线检测状态 if(LineL1 ==0 && LineR1 ==0) { err =70; // 应用PID控制 这里根据实际情况调节 pid_output_IRR = (int)(APP_IR_PID_Calc( -err)); Motion_Car_Control(-IRR_SPEED, 0, pid_output_IRR); delay_ms(400); return ; } else if(LineL2 == 0 && LineR2 == 1) err = -30; // 最左 else if(LineL2 == 0 && LineL1 == 0) err = -40; // 最左 else if(LineR2 == 0) err = 30; else if(LineR2 == 0 && LineR1 == 0) err = 40; else if(LineL2 == 1 && LineR2 == 1) err = 0; else err = 0; // 应用PID控制 pid_output_IRR = (int)(APP_IR_PID_Calc( -err)); // 控制小车运动 Motion_Car_Control(IRR_SPEED, 0, pid_output_IRR); }LineWalking
| 函数原型 | void LineWalking(void) |
|---|---|
| 功能描述 | 基于 “画地为牢” 逻辑的四路传感器巡线控制: 获取四路传感器状态,根据不同检测情况计算偏差值 err。当 LineL1 和 LineR1 同时检测到黑线时,触发特殊控制(反向速度 + PID 调节并延时);其他情况根据左右传感器状态设置 err,经 PID 计算后控制小车运动(直线速度为 IRR_SPEED) |
| 输入参数 | 无 |
| 返回值 | 无 |
将小车接好线,连接OLED模块,给MSPM0烧录程序后,把小车放在白底黑线的地图上,小车会再圈内行驶,OLED上显示传感器数据
其中L2 、L1、R1、R2代表从左到右的四个传感器数据
