2021年电赛国赛A题:信号失真度测量装置
目录
1.项目简介
2.题目及功能指标
3.理论分析与计算
4.本题所用模块清单表及总体方案描述
5.各原理图电路分析
6.电路pcb设计
7.程序设计
8.实物图展示
9.总结
项目简介
本系统以TI公司的MSP432系列MCU为控制核心,通过硬件调理电路、MCU ADC采样、数字信号处理等手段,测量信号源产生的任意波的总谐波失真近似值(THD)。输入信号经自动增益控制放大器,再通过直流偏置加法器把幅度调整到ADC采样范围,进而采样为数字信号,通过快速傅立叶变换(FFT)分析计算出信号的THD,得到频域与时域波形,并将所测结果通过本地彩色触摸屏显示和通过WiFi实时传输至手机APP显示。测试结果表明,本装置电路设计条理清晰,人机交互界面友好,功能性能完备,并且频率、幅度、精度的测量范围均超过题目要求,能在1s内完成各项指标的测量,新增频率指标和语音播报创新功能,THD测量最大误差不超过1%,圆满完成了题目的所有要求并有所拓展。
题目及功能指标
题目要求 | 完成情况 |
(1)输入信号峰峰值30mV~600mV | 完成,拓展至170μV~6V |
(2)输入信号基频范围1kHz~100kHz | 完成,拓展至600Hz~100kHz |
(3)输入信号失真度范围5%~50% | 完成,拓展至0%~100% |
(4)失真度测量与显示用时不超过10s | 完成,拓展至不超过1s |
(5)测量输出信号总谐波失真近似值THD | 完成,最大误差不超过1% |
(6)测量并显示输入信号一个周期波形 | 完成 |
(7)显示基波与谐波归一化幅值 | 完成 |
(8)手机上显示测量结果 | 完成 |
(9)其它 | (1) 频率测量显示 (2) 语音提示功能 (3) 离散频谱可视化 (4)交互友好、显示清晰 (5)连续、单次测量模式 |
本题模块清单表
模块 | 型号 | 备注 |
主控模块MCU | MSP432E401Y | |
自动增益控制放大模块AGC | AGC模块(AD603) | 淘宝链接:https://m.tb.cn/h.fiGzQkD?sm=9124c2 |
WiFi模块 | ESP8266(正点原子) | 淘宝链接:https://m.tb.cn/h.f7zSYlr?sm=472fbb |
显示屏(大彩屏) | 7寸800*480 8P接口串口屏 | 淘宝链接:https://m.tb.cn/h.fRyreFA?sm=ad58ad |
总体方案描述
外接任意波信号发生器作为信号源,输入信号接入自动增益控制放大器进行放大以适应宽输入幅度范围,再叠加偏置将输出信号调理至ADC采样幅度范围,单片机将采样得到的结果进行FFT运算,从而得到总谐波失真近似值和时域、频域的波形信息,并将所测结果通过彩色触摸屏显示和通过WiFi实时传输至手机APP显示,系统总体方案框图如图所示。
理论分析与计算
1.放大电路设计
在本系统中,由于测控信号的范围比较宽,为保证必要的测量精度,对于输入的模拟信号需要加前置放大器,以使输出电压适合于模数转换器的电压范围。
针对题目输入信号的峰峰值范围30mV~600mV,本系统设计的放大器不仅要满足最低输入幅度的信号能被AD准确采集,也要保证最高输入幅度的信号经放大后不会超过单片机ADC的输入幅度限制0~3.3V,同时,考虑到输入信号基频最大为100kHz,则其五次谐波频率为500kHz,故应选用带宽不小于5MHz的运放,此处选用程控放大器AD603实现,AD603采用特有的内插技术,可保证增益变化是线性的,且增益稳定性强,受外界温度及电源波动影响较小。
信号源产生的任意波通过自动增益放大电路,其作用是当输入信号较强时,使放大器增益自动降低,而当信号较弱时,又使其增益自动增高,从而保证在AGC作用范围内输出电压比较均匀。使得后级处理电路对于输入信号具有良好的处理特性。
2.直流偏置加法电路设计
偏置部分选用经典加法器电路,其中比例电阻均取10kΩ。具体偏置大小采用定值电阻与电位器分压的方式,考虑到MCU ADC要求采集信号幅度在0~3.3V,取放大后的正弦波峰峰值最大可放大到3Vpp,则:
故取1K电位器与3.3K定值电阻分压。
3.FFT测量设计
快速傅里叶变换FFT可以将一个时域信号变换到频域,也可以将一个信号的频谱提取出来,先对一个信号在时域上按照采样频率F进行采集,采集N个点然后对这N个点进行FFT运算,就可以得到这个信号的频谱特性。FFT之后结果就是一个N个点的复数,每一个点对应一个模值为实部与虚部平方和的频率点,每个频率点的模值(第一个点直流分量除外)为原始信号峰值A的N/2倍,第一个点直流分量为A的N倍。第n个点对应的信号频率为:
原理图电路分析
1.自动增益控制放大电路
AGC电路本质上是一个反馈控制电路,将输出电压平均值通过检测电路变换为合适的直流电平,并反馈至压控增益放大器的增益控制端,其结构如下图。
压控增益放大器决定了AGC的最大增益和增益变换范围,电路的频率特性,噪声指标等主要指标也取决于这个放大器。由于反馈环反馈准直流信号,所以对于整个放大器的频率特性基本没有影响。
本系统中的自动增益控制放大电路,是由两个AD603构成可变增益放大器,每个AD603的电压增益可以从0dB变化到+42dB,两个放大器构成的级联放大器增加AGC的控制范围。
AD603依靠控制电压控制放大倍数;比较器AD8561比较的是第二级AD603输出信号(比较器的同相端)和设置电压(比较器的反相端),使用二极管和RC对比较器输出信号进行检波;检波的值的范围0~3.3V,电路设置为固定电压值1.4V,这样就可以保证调整电压在AD603的控制电压范围内,使AD603能正常放大,具有自动调节的能力,如图所示。
2.直流偏置加法电路
在本系统中,由于前级放大电路中的AD603存在内部失调电压,导致放大后的信号在进入加法器前存在较大的直流偏置,故加入截止频率为1.59Hz的高通滤波器隔直,这里取电容C=0.1μF,R=1MΩ的一阶无源高通滤波器。
同时,为防止分压电路电阻对加法器比例电阻的影响,与比例电阻对高通滤波器截止频率的影响,在分压电路和高通滤波器后各加入一级跟随器进行隔离再输入进加法器,实际电路如图所示。
PCB电路分析
1.自动增益控制放大电路
这个用的是备赛期间准备的AGC自动增益控制放大模块,所以就不贴PCB图了,放一个淘宝链接:
https://m.tb.cn/h.fiGzQkD?sm=9124c2 AGC模块 AD603 自动增益控制 手动、程控调节输出幅值 带宽10M
2.直流偏置与高通隔直电路
因为是比赛的时候制作的,实验室做双面板很麻烦,选用单面板,然后之所以放两个供电接口,主要是因为只放一个的话很难布通。然后规格接近5X5cm,不大不小,和其他电路模块大小一致,看上去也比较美观。
3.加法电路
这也是个基本的加法电路,注意电源退耦,然后电路板规格也是尽量做成5X5cm,与前后电路模块大小保持一致。
程序设计
本装置以MSP432E401Y单片机为核心,使用串口屏进行人机交互,一键启动后,通过单片机片上12位ADC对放大后的输入信号进行多次采样,选取最佳采样率下的数据进行FFT运算,得到信号的频域波形,在频域中提取基波及各次谐波的峰峰值、相位等信息并进行IFFT运算,从而得到还原后的一个周期时域波形,最终测试结果通过串口屏显示和通过WiFi实时传输至手机APP显示,如图所示。
首先先来介绍一下上位机。我们上位机软件是用QT来写的,因为QT是跨平台的,同样一套代码可以在windows上面跑,也可以在linux上面跑,也可以在安卓手机上面跑。而且不需要修改任何东西,编译器会自动给你生成好,并且可以非常地快速实现界面设计,非常地友好,这就非常的方便。既然可以在手机上面跑,那么我把串口改成WiFi不就是一个WiFi_APP了吗?说干就干,网上关于QT开发蓝牙的已经有相关的资料了,那么一样的道理,WiFi或蓝牙差不多的,于是乎就综合各方面资料,整合了一个WiFi_APP。 做这个app不需要任何的Java的知识,你只要会QT最基本的C++基础就可以了。只有你手头有WIFI模块(ESP8266)和安卓手机就可以实现WIFI_APP的功能。
软硬件平台
硬件平台:
ESP8266,(淘宝上有卖),它的接口就是跟串口一样,用到了TX,RX,GND,VCC四个引脚。跟下位机或者用CH340,TTL转USB模块接到PC机上,WIFI的工作模式可以通过AT指令调节。有AP模式,STA模式,AP+STA混合模式......简单的来说就是:
AP:可以将ESP8266作为热点,可以让其他的设备连接上它;
STA:可以连接上当前环境下的WIFI热点。
最重要的是开启透传模式。透传就是指不需要关心wifi协议是如何实现的。所需要做的就是A通过串口发数据,B通过串口收数据,整个过程中A串口和B串口就像是用导线直接连接起来了一样。则对于开发人员来看,就是完全透明的。我们用的是STA模式(需连接热点),然后开启透传。
ATK-ESP8266(正点原子)模块,接线方式如下:
这六个引脚只需要4个就行了:RXD、TXD、GND、VCC,分别和单片机的TXD、RXD、GND、VCC相连接就行了。
安卓手机:
我这里用的是一台安卓手机,OPPO手机,安卓版本10
软件平台:
本项目Qt版本是5.12.4,系统是Windows 10 x64
注意:需要搭建Qt for Android 环境
视频链接:Qt的安装和安卓环境搭建
软件基本介绍:
因为第一次做WiFi上位机,就做了一个非常简单的雏形,实现WIFI状态检测,本机IP的扫描和服务器链接,基波谐波的显示,时域频域波形的显示,并且能像串口助手一样完成数据收发。如图,就是本一开始做的最简单的软件界面,本软件基于widge控件制作,当然你可以选择其他的,更可以自己定义类。
我们是基于QT的网络协议之TCP通信,用到了两个类,QTcpServer和QTcpSocket,TCP分为了服务器和客户端,就是跟网络调试助手差不多的。我们这里使用手机作为服务器,wifi模块(esp8266)作为客户端,那么只要连接在同一个网络,就可以互相通信,传输数据了。
当然我们还需要制定简单的数据传输协议:因为有了协议,你才知道发过来的是什么类型的数据,一次发多少个,要显示在哪里,下面是部分代码,源码放在最后面了,大家可以下载来慢慢查看。
同样我们也给大家提供了学习QT的视频链接方便大家学习:【【北京迅为】嵌入式学习之QT学习篇-哔哩哔哩】 https://b23.tv/gP8rDCd
#include "qglobal.h"
#include "cmd_queue.h"
#include "process_fun.h"
#include "widget.h"
uint8_t cmd_buffer[A_CMD_MAX_SIZE];
void A_ProcessMessage(A_PCTRL_MSG msg, uint16_t size,Ui::Widget *dis)
{
uint8_t cmd_type = msg->cmd_type; //指令类型
uint16_t screen_id = A_PTR2U16(&msg->screen_id); //画面
ID uint16_t control_id = A_PTR2U16(&msg->control_id); //控件
ID uint32_t value = A_PTR2U32(msg->param); //数值
uint16_t len = A_PTR2U16(msg->param); switch(cmd_type) { case A_kCtrlButton: //按钮控件
A_NotifyButton(screen_id,control_id); break; case A_kCtrlText: //文本控件
A_NotifyText(screen_id,control_id,msg->param,dis); break; case A_kCtrlGraph: A_NotifyGraph(screen_id,control_id,len,&msg->param[2]); //画图控件
default: break; }
}
void A_NotifyText(uint16_t screen_id, uint16_t control_id, uint8_t *str,Ui::Widget *dis)
{ if(screen_id == 0)
{ if(control_id == 3)
{ Widget::updatedata3(str,1,dis); }
实物图展示
作品实物图:
人机交互界面:
手机APP:
总结
对于此题,我们队伍还是抱有一点遗憾,因为之前对TI的MCU没有足够了解,面对此题现学TI的板卡开发,包括在选型时也吃了亏,当时手头有430、432、C2000三种型号的MCU,简单看了官网上的介绍就选择了MSP432,虽然能完成题目规定的各项指标,但相对于其他选择C2000的组来说还是有很大差距,听说其他学校用C2000能测到1M频率,而MSP432E401Y的ADC采样速率只能到1M,对于100kHz的基波,五次谐波已经达到500kHz,用1M速率来采已经非常勉强。而且MSP432E401Y内部没有DA,无法做连续的程控,要么采用控继电器、模拟开关等实现离散放大倍数的控制;要么就只能外接DA模块。
最后也十分感谢平常给我们培训,答疑解惑的实验室老师们和学长学姐们,感谢一同奋战电赛的兄弟们和学弟学妹们,感谢在考研紧张复习的时期抽出时间的队友,本科期间最后一场电赛结束了,但电赛不是终点,谨以此与君共勉。