题目链接:自动行驶小车(H题)
我们截取一些重要信息
MCU熟悉度:尽管TI MSPM0系列MCU在使用上类似于STM32CUBEIDE+Keil,但其开发环境也需要熟悉。因此,首要任务是熟悉TI MSPM0的编程环境,以及其基本的寄存器配置和编程接口。// 我这里使用的嘉立创的地猛星MSPM0G3507
硬件接口与驱动:根据小车配置,需要编写电机驱动、传感器(寻迹,MPU6050,OLED等)的接口代码。这要求能移植即可,且嘉立创也提供了移植教程。
实时性与稳定性:由于小车行驶过程中需要快速响应环境变化,因此代码的实时性和稳定性至关重要。
环境搭建:安装并配置TI MSPM0的开发环境,确保能够编译、下载和调试代码。
硬件测试:单独测试各个硬件组件(电机、传感器等),确保其工作正常。
基础功能实现:先实现小车的基本移动功能,如前进、后退、左转、右转等。
路径跟踪与避障:在基础功能基础上,逐步加入路径和寻迹逻辑。
集成测试与调优:将各功能模块集成,进行整体测试,并根据测试结果进行调优。
MSPM0G3507开发教程: 立创·地猛星MSPM0G3507开发板
通过系统地学习和实践上述基础功能,我们可以为后续的自动行驶小车项目打下坚实的基础。这些技能不仅有助于我们更好地理解MCU的工作原理和编程方法,还能在项目中发挥关键作用,如通过PWM控制电机转速、通过串口通信实现与上位机的数据交换等。
// 无效内容,只需要注意我们这里采用的是双MCU即可
在比赛进程中,我们遭遇了一个挑战:在尝试将控制程序加入MPU6050传感器后,发现MCU(微控制器单元)意外地失去了响应。面对时间紧迫的竞赛环境,我们迅速评估了当前状况,并决定采取一个高效且直接的解决方案来应对这一突发问题。
为了在最短时间内恢复系统功能并确保任务能够顺利进行,我们决定采用双MCU(两块地猛星)的并行架构作为最优解。这一策略旨在通过分散负载和提供冗余度来绕过原系统中的潜在障碍,同时保留关键传感器(MPU6050)的数据采集能力。
通过部署双MCU系统,我们可以将控制逻辑分配到两个独立的处理器上,其中一个专注于与MPU6050的通信和数据处理,而另一个则负责执行其他关键任务,如电机控制、通信接口管理等。这样的设计不仅能够有效避免单一故障点导致的系统瘫痪,还能提升整体系统的稳定性和响应速度。在实施这一方案时,我们将紧密关注两个MCU之间的同步与协调,确保数据传输的准确性和实时性
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++;
}
}
发送:使用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;
}
BEEP
Track
TB6612
KEY
PWM
UART: 串口1不需要中断