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

目录

一、电赛 A 题初印象

二、任务要求深度剖析

(一)基本要求详解

(二)发挥部分解读

三、硬件方案与原理

(一)整体硬件架构

(二)关键硬件模块解析

四、软件设计思路与流程

(一)整体软件架构

(二)关键算法实现

五、代码实现细节

(一)开发环境搭建

(二)主要代码片段解析

六、调试与优化

(一)常见问题与解决方法

(二)性能优化策略

七、总结与展望


一、电赛 A 题初印象

2021 年全国大学生电子设计大赛 A 题 “信号失真度测量装置”,是一道极具挑战性且能充分考察参赛者综合能力的题目。信号失真度测量在通信、音频处理、仪器仪表等众多领域都有着至关重要的应用,准确测量信号的失真度,能帮助我们判断电子设备的性能优劣。对于参赛的电子爱好者和学生来说,这道题不仅是对专业知识的检验,更是一次将理论应用于实践的绝佳机会。接下来,就让我们一同深入解析这道题,探寻其背后的原理以及软件代码的实现方法。

二、任务要求深度剖析

(一)基本要求详解

  1. 输入阻抗:要求输入阻抗不小于 10kΩ。这一要求的意义在于,当测量装置接入被测信号源时,不会因自身输入阻抗过低而对信号源产生过大的负载效应,避免影响被测信号的原有特性,保证测量的准确性。如果输入阻抗过小,信号源输出的信号在测量装置上的分压会减小,导致测量值出现偏差。
  1. 信号电压范围:通常要求能测量正弦信号电压峰峰值在 0.1V - 5V 之间。该范围的设定考虑了实际应用中常见的信号强度,覆盖了中小幅度的信号测量需求,能够满足大部分基础场景下的信号失真度测量。
  1. 频率成分范围:一般规定测量信号的基波频率范围在 100Hz - 10kHz。这个频率范围包含了音频信号的主要频段,同时也是许多电子设备常用的工作频率范围,使得该测量装置具有一定的通用性。
  1. 频率分辨力:要求频率分辨力不低于 1Hz。频率分辨力是指测量装置能够区分两个相邻频率信号的最小频率差,较高的频率分辨力能让装置更精确地识别信号中的不同频率成分,为后续的失真度计算提供可靠的频率数据。

(二)发挥部分解读

  1. 扩大输入信号动态范围:将输入信号电压峰峰值的测量范围扩展到 0.01V - 10V。这一提升方向使得测量装置能够适应更多不同强度的信号,无论是微弱信号还是较强信号,都能进行准确测量,大大提高了装置的实用性和适用场景。
  1. 增加频率分辨力档:除了基本要求的 1Hz 分辨力外,增加 0.1Hz 等更高分辨力的档位。更高的频率分辨力可以让测量装置在处理一些频率接近的信号成分时,能够更清晰地将它们区分开来,进一步提升测量的精度,满足更高级别的测量需求。

三、硬件方案与原理

(一)整体硬件架构

整体硬件架构主要由信号输入模块、信号调理模块、ADC 采样模块、微控制器(MCU)模块、显示模块和电源模块组成。信号输入模块负责接收外部被测信号;信号调理模块对输入信号进行放大、滤波、电平抬升等处理,使其适合 ADC 采样;ADC 采样模块将模拟信号转换为数字信号并传输给 MCU;MCU 模块是整个系统的核心,负责控制各个模块的工作、对采样数据进行处理和计算;显示模块用于实时显示测量结果;电源模块为各个模块提供稳定的工作电压。各模块之间通过相应的接口和线路连接,协同工作完成信号失真度的测量任务。

(二)关键硬件模块解析

  1. 信号调理电路:输入信号首先经过衰减或放大电路,根据信号的强弱进行适当的调整,使信号处于合适的幅度范围。然后通过滤波电路,滤除信号中的高频噪声和干扰信号。接着进行电平抬升,将交流信号转换为单极性信号,以适应 ADC 的输入范围。常用的芯片有运算放大器如 OP07、LM358 等,这些芯片具有高增益、低噪声、高精度等特性,能够很好地完成信号调理的任务。
  1. ADC 采样模块:选用 12 位或更高位数的 ADC 芯片,如 ADS1115、STM32 内部集成的 ADC 等。ADC 采样的原理是通过对模拟信号进行离散化采样,将连续的模拟信号转换为离散的数字量。以 ADS1115 为例,它通过 I2C 接口与 MCU 连接,MCU 可以通过发送指令控制 ADC 的采样率、量程等参数,采样完成后,ADC 将转换后的数字数据通过 I2C 总线传输给 MCU。
  1. 微控制器选择:选用 STM32 系列单片机,如 STM32F103。该型号 MCU 具有丰富的外设资源,包括多个 ADC 接口、I2C 接口、SPI 接口、UART 接口等,能够满足与各个模块的通信和控制需求。同时,它具有较高的运算速度,能够快速处理采样数据并进行复杂的算法计算,满足实时测量的要求。

四、软件设计思路与流程

(一)整体软件架构

软件流程图主要包括主程序流程和中断服务程序流程。主程序首先进行系统初始化,包括 GPIO 初始化、ADC 初始化、I2C 初始化、UART 初始化、定时器初始化等。初始化完成后,进入主循环,在主循环中,通过定时器触发 ADC 采样,当采样完成后,触发中断服务程序。在中断服务程序中,读取 ADC 采样数据并存储到缓冲区,当缓冲区的数据达到一定数量时,对数据进行 FFT 变换、失真度计算等处理,然后将处理结果发送到显示模块进行显示。主程序还负责处理用户的按键输入,实现对测量参数的设置和调整。

(二)关键算法实现

  1. FFT 算法:FFT(快速傅里叶变换)是一种高效的计算离散傅里叶变换(DFT)的算法,它可以将时域信号转换到频域,从而分析信号的频率成分。在信号失真度测量中,通过 FFT 算法可以得到信号中基波和各次谐波的频率和幅度。代码实现的关键步骤包括:对采样数据进行预处理,如加窗函数以减少频谱泄漏;将预处理后的数据进行 FFT 变换;从 FFT 结果中提取基波和各次谐波的频率和幅度信息。
  1. 失真度计算算法:失真度通常定义为各次谐波的总有效值与基波有效值之比的百分数。计算方法是先通过 FFT 算法得到基波和各次谐波的幅度,然后根据有效值的计算公式分别计算基波的有效值和各次谐波的总有效值,最后按照失真度的定义计算出失真度。具体公式为:失真度 =(√(U2²+U3²+…+Un²)/U1)×100%,其中 U1 为基波有效值,U2、U3、…、Un 为各次谐波有效值。

五、代码实现细节

(一)开发环境搭建

使用 Keil MDK 开发工具进行代码编写和调试。环境搭建步骤如下:首先安装 Keil MDK 软件,然后安装对应 MCU 型号的芯片包,如 STM32F103 的芯片包。接着创建一个新的工程,选择对应的 MCU 型号,配置工程的编译选项和链接脚本。最后添加必要的库文件和头文件,如 STM32 的标准库文件等,完成开发环境的搭建。

(二)主要代码片段解析

  1. ADC 采样代码
 

void ADC_Init(void)

{

ADC_InitTypeDef ADC_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

GPIO_Init(GPIOA, &GPIO_InitStructure);

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

ADC_InitStructure.ADC_ScanConvMode = DISABLE;

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

ADC_InitStructure.ADC_NbrOfChannel = 1;

ADC_Init(ADC1, &ADC_InitStructure);

ADC_Cmd(ADC1, ENABLE);

ADC_ResetCalibration(ADC1);

while (ADC_GetResetCalibrationStatus(ADC1));

ADC_StartCalibration(ADC1);

while (ADC_GetCalibrationStatus(ADC1));

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

}

uint16_t ADC_GetValue(void)

{

while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

return ADC_GetConversionValue(ADC1);

}

上述代码中,ADC_Init 函数用于初始化 ADC1,设置 GPIOA 的 Pin0 为模拟输入,配置 ADC 的工作模式为独立模式、单通道扫描、连续转换等。关键参数如 ADC_Mode 设置为独立模式,保证 ADC1 独立工作;ADC_ContinuousConvMode 设置为 ENABLE,使 ADC 能够连续进行采样。ADC_GetValue 函数用于获取 ADC 的采样值,通过等待 ADC_FLAG_EOC 标志位来判断采样是否完成,然后返回采样值。

  1. FFT 计算代码

这里以使用 STM32 的 DSP 库中的 FFT 函数为例,代码片段如下:

 

#include "arm_math.h"

#define FFT_SIZE 1024

float32_t inputBuffer[FFT_SIZE * 2];

float32_t outputBuffer[FFT_SIZE];

arm_cfft_radix4_instance_f32 fftInstance;

void FFT_Init(void)

{

arm_cfft_radix4_init_f32(&fftInstance, FFT_SIZE, 0, 1);

}

void FFT_Process(uint16_t *adcData)

{

uint16_t i;

for (i = 0; i < FFT_SIZE; i++)

{

inputBuffer[2 * i] = (float32_t)(adcData[i] - 2048); // 去除直流分量

inputBuffer[2 * i + 1] = 0;

}

arm_cfft_radix4_f32(&fftInstance, inputBuffer);

arm_cmplx_mag_f32(inputBuffer, outputBuffer, FFT_SIZE);

}

FFT_Init 函数用于初始化 FFT 实例,设置 FFT 的大小为 1024 点。FFT_Process 函数用于对 ADC 采样数据进行 FFT 处理,首先将 ADC 采样数据转换为浮点数并去除直流分量,存储到输入缓冲区中(复数形式,虚部为 0),然后调用 arm_cfft_radix4_f32 函数进行 FFT 变换,最后通过 arm_cmplx_mag_f32 函数计算复数的模值,得到信号的频谱幅度。

  1. 显示与通信代码

以 UART 通信为例,将测量结果发送到上位机:

 

void UART_Init(uint32_t baudRate)

{

USART_InitTypeDef USART_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

USART_InitStructure.USART_BaudRate = baudRate;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_Parity = USART_Parity_No;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode = USART_Mode_Tx;

USART_Init(USART1, &USART_InitStructure);

USART_Cmd(USART1, ENABLE);

}

void UART_SendData(float distortion)

{

char sendBuffer[50];

sprintf(sendBuffer, "Distortion: %.2f%%\r\n", distortion);

uint16_t i = 0;

while (sendBuffer[i] != '\0')

{

while (!USART_GetFlagStatus(USART1, USART_FLAG_TXE));

USART_SendData(USART1, sendBuffer[i]);

i++;

}

}

UART_Init 函数初始化 USART1,设置波特率、数据位、停止位等参数,配置 GPIOA 的 Pin9 为发送引脚(复用推挽输出),Pin10 为接收引脚(浮空输入)。UART_SendData 函数将失真度测量结果格式化后,通过 USART1 发送到上位机,实现数据的传输。

六、调试与优化

(一)常见问题与解决方法

  1. 硬件问题
  • 问题:ADC 采样数据波动较大,噪声严重。
  • 解决思路:检查电源模块输出是否稳定,可增加滤波电容;检查信号调理电路中的滤波环节,适当调整滤波参数,选用截止频率合适的滤波器;确保电路接地良好,减少接地噪声的干扰。
  1. 软件问题
  • 问题:FFT 变换后频谱泄漏严重,影响频率成分识别。
  • 解决方法:在进行 FFT 变换前,对采样数据添加合适的窗函数,如汉宁窗、汉明窗等,减少频谱泄漏;确保采样频率满足奈奎斯特采样定理,避免频率混叠。

(二)性能优化策略

  1. 算法优化:对于 FFT 算法,可以根据实际需求选择合适的 FFT 点数,在保证测量精度的前提下,减少计算量,提高处理速度;优化失真度计算的算法,减少不必要的运算步骤,提高计算效率。
  1. 硬件参数调整:调整信号调理电路中的放大倍数和滤波参数,使输入到 ADC 的信号处于最佳范围,提高采样精度;选择更高位数的 ADC 芯片,提升模数转换的精度;合理选择 MCU 的工作频率,在满足性能要求的同时降低功耗。

七、总结与展望

通过对 2021 电子设计大赛 A 题 “信号失真度测量装置” 的解析,我们详细了解了该题的任务要求、硬件方案、软件设计思路以及代码实现细节。从硬件模块的选型与搭建,到软件算法的设计与优化,每一个环节都需要我们严谨对待,充分发挥自己的专业知识和实践能力。

这道题不仅考察了我们对电子电路、嵌入式系统、数字信号处理等知识的掌握程度,更锻炼了我们分析问题和解决问题的能力。在实际的制作和调试过程中,我们会遇到各种意想不到的问题,但正是这些问题促使我们不断学习和进步。

展望未来,信号失真度测量技术在电子领域的应用将更加广泛,对测量精度和速度的要求也会越来越高。希望通过本次解析,能为广大电子爱好者和学生提供一些参考和启发,鼓励大家积极实践和探索,不断改进和完善测量装置,为电子技术的发展贡献自己的力量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大雨淅淅

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

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

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

打赏作者

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

抵扣说明:

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

余额充值