电赛解析:信号题FFT怎么做误差小频带宽?顺序采样是绝招(A题国一)

首页-达尔闻    全部    电赛解析:信号题FFT怎么做误差小频带宽?顺序采样是绝招(A题国一)

历经几波疫情之后,2021全国电赛总算是落下帷幕。达尔闻向所有取得满意成绩的同学表示祝贺;没有打好比赛的同学也不要气馁,多学习接下来达尔闻分享的电赛解析,打起精神,有机会明年再战省赛。

 

从今天开始,达尔闻会在每周三、五推送优秀的电赛方案解析分享,达尔闻说微信和达尔闻B站同时上线,敬请关注!

 

今天要分享的是A题方案解析,来自武汉理工大学的张嘉明、岳志飞、周惠,指导老师:夏定元、张家亮,他们取得了国一的好成绩。

 

观看视频:https://www.bilibili.com/video/BV1gm4y197cR

 

 

赛题任务

 

设计制作信号失真度测量装置,对来自函数/任意波形发生器的周期信号(以下简称为输入信号)进行采集分析,测得输入信号的总谐波失真 THD(以下简称为失真度),并可在手机上显示测量信息。

基本要求:

1)输入信号的峰峰值电压范围:300mV~600mV。

2)输入信号基频:1kHz。

3)输入信号失真度范围:5%~50%。

4)要求对输入信号失真度测量误差绝对值|THDx-THDo|≤5%,THDx和THDo分别为失真度的测量值与标称值。

5)显示失真度测量值THDx。

6)失真度测量与显示用时不超过10秒。

 

 

发挥部分:

1)输入信号的峰峰值电压范围:30mV~600mV。

2)输入信号基频范围:1kHz~100kHz。

3)测量并显示输入信号失真度THDx值,要求|THDx-THDo|≤3%。

4)测量并显示输入信号的一个周期波形。

5)显示输入信号基波与谐波的归一化幅值,只显示到5次谐波。

6)在手机上显示测量装置测得并显示的输入信号THDx值、一个周期波形、基波与谐波的归一化幅值。

7)其他。

 

赛前准备

首先做一个队伍介绍吧,我们三个人都是来自武汉理工大学的大四学生,已经是老学长学姐了,其中两人都参加集创赛、智能车和省电赛等比赛,取得过不错的成绩,所以在赛前准备这块也是小有心得和经验,这里和大家分享一下。

 

 

我们是属于传统信号组,所以其实在出题前就已经明确了选题方向——那就是信号题。信号这块需要准备的东西其实挺多的,而且需要长期的学习与沉淀。我们组分工比较明确,一个人负责软件,一个人负责硬件,还有一个人负责辅助+报告(工具人)。

在清单列表出来后我们便开始准备了,首先将清单与前几年的清单做了对比,把其中与信号有关的器件选了出来,发现和往年基本一模一样,所以决定还是按部就班的准备。

 

软件主要准备方向:各种模块如(DDS/PLL/ADC/DAC/串口屏/键盘)的调试以及驱动代码的打包,还有一些常用的数字信号处理算法如FFT以及滤波算法等,软件这块最重要的就是熟悉自己以前写过的代码,这样在正式比赛的时候调库会更加得心应手一点。

 

硬件主要准备方向:常用的运放模块如加法器、减法器、比较器、滤波器还有AGC模块的调试,分类装好,正式比赛时确定硬件电路方案后就可以将各种模块像拼积木一样搭建好,硬件的前期准备是非常重要的。

 

 

方案设计

在看到题目后,我们第一反应是“这不就是去年的省赛题吗?”,但是在仔细读完题目后,发现还是有一定区别的:

1)主控必须要使用TI公司的。这其实对做软件的同学是一个比较大的挑战,因为我们以前准备的主控大多都是STM32,换主控的话需要对新的单片机以及新的EDA工具进行学习,还要将之前32的库做一个移植,工作量会比较大。

2)输入信号的频率以及幅值是不确定的。我们都知道单片机的内部ADC采集电压范围为0-3.3V,因此如何把信号幅值控制在这个区间内给单片机采样是硬件要解决的一个问题。还有在不知道信号基频的情况下,如何通过FFT运算后将频谱中的一到五次谐波提取出来,这也是一个问题。经过和组员的讨论,我们的系统方案大致如下:

图1 系统方案架构图

 

我们采用AGC电路对输入周期信号进行前级处理,结合ADC前端调理电路,将信号变换至ADC采集范围内。接下来采用MSP432的内部ADC对输出信号进行顺序采样,经FFT算法分析得到基波与谐波的归一化幅值,运算处理得到THD,并在串口屏与手机APP上进行显示。

下面是每个部分的详细介绍:

1)基于VCA821的AGC电路

VCA821是一款直流耦合、宽带、dB线性的压控增益放大器。当需要动态信号幅度校正时,AGC环路将提供实时增益控制。VCA821输出信号经过OPA695提供额外的负载驱动能力,再经过OPA820积分器,连接至VCA821的VG引脚形成闭环,环路的时间常数由电容C2和电阻R9设置。该方案的优点是原理清晰,且输入信号电压范围广、频率响应好、输出电压稳定性好。为保证输出波形的稳定性,方便后续THD测量,并尽量提高输入信号的峰峰值电压范围,同时因为之前准备过这款AGC电路,所以选择该方案作为信号的前级处理。

图2 基于VCA821的AGC电路原理图

 

图3 基于VCA821的AGC电路PCB板

 

2)ADC前端调理电路

经过AGC电路处理后的信号不能直接输出给单片机进行采样,因为经测量AGC输出的电压范围大致在-1.4V~1.4V区间之内,负电压不在单片机的采样范围之内,会导致FFT运算错误。因此这里我们采用OPA211构成电压跟随器,起到缓冲、隔离、提高带载能力的作用,再使用REF3030产生+3V基准电压,经过电阻分压网络将+1.65V直流电位通过同相加法器叠加至原信号,利于ADC充分采样

图4 ADC前端调理电路原理图

 

图5 ADC前端调理电路PCB板

 

3)MSP432主控

这里我们主控选择的是MSP432P401R,本来是准备使用MSP432E401Y,因为它的主频以及ADC采样率更高,但是由于手头没有,同时因为改进了算法,系统对采样率没有很高的要求(后面会在软件实现部分对该算法详细说明),因此最后还是选择了资源丰富且较为容易使用的MSP432P401R。

 

主要使用到的单片机外设有两个,分别是串口以及ADC。ADC用于对ADC前端调理电路输出信号进行采样,串口用到了两个:UART0用于和串口屏进行人机交互,通过串口屏显示波形、归一化幅值以及THD值,同时控制单片机切换不同的采样模式;UART1用于和ESP8266无线模块进行通信,将数据发送给ESP8266模块,再通过TCP协议使ESP8266模块能够和手机进行无线通信,并最后在APP端显示题目要求的各项数据。

 

 

软件实现

 

通过方案设计部分可以看出这道题的侧重点其实并不是硬件,而是软件。硬件整体的电路只有两个部分,且较为常见,如果准备充分的话一般正常调一天就可以把硬件部分调通,所以我们接下来看软件实现部分:

图6 题目输入信号基频范围要求图

 

题目要求可测量的基频范围是1kHz~100kHz,同时THD只需要测量并计算到5次谐波,如果使用传统的实时采样算法,根据奈奎斯特采样定理可以知道,当输入的基频为100kHz时,它的第五次谐波频率是500kHz,如果想要提取到这500kHz的谐波,那么采样率至少需要是1M及以上。通过查询MSP432的数据手册,我们发现它内部ADC的最大采样率仅为1MHz,刚刚满足理论计算要求。

图7 数据手册ADC最大采样率图

 

通过前期对FFT的调研以及准备,我们知道当采样率与频率刚刚满足两倍关系时,计算得到的结果误差会非常大,同时由于采样率的限制,我们可能无法再对系统进行进一步的提升与优化例如测量更高基频的信号。所以我们讨论了两种方案,一种是超频MSP432,使其拥有更高的主频以及采样率,但这个方案很快被否定掉了,因为超频会使单片机处于不稳定的工作条件下,如果时钟树没有设置好,可能会导致系统的崩溃,风险很大,而且通过超频得到的采样率也没有非常高。因此我们选择第二种方案:改变采样算法。

 

 

通过查阅资料以及书籍,我们发现一种非常适合该系统的采样方式:顺序采样

图8 顺序采样原理图

 

顺序采样这种方式主要用于数字示波器中,它能以极低的采样速率获得极高的带宽,并且垂直分辨率一般都在10bit以上。由于在每个采样周期只取波形上的一个样点,每次延迟一个已知的时间,因此采集足够多的样点,需要更长的时间。该方案的优点是可以使用较小的采样频率采集频率较高的信号,缺点是测量一次所花时间较长。也就是牺牲时间换取采样频率。利用该算法测量信号的THD值步骤如下:

 

1)ADC顺序采样

我们先使用ADC实时采样并通过FFT获取信号的基频,然后开始顺序采样:在一个或多个被测量信号周期内取样一次,取样信号每次延迟,因此在已知基波频率的情况下,可以倒推出所需采样频率。

 

据题,输入信号频率为1kHz~100kHz,我们设定一个周期波形采样的点数为64,即。使用14位内部ADC采集信号,设置ADC采样点数,采样频率为:

 

2)FFT计算频谱

在时域下对采集到的1024点信号序列进行FFT变换,得到输出序列为:

序列的第一个点为直流分量,它的模值为X(0)/N;序列的第i点模值为2X(i)/N。

 

3)THD的计算

根据下面公式对THD进行计算:

 

整体程序流程:

系统开启电源后,首先对各个模块进行初始化,当有信号输入时开始进行第一轮ADC实时采样;通过FFT得到输入信号的基频;根据预设在一个周期上需要采样的点数,设置自适应后的重装载值从而修改采样频率;修改参数后重新进行一轮ADC顺序采样,采集1024个点并进行FFT运算;根据得到的频谱计算出THD、归一化幅值并还原波形;将结果显示到串口屏并通过无线模块传输到手机APP上;最后还原采样频率重新进行新一轮采样并显示测量结果。

图9 程序流程图

 

 

测试结果

根据测试数据分析,本系统实现了该任务基本要求和发挥部分的所有指标,并且输入信号的峰峰值电压范围和基频范围等指标优于任务要求。输入信号的峰峰值电压范围达到10mV~1000mV,优于发挥部分指标(1)要求;输入信号基频最大可以达到1MHz,优于发挥部分指标(2)要求。测量并显示一次的时间短于0.5s,优于基本部分指标(6)具体测试过程可见视频。

在这里,我给大家总结了一些关于FFT造成误差的原因分析以及解决办法:

1)单片机内部ADC性能影响。如果需要满足奈奎斯特采样定理,采样频率需大于输入信号最高频率的两倍,以减少或者消除混叠效应;而当采样频率过大时,ADC的精度会受到一定影响。同时ADC在每次测量电压时会存在转换时间,使每次采样间隔并不完全相同,从而产生误差。

 

2)使用DSP库中的FFT函数存在误差。对于信号来说,只有那些周期(或者周期的倍数)刚好和信号长度相同时,频谱泄漏才不会发生。虽然理论上可以根据信号调整某数转换器的采用频率得到,但在实际中很难进行操作,因此我们在测量过程中频谱泄漏的情况总是存在的。同时可能由于分辨率较低,从而产生栏栅效应。

 

针对以上的误差,改进的方法如下:

1)尽量选择板载ADC性能较好的主控。同时使用顺序采样的方法,不需要将ADC采样频率设置过高,从而可以减小误差。

 

2)为了控制频谱泄漏,可以对信号进行FFT变换前加窗,加入对应的窗函数,如常用的Hanning窗函数;对应栏栅效应,可以进行补零等操作,从而提高频率分辨率。最后要尽量保证系统测量的频率是频率分辨率的整数倍,这样可以最大程度上减小频谱泄漏带来的误差。

 

 

比赛心得

这应该是我和我队友在本科期间的最后一个比赛了,能圆满结束并拿到国奖真的非常开心。电赛带给我们太多的回忆和收获。从大一下作为小白加入实验室,自己每天在网上找资料看视频,通过达尔闻学习其他学校大佬们制作的作品,从焊接最简单的三极管放大电路到独立搭建整个电路系统,这两年真的收获了很多。非常感谢一直陪我搭档的老队友飞哥,这一年多没少一起熬夜,我们都将去心仪的学校继续攻读研究生,开始新的旅程,也非常感谢亲爱滴惠神,给我带来的温暖与快乐。

 

在这里给准备参加下一届电赛的同学们一些比赛中的建议:

1)提前确定好团队的选题方向(信号仪表/运动控制/电源/人工智能/无人机),以及组内分工,提前做好规划,这样才能有针对性地训练与学习。

2)做软件的同学要注意,比赛期间多备份代码,这样可以有效避免意外情况的发生,比如电脑死机或者误删这种。比赛前一定要多多熟悉自己写过的代码,在确定方案后可以快速地从以往写过的代码中抠出自己需要使用的部分,能够节省很多时间。

3)做硬件的同学要注意,接线时细心一点,一定要注意VCC、GND、VEE,不要把电源线插反或者插到错误的电平上,避免发生“串烧”事件。

4)无论是做哪个赛题,方案永远是最重要的,正确的方案能让你少走很多弯路,而错误的方案不仅会浪费非常多的时间,而且可能会导致最后比赛的失败。所以在这里我建议大家在第一天多花时间在方案讨论上,学会发现题目中隐藏的“暗坑”,如果用大家都能想到的方案,做出来的东西一模一样,那这道题也失去考察的意义和价值了。当然如果在比赛的过程中发现方案错了,也不要慌张,及时止损选择正确的方向,都是来得及的。扎实完成基础部分以及提高部分的要求,有时间就尽力去提高系统的极限指标,能做到这一点,就一定能取得满意的成绩!

2022年1月14日 13:54
收藏