发作品签到
标准版

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

工程标签

8.7k
0
0
1

简介

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

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

开源协议

GPL 3.0

创建时间:2021-12-08 12:53:36更新时间:2021-12-15 06:11:46

描述

项目简介

本作品设计并制作了一个信号失真度测量装置,以32位MSP-EXP432E开发板为控制核心,外围由低通滤波电路、可调放大电路、极性转换电路、过零比较电路、显示屏以及HC06蓝牙模块组成。首先让输入信号通过低通滤波器滤除高频成分,接着通过可调放大电路对信号进行放大,放大后的信号一方面通过极性转换电路使所有波段的信号幅值尽可能宽的分布在0-3.3V之间,另一方面通过过零比较电路转换成方波以便单片机获取信号频率。单片机对输入信号的幅值和频率进行采样后利用相干检测的方法提取并计算谐波成分得到THD,最后将数据通过蓝牙模块传到APP上实现信号失真度显示。本系统已完成题目所有要求,测试结果表明该设计具有精度高和响应快等特点。


项目功能介绍

项目的相关功能的介绍和简介,如:
1、可以准确测量电压范围30-600mv、基频1kHz-100kHz的输入信号的失真度,误差≤5%;
2、可以将测量出来的失真度值的归一化幅值以及一个周期的波形在LCD屏上显示出来,且计算时间不超过10s;
3、可以将失真度数据通过蓝牙模块传至APP上显示出来。


项目属性

这里可填写项目的完成进度条,根据已完成的功能来选择复选框,也可以作为功能的完成度进度调显示

  • 原理图设计
  • PCB图设计
  • PCB打样
  • 焊接测试
  • 功能测试
  • 程序测试

电路讲解

本系统硬件电路由低通滤波电路、可调放大电路、极性转换电路、过零比较电路四个部分组成。

(1)低通滤波电路设计

为了滤除500KHz以上高频信号的干扰,利用FilterPro设计截止频率为500KHz低通滤波器,得到两级二阶低通滤波器如图1所示。

image.png

图1  低通滤波电路

(2)可调放大电路设计

可调放大电路由程控放大电路和反相放大电路两部分组成。程控放大电路是通过单片机判断信号幅值的区间来调节数字电位器的大小从而控制一级放大电路的放大倍数;程控放大电路和反相放大电路共同使信号幅值满足单片机采样的要求。可调放大电路如图2所示。

image.png

图2  可调放大电路

(3)极性转换电路设计

极性转换电路依据差分放大电路实现信号幅值的抬升,实现所有波段的信号幅值尽可能宽的分布在0-3.3V之间,以保证单片机采样的信号满量程且不失真。极性转换电路如图3所示。

image.png

图3 极性转换电路

(4)过零比较电路设计

过零比较电路是为了将正弦信号转化成方波信号,以便单片机通过定时器获取信号频率。过零比较电路如图4所示。

image.png

图4 过零比较电路

电路参数设计分析
image.pngimage.png



软件

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
pcb图:DJ96W16A)S{VH}OSA~46@O.png
3D图:image.png
实物图:222.jpg
APP展示图:Cache_211f4b567e8bc1e..jpg


演示视频

演示视频见工程附件


注意事项

1、在PCB的布局过程中尽量使回路面积小,其次在焊接过程中注意防止电路氧化、注意电源接口的防正负误接;
2、在使用电阻电容之前,记得先测其参量的大小,防止老化元件影响电路的稳定性以及信号的干扰;
3、测试时,接线注意各接口的输入输出特性,防止接错,SMA插座在使用过程中注意不要太用力,防止接口损耗导致信号传输不稳定。


  • 心得体会

我在测试的过程中遇到了各种各样的问题,但是通过思考和积极修改,克服了难关,我本人学的专业是电子信息工程,此次比赛让我把数字信号处理的理论知识用到实验当中,我感到非常开心。希望小伙伴在制作的过程中遇到困难也不要灰心,细心排查问题,我在这次也有做的不当的地方,在采购的时候少买了一个元器件,好在实验室板子上找到这个芯片,在后面的工作中一定要细致认知,学到的不仅仅学到理论,也锻炼了团队协作能力,只有团队协作顺利才能让我这么快质量这么高的完成任务,另外这是我第一次开源,要是有不当的地方希望小伙伴们指正,互相学习。

设计图

原理图
PCB

BOM

暂无BOM

附件

序号文件名称下载次数
1
失真度测量装置代码.zip
485
2
测试方案.docx
282
3
测试视频.mp4
1723
克隆工程
添加到专辑
0
0
分享
侵权投诉

评论

全部评论(1)
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航