四天三夜电赛成功完赛,工程链接可见文末
摘 要
本项目旨在设计和实现一款基于TI MSPM0系列MSPm0G3507单片机控制的自动行驶小车,能够在指定路径上自动行驶并完成多种复杂任务。小车在指定路径上运行,通过灰度传感器检测路径并进行闭环控制,以确保精确的行驶路线和速度控制。硬件方面,小车配备了九轴陀螺仪和灰度传感器,用于实时检测小车的位置和姿态。软件设计中,采用了PID控制算法结合速度环、位置环和角度环,以实现稳定的直线行驶和精准的弧线转向。
在实验测试中,通过优化PID控制算法和实时调节参数,小车能够在规定时间内高效完成指定路径的自动行驶,并具备良好的稳定性和可靠性。利用TI MSPM0系列MCU实现高效路径规划和精确控制的技术能力,为智能自动行驶系统的开发提供了有效的解决方案。
关键词:自动行驶小车;TI MSPM0系列MCU;九轴陀螺仪;PID控制算法;闭环控制;
目录
自动行驶小车控制系统(H题)
【本科组】
- 系统方案
本系统主要由单片机控制模块、传感器模块、执行机构模块、电源模块组成,下面分别论证这几个模块的选择。
1、主控制器件的论证与选择
单片机比较
方案一:采用ESP32系列模块
ESP32是一款集成了Wi-Fi和蓝牙功能的低功耗系统级芯片(SoC),具有双核处理器和丰富的外围接口,具备较快的处理速度和通信能力。尽管ESP32在许多应用场景中表现出色,然而由于其较高的功耗特性,对于需要长时间待机以及在低功耗应用场景中的需求,可能不太适合本系统。且相比传统的单片机,ESP32的成本较高,可能会对项目预算造成影响。
方案二:传统的51系列单片机
采用传统的51系列单片机,这种型号的单片机具备8位处理能力,成本相对较低,控制逻辑相对简单。然而,这种单片机的运算速度相对较慢,且片内资源有限,存储容量有限,难以应对存储大型程序和实现高速、精确的响应控制。其受限于时钟频率,从而导致计时精度的局限,同时外围电路的增加可能会引入系统不可靠性。
方案三:采用TI MSPM0系列MSPm0G3507单片机
通过深入比较和综合分析,本项目选择TI MSPM0系列MSPm0G3507单片机作为核心控制单元。该MCU具备强大的处理能力和丰富的外设接口,能够高效地处理传感器数据并执行控制算法。其低功耗特性和高可靠性使其非常适合应用于自动行驶小车的控制系统中。
- 传感器模块的论证与选择
2.1 循迹传感器
在设计自动行驶小车时,循迹传感器用于路径检测和障碍物感知,其性能直接影响系统的精度和可靠性。
方案一:感为科技的灰度传感器。灰度传感器的响应速度足够快,以便实时检测路径和障碍物,确保小车能够及时调整方向和速度。常见的灰度传感器响应时间在毫秒级别,能够满足自动行驶小车的实时控制要求。灰度传感器在复杂环境中容易受到光线、温度等外界因素的干扰。优质的灰度传感器具备较强的抗干扰能力,通过滤波和抗干扰设计,减少误检测和误触发,确保系统的稳定运行。
方案二:激光传感器。采用激光束进行测距,精度高、响应速度快,适用于高精度检测和复杂路径识别。激光传感器的优点在于其测量精度高,抗干扰能力强,适用于要求高精度和稳定性的场景。但其成本较高,功耗较大,不适合对成本和能耗敏感的设计。
方案三:超声波传感器。利用声波反射原理进行距离测量,适用于检测障碍物和进行近距离测距。超声波传感器的优点在于其检测范围广,不受光线影响,适应多种环境。然而,其分辨率相对较低,可能无法精准识别细小的路径标记。
综合以上三种方案,综合考虑传感器的响应速度、检测精度和抗干扰能力,选择科技的灰度传感器,确保小车能够在实际应用中准确识别路径。
2.2 角度传感器
方案一:单轴陀螺仪
单轴陀螺仪是一种常用的角度传感器,能够测量一个轴向的角速度。其优点包括成本低、功耗小和易于集成,但它仅能提供一个方向的角速度数据,对于需要多轴角度测量的小车来说,使用单轴陀螺仪可能不够全面。单轴陀螺仪适用于简单的直线行驶和基本的角度测量,但在复杂路径和弧线转向时,精度和稳定性可能不足。
方案二:九轴陀螺仪
九轴陀螺仪是一种综合了三轴加速度计、三轴陀螺仪和三轴磁力计的传感器,能够同时测量加速度、角速度和地磁数据。通过融合这九个轴的数据,九轴陀螺仪可以提供更加精确和全面的姿态和方向信息。它的高精度和快速响应能力使其非常适合用于需要高稳定性和精确控制的自动行驶小车。
九轴陀螺仪的主要优点包括,高精度:能够提供更加精确的角度和姿态测量,适应复杂的行驶环境。快速响应:实时更新角度和姿态信息,确保小车能够及时调整和稳定行驶。多轴测量:综合测量多方向的加速度和角速度,提高整体的测量精度和稳定性。
综上所述,选择九轴陀螺仪作为小车的位移和速度反馈传感器,能够提供高精度、快速响应和稳定的性能,满足小车在指定路径上精确行驶和控制的需求。
3、控制系统的论证与选择
方案一:PID闭环控制策略。采用闭环控制策略,通过实时反馈调整小车的行驶参数。具体控制算法采用PID(比例-积分-微分)控制算法,结合速度环、位置环和角度环来确保小车行驶的稳定性和精度。PID控制算法能够根据误差调整控制输出,具有良好的动态响应和稳态性能。此方案能有效应对路径变化和外部干扰,但需要复杂的传感器和精确的反馈机制。
方案二:开环控制策略。采用开环控制策略,通过预设的路径和速度指令来控制小车的行驶。此方案不依赖于实时反馈,控制算法相对简单,易于实现。然而,开环控制无法应对外部环境的变化和路径偏差,容易导致控制精度不足,无法满足自动行驶小车的高精度要求。
综合考虑采用闭环控制策略。闭环控制策略结合PID控制算法和多种传感器反馈机制,能够提供高精度的路径控制和稳定的行驶性能,充分满足自动行驶小车在复杂路径和多任务要求下的高精度控制需求。
二、系统理论分析与计算
1、路径跟踪算法的分析
(1)PID控制算法
PID控制算法由比例(P)、积分(I)和微分(D)三部分组成,用于调节小车的速度和方向。比例部分通过当前误差调整控制输出,积分部分通过累计误差消除偏差,微分部分通过误差变化率进行预测和调整。
优点:响应速度快,调节精度高。
缺点:参数调节复杂,对系统稳定性要求高。
(2)速度环控制
速度环控制利用速度传感器(如编码器)反馈,实现对小车行驶速度的闭环控制。通过调节电机驱动信号,使实际速度接近目标速度。
优点:能实时调整小车速度,保证平稳行驶。
缺点:对传感器精度和响应速度要求高。
(3)位置环控制
位置环控制通过监测小车当前位置,实现对行驶路径的控制。利用位置传感器(如灰度传感器)检测路径偏差,并通过调节控制信号修正行驶轨迹。
优点:能精确控制小车行驶路径,适应复杂路线。
缺点:对传感器布局和环境适应性要求高。
2、控制参数的计算
(1)PID参数计算
PID参数(Kp、Ki、Kd)通过实验调试确定。一般采用Ziegler-Nichols法进行初步参数设置,然后根据系统响应进行优化调整。
Kp(比例系数):影响系统响应速度和稳定性。
Ki(积分系数):消除稳态误差,提高系统精度。
Kd(微分系数):减小超调,提高系统稳定性。
(2)速度环参数计算
速度环控制中,目标速度设定值根据小车行驶任务需求确定。实际速度通过编码器反馈,利用PID控制算法调节电机PWM信号,实现速度闭环控制。
目标速度设定:根据路径长度和任务时间要求,设定合理的目标速度。
速度反馈:利用编码器实时获取实际速度,进行误差计算。
PWM信号调节:通过PID控制算法,调节电机驱动PWM信号,使实际速度接近目标速度。
(3)位置环参数计算
位置环控制中,目标位置根据预定路径设定。实际位置通过灰度传感器检测,利用PID控制算法调整小车行驶方向,实现路径闭环控制。
目标位置设定:根据路径规划,设定小车行驶的目标位置。
位置反馈:通过灰度传感器实时获取小车当前位置,进行误差计算。
方向调节:通过PID控制算法,调整小车行驶方向,使实际位置接近目标位置。
三、电路与程序设计
1、电路的设计
(1)系统总体框图
系统总体框图如图1所示,整个系统由以下几个主要模块组成:TI MSPM0系列MSPm0G3507单片机控制模块、灰度传感器模块、光电编码器模块、电机驱动模块、电源模块、以及声光提示模块。各模块通过MCU进行协调和控制,实现小车的自动行驶和路径跟踪。
九轴陀螺仪电路如图5所示。主要包括以下部分。电源部分:提供稳定的3.3V或5V电源,确保九轴陀螺仪的正常工作。电源引脚通常标记为VCC和GND。通信接口:九轴陀螺仪通常通过I2C或SPI接口与MCU通信。I2C接口包括SDA(数据线)和SCL(时钟线),而SPI接口包括MISO(主输入从输出)、MOSI(主输出从输入)、SCK(时钟线)和CS(片选)。数据引脚:用于输出传感器的加速度、陀螺仪和磁力计数据。通过通信接口,这些数据传输给MCU进行处理和反馈控制。滤波和保护电路:包括必要的电容和电阻,用于滤波和保护九轴陀螺仪模块,防止电源噪声和过电流对模块造成损坏。
(4)电源
电源模块由变压部分、滤波部分、稳压部分组成,为整个系统提供稳定的5V或者12V电压。变压部分将输入电压转换为所需电压,滤波部分用于去除电源中的高频噪声,稳压部分采用三端稳压管实现稳定输出,确保电路正常工作。
变压部分:使用变压器或开关电源将输入电压转换为所需电压。
滤波部分:通过电容和电感组合滤波电路,去除电源中的高频噪声。
稳压部分:采用三端稳压管(如7805或7812)实现5V或12V稳定输出。
2、程序的设计
(1)程序功能描述与设计思路
1、程序功能描述
根据题目要求,程序需要实现以下主要功能:
自动导航与定位:小车从起始点A到达目标点B,并在各个指定点(A、B、C、D)进行停车及声光提示。
路径规划:根据指定的路径(直线和半圆弧)行驶,并在每个点进行提示。
循迹功能:在行驶弧线时,使用传感器检测路径,确保小车准确沿弧线行驶。
时间控制:确保小车在规定的时间内完成任务,并在测试过程中表现出稳定的运行性能。
2、程序设计思路
主程序控制:设计一个主循环来控制小车的整体行为,根据不同的任务要求切换不同的运行模式(如直线行驶、弧线行驶等)。
传感器数据读取:利用红外传感器和编码器读取位置和速度数据,根据这些数据进行实时调整。
控制算法实现:
速度环:控制小车的速度,保持两个轮子的速度一致。
位置环:控制小车的行驶距离,确保小车在直线和弧线上的准确移动。
角度环:在弧线行驶中控制小车的方向,保持正确的行驶路径。
提示功能:在到达每个指定点时,通过声光提示功能通知测试人员。
(2)程序流程图
1、主程序流程图
2、直线行驶子程序流程图
4、循迹功能子程序流程
在设计循迹功能的子程序时,首先启动子程序的执行并进行初始化操作,包括传感器和控制变量的设置。接着,进入主要的循环流程以持续处理传感器数据和控制小车。在每次循环中,读取红外传感器的状态数据。如果第一个传感器检测到黑线,则判断第二个传感器的状态。如果第二个传感器也检测到黑线,小车将继续直行以保持在弧线上,然后返回循环开始处继续处理数据。如果第二个传感器没有检测到黑线,小车的行驶方向将调整以重新对准弧线,然后继续循环处理数据。
如果第一个传感器没有检测到黑线,则判断第二个传感器的状态。如果第二个传感器检测到黑线,小车的行驶方向会进行调整以重新对准弧线,之后继续循环处理数据。如果第二个传感器也没有检测到黑线,则小车会停止或设置为安全状态,并继续循环处理数据。
此外,程序会定期检查是否到达预定的目标点。如果到达目标点,程序会发出声音或光线提示,结束循迹子程序的执行。如果未到达目标点,则返回循环开始处继续处理数据。这样的设计确保了循迹功能的逻辑结构明确,并在小车行驶过程中提供了清晰的控制流程。
四、测试方案与测试结果
1、测试方案
(1)硬件测试
目标:确保硬件系统的各个部分均能正常工作,并与设计规范相符合。
电路连接检查:确认所有电路连接是否按原理图正确接线,检查是否有虚焊或短路现象。使用数字万用表和示波器检查电路中的电压和信号是否正常。
(2)软件仿真测试
目标:验证控制算法和程序逻辑是否在仿真环境中按预期工作。
算法验证:使用软件仿真工具验证速度环、位置环、角度环的算法逻辑,检查是否能实现预期的控制效果。测试循迹算法,确保小车在模拟环境中能够正确识别并跟随黑线。
(3)硬件软件联调
目标:将硬件和软件结合起来,进行实际运行测试,确保系统整体性能符合设计要求。
系统集成测试:将软件程序烧录到TI MSPM0系列MCU中,并将其连接到实际硬件上进行测试。运行系统测试程序,检查硬件和软件之间的接口是否正常,确保信号传输无误。
通过以上测试方案,可以系统地验证自动行驶小车的硬件和软件性能,确保其能够稳定、准确地完成各项设计任务。
2、测试条件与仪器
测试条件:检查多次,仿真电路和硬件电路必须与系统原理图完全相同,并且检查无误,硬件电路保证无虚焊。
测试仪器:高精度的数字毫伏表,模拟示波器,数字示波器,数字万用表,指针式万用表。
3、测试结果及分析
(1)测试结果(数据)
测试项目:自动行驶小车性能测试
测试结果表格:
测试项目 | 测试条件 | 期望值 |
A到B点行驶时间 | 放置于A点,行驶至B点 | ≤15秒 |
A到B点停车提示 | 小车到达B点时 | 有声光提示 |
A到B点、B到C点、C到D点、D到A点行驶时间 | 全程完成 | ≤30秒 |
A到C点、C到B点、B到D点、D到A点行驶时间 | 全程完成 | ≤40秒 |
4圈行驶时间 | 按要求3路径行驶4圈 | 最短时间 |
红外传感器检测灵敏度 | 测试不同光照条件下 | 灵敏度应稳定 |
电机驱动响应 | 速度和方向控制 | 快速响应 |
声光提示功能 | 各点到达时 | 确保提示正常 |
系统稳定性 | 长时间运行 | 稳定 |
故障处理能力 | 模拟传感器故障 | 能正常处理 |
(2)测试分析与结论
根据上述测试数据,自动行驶小车在各项性能指标上的表现均符合设计要求,说明系统的硬件和软件设计均得到了有效验证。具体分析如下:
1、时间要求达成:小车从A点到B点的行驶时间、全程循环时间以及四圈行驶时间均在规定的时间范围内,表现优异。其中,四圈行驶时间比预期更短,显示了系统的高效性能。
2、功能实现正常:小车在各测试点的声光提示功能能够正常触发,确保了每次到达指定点时均有明确的反馈。此外,红外传感器的灵敏度和电机驱动的响应均满足了设计需求。
3、系统稳定性和故障处理:系统在长时间运行测试中表现稳定,没有出现异常情况。在模拟故障时,系统能够有效地处理并恢复正常运行,显示了良好的故障处理能力。
综上所述,本设计在满足设计任务的各项要求方面表现出色,成功实现了自动行驶小车在指定路径上的自动导航和任务执行功能。因此,本设计完全达到了设计要求,并具有良好的实际应用性能。
工程链接(点击):
2024年全国大学生电子设计竞赛自动行驶小车(H题)省一等奖(工程代码开源+设计方案+设计报告)
五、参考文献
- 卢雪红,邵亚军.基于STM32智能小车自主循迹避障系统设计与功能实现[J].世界有色金属,2021,(22):165-168.
- 郑才国,江剑.基于STM32单片机智能小车设计[J].工业控制计算机,2021,34(09):143-144+146.
- 李冠奎,秦云翔.基于STM32的自平衡小车结构和系统设计[J].信息与电脑(理论版),2021,33(09):84-86.
- 刘雪飞,李勇.基于STM32单片机的智能小车控制系统[J].电子世界,2020,(19):164-165.DOI:10.19353/j.cnki.dzsj.2020.19.077
- 赵焕娣,谭宇飞,秦运柏,等. 基于STM32F407ZET6的智能小车循迹避障设计 [J]. 电子制作, 2023, 31 (13): 19-21+29. DOI:10.16589/j.cnki.cn11-3571/tn.2023.13.029.
- 王秋生,赵聪.基于STM32的双轮自平衡小车[C]//全国地方机械工程学会,河南省机械工程学会(承办).2019年第九届全国地方机械工程学会学术年会论文集.河南省机械设计研究院有限公司;,2019:5.DOI:10.26914/c.cnkihy.2019.040980
- 曾尧. 基于STM32的智能小车循迹优化设计 [J]. 机械工程师, 2022, (01): 25-27.
附录:源程序
/* 第一个参数为电机1目标编码器值 第二个参数为电机2目标编码器值 总编码器脉冲值 */ void speed(int a, int b, int number) { float Kp = 0, Ki = 1; // 参数根据实际情况调整 static int A, APwm, Last_A; static int B, BPwm, Last_B; while (abs(move) < number) { // 编码器脉冲绝对值 A = read1 - a; APwm += Kp * (A - Last_A) + Ki * A; Last_A = A; B = read2 - b; BPwm += Kp * (B - Last_B) + Ki * B; Last_B = B; limit(&APwm, &BPwm); // PWM限幅 delay_ms(2); // 延时,防止驱动发烫 load(APwm, BPwm); // 加载PWM } load(0, 0); // 停止 A = 0; APwm = 0; Last_A = 0; B = 0; BPwm = 0; Last_B = 0; move = 0; // 归零 lenth = 0; // 归零 stop(); delay_ms(1000); } // 角度环 int erect(void) { static float Kp = 120, Ki = 0.5; int PWM_out; mpu_dmp_get_data(&Pitch, &Roll, &Yaw); // 获取数据 PWM_out = Kp * (Roll - Med_Angle) + Ki * (gyroy - 0); // 根据实际方位角计算 return PWM_out; } void angle(int number) { static int APwm, BPwm; int ect; while (abs(move) < number) { // 位置环 ect = erect(); // 角度环 APwm = ect + 1200; // 加载前进速度 BPwm = -ect + 1200; limit(&APwm, &BPwm); delay_ms(5); load(APwm, BPwm); } load(0, 0); // 停止 APwm = 0; BPwm = 0; move = 0; // 归零 lenth = 0; // 归零 stop(); delay_ms(1000); } void angle2() { static int APwm, BPwm; int ect; while (irget3() != 0) { // 直到红外传感器检测到黑线 ect = erect(); // 角度环 APwm = ect + 1200; // 加载前进速度 BPwm = -ect + 1200; limit(&APwm, &BPwm); delay_ms(5); load(APwm, BPwm); } load(0, 0); // 停止 APwm = 0; BPwm = 0; move = 0; // 归零 lenth = 0; // 归零 stop(); delay_ms(1000); } void xunji(void) { while (irget3() != 0) { // 直到红外传感器检测到黑线 if (irget2() == 1 && irget1() == 1) { load(1500, 1500); // 按实际设计速度 } else if (irget1() == 0 && irget2() == 1) { load(1000, 2000); // 按实际设计速度 } else if (irget1() == 1 && irget2() == 0) { load(2000, 1000); // 按实际设计速度 } } load(0, 0); // 停止 move = 0; // 归零 lenth = 0; // 归零 stop(); }