2021年A题——信号失真度测量装置 - 嘉立创EDA开源硬件平台

编辑器版本 ×
标准版 Standard

1、简单易用,可快速上手

2、流畅支持300个器件或1000个焊盘以下的设计规模

3、支持简单的电路仿真

4、面向学生、老师、创客

专业版 professional

1、全新的交互和界面

2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计

3、更严谨的设计约束,更规范的流程

4、面向企业、更专业的用户

标准版 2021年A题——信号失真度测量装置

简介:本作品设计并制作了一个信号失真度测量装置,以32位MSP432开发板为控制核心,外围由低通滤波电路、可调放大电路、极性转换电路、过零比较电路等组成。测试结果表明该设计具有精度高和响应快等特点。

开源协议: GPL 3.0

(未经作者授权,禁止转载)

创建时间: 2021-12-08 20:53:36
更新时间: 2021-12-15 14:11:46
描述
### 项目简介 本作品设计并制作了一个信号失真度测量装置,以32位MSP-EXP432E开发板为控制核心,外围由低通滤波电路、可调放大电路、极性转换电路、过零比较电路、显示屏以及HC06蓝牙模块组成。首先让输入信号通过低通滤波器滤除高频成分,接着通过可调放大电路对信号进行放大,放大后的信号一方面通过极性转换电路使所有波段的信号幅值尽可能宽的分布在0-3.3V之间,另一方面通过过零比较电路转换成方波以便单片机获取信号频率。单片机对输入信号的幅值和频率进行采样后利用相干检测的方法提取并计算谐波成分得到THD,最后将数据通过蓝牙模块传到APP上实现信号失真度显示。本系统已完成题目所有要求,测试结果表明该设计具有精度高和响应快等特点。 - - - ### 项目功能介绍 项目的相关功能的介绍和简介,如: 1、可以准确测量电压范围30-600mv、基频1kHz-100kHz的输入信号的失真度,误差≤5%; 2、可以将测量出来的失真度值的归一化幅值以及一个周期的波形在LCD屏上显示出来,且计算时间不超过10s; 3、可以将失真度数据通过蓝牙模块传至APP上显示出来。 - - - ### 项目属性 这里可填写项目的完成进度条,根据已完成的功能来选择复选框,也可以作为功能的完成度进度调显示 * [x] 原理图设计 * [x] PCB图设计 * [x] PCB打样 * [x] 焊接测试 * [x] 功能测试 * [x] 程序测试 - - - ### 电路讲解 本系统硬件电路由低通滤波电路、可调放大电路、极性转换电路、过零比较电路四个部分组成。 (1)低通滤波电路设计 为了滤除500KHz以上高频信号的干扰,利用FilterPro设计截止频率为500KHz低通滤波器,得到两级二阶低通滤波器如图1所示。 ![image.png](//image.lceda.cn/pullimage/ZUGc4lr4WqzI65ytwoPu8pjmJ04rYjjHrHXaW6Aq.png) 图1  低通滤波电路 (2)可调放大电路设计 可调放大电路由程控放大电路和反相放大电路两部分组成。程控放大电路是通过单片机判断信号幅值的区间来调节数字电位器的大小从而控制一级放大电路的放大倍数;程控放大电路和反相放大电路共同使信号幅值满足单片机采样的要求。可调放大电路如图2所示。 ![image.png](//image.lceda.cn/pullimage/2GYnL9uWnnrzmSOegMErFcnQerRzjeSpJj8JzWkh.png) 图2  可调放大电路 (3)极性转换电路设计 极性转换电路依据差分放大电路实现信号幅值的抬升,实现所有波段的信号幅值尽可能宽的分布在0-3.3V之间,以保证单片机采样的信号满量程且不失真。极性转换电路如图3所示。 ![image.png](//image.lceda.cn/pullimage/NrRctKh12GC8dPTDhcZrfr2KvLiXHzRwJmolUk1q.png) 图3 极性转换电路 (4)过零比较电路设计 过零比较电路是为了将正弦信号转化成方波信号,以便单片机通过定时器获取信号频率。过零比较电路如图4所示。 ![image.png](//image.lceda.cn/pullimage/BSKmEuIdkW60EelY09EWdFsxQSAElOlrPBTK4T09.png) 图4 过零比较电路 **电路参数设计分析** **![image.png](//image.lceda.cn/pullimage/1GpksXqCQwXV13BFKXU8z9SDlQB3kiIntQct6w3V.png)![image.png](//image.lceda.cn/pullimage/sxeuKBJmsYC3f7lfYbukFZOxjz0JfP0ezTt8FWr5.png)**
- - - ### 软件 ``` C void GPIOCap_Handler(void) { unsigned long ulStatus; ulStatus = GPIOIntStatus(GPIO_PORTB_BASE, true); // 读取中断状态 GPIOIntClear(GPIO_PORTB_BASE, ulStatus); // 清除中断状态 if(ulStatus & GPIO_PIN_5) { TempFrequantNum++; } } void Find_AWave(uint16_t *samplebuff,uint16_t *Wavebuff) { for(uint16_t i=0;i>8); sendadcval[2*i+1] = (uchar)(tempbuff[i]); //UARTprintf("%4dr",tempbuff[i]); } } if(ModeType == 1) { for(int i=0;i>8); sendadcval[2*i+1] = (uchar)(tempbuff[i]); } for(int i = 0;i<20;i++) { //CalWave20[i] = (float)tempbuff[i]/4096.0f*3.30f; CalWave20[i] = (float)tempbuff[i]; //UARTprintf("%4dr",tempbuff[i]); } } } int main(void) { uint32_t aimfrequant = 0; /* Configure the system clock for 120 MHz */ systemClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 120000000); /* Initialize serial console */ ConfigureUART(systemClock); /* Enable the clock to GPIO Port E and wait for it to be ready */ ADC_Sample(2000000); spi_init(); MCP41010_SetRes(0); FPULazyStackingEnable(); FPUEnable(); InputCapInit(); Timer1A_init(); Uart_Send_Init(); //Usart6Config(); ILI9341_INITIAL(); LCD_Clear(WHITE); Make_ACG(); /* Wait loop */ while(1) { /* Wait for the conversion to complete */ //while(!bgetConvStatus); // // for(i=0;i<200;i++) // { // // UARTprintf("%4drn", srcBuffer[i]); // } FindAndResolveData(); if(ModeType == 2) { basefre = Get_SinWave_ValidValues(1); freq2 = Get_SinWave_ValidValues(2); freq3 = Get_SinWave_ValidValues(3); freq4 = Get_SinWave_ValidValues(4); freq5 = Get_SinWave_ValidValues(5); tempNum = freq2*freq2+freq3*freq3+freq4*freq4+freq5*freq5; arm_sqrt_f32(tempNum,&tempNum); tempDHT = tempNum / basefre; } if(ModeType == 1) { basefre = Get_SinWave_ValidValues_20(1); freq2 = Get_SinWave_ValidValues_20(2); freq3 = Get_SinWave_ValidValues_20(3); freq4 = Get_SinWave_ValidValues_20(4); freq5 = Get_SinWave_ValidValues_20(5); tempNum = freq2*freq2+freq3*freq3+freq4*freq4+freq5*freq5; arm_sqrt_f32(tempNum,&tempNum); tempDHT = tempNum / basefre; } ADC_Sample(SampleNum); Normalnization(); PackAndSendBuff(FrequantNum,Normalbasefre,Normalfreq2,Normalfreq3,Normalfreq4,Normalfreq5,tempDHT,sendadcval); Show_FrequantList(); drawXY(); //SysCtlDelay(4*systemClock/1/3); LCD_Clear(WHITE); if(FrequantNum<20000) { SampleNum = FrequantNum * 100; ModeType = 2;//选择模式2 } else if(FrequantNum<=100000) { SampleNum = FrequantNum * 20; ModeType = 1; //选择模式1 } else { SampleNum = 2000000; ModeType = 1;//选择模式1 } aimfrequant = FrequantNum; basefre = 0; freq2 = 0; freq3 = 0; freq4 = 0; freq5 = 0; tempNum = 0; tempDHT = 0; } } ``` - - - ### 图片 原理图:![image.png](//image.lceda.cn/pullimage/Tt4DpDXACPAFD8yOliosBiiXAgUoi7RLkCQ5BooM.png) pcb图:![DJ96W16A)S{VH}OSA~46@O.png](//image.lceda.cn/pullimage/IV7qtwZZv5B3Hm8DurxZ6GLWoKtV8haUat1fFOVI.png) 3D图:![image.png](//image.lceda.cn/pullimage/bFDQYSVFWYBzB0khZCkFwo0QYb3TVENwjRQMyRq1.png) 实物图:![222.jpg](//image.lceda.cn/pullimage/HmkOhKCJBe2TU462qsE8pQk8Sz2BFJdEL80OOPad.jpeg) APP展示图:![Cache_211f4b567e8bc1e..jpg](//image.lceda.cn/pullimage/87yPEEGggVtD3VEP9A6HoXKcROglSr2hDlSFX1ZY.jpeg) - - - ### 演示视频 演示视频见工程附件 - - - ### 注意事项 1、在PCB的布局过程中尽量使回路面积小,其次在焊接过程中注意防止电路氧化、注意电源接口的防正负误接; 2、在使用电阻电容之前,记得先测其参量的大小,防止老化元件影响电路的稳定性以及信号的干扰; 3、测试时,接线注意各接口的输入输出特性,防止接错,SMA插座在使用过程中注意不要太用力,防止接口损耗导致信号传输不稳定。
* **心得体会**: 我在测试的过程中遇到了各种各样的问题,但是通过思考和积极修改,克服了难关,我本人学的专业是电子信息工程,此次比赛让我把数字信号处理的理论知识用到实验当中,我感到非常开心。希望小伙伴在制作的过程中遇到困难也不要灰心,细心排查问题,我在这次也有做的不当的地方,在采购的时候少买了一个元器件,好在实验室板子上找到这个芯片,在后面的工作中一定要细致认知,学到的不仅仅学到理论,也锻炼了团队协作能力,只有团队协作顺利才能让我这么快质量这么高的完成任务,另外这是我第一次开源,要是有不当的地方希望小伙伴们指正,互相学习。
设计图
原理图
1 /
PCB
1 /
未生成预览图,请在编辑器重新保存一次
工程视频/附件
序号 文件名称 下载次数
1

失真度测量装置代码.zip

434
2

测试方案.docx

238
3

测试视频.mp4

1710
侵权投诉
相关工程
换一批
加载中...
添加到专辑 ×

加载中...

温馨提示 ×

是否需要添加此工程到专辑?

温馨提示
动态内容涉嫌违规
内容:
  • 153 6159 2675

服务时间

周一至周五 9:00~18:00
  • 技术支持

support
  • 开源平台公众号

MP