24年电子设计大赛H题总结

        一:题目要求:

        个人认为:拿到题目时,赛题的主要难点有两点:

        1:使用的芯片并不是大家常用的32作为主控,题目明确要求使用Ti的MSPM0芯片,在网上找到的主要有两个(M0L1306和M0G3507)两款芯片的差异还是挺大的,做开始配环境的时候使用的是M0L1306但是会出现各种各样的bug,后来换了M0G3507之后外设之间的工作就正常了所以最后是选用了M0G3507作为主控

        2:就是各个PID环之间的切换,我们使用了速度环,角度换作为两个主要的环,具体的使用思路会在下文做介绍,A,B,C,D每个位置的PID要相互结合才能较好地实现功能。

二:硬件设计:

        这里首先要感谢B站的up主:御龙老大哥,在赛前的时候实验室的同学在网上看到了大哥的项目,并将此项目的资料收入囊中,对此次的电赛帮助很大,大哥的项目是完成了小车的速度环,距离环,循迹环,角度环,角速度环的封装,包括上位机和使用按键进行OLED菜单的切换,硬件上也有嘉立创的原理图与PCB,相当于此项目已经把要用底层算法封装完成,要做的就是将他们组合起来进行联调即可(这个过程还是挺痛苦的),如果想要了解复刻的友友可以去B站支持一下。

三:软件配置:

        1.环境配置

        常说点亮了一个LED就是成功了一半了,开发环境是在赛前的时候配置的,使用的是(Keil+sysconfig)的方法,具体的配置就不再一一介绍了,有相应的教程,要注意的就是Keil的版本不能太低,另外就是改文件路径的时候对应的文件名要修改正确否则在Keil里面是无法跳转的。

        2.sysconfig使用:

        对于Ti推出的初始化配置软件来说肯定是没有Cubemx好用的,最起码他没有帮你像Cubemx那样帮你把工程配置好,再加上Ti官方提供的历程模板也不是那么好用,所以电赛时使用的就是大哥的资料,在资料里面的空白例程里做了一些移植(OLED,MPU6050,编码器计次),后面由于时间原因并没有移植。

        使用他的主要注意点就是配置完相应的IO口之后并不会生成工程,而是要使用三个文件:

要把这三个文件导入到使用的工程里面,这样才可以把配置好的设置同步到工程里面,IO口才可以初始化完成。对于里面的详细配置如果有兴趣可以稍微整理一下,具体的太多了就不一一介绍了。

        3.整体配置:

        (1)编码器配置:

        由于M03507的定时器支持使用编码器的模式只有一个定时器(真的难绷了,F103都有三个定时器支持编码器输入),所以这个方案就没办法了,后面就是用的外部中断读取高低电平进行编码器的计次了,具体的实现逻辑与STM32的方法一致。

        (2)OLED使用的是软件IIC进行的,MPU6050使用硬件IIC(使用软件IIC没有成功,好像是因为GPIO口的速率太慢了,所以就放弃了),定时器输出PWM波,这些就和平时使用32做小车的配置很相似了。

四:整体逻辑:

        任务一:使用速度环进行,小车执行任务一的时候两个轮子就走速度环走相同的速度就可以走直线,检测到黑线之后可以使用电机失能和速度环置零的方法,实测下来差的不是很多,使用速度环置零的方法停下来的速度更快,要注意速度不建议给的非常大,虽说跑得是快了,但是单片机输出PWM有先后所以其实没法做到真正意义上的同步。

        任务二:从A到B走速度环直接到达(同任务一),走到B点循迹到黑线以后就走循迹环到C点,在C点进行一个角度矫正,矫正之后走速度环+角度环,保证小车可以走直线到达D点,在D点走入循迹之后到A点没有检测到循迹就停下来。

        任务三:开机后等待MPU6050角度解算完成,之后使用角度环达到相应角度(35~40度范围),走速度环+角度环到达C点后走循迹到达B点,在B点没有循迹到白线的时候就使用角度环进行第二次角度矫正(角度范围:180~190),矫正后走速度环+角度环到D点后,走循迹到达A点没有检测到黑线就停下来。

        任务四:虽说看着任务四是任务三走四圈,但是使用MPU6050的时候发现其零飘与温漂的情况比较严重,比赛时换用精度更高的传感器显然也来不及(如果有精度更高的传感器,这个题应该是可以秒了的!)所以对于参数的调整就至关重要了,每一圈走下来MPU6050的飘逸有一定范围但是基本上是在一个区间内(我们实测大概是-10~-20之间)所以每一圈需要转的参数可以定下来的,需要改的只是角度范围,大体的逻辑并没有怎么改变的。

五:具体实现细节:

        1.速度环+角度环

        上面的思路里面大多都是一个PID闭环就可以实现,但是有一个速度环+角度环的有点说法,起初,我们使用速度环的时候发现第二问从C点出来的时候没办法让他车头刚刚好走直线的那个方向,需要有一个角度校验的意思,而且并不能保证可以正正好走到D点的黑线端(要么偏外,要么偏里)。

        所以在C点出来之后加一个角度环就比较关键了,这时可能会想为什么不用PID串联呢(四天三夜的时间确实吧有点赶,后面还有参数需要标定所以没采用),所以我们在1ms的定时器里面定义了两个static变量,两个变量分别自增到相应的数值以后执行速度环或者角度环,因为时间切换的比较快,在宏观上是感觉两个环同时工作的,就实现两个环的叠加,具体实现代码如下:

static uint8_t Angle_Start = 0;
static uint8_t Speed_Start = 0; 

if(Angle_Speed_Flag == 1)
{
	Speed_Start++;Angle_Start++;
	if(Speed_Start >= 10)						//速度环
	{
		//开启速度环
		Speed_Start = 0;			
	}
	if(Angle_Start >= 20)						//角度环
	{
		//开启角度环
		Angle_Start = 0;
	}
}

        就是让两个环不断地切换达到一起运行的效果,最终实现的效果还是不错的, 除了会导致速度降低(但不会降低很多,暂时还没有想明白因为什么)。最终应用到后面三问的效果还是不错的。        

        2.任务切换

        MPU6050的漂移问题在这个题目中的影响就非常严重了,特别是在回到原点的时候我们发现他会出现自增的状态,复位之后可能其内部并没有处于原位,再去跑下一问的时候就会出现问题,所以最后我们打算使用重新上电的方法来解决,但是重新上电的时候任务切换有点难,所以我们设计了两个IO口通过读取IO口的电平状态来切换任务,具体逻辑与代码实现如下:

                


//Read_State2与Read_State1是读取IO电平状态
uint8_t taskstate(void){
	uint8_t State;
	State = (Read_State2<<1) | (Read_State1) ;
	return State;
}

if(taskselect==0)
{
    task1();
}
if(taskselect==1)
{
	task2();	
}
if(taskselect==2)
{
	task3();
}
if(taskselect==3)
{
    task4();
}

        通过上电的时候读取电平选择任务实现的效果可以消除一部分的MPU6050的漂移。

        后面的一些心得会慢慢整理出来       

       

        

<think>嗯,用户需要找2024H的STM32解决方案、示例代码和设计思路。首先,我得先看看H的具体内容,但用户没给出目描述。不过根据提供的引用资料,可能涉及物联网、传感器、控制终端等。引用里提到了ESP8266/ESP32用于Wi-Fi,温湿度传感器、烟雾探测器,还有STM32的GPIO配置,口罩识别和无线测温系统。这些线索可能暗示H可能和环境监测、远程控制相关。 接下来,用户可能需要一个基于STM32的系统设计,整合多种传感器和无线通信。比如,使用STM32作为主控,连接温湿度传感器(DHT11)、红外传感器,通过ESP32进行Wi-Fi数据传输,开发移动APP或Web界面控制。同时,代码示例可能需要包括传感器数据采集、Wi-Fi通信、外设控制等模块。 设计思路方面,可能需要分模块处理:硬件选型、传感器数据采集、通信协议、控制逻辑、源管理等。示例代码可能需要初始化各个外设,读取传感器数据,处理数据并通过Wi-Fi发送,接收控制指令,驱动继器等执行器。 还要考虑用户可能的深层需求,比如系统稳定性、实时性、低功耗设计,或者如何优化代码结构,处理多任务调度。另外,引用中提到STM32 Cube MX和Keil的使用,可能需要指导如何配置时钟树、GPIO,或者推荐开发工具的选择。 用户可能没有明确说明目的具体要求,所以需要基于常见的目类型,比如环境监测、智能控制、物联网应用等,提供通用的解决方案框架。同时,结合引用中的资料,确保推荐的方法和代码与现有资源相符,方便用户参考已有的示例和配置。 最后,生成相关问时要覆盖系统设计的关键点,比如硬件选型、通信协议、低功耗优化、多传感器融合、故障处理等,帮助用户全面考虑可能的挑战和解决方案。</think>### 2024HSTM32解决方案设计思路 #### 1. 系统架构设计 根据H可能涉及的环境监控或智能控制需求,建议采用以下架构: - **主控单元**:STM32F103/F407系列(Cortex-M3/M4内核,性价比高)[^4] - **通信模块**:ESP32(集成Wi-Fi+蓝牙,支持MQTT协议)[^1] - **传感器模块**: - 温湿度:DHT11/DHT22(GPIO数字接口)[^3] - 气体检测:MQ-2烟雾传感器(ADC采集) - 人体感应:HC-SR501红外传感器[^3] - **执行单元**:继器模块控制家设备 #### 2. 关键技术实现 ```c // 示例代码框架(基于HAL库) #include "stm32f1xx_hal.h" #include "dht11.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_ADC1_Init(void); static void MX_USART1_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_ADC1_Init(); MX_USART1_UART_Init(); DHT11_Data dht; ESP32_Init(); // ESP32通信初始化 while (1) { if(DHT11_ReadData(&dht) == DHT_OK){ SendToCloud(dht.temp, dht.humi); // 通过ESP32上传数据 } CheckSensorThreshold(); // 阈值判断 HAL_Delay(1000); } } ``` #### 3. 关键设计要点 1. **多任务处理**: - 使用FreeRTOS创建独立任务: - 传感器数据采集任务 - 通信协议处理任务 - 设备控制任务 2. **通信协议设计**: ```python # Web服务端示例(Flask) from flask import Flask, jsonify app = Flask(__name__) @app.route('/api/control', methods=['POST']) def control_device(): command = request.json['cmd'] # 发送控制指令到STM32 return jsonify({"status": "success"}) ``` 3. **低功耗优化**: - 使用STM32的Stop模式(降低至20μA) - 配置ESP32为Deep Sleep模式 - 传感器采用中断唤醒机制 #### 4. 开发工具链 - **Keil MDK**:推荐使用V5.3+版本,支持Cortex-M全系芯片[^4] - **STM32CubeMX**:快速配置时钟树和GPIO[^2] - **调试工具**:ST-LINK V2/J-Link
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值