24电赛H题总结

一、题目

        题目链接:自动行驶小车(H题)

        我们截取一些重要信息

1. 小车行驶场地示意图

        

2.要求

二、赛题分析

技术挑战与准备

  • MCU熟悉度:尽管TI MSPM0系列MCU在使用上类似于STM32CUBEIDE+Keil,但其开发环境也需要熟悉。因此,首要任务是熟悉TI MSPM0的编程环境,以及其基本的寄存器配置和编程接口。// 我这里使用的嘉立创的地猛星MSPM0G3507

  • 硬件接口与驱动:根据小车配置,需要编写电机驱动、传感器(寻迹,MPU6050,OLED等)的接口代码。这要求能移植即可,且嘉立创也提供了移植教程。

  • 实时性与稳定性:由于小车行驶过程中需要快速响应环境变化,因此代码的实时性和稳定性至关重要。

开发流程建议

  1. 环境搭建:安装并配置TI MSPM0的开发环境,确保能够编译、下载和调试代码。

  2. 硬件测试:单独测试各个硬件组件(电机、传感器等),确保其工作正常。

  3. 基础功能实现:先实现小车的基本移动功能,如前进、后退、左转、右转等。

  4. 路径跟踪与避障:在基础功能基础上,逐步加入路径和寻迹逻辑。

  5. 集成测试与调优:将各功能模块集成,进行整体测试,并根据测试结果进行调优。

MSPM0G3507开发教程: 立创·地猛星MSPM0G3507开发板

熟悉基础控制

1. LED点灯

  • 目标:学会如何通过编程控制MSPM0G3507的GPIO(通用输入输出)端口来点亮和熄灭LED灯。
  • 学习要点:了解GPIO端口的配置(如设置为输出模式)、编写控制LED亮灭的代码、理解电平高低与LED状态的关系。

2. 按键控制

  • 目标:掌握如何通过编程读取MSPM0G3507的GPIO端口状态来检测按键是否被按下,并根据按键状态执行相应的操作。
  • 学习要点:了解GPIO端口的输入模式配置、按键的去抖动处理(避免误触发)、编写按键扫描和状态处理的代码。

3. 串口通信

  • 目标:学会配置MSPM0G3507的USART(通用同步/异步接收/发送器)模块,实现与PC或其他设备之间的串口通信。
  • 学习要点:理解串口通信的基本原理(如波特率、数据位、停止位等参数)、USART模块的初始化配置、编写数据发送和接收的代码、使用串口调试助手等工具进行测试。

4. PWM输出

  • 目标:掌握MSPM0G3507的PWM(脉冲宽度调制)模块的配置和使用,实现模拟信号的输出控制(如电机速度调节)。
  • 学习要点:了解PWM的基本原理、PWM模块的初始化配置(如时钟源选择、占空比设置等)、编写控制PWM输出的代码、通过实验观察PWM波形并调整参数以达到预期效果。

通过系统地学习和实践上述基础功能,我们可以为后续的自动行驶小车项目打下坚实的基础。这些技能不仅有助于我们更好地理解MCU的工作原理和编程方法,还能在项目中发挥关键作用,如通过PWM控制电机转速、通过串口通信实现与上位机的数据交换等。

三、硬件设计

// 无效内容,只需要注意我们这里采用的是双MCU即可

在比赛进程中,我们遭遇了一个挑战:在尝试将控制程序加入MPU6050传感器后,发现MCU(微控制器单元)意外地失去了响应。面对时间紧迫的竞赛环境,我们迅速评估了当前状况,并决定采取一个高效且直接的解决方案来应对这一突发问题。

为了在最短时间内恢复系统功能并确保任务能够顺利进行,我们决定采用双MCU(两块地猛星)的并行架构作为最优解。这一策略旨在通过分散负载和提供冗余度来绕过原系统中的潜在障碍,同时保留关键传感器(MPU6050)的数据采集能力。

通过部署双MCU系统,我们可以将控制逻辑分配到两个独立的处理器上,其中一个专注于与MPU6050的通信和数据处理,而另一个则负责执行其他关键任务,如电机控制、通信接口管理等。这样的设计不仅能够有效避免单一故障点导致的系统瘫痪,还能提升整体系统的稳定性和响应速度。在实施这一方案时,我们将紧密关注两个MCU之间的同步与协调,确保数据传输的准确性和实时性

四、基础功能编写

1. MPU6050

*  MPU6050姿态角获取

MPU6050的移植方式:MPU6050六轴传感器

值得注意的是,关于stdio.c和stdio.h文件的移植步骤中,直接获取这些文件的方式可能未予详细说明,但关键信息已包含在文章的末尾部分——即文章最后的移植成功案例的代码下载链接中。

移植成功案例代码下载链接:

链接MPU6050移植成功案例

提取码:yaah

注意:我们在直接按照移植步骤完成后并未成功实现MPU6050的姿态获取(串口无反应)

我们做了如下更改:将void delay_us(unsigned long __us) ;更改如下,同时也发生了二中的情况。

void delay_us(unsigned long __us) 
{
	int delay__1us = 32000;
			int dd = 0;
	for(int i = 0; i< delay__1us;i++){
		dd++;
	}
}

*  MPU6050姿态角发送与接收

发送:使用UART1将信息发送出去(此处为了简便和配合不熟悉MCU,我们只发送一个字节)

为了通过UART1发送信息(在此场景中简化为仅发送一个字节),同时考虑到我们处理的角度数据范围在-180度到180度之间,并且单个字节(0-255)的传输限制,我们设计一个简单的编码方案。

			int yaw_int = yaw;
			yaw_int = yaw_int + 180;
			yaw_int = yaw_int/2;
	
			
			sendInt(yaw_int);
			delay_ms(20);

将 int 类型的数据装换后发出

void sendInt(int value)
{
    uint8_t sendBuff[sizeof(int)];
    
    // 将 int 转换为字节数组
    for (int i = 0; i < sizeof(int); i++)
    {
        sendBuff[i] = (value >> (i * 8)) & 0xFF; // 提取每个字节
    }

    // 逐字节发送
    for (int i = 0; i < sizeof(int); i++)
    {
        DL_UART_Main_transmitData(UART_1_INST, sendBuff[i]);
    }
}

接收:主控板通过UART1接受数据并解码

我们MPU6050的MCU会一直发送姿态角,所以我们只需要在使用时接受一次就可以了。


//获取姿态角
int yaw_out(){
		int  usrt_dd = 0;
		usrt_dd = DL_UART_Main_receiveData(UART_1_INST);
		usrt_dd  =usrt_dd*2 ;
	return usrt_dd;
}

2. 主控环境配置

BEEP

Track

TB6612

KEY

PWM

UART: 串口1不需要中断

  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0X78

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值