摘要:本设计是以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系统总体方案描述
本设计的电路首先将信号输入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的信号。
图2 AD603原理图
2.2 DAC电路
DAC电路的级联顺序为TLC5615、SGM8292,通过TLC5615与单片机之间的SPI协议,传输一个10位的控制字,随后通过TLC5615可以线性输出一个相同精度的电压,再经过SGM8292处理后,输出量程范围之内的直流电压,从而可实现对程控放大器的DA控制。其具体的原理图如下如所示。
图3 DAC模块原理图
2.3 加法电路
运放正相输入端接入放大后的信号,反向输入端接入经电阻分压后的直流量。通过OPA842运放,对上级程控放大输入的信号进行抬升,使信号电压最小值也为正,可被单片机ADC正确采样。芯片OPA842增益带宽积为200MHz,其性能完美适合对于小信号(30mV)和高频信号(≥500KHz)的处理。
3.系统软件设计分析
3.1.软件设计总体描述
本题采用MSP432E401Y控制调理电路调节信号幅度,使其峰峰值相对稳定。在信号处理上,单片机内部首先进行一次FFT,计算输入信号的基频,然后通过自适应算法,找到较为适合此信号的采样频率。改变采样频率并采集数据后,在数据集上叠加窗口函数,重新计算一次FFT,在变换后的数据集中搜索基波与谐波的幅值,计算归一化谐波以及THD,最后发送到手机和屏幕上显示。其系统框图如下图所示。
图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的信号
表2 输入基波为1kHz峰峰值600mV的信号
5.2 发挥部分
表3 输入基波为77.9kHz峰峰值600mV的信号
表4 输入基波为100kHz峰峰值300mV的信号
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);
}