十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

智能小车完整技术方案:从选型、循迹到PID调参与答辩材料

智能小车完整技术方案:从选型、循迹到PID调参与答辩材料 简介面向大学生电子设计竞赛的智能小车完整设计文档适合电子、嵌入式及相关专业学生备赛参考。材料从设计任务概述、基本任务与发挥部分切入系统论证并选择了车体、控制模块、电源模块、电机及驱动模块、避障模块、循迹模块、金属传感器模块等关键分系统同时兼顾报警语音提示、显示等辅助功能并延伸至硬件电路设计与功能实现涵盖微控制器电路、电源电路、电机驱动电路等核心环节帮助读者建立从任务分析到方案落地的完整链条。资源以单个doc文档形式提供压缩包仅2.04MB便于快速查阅与打印文档按“任务—方案论证—硬件设计”组织层次清晰既能帮助参赛者梳理解题思路也可作为课程设计与创新项目的参考模板。该材料已有444人浏览学习适合刚开始准备竞赛或希望完善小车方案的同学反复研读。1. 从零搭一台能上场的智能小车而不是只凑一台能跑的小车不少队伍在电子设计大赛备赛时把 80% 的精力砸在调电机、调循迹传感器上最后两天才开始补设计文档、画系统框图、写测试记录。结果是车能跑但答辩时说不清“为什么用这个单片机”“为什么选这个电机驱动”“阈值为什么是 300”。真正有分量的智能小车作品不是一台侥幸跑完赛道的样机而是一整套从选型、电路、算法到测试数据都能自洽的系统。《大学生电子设计大赛-智能小车完整材料.doc》这类标题指向的正是参赛者最需要的完整技术方案从 51 单片机到 STM32F103ZET6 的选型逻辑从红外循迹到电磁循迹的传感器对比从 L298N 到 TB6612 的驱动取舍再加上 PID 调速、避障策略和赛道标定这些实战细节。这篇文章就把这套东西讲透让新手能跟着搭出第一台车让老手能在这里找到边界和参数而不是只拿到一张原理图。2. 先定主控51 单片机、Arduino 和 STM32F103ZET6 怎么选2.1 从竞赛题目反推主控需求而不是先选芯片再适配题目很多队伍第一步就错了先买一块开发板再去看题目要什么。正确做法是把题目要求拆成资源需求控制几个电机、读取几路传感器、需不需要跑算法、有没有摄像头或蓝牙模块、功耗有没有限制。常见做法是先把这些量化成一张表再对照芯片资源。电子设计大赛的智能小车题基本跑不出循迹、避障、搬运、测距、无线控制这几个组合。以最常规的循迹避障车为例资源需求大概是2 路直流电机或 4 路、3 到 5 路红外循迹传感器、1 路超声波测距、1 个舵机云台可选、1 个蓝牙或无线模块可选。这些外设加起来对 GPIO 的需求在 10 到 20 个之间定时器至少要 2 个一个做 PWM 调速一个做超声波回波计时中断引脚至少 1 个。这个量级51 单片机勉强够用Arduino Uno 很宽裕STM32F103ZET6 则绰绰有余。选型还要看技术储备。如果队伍里只学过 C 语言基础51 单片机是最低门槛寄存器少、库函数简单、资料多到溢出。如果用过 Arduino哪怕是抄过几个例程Arduino 的开发效率能把调车周期压缩一半。如果目标是拿国奖或者做带摄像头的视觉巡线那直接上 STM32F103ZET6它的主频、Flash、RAM 和定时器资源决定了后期加功能不用换平台。2.2 三款主流主控的参数对比和选型结论主控内核主频Flash/RAM开发方式适合场景STC89C5251805112MHz典型8KB/512B寄存器/库函数Keil基础循迹、入门学习、低复杂度题目Arduino UnoATmega328PAVR16MHz32KB/2KBArduino IDE库函数封装快速原型、蓝牙控制、中小型搬运车STM32F103ZET6Cortex-M372MHz512KB/64KB标准库/HALKeil/IAR视觉巡线、多传感器融合、高性能搬运车注意一点51 单片机不是不能用而是它的 RAM 和定时器数量会在后期卡住你。一旦你要加一个 OLED 显示再加一个编码器测速51 的定时器就只剩一个了PWM 输出和测速计时会抢资源。所以我的建议是首次参赛、目标是完赛和拿省奖的可以用 STM32F103ZET6它没有明显的资源短板而且 HAL 库的代码可读性好写进设计文档里显得系统性强。2.3 最小系统的搭建要点和一个可以抄的 GPIO 分配表选好主控后最小系统搭建有一些细节容易被忽略。STM32F103ZET6 的 boot0 引脚要拉低到 GND必须接了 10K 下拉电阻才能从 Flash 启动很多车跑不起来是因为 boot0 悬空。复位电路用 10K 上拉加 0.1uF 电容到地即可不要用复杂的有源复位芯片竞赛场景不需要。晶振用 8MHz 无源晶振两个 20pF 负载电容这是最标准的接法。GPIO 分配有个原则PWM 通道尽量集中在一个定时器上这样调速代码可以统一处理。比如把左右电机的 PWM 分别接到 TIM2 的 CH1 和 CH2编码器测速接到 TIM3 的 CH1 和 CH2这样中断处理不会互相打扰。// STM32F103ZET6 GPIO 分配建议HAL 库 // 电机驱动 TB6612AIN1/BIN1 控制方向PWMA/PWMB 控制速度 #define MOTOR_A_IN1 GPIO_PIN_0 // GPIOA #define MOTOR_A_IN2 GPIO_PIN_1 // GPIOA #define MOTOR_B_IN1 GPIO_PIN_2 // GPIOA #define MOTOR_B_IN2 GPIO_PIN_3 // GPIOA #define MOTOR_A_PWM GPIO_PIN_0 // GPIOA, TIM2_CH1 #define MOTOR_B_PWM GPIO_PIN_1 // GPIOA, TIM2_CH2 // 红外循迹传感器4 路数字量输出接到普通 GPIO #define TRACK_SENSOR_1 GPIO_PIN_4 // GPIOB #define TRACK_SENSOR_2 GPIO_PIN_5 // GPIOB #define TRACK_SENSOR_3 GPIO_PIN_6 // GPIOB #define TRACK_SENSOR_4 GPIO_PIN_7 // GPIOB // 超声波Trig 输出 10us 高电平触发Echo 输入回波 #define ULTRASONIC_TRIG GPIO_PIN_8 // GPIOB #define ULTRASONIC_ECHO GPIO_PIN_9 // GPIOB代码的逻辑分了三层电机、传感器、测距模块各自占用独立的 GPIO 组互不干扰PWM 引脚特意集中到 TIM2这样调整左右电机速度时只需要修改TIM2-CCR1和TIM2-CCR2两个寄存器不需要打断其他外设的逻辑超声波模块的 Echo 引脚建议开启输入捕获或外部中断功能后面做避障时要用中断方式读取回波轮询方式会阻塞主循环。参数上要注意红外传感器数字输出引脚的模式要设置为输入模式并且开启上拉电阻部分模块输出是开漏结构不接上拉读到的永远是低电平。3. 底盘、电机驱动和传感器选型决定你的车能跑多稳3.1 电机驱动的核心差异L298N 和 TB6612FNG 怎么选电机驱动是智能小车最容易出问题的环节。L298N 是经典方案双 H 桥驱动能力强但是压降大1A 负载时可能有 2V 左右的压降供电 7.4V 的电池经过它之后电机两端实际电压可能不到 6V直接影响爬坡能力。TB6612FNG 是东芝的方案MOSFET 开关管结构压降通常在 0.5V 以内同样的电池驱动能力更强而且体积小、发热低。竞赛场景我推荐 TB6612FNG理由有三点第一它的 PWM 频率响应更好可以支持 10kHz 以上的 PWM 频率调 PID 时不会出现电机啸叫第二它内置了正反转控制和制动功能逻辑简单代码里只需要设置 IN1/IN2 的电平组合第三它的 VCC 逻辑电压和 VM 电机电压是分开的逻辑部分接 3.3V 或者 5V 都可以兼容 STM32 的 3.3V 电平不需要额外的电平转换电路。// TB6612FNG 逻辑控制表 // IN10, IN21 - 正转IN11, IN20 - 反转IN11, IN21 - 制动 // 速度由 PWMA/PWMB 的占空比决定范围 0-100% void motor_forward(void) { HAL_GPIO_WritePin(GPIOA, MOTOR_A_IN1, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, MOTOR_A_IN2, GPIO_PIN_SET); __HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_1, 60); // 初始速度 60% }这里参数 60 是占空比的初始值代码中通过__HAL_TIM_SET_COMPARE写入 PWM 比较寄存器。比例关系是比较值 60 对应 60% 占空比假设 ARR 预装载值为 100。实际调试中60% 只是起步值不同电机的死区电压不同有些电机在 30% 占空比下完全不转建议用二分法找出起步阈值记录在设计文档里作为测试数据。3.2 传感器选型的核心逻辑红外、电磁还是摄像头很多队伍在传感器上花了最多的钱却忽视了赛道物理环境。传感器选型第一原则不要选课堂上没讲过的不要选车队没用过的。电子设计大赛的赛道环境通常在室内光照条件稳定地面多为浅色或灰色。在这个背景下红外循迹是最成熟可靠的方案原理是红外发射管和接收管对反射光强度的检测黑线吸收红外光浅色地面反射红外光接收管输出的电平发生变化。红外循迹模块的选型看两个参数探测距离和输出方式。探测距离 2cm 到 5cm 的模块比较合适太近会被地面不平整干扰太远会受环境光干扰。输出方式优先选数字量方便单片机读取和做阈值逻辑。模块数量上4 路红外可以做基本的偏差计算5 路可以做相对复杂的转向控制8 路可以应对十字路口和起跑线检测。// 4 路红外循迹读数返回偏差值用于 PID 转向控制 // 传感器从左到右排列最左为 sensor[0]最右为 sensor[3] int get_track_error(void) { int error 0; int sensor_state[4]; // 读取四路传感器状态1 表示压到黑线 sensor_state[0] HAL_GPIO_ReadPin(GPIOB, TRACK_SENSOR_1); sensor_state[1] HAL_GPIO_ReadPin(GPIOB, TRACK_SENSOR_2); sensor_state[2] HAL_GPIO_ReadPin(GPIOB, TRACK_SENSOR_3); sensor_state[3] HAL_GPIO_ReadPin(GPIOB, TRACK_SENSOR_4); // 加权计算偏差左侧传感器为负右侧为正权重 1 和 2 // 例如只有 sensor[1] 压线则 error -1 if (sensor_state[0] !sensor_state[1]) error -2; else if (sensor_state[1] !sensor_state[2]) error -1; else if (sensor_state[2] !sensor_state[3]) error 1; else if (sensor_state[3]) error 2; else error 0; // 丢线情况 return error; }这段代码的逻辑核心是加权偏差计算。注意最后一行error 0对应丢线情况。实际调试中丢线时不能简单地返回 0否则车会直行冲出赛道。常见做法是保留上一次的偏差值或者加大打角速度这个在后面的循迹算法里再展开。3.3 供电系统的常见失败模式为什么你的车一加速就复位供电是智能小车最大的隐性坑。很多车表现为主控偶尔复位、电机转速突然归零、OLED 屏幕闪烁90% 的原因是电源纹波太大或者电压跌落。电机启动瞬间的电流可以达到正常工作电流的 3 到 5 倍如果电池输出能力不足电压会被拉低到主控的复位阈值以下。常见做法是采用独立供电或者隔离供电方案主控和传感器用一块电池或一个稳压模块供电电机驱动单独供电。如果使用单电池方案必须在电机驱动板的电源输入端并联一个大容量电解电容典型值是 470uF 到 1000uF同时并联一个 0.1uF 陶瓷电容滤高频噪声。主控板上电前要先用万用表测一下空载和电机全速运行时主控供电电压的跌落必须小于 0.3V否则加电容或者换电池。4. 循迹和避障的代码实现从跑直线到过直角弯的完整调参路径4.1 先让车跑直PWM 开环控制必须做的两件事刚组装好的小车左右轮转速一定不一样。原因有两个直流电机的个体差异即使同样占空比转速也有 5% 到 10% 的偏差轮胎摩擦力和车体重心的影响左右轮压地力度不同。所以第一件事不是写循迹算法而是做开环校准。常见做法是在直道上让车全速跑 1 到 2 秒观察车的偏转方向然后手动调整左右轮的 PWM 占空比修正值。比如左轮占空比 60%、右轮占空比 62%车才能走直那么代码里要定义一个PWM_COMPENSATION补偿值后续所有速度设定都叠加这个补偿。// 开环校准参数左右轮补偿值根据实测调整 #define PWM_BASE_LEFT 60 // 基准占空比 #define PWM_COMPENSATION 2 // 右轮补偿值比左轮高 2% void set_motor_speed(int speed) { // speed 范围为 -100 到 100负值表示反转 // 左轮直接用目标速度右轮叠加补偿 int left_pwm speed; int right_pwm speed PWM_COMPENSATION; // 限制 PWM 范围在 0-100 if (left_pwm 0) left_pwm 0; if (right_pwm 100) right_pwm 100; __HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_1, left_pwm); __HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_2, right_pwm); }这段代码里PWM_COMPENSATION是关键参数它以右轮为基准、左轮固定 60右轮加 2 个百分点。参数调整步骤是先把补偿值设为 0跑直道观察偏转方向若向左偏则增大右轮占空比每次 1直到车在 3 米直道上不偏移记录数据到调试日志中。4.2 循迹 PID 控制的参数设置方法和直弯切换逻辑循迹算法是智能小车的核心竞赛圈最常用的是位置式 PID 或增量式 PID 来控制转向。基本控制逻辑是传感器返回位置偏差 errorPID 输出一个转向修正量叠加到左右轮的差速上。// 增量式 PID 循迹控制输出转向修正量 typedef struct { float kp; // 比例系数 float ki; // 积分系数 float kd; // 微分系数 int previous_error; // 上一次偏差 int integral; // 积分累加值 } PID_TypeDef; int pid_control(PID_TypeDef *pid, int error, int max_output) { int output; // 积分分离偏差超过阈值时不累积防止积分饱和 if (abs(error) 2) { pid-integral error; // 限幅防止积分过深 if (pid-integral 50) pid-integral 50; if (pid-integral -50) pid-integral -50; } else { pid-integral 0; } int derivative error - pid-previous_error; output (int)(pid-kp * error pid-ki * pid-integral pid-kd * derivative); pid-previous_error error; // 输出限幅 if (output max_output) output max_output; if (output -max_output) output -max_output; return output; } // 使用示例kp30, ki1, kd8max_output50 PID_TypeDef track_pid {30, 1, 8, 0, 0}; int motor_control pid_control(track_pid, get_track_error(), 50); int left_speed 60 - motor_control; // 转向时左轮减速 int right_speed 60 motor_control; // 右轮加速 set_motor_speed_differential(left_speed, right_speed);PID 参数的整定遵循先比例、后微分、再加积分三步走。第一步把所有积分和微分项清零只留 kp从 10 开始逐步增大直到车在直线弯道上表现出明显的回正趋势但不过冲。第二步加入微分项 kd从 5 开始逐步增大抑制过冲和振荡。第三步加入积分项 ki用于消除静态误差比如长时间跑直线时的偏航积累。这个代码加了积分分离偏差大于 2 时清零累积量是防止急弯里积分饱和的关键。处理直角弯和 U 形弯的逻辑需要在 PID 输出之外再加一个状态判断。当最左侧或最右侧的传感器单独压线时说明车已经到了弯道临界点此时要强制降低基础速度。// 弯道检测和限速逻辑 // 读取最左最右传感器判断是否进入急弯 int handle_sharp_turn(void) { int left_edge HAL_GPIO_ReadPin(GPIOB, TRACK_SENSOR_1); int right_edge HAL_GPIO_ReadPin(GPIOB, TRACK_SENSOR_4); if (left_edge) { // 进入左急弯强制降速并加大左转角度 set_motor_speed_differential(30, 80); return 1; } if (right_edge) { set_motor_speed_differential(80, 30); return 1; } return 0; }注意这里的处理方式和 PID 输出是叠加关系而非替代关系。当边缘触发时直接绕过 PID 输出给电机一个强制的差速值。这是因为 PID 的响应在高速过弯时会有延迟而边缘传感器触发的瞬间车已经偏离赛道中心线很多必须以最大差速修正。在赛道上测试时这个逻辑能明显减少飞线概率。4.3 超声波避障的时序陷阱和舵机云台的联动避障功能在电子设计大赛里出现频率也很高常用方案是超声波测距加舵机云台扫描。超声波模块的时序是所有初学者都会踩坑的地方Trig引脚拉高 10us 以上触发测距然后Echo引脚会输出一个与距离成正比的高电平脉冲。// 超声波测距读回波脉宽换算为厘米 float ultrasonic_get_distance(void) { uint32_t count; // 发送 20us 的触发脉冲 HAL_GPIO_WritePin(GPIOB, ULTRASONIC_TRIG, GPIO_PIN_SET); delay_us(20); HAL_GPIO_WritePin(GPIOB, ULTRASONIC_TRIG, GPIO_PIN_RESET); // 计算 Echo 高电平持续时间 count 0; while (HAL_GPIO_ReadPin(GPIOB, ULTRASONIC_ECHO) GPIO_PIN_RESET); while (HAL_GPIO_ReadPin(GPIOB, ULTRASONIC_ECHO) GPIO_PIN_SET) { count; delay_us(1); if (count 30000) break; // 超时保护约 520cm } // 声速 340m/s高电平时间/2 * 34000 距离厘米 return count * 0.017; // 单位cm }关键参数是超时保护和换算系数。回波时间越长说明距离越远如果超过30000us说明没有目标直接返回一个安全距离比如 -1在避障逻辑中做忽略处理。换算公式推导声速 340m/s即 0.034cm/us回波往返距离所以距离 高电平时间 * 0.034 / 2 时间 * 0.017。这个是固定物理参数不需要修改。避障策略中舵机云台每次转三个角度左、中、右每个角度测一次距离优先选择距离最大且大于安全阈值的方向转向。一个注意点舵机转到位后要等待 200ms 左右让舵机稳定后再触发超声波测距否则云台还在运动时测距结果不稳定会测到伪目标。时间太短测的距离偏大或者偏小太慢则响应速度慢200ms 是一个经过大量测试得到的折中值。5. 整车联调的三个关键步骤标定、测试记录和参数矩阵5.1 用测试记录表格替代口口相传的调参经验电子设计大赛答辩时最容易被追问的就是“这些参数怎么来的”。如果回答不出来说明整个队伍的工程方法论有问题。正确做法是建立一份测试记录表每次修改参数以后记录车的行为表现后面回退和调整都有依据。测试编号赛道特征kpkdki基础速度现象描述是否达标T01直道 3m200050轻微右偏末端偏离约 10cm否T02直道 3m205050走直无明显偏移是T03连续 S 弯308045出弯略有外抛否T04连续 S 弯308145稳定过弯是表格里记录的是调试过程的中间状态。每行的 kd 和 ki 是在上一行基础上微调的结果不是重新设定的。经验是每次只改一个参数改完必须跑完整个赛道记录现象再动下一个参数。赛道特征要写具体是对实际操作有指导意义的这个矩阵本身就是设计文档中最有说服力的部分。5.2 从车到文档材料整理的顺序和答辩的表述逻辑回看标题《大学生电子设计大赛-智能小车完整材料.doc》它强调“完整材料”四个字。完整文档的组织方式要体现从需求到验证的闭环。常见做法是系统方案设计、硬件设计说明含原理图和 PCB 截图、软件设计说明含主流程图和关键代码、测试报告含测试数据表格和现象照片、成本清单、团队分工。其中测试报告部分必须在开发过程中同步记录赛前临时补写的编造数据在答辩时很容易被问破绽。答辩的表述逻辑一般建议按照“指标制订 → 方案对比 → 方案落地 → 测试结果”四段式讲。比如“题目要求稳定过 2m 直道和 S 弯我们对比了红外和电磁两种循迹方案红外方案在室内光照条件下一致性更好选用了 4 路红外方案软件上使用 PID 算法通过记录 30 组参数测试数据最终确定 kp30、ki1、kd8 的配置。实测结果显示2m 直道最大偏差可以控制在 3cm 以内S 弯无飞线”。5.3 现场易出问题自查清单上场前 5 分钟做的事竞赛现场和实验室环境差异很大灯光、地面材质、电池剩余电量都会让调试好的车突然失灵。建议上场前按下面这个清单检查电池电压是否满电满电 8.4V、最低 7.2V 是 2S 锂电池的合理工作区间低于 7.4V 时要换备用电池红外传感器探头是否被灰尘遮蔽用棉签蘸酒精清洁一下可以排除很多偶发故障轮胎表面是否沾了赛道残留的胶痕轮胎打滑会让循迹偏差突然增大舵机云台支架螺丝是否紧固超声波模块松动会导致测距数据跳变。这个清单是快速排除现场问题的思路自己做材料时建议据此写成一个一页 A4 纸的 checklist直接放进文档附件现场照着执行。# 现场电池电压检查命令使用万用表测量电池两端电压 # 正常值8.4V满电 到 7.4V警戒值 # 低于 7.4V 时电机驱动压降后可能导致主控复位必须更换电池 # 同时测量驱动板 PWM 输出端口确认输出正常波形5.4 最后一块调校扳手低速标定法让循迹更稳基础速度跑不上去了可以试试低速标定法。步骤是先把基础速度从 60 降到 35跑一圈赛道把每个弯道、直道上的传感器状态变化记录下来再把车升到目标速度跑对比低速和高速下传感器切换点的时间差异。这个差异就是 PID 输出滞后的量化体现。知道了滞后量就可以在高速逻辑里把弯道检测的触发条件提前比如原来最左侧传感器压线才触发强制转角现在提前到次左侧传感器压线时就把转角从 30% 提高到 50% 保持住这样高速过弯时的轨迹会更紧贴中线。这个技巧在直角弯和圆环赛道上效果尤其明显是很多队伍没有注意到的一个调校维度。本文还有配套的精品资源点击获取
返回列表