【电子设计大赛】2019电子设计大赛A题通关指南

目录

一、大赛背景与 A 题概述

二、A 题详细解析

(一)题目拆解

(二)关键技术点剖析

三、软件代码实现思路

(一)整体架构设计

(二)核心算法实现

四、代码示例与注释

(一)主要函数代码展示

(二)代码逻辑解释

五、常见问题与解决方法

(一)实际操作中遇到的问题

(二)对应的解决方案

六、总结与展望


一、大赛背景与 A 题概述

全国大学生电子设计竞赛是教育部和工业和信息化部共同发起的大学生学科竞赛之一,是面向大学生的群众性科技活动 ,旨在推动高等学校促进信息与电子类学科课程体系和课程内容的改革。该竞赛以其综合性、创新性和实用性,吸引着无数电子信息领域的学子们参与,为他们提供了一个展示才华、锻炼能力的绝佳舞台,在高校中拥有极高的影响力。

2019 年的全国大学生电子设计竞赛中,A 题 “电动小车动态无线充电系统” 更是吸引了众多目光。这道题目的核心任务是设计并制作一个电动小车动态无线充电系统,实现小车在运动过程中的高效无线充电。具体来说,要构建无线充电发射和接收电路,确保电动小车在规定的轨道上行驶时,能从发射端获取电能,保证小车持续稳定运行。同时,还需对充电效率、充电稳定性等关键指标进行优化,满足一系列性能要求。这不仅考验着参赛选手们在电路设计、电力电子、自动控制等多方面的知识和技能,更要求他们具备创新思维和解决实际问题的能力 。

二、A 题详细解析

(一)题目拆解

  1. 无线充电电路设计:这是整个系统的核心部分之一,需要设计高效的无线充电发射和接收电路。发射电路要能够将输入的电能转换为合适频率的交变磁场,接收电路则要能有效地将交变磁场转换为电能,为电动小车供电。在设计过程中,要考虑电磁感应原理、谐振电路的设计以及电路参数的优化,以提高充电效率和稳定性。例如,如何选择合适的线圈匝数、线径以及电容值,以实现最佳的谐振效果,是一个关键问题。
  1. 电动小车运动控制: 电动小车需要按照规定的轨道行驶,这就要求对小车的运动进行精确控制。包括电机的驱动与控制,要实现小车的前进、后退、转向等动作。同时,还需要考虑小车的速度控制,以确保在不同的路况和充电需求下,小车都能稳定运行。此外,还可能涉及到小车的位置检测和定位,例如使用光电传感器、编码器等,以便实现更精准的运动控制。
  1. 充电状态监测与控制:实时监测充电状态对于保证充电效果和电池寿命至关重要。需要设计相应的电路和算法,监测充电电流、电压、功率等参数,并根据这些参数调整充电策略。当充电电流过大或过小时,自动调整发射电路的输出功率;当电池充满时,及时停止充电,防止过充。
  1. 系统集成与优化:将无线充电电路、小车运动控制系统以及充电状态监测系统进行集成,确保各个部分之间能够协同工作。同时,对整个系统进行优化,提高系统的性能和可靠性。这包括优化电路布局,减少电磁干扰;优化软件算法,提高控制精度和响应速度等。

(二)关键技术点剖析

  1. 传感器应用:在这个项目中,多种传感器发挥着重要作用。例如,使用电流传感器和电压传感器来监测充电电路的电流和电压,为充电状态的判断提供数据依据。通过霍尔传感器检测磁场强度,可用于优化无线充电的效率和位置精度。在小车运动控制方面,编码器可以精确测量车轮的转速和转动角度,从而实现对小车速度和位置的精确控制;而光电传感器则可用于检测小车是否偏离轨道,以及检测小车与充电发射端的相对位置。
  1. 电路设计:无线充电电路设计采用电磁感应原理,通过发射线圈产生交变磁场,接收线圈在磁场中感应出电动势,实现电能的无线传输。谐振电路的设计至关重要,它能提高能量传输效率,减少能量损耗。 为确保系统的稳定运行,还需要设计合适的电源管理电路,为各个模块提供稳定的电源,并对电源进行有效的分配和管理。
  1. 微控制器选型:微控制器作为系统的核心控制单元,其选型直接影响系统的性能。需要根据系统的需求,选择具有合适性能和资源的微控制器。常见的如 STM32 系列单片机,它具有丰富的外设资源、较高的处理速度和较低的功耗,能够满足对无线充电、小车运动控制以及数据处理等多方面的需求。其强大的定时器、PWM 输出功能可以方便地实现对电机的精确控制和无线充电电路的驱动;而丰富的通信接口,如 SPI、I2C、UART 等,则便于与各种传感器和其他设备进行数据通信。

三、软件代码实现思路

(一)整体架构设计

软件整体架构采用模块化设计思想,主要包括主程序模块、无线充电控制模块、小车运动控制模块、充电状态监测模块以及通信模块 。

主程序流程首先进行系统初始化,包括微控制器的初始化、各个模块的初始化等。初始化完成后,进入主循环,在主循环中不断查询各个模块的状态,并根据相应的状态进行处理。当充电状态监测模块检测到充电异常时,主程序会立即通知无线充电控制模块调整充电策略,并向小车运动控制模块发送指令,让小车暂停运动或采取相应的措施 。

无线充电控制模块负责生成和控制无线充电发射电路的信号,根据充电状态监测模块反馈的信息,调整发射功率和频率,以实现高效稳定的无线充电。小车运动控制模块根据预设的路径和速度信息,控制电机的运转,实现小车的前进、后退、转向等动作 。同时,该模块还会接收来自传感器的反馈信息,对小车的运动状态进行实时调整,确保小车始终在规定的轨道上行驶。充电状态监测模块实时采集充电电流、电压、功率等参数,并对这些参数进行分析处理。一旦发现充电状态异常,如过流、过压、充电效率过低等,立即向主程序发送警报信息。通信模块则负责实现各个模块之间的数据传输以及与上位机的通信,通过串口通信、SPI 通信等方式,将各个模块的数据进行交互和共享,方便上位机对整个系统进行监控和管理。

(二)核心算法实现

  1. 路径规划算法:采用 A算法进行小车的路径规划。A算法是一种启发式搜索算法,它通过结合广度优先搜索和启发式搜索的优势,能够在图中寻找从起点到目标的最优路径 。其核心思想是在每一步中,选择代价最小的节点进行扩展,直到找到目标节点。每个节点都有一个代价函数 f (n),表示从起点到目标的总预计代价,f (n)=g (n)+h (n),其中 g (n) 是从起点到当前节点的实际代价,h (n) 是从当前节点到目标节点的估计代价 。在实际应用中,将小车的行驶轨道划分为一个个的网格节点,通过计算每个节点的代价函数,逐步搜索出从起点到终点的最优路径。具体代码实现步骤如下:
    • 定义节点类,包含节点的坐标、代价函数值、实际代价值和父节点等属性。
    • 将起点加入开放列表,并计算其代价函数值。
    • 从开放列表中选择代价函数值最小的节点进行扩展。
    • 对扩展节点的相邻节点进行判断和处理:如果相邻节点已经在关闭列表中,则忽略它;如果相邻节点不在开放列表中,则将其加入开放列表,并计算其代价函数值和实际代价值,同时将扩展节点设置为该相邻节点的父节点;如果相邻节点已经在开放列表中,则比较当前路径和之前的路径,如果当前路径更短,则更新其代价函数值和实际代价值以及父节点 。
    • 重复上述步骤,直到找到终点或开放列表为空。如果找到终点,则从终点开始回溯路径,直到回溯到起点,得到最优路径 。
  1. 数据处理算法:对于充电状态监测模块采集到的数据,采用卡尔曼滤波算法进行处理。卡尔曼滤波是一种最优线性滤波算法,它能够通过对系统的状态进行预测和更新,有效地去除噪声干扰,提高数据的准确性和可靠性 。在本系统中,通过建立充电状态的状态空间模型,利用卡尔曼滤波算法对充电电流、电压等参数进行实时估计和更新 。具体代码实现步骤如下:
    • 初始化卡尔曼滤波器的参数,包括状态转移矩阵、观测矩阵、过程噪声协方差矩阵、观测噪声协方差矩阵等。
    • 根据上一时刻的状态估计值和状态转移矩阵,预测当前时刻的状态。
    • 根据预测状态和观测矩阵,计算预测的观测值。
    • 根据实际观测值和预测观测值,计算卡尔曼增益。
    • 根据卡尔曼增益、预测状态和实际观测值,更新当前时刻的状态估计值。
    • 更新过程噪声协方差矩阵和观测噪声协方差矩阵,为下一次滤波做准备。

四、代码示例与注释

(一)主要函数代码展示

以下是部分核心功能的函数代码,以基于 STM32 的开发为例:

// 引入必要的头文件

#include "stm32f10x.h"

// 定义传感器数据读取函数

void Read_Sensor_Data(void) {

// 初始化ADC

ADC_InitTypeDef ADC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

ADC_InitStructure.ADC_ScanConvMode = DISABLE;

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

ADC_InitStructure.ADC_NbrOfChannel = 1;

ADC_Init(ADC1, &ADC_InitStructure);

// 使能ADC1

ADC_Cmd(ADC1, ENABLE);

// 配置ADC通道

ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);

// 启动ADC转换

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

// 等待转换完成

while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);

// 读取传感器数据

uint16_t sensor_data = ADC_GetConversionValue(ADC1);

// 这里可以添加数据处理代码,比如将原始数据转换为实际物理量

}

// 定义电机控制函数,以控制直流电机为例

void Motor_Control(int speed, int direction) {

// 初始化定时器用于PWM输出

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

TIM_TimeBaseStructure.TIM_Period = 999;

TIM_TimeBaseStructure.TIM_Prescaler = 71;

TIM_TimeBaseStructure.TIM_ClockDivision = 0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse = speed; // 根据传入的速度值设置PWM脉冲宽度

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OC1Init(TIM3, &TIM_OCInitStructure);

// 启动定时器

TIM_Cmd(TIM3, ENABLE);

// 控制电机方向,假设使用两个GPIO口控制方向

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

if (direction == 1) {

GPIO_SetBits(GPIOA, GPIO_Pin_0);

GPIO_ResetBits(GPIOA, GPIO_Pin_1);

} else {

GPIO_ResetBits(GPIOA, GPIO_Pin_0);

GPIO_SetBits(GPIOA, GPIO_Pin_1);

}

}

(二)代码逻辑解释

在传感器数据读取函数中,首先对 ADC 进行初始化配置。通过 RCC_APB2PeriphClockCmd 函数使能 ADC1 的时钟,然后设置 ADC 的工作模式为独立模式,关闭扫描模式和连续转换模式,采用软件触发转换,数据右对齐,并且只使用一个通道 。接着使能 ADC1,配置要使用的通道(这里假设传感器连接到 ADC 通道 0),并设置采样时间。之后启动软件触发转换,通过循环等待 ADC_FLAG_EOC 标志位来确认转换是否完成,当转换完成后,使用 ADC_GetConversionValue 函数读取传感器数据 。

电机控制函数中,先对定时器 TIM3 进行初始化,用于产生 PWM 信号来控制电机速度。设置定时器的周期(TIM_Period)和预分频器(TIM_Prescaler),确定 PWM 的频率 。然后配置 TIM3 的输出模式为 PWM1 模式,使能输出,根据传入的速度参数设置 PWM 脉冲宽度(TIM_Pulse)。在控制电机方向部分,先使能 GPIOA 的时钟,配置 PA0 和 PA1 为推挽输出模式 。根据传入的方向参数(1 表示正转,其他值表示反转),通过 GPIO_SetBits 和 GPIO_ResetBits 函数来设置这两个引脚的电平,从而控制电机的转动方向。通过这些函数的协同工作,软件能够实现对传感器数据的准确读取以及对电机的精确控制,满足电动小车动态无线充电系统在运动控制和状态监测方面的功能需求。

五、常见问题与解决方法

(一)实际操作中遇到的问题

在完成 2019 电子设计大赛 A 题的过程中,实际操作里会遇到各种各样的问题。硬件与软件不兼容的情况时有发生,像是选用的传感器与微控制器之间的通信接口不匹配,导致无法正常读取传感器数据 ;或者无线充电模块与小车的电源管理电路存在兼容性问题,使得充电过程不稳定,容易出现断电或过充的情况。

代码运行出错也是常见状况,语法错误相对容易发现,比如少写了分号、括号不匹配等。而逻辑错误则更具隐蔽性,像路径规划算法中,可能由于对地图节点的定义或搜索逻辑有误,导致小车无法找到最优路径,甚至陷入死循环 ;数据处理算法中,若对卡尔曼滤波算法的参数设置不合理,就会使处理后的数据不准确,无法真实反映充电状态。还有运行时错误,比如在多任务处理中,任务之间的资源竞争可能引发程序崩溃;内存溢出问题也可能出现,当程序需要处理大量数据,但分配的内存空间不足时,就会导致程序异常终止 。

(二)对应的解决方案

针对硬件与软件不兼容问题,首先要仔细检查硬件连接是否正确,接口定义是否一致。若硬件接口不匹配,可以考虑使用转接板或重新设计接口电路来实现硬件之间的通信 。对于电源管理方面的兼容性问题,需要对充电电路和电源管理芯片的参数进行优化调整,确保电压、电流的匹配。

面对代码运行出错,对于语法错误,可借助编译器的错误提示信息,逐行检查代码,修改错误的符号和语句结构。对于逻辑错误,要深入分析算法逻辑,通过添加调试语句,输出关键变量的值,来逐步排查问题所在。在路径规划算法中,可以打印出每次扩展节点的信息以及代价函数值,观察搜索过程是否符合预期;对于数据处理算法,可对比处理前后的数据,分析参数设置对结果的影响,逐步调整到合适的参数。当出现运行时错误时,利用调试工具,如断点调试,查看程序在运行到出错位置时各个变量的值和程序的执行流程,找出资源竞争或内存溢出的原因。合理分配内存资源,避免内存泄漏,在多任务处理中,采用信号量、互斥锁等机制来协调任务之间的资源访问 。

六、总结与展望

2019 电子设计大赛 A 题 “电动小车动态无线充电系统” 是一道极具挑战性和综合性的题目,涵盖了无线充电技术、电机控制、传感器应用、电路设计以及软件算法等多个关键领域 。通过对这道题目的解析和实践,我们深入了解了各个环节的技术要点和实现方法,感受到了电子设计领域的魅力与挑战。

在软件代码实现方面,合理的架构设计和高效的算法是解决问题的关键。模块化的软件设计思想使得系统结构清晰、易于维护和扩展 ;而路径规划算法和数据处理算法的运用,为小车的智能运动和准确的充电状态监测提供了有力支持。代码示例展示了如何将理论知识转化为实际的代码实现,通过对主要函数的逻辑解释,我们可以更好地理解代码的运行机制和功能实现方式。

然而,在解决问题的过程中,我们也遇到了诸多挑战,如硬件与软件的兼容性问题以及代码运行出错等。但通过不断地排查和优化,我们找到了解决方案,这也进一步提升了我们解决实际问题的能力。

展望未来,电子设计领域的发展前景十分广阔。随着科技的不断进步,无线充电技术、智能控制技术等将在更多领域得到应用和拓展 。对于电子设计爱好者和从业者来说,持续学习和掌握新的知识与技术至关重要。希望大家能够从 2019 电子设计大赛 A 题的解析和实现中获得启发,不断探索电子设计的新领域,提升自己的专业技能,在未来的电子设计之路上创造出更多优秀的作品 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大雨淅淅编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值