基于MSP430F6638的信号采集与分析系统实验

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

信号采集与分析系统实验一、实验目的本实验目的是利用实验箱构建一个信号采集和分析系统。二、实验内容单片机核心板/或FPGA核心板按键与LED显示模块,不同LED显示代表输入为不同频点正弦信号3.5寸液晶屏显示频谱AD采集模块(也可用单片机内部AD代替)DDS模块根据按键,产生不同单频信号信号发生器(仪器)产生单频信号,测试用放大模块(备选扩展)三、实验步骤1、键盘及LED的设计与制作–编写单片机程序,控制按键,控制灯的亮灭,测试所有能控制的按键和LED2、液晶屏显示的设计与制作–测试在液晶屏上显示波形和数据3、以信号发生器输入单频正弦波,以16个指示灯代表16个单频点,频点在200Hz~10kHz任选,信号发生器每次产生一种频点正弦波,AD采集,对应频点的指示灯会亮;4、把指示灯显示频点改成用液晶显示5、液晶屏同时显示频谱和时域波形四、实验原理1、AD采样模块在这个模块中,每过一段时间,AD采样器采集一个数据存入数组中,并将存储的二进制数转换成对应的电压值,通过代码:collect0[t].real=ADC12MEM0*3.0/0x03ff;实现。采集满N个值之后,令标志变量flag=1,表示一组数据采集完毕,进入下一模块,即FFT变换。我们将信号发生器输出的模拟电压范围设定为0V~2V,这是因为:若电压值太大,会导致结果波形失真;若出现负电压,则因为AD模块不支持负电压的采集,结果可能会出现错误。2、FFT处理模块该模块将采集进来的数据进行FFT变换,变换后的实部即为频谱,用于LCD的频谱绘制。绘制时,以各频点的幅频值与最大幅频值的相对大小进行绘制;变换后模值最大的频点对应的频率即为待测频率,用fre表示,便于屏幕及LED频率显示;根据求得的fre,可求得若干函数值,用于LCD的时域波形绘制。3、LCD液晶屏显示模块该模块用于显示时域波形、频谱、学号、所测频率等内容。关键语句:清屏:etft_AreaSet(0,0,239,319,0);//清屏显示:sprintf(buffer,Frequency:%5dHz,fre);etft_DisplayString(buffer,0,32,0xFFFF,0x0000);//显示频率同时,在模块中加入了延时语句,使得波形可以保持一定的时间。时间到后,LCD会进行刷新,重新显示波形和数据。4、LED灯显示模块LED1作为采样指示灯,ADC模块每采一次样闪烁一次,由于采样频率极高,但中断调用间隔较长,实际显示为每次进入ADC采样中断LED1闪烁一下。使用LED2、LED3、LED4、LED5显示频率,标号分别为5.7、4.7、4.6、4.5。受LED灯数目的限制,当用LED显示频率时(二进制表示),只能精确到1kHz。如当1500=fre2500时,用2kHz表示,灯显示为0010;当5500=fre6500时,用6kHz表示,灯显示为0110,其余类似。通过以上模块,可以实现以下功能:AD模块采集N个数据后,FFT模块对数据进行处理,FFT变换后,实部为频谱,用于LCD的频谱绘制;模值最大的频点为所求频率,在LED和LCD上显示;再求得一些采样点的函数值,在LCD上绘制时域波形。最终,频率显示在LED灯和LCD上,波形和频谱显示在LCD上。图像保持一段时间后,LCD会进行刷新,重新显示波形和数据。附录:1、键盘及LED的设计与制作#includemsp430.h#includestdint.h#includestdio.h#includedr_i2c.h#includedr_tft.h#defineTEMP_ADDR0x2A#defineTEMP_LOCAL0x00#defineTEMP_REMOTE0x01#defineTEMP_CONFIG10x09#defineTEMP_CONFIG20x0A#defineTEMP_NCORR0x21#defineBATT_ADDR0x55#defineBATT_VOLTAGE0x04#defineBATT_CURRENT0x10#defineBATT_SOC0x1C#defineBATT_CAPA0x0C#defineBATT_FLAG0x06intTEMP_LOCAL_INDEX;intTEMP_REMOTE_INDEX;intBATT_VOLTAGE_INDEX;intBATT_CURRENT_INDEX;intBATT_SOC_INDEX;intBATT_CAPA_INDEX;intBATT_FLAG_INDEX;typedefstruct{constvolatileuint8_t*PxIN;volatileuint8_t*PxOUT;volatileuint8_t*PxDIR;volatileuint8_t*PxREN;volatileuint8_t*PxSEL;}GPIO_TypeDef;constGPIO_TypeDefGPIO4={&P4IN,&P4OUT,&P4DIR,&P4REN,&P4SEL};constGPIO_TypeDefGPIO5={&P5IN,&P5OUT,&P5DIR,&P5REN,&P5SEL};constGPIO_TypeDefGPIO8={&P8IN,&P8OUT,&P8DIR,&P8REN,&P8SEL};constGPIO_TypeDef*LED_GPIO[5]={&GPIO4,&GPIO4,&GPIO4,&GPIO5,&GPIO8};constuint8_tLED_PORT[5]={BIT5,BIT6,BIT7,BIT7,BIT0};voidinitClock(){while(BAKCTL&LOCKIO)//UnlockXT1pinsforoperationBAKCTL&=~(LOCKIO);UCSCTL6&=~XT1OFF;//启动XT1P7SEL|=BIT2+BIT3;//XT2引脚功能选择UCSCTL6&=~XT2OFF;//启动XT2while(SFRIFG1&OFIFG){//等待XT1、XT2与DCO稳定UCSCTL7&=~(DCOFFG+XT1LFOFFG+XT2OFFG);SFRIFG1&=~OFIFG;}UCSCTL4=SELA__XT1CLK+SELS__XT2CLK+SELM__XT2CLK;//避免DCO调整中跑飞UCSCTL1=DCORSEL_5;//6000kHz~23.7MHzUCSCTL2=20000000/(4000000/16);//XT2频率较高,分频后作为基准可获得更高的精度UCSCTL3=SELREF__XT2CLK+FLLREFDIV__16;//XT2进行16分频后作为基准while(SFRIFG1&OFIFG){//等待XT1、XT2与DCO稳定UCSCTL7&=~(DCOFFG+XT1LFOFFG+XT2OFFG);SFRIFG1&=~OFIFG;}UCSCTL5=DIVA__1+DIVS__1+DIVM__1;//设定几个CLK的分频UCSCTL4=SELA__XT1CLK+SELS__DCOCLK+SELM__DCOCLK;//设定几个CLK的时钟源}intmain(void){//StopwatchdogtimertopreventtimeoutresetWDTCTL=WDTPW+WDTHOLD;initClock();initI2C();initTFT();etft_AreaSet(0,0,319,239,0);inti;for(i=0;i5;++i)*LED_GPIO[i]-PxDIR|=LED_PORT[i];//设置各LED灯所在端口为输出方向P4REN|=0x1F;//使能按键端口上的上下拉电阻P4OUT|=0x1F;//上拉状态uint8_tlast_btn=0x1F,cur_btn,temp;while(1){inttemp1,temp2;charbuffer[41];cur_btn=P4IN&0x1F;temp=(cur_btn^last_btn)&last_btn;//找出刚向下跳变的按键last_btn=cur_btn;inti;for(i=0;i5;++i){if(temp&(1i)){*LED_GPIO[i]-PxOUT^=LED_PORT[i];//翻转对应的LED__delay_cycles(3276);//延时大约100mstemp1=7-i;temp2=5-i;sprintf(buffer,Switch%dLED%d,temp1,temp2);etft_DisplayString(buffer,0,0,0xFFFF,0x0000);sprintf(buffer,temp%d,temp);etft_DisplayString(buffer,0,16,0xFFFF,0x0000);}}__delay_cycles(2000000);}}2、信号采集与显示#includemsp430f6638.h#includestdint.h#includestdio.h#includemath.h#includedr_tft.h#defineN256//FFT点数#definePI3.14159265327volatilelongIntDegF;volatilelongIntDegC;voidinitClock(){while(BAKCTL&LOCKIO)//UnlockXT1pinsforoperationBAKCTL&=~(LOCKIO);UCSCTL6&=~XT1OFF;//启动XT1P7SEL|=BIT2+BIT3;//XT2引脚功能选择UCSCTL6&=~XT2OFF;//启动XT2while(SFRIFG1&OFIFG){//等待XT1、XT2与DCO稳定UCSCTL7&=~(DCOFFG+XT1LFOFFG+XT2OFFG);SFRIFG1&=~OFIFG;}UCSCTL4=SELA__XT1CLK+SELS__XT2CLK+SELM__XT2CLK;//避免DCO调整中跑飞UCSCTL1=DCORSEL_5;//6000kHz~23.7MHzUCSCTL2=20000000/(4000000/16);//XT2频率较高,分频后作为基准可获得更高的精度UCSCTL3=SELREF__XT2CLK+FLLREFDIV__16;//XT2进行16分频后作为基准while(SFRIFG1&OFIFG){//等待XT1、XT2与DCO稳定UCSCTL7&=~(DCOFFG+XT1LFOFFG+XT2OFFG);SFRIFG1&=~OFIFG;}UCSCTL5=DIVA__1+DIVS__1+DIVM__1;//设定几个CLK的分频UCSCTL4=SELA__XT1CLK+SELS__DCOCLK+SELM__DCOCLK;//设定几个CLK的时钟源}structcompx{floatreal,imag;};structcompxcollect[N],collect0[N];//AD采集到的值unsignedlongfs=28500;//采样频率inti,j,fre;floattemp_frc,z;unsignedintt=0,k=0,flag=0,n=0,c=0;/*函数原型:structcompxEE(structcompxb1,structcompxb2)函数功能:对两个复数进行乘法运算输入参数:两个以联合体定义的复数a,b输出参数:a和b的乘积,以联合体的形式输出*/structcompxEE(structcompxa,structcompxb){structcompxc;c.real=a.real*b.real-a.imag*b.imag;c.imag=a.real*b.imag+a.imag*b.real;return(c);}/*函数原型:voidFFT(structcompx*xin)函数功能:对输入的复数组进行快速傅里叶变换(FFT)输入参数:*xin

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功