国一【A题-南信大】差不多得了队—信号失真度测量装置
本设计是以MSP432为主控芯片的信号失真度测量电路,实现对任意周期信号的采集分析,最终测得输入信号的总谐波失真率及5次谐波的与基波的归一化幅值,并能在显示屏和手机APP上显示数据和周期波形。
标签
2021电赛
南京信息工程大学
更新2021-12-21
南京信息工程大学
3856

摘要:本设计是以MSP432为主控芯片的信号失真度测量电路,实现对任意周期信号的采集分析,最终测得输入信号的总谐波失真率及5次谐波的与基波的归一化幅值,并能在显示屏和手机APP上显示数据和周期波形。本电路包括程控放大电路,加法电路,DAC电路,AD-DC降压稳压电路,WIFI模块;其中程控放大电路采用AD603芯片,加法电路采用OPA842芯片,DAC电路采用TLC5615芯片,WIFI模块采用ESP32芯片。通过MSP432单片机控制TLC5615输出DA,程控AD603输出稳定峰峰值的放大后的信号,再经过加法电路抬升信号幅值全部为正。接着单片机ADC采样、FFT计算信号基频频率,通过自适应检测算法计算获得最佳的ADC采样频率,重新调整采样并进行FFT计算,得到总谐波失真和基波与谐波的归一化幅值,并显示在触摸屏和手机APP上。

关键词:信号失真度检测、ADC采样、FFT算法、自适应检测算法

1.方案设计与论证

1.1方案比较与选择

(1)MCU的选择

方案一:采用MSP430系列,MSP430是16位MCU,运算高精度FFT算法速度会比较慢。

方案二:采用MSP432P401R,MSP432P401R的ADC采样频率最高为1M,对于题目要求中高于500kHz的谐波采样效果不佳。

方案三:采用MSP432E401Y,MSP432E401Y的ADC采样频率最高为2M,采样精度为12位,且为32位的MCU,满足题目要求,故采用该方案。

(2)信号调理电路的设计

方案一:首先使用OPA847固定运放对信号源进行电压放大,然后输入OPA842加法电路的一端。5V电压源分压后,接入加法电路输入的另一端,使得调理电路的输出电压有一个1.65V的直流分量叠加一个峰峰值0.15V到3V的信号,满足MCU的ADC的采样范围。

方案二:使用MSP432单片机通过SPI通信协议控制DAC模块TLC5615,进而控制程控放大器AD603,信号源经过AD603放大后再输入后级的加法电路OPA842,加法电路另一输入端引入1.65V的直流分量,通过单片机算法计算得到调理后的信号幅值,并通过程控使输出电压的峰峰值稳定在2V左右。本方案可以尽可能的放大微小信号,提高单片机ADC采样的精度,故采用此方案。

(3)MCU软件系统的设计

方案一:固定采样频率为2M,采用4096位的FFT算法,找出频谱中的基波与谐波,计算其比例以及THD。

方案二:初始设置409600Hz的采样率,采用4096点的FFT算法,将频率识别精度提升为100Hz,再根据识别出的频率,综合考虑频谱混叠、系统最高采样频率、采样精度,计算出能使精度最高的二次采样频率。采样后,将4096点的数据叠加汉宁窗函数降低频谱混叠现象。然后找出频谱中的基波与谐波,计算归一化谐波以及THD。此方案采用自适应调整采样频率的方案,使得系统频谱混叠较少,大大提高测量精度,故采用此方案。

(4) 结果显示方案的设计

方案一:LCD屏+蓝牙,本方案的蓝牙模块采用ESP32,配合手机app——蓝牙调试器使用,但是在实际检测中,我们发现蓝牙模块的传输速率不够快,再加之传输数据类型大多数都为浮点类型,所占字节多,所以并不采纳此方案。

方案二:串口屏+WIFI,本方案WIFI模块依然采用ESP32,与蓝牙模块不同的是,WIFI传输速率更快,同时安卓app的开发也不是难事,所以无线传输部分采用ESP32的WIFI功能。考虑到串口屏的开发难度较低,界面制作精美,所以显示部分就采用串口屏。

1.2系统总体方案描述

FmlUAGZiIKtMQ7VI5zzLsAzyie7Z

本设计的电路首先将信号输入AD603与OPA842级联的调理放大电路,进行程控放大并引入直流分量,然后接入单片机MSP432E401Y的ADC端口进行采样以及数据处理,计算出谐波的归一化幅值和失真度。最后将得到的数据传输到屏幕并通过WiFi模块ESP32传输到手机APP上进行显示。其中程控放大器VGA603由MSP432E401Y控制TLC5615,电源由一个AC-DC电源降压稳压模块产生+5V与-5V稳压电源给电路供电。如上图所示。

2.主要硬件电路设计

2.1 AD603程控放大器

AD603程控放大器采用两个AD603和一个OPA690对信号进行放大,放大倍数通过DA输入电压并经LM358处理后输入第二级AD603进行控制,通过程控算法设计,在输入信号在30mVpp-600mVpp时,可使程控放大器稳定输出1.2Vpp的信号。

FqAgeYBcuGho5PSZQdVuJGqI1zq1

图2 AD603原理图

2.2 DAC电路

DAC电路的级联顺序为TLC5615、SGM8292,通过TLC5615与单片机之间的SPI协议,传输一个10位的控制字,随后通过TLC5615可以线性输出一个相同精度的电压,再经过SGM8292处理后,输出量程范围之内的直流电压,从而可实现对程控放大器的DA控制。其具体的原理图如下如所示。

Fvvu7fDjk3CChgls2XHgNKr00sBv

图3 DAC模块原理图

2.3 加法电路

运放正相输入端接入放大后的信号,反向输入端接入经电阻分压后的直流量。通过OPA842运放,对上级程控放大输入的信号进行抬升,使信号电压最小值也为正,可被单片机ADC正确采样。芯片OPA842增益带宽积为200MHz,其性能完美适合对于小信号(30mV)和高频信号(≥500KHz)的处理。

Ft8H11DnYIxD5aMq4BsAEs96iAjY

3.系统软件设计分析

3.1.软件设计总体描述

本题采用MSP432E401Y控制调理电路调节信号幅度,使其峰峰值相对稳定。在信号处理上,单片机内部首先进行一次FFT,计算输入信号的基频,然后通过自适应算法,找到较为适合此信号的采样频率。改变采样频率并采集数据后,在数据集上叠加窗口函数,重新计算一次FFT,在变换后的数据集中搜索基波与谐波的幅值,计算归一化谐波以及THD,最后发送到手机和屏幕上显示。其系统框图如下图所示。

FmaPiu_8NiIBtzYCzH7eha4eCJ-p

图5 主程序流程图

4.竞赛工作环境条件

4.1.设计分析软件环境

Multisim:电路仿真;

Keil uvision5:MSP432E401Y开发平台;

Altium Designer:PCB电路板设计;

Matlab:参数仿真模拟。

4.2. 仪器设备硬件平台

RIGOL DS2102A 100M 数字示波器、RIGOL DG4102 100M 信号发生器、AC/DC 稳压电源。

5.作品成效总结分析

5.1 基本部分

表1 输入基波为1kHz峰峰值300mV的信号

FnbYsJupJCMLymX2Us2DC3zxFRpx

表2 输入基波为1kHz峰峰值600mV的信号

FvKRR8gO8RYksrYQ4tdVW9vJklfa

5.2 发挥部分

表3 输入基波为77.9kHz峰峰值600mV的信号

Fu9eGvB0tBEfujqIIo1oAiRhlcum

表4 输入基波为100kHz峰峰值300mV的信号

FtKinJpbgIdS-9Evtn3ymuRYqTai

FuLK0n3lVlOe3_6QHNFnojDXLAxL

6.参考资料及文献

[1] 张伏生,耿中行,葛耀中.电力系统谐波分析的高精度FFT算法[J].中国电机工程学报,1999(03):64-67.

[2] 薛蕙,杨仁刚.基于FFT的高精度谐波检测算法[J].中国电机工程学报,2002(12):107-111.

[3] 潘文,钱俞寿,周鹗.基于加窗插值FFT的电力谐波测量理论──(Ⅰ)窗函数研究[J].电工技术学报,1994(01):50-54.

[4] 潘文,钱俞寿,周鹗.基于加窗插值FFT的电力谐波测量理论(Ⅱ)双插值FFT理论[J].电工技术学报,1994(02):53-56.

7.附件材料

void ConfigureUART(void)
{
    //
    // Enable the GPIO Peripheral used by the UART.
    //
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

    //
    // Enable UART0
    //
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);

    //
    // Configure GPIO Pins for UART mode.
    //
    MAP_GPIOPinConfigure(GPIO_PA0_U0RX);
    MAP_GPIOPinConfigure(GPIO_PA1_U0TX);
    MAP_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

    //
    // Initialize the UART for console I/O.
    //
    UARTStdioConfig(0, 115200, g_ui32SysClock);
}
void ADC_DMA_Config(int fre)
{
 /* Enable the clock to GPIO Port E and wait for it to be ready */
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
    while(!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOE)))
    {
    }

    /* Configure PE0-PE3 as ADC input channel */
    MAP_GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_0);

    /* Enable the clock to ADC-0 and wait for it to be ready */
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
    while(!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_ADC0)))
    {
    }

    /* Configure Sequencer 2 to sample the analog channel : AIN0-AIN3. The
     * end of conversion and interrupt generation is set for AIN3 */
    MAP_ADCSequenceStepConfigure(ADC0_BASE, 2, 0, ADC_CTL_CH3 | ADC_CTL_IE |
                                 ADC_CTL_END);

    /* Enable sample sequence 2 with a timer signal trigger.  Sequencer 2
     * will do a single sample when the timer generates a trigger on timeout*/
    MAP_ADCSequenceConfigure(ADC0_BASE, 2, ADC_TRIGGER_TIMER, 2);

    /* Clear the interrupt status flag before enabling. This is done to make
     * sure the interrupt flag is cleared before we sample. */
    MAP_ADCIntClearEx(ADC0_BASE, ADC_INT_DMA_SS2);
    MAP_ADCIntEnableEx(ADC0_BASE, ADC_INT_DMA_SS2);

    /* Enable the DMA request from ADC0 Sequencer 2 */
    MAP_ADCSequenceDMAEnable(ADC0_BASE, 2);

    /* Since sample sequence 2 is now configured, it must be enabled. */
    MAP_ADCSequenceEnable(ADC0_BASE, 2);

    /* Enable the Interrupt generation from the ADC-0 Sequencer */
    MAP_IntEnable(INT_ADC0SS2);

    /* Enable the DMA and Configure Channel for TIMER0A for Ping Pong mode of
     * transfer */
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
    while(!(SysCtlPeripheralReady(SYSCTL_PERIPH_UDMA)))
    {
    }

    MAP_uDMAEnable();

    /* Point at the control table to use for channel control structures. */
    MAP_uDMAControlBaseSet(pui8ControlTable);

    /* Map the ADC0 Sequencer 2 DMA channel */
    MAP_uDMAChannelAssign(UDMA_CH16_ADC0_2);

    /* Put the attributes in a known state for the uDMA ADC0 Sequencer 2
     * channel. These should already be disabled by default. */
    MAP_uDMAChannelAttributeDisable(UDMA_CH16_ADC0_2,
                                    UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
                                    UDMA_ATTR_HIGH_PRIORITY |
                                    UDMA_ATTR_REQMASK);

    /* Configure the control parameters for the primary control structure for
     * the ADC0 Sequencer 2 channel. The primary control structure is used for
     * copying the data from ADC0 Sequencer 2 FIFO to srcBuffer. The transfer
     * data size is 16 bits and the source address is not incremented while
     * the destination address is incremented at 16-bit boundary.
     */
    MAP_uDMAChannelControlSet(UDMA_CH16_ADC0_2 | UDMA_PRI_SELECT,
                              UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
                              UDMA_ARB_4);

    /* Set up the transfer parameters for the ADC0 Sequencer 2 primary control
     * structure. The mode is Basic mode so it will run to completion. */
    MAP_uDMAChannelTransferSet(UDMA_CH16_ADC0_2 | UDMA_PRI_SELECT,
                               UDMA_MODE_BASIC,
                               (void *)&ADC0->SSFIFO2, (void *)&srcBuffer,
                               sizeof(srcBuffer)/2);

    /* The uDMA ADC0 Sequencer 2 channel is primed to start a transfer. As
     * soon as the channel is enabled and the Timer will issue an ADC trigger,
     * the ADC will perform the conversion and send a DMA Request. The data
     * transfers will begin. */
    MAP_uDMAChannelEnable(UDMA_CH16_ADC0_2);

    /* Enable Timer-0 clock and configure the timer in periodic mode with
     * a frequency of 1 KHz. Enable the ADC trigger generation from the
     * timer-0. */
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
    while(!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_TIMER0)))
    {
    }

    MAP_TimerConfigure(TIMER0_BASE, TIMER_CFG_A_PERIODIC);
    MAP_TimerLoadSet(TIMER0_BASE, TIMER_A, (systemClock/fre));
    MAP_TimerADCEventSet(TIMER0_BASE, TIMER_ADC_TIMEOUT_A);
    MAP_TimerControlTrigger(TIMER0_BASE, TIMER_A, true);
    MAP_TimerEnable(TIMER0_BASE, TIMER_A);
}
团队介绍
南京信息工程大学
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号