ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:101.11KB ,
资源ID:24777815      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/24777815.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(DSP实验报告.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

DSP实验报告.docx

1、DSP实验报告一、综合实验内容和目的1、实验目的(1) 通过实验学习掌握TMS320F28335的浮点处理;(2) 学习并掌握A/D模块的使用方法;(3) 学习并掌握中断方式和查询方式的相关知识及其相互之间的转换;(4) 学习信号时域分析的方法,了解相关电量参数的计算方法;(5) 了解数字滤波的一些基本方法。2、实验内容要求1:对给定的波形信号,采用TMS320F28335的浮点功能计算该信号的以下时域参数:信号的周期T,信号的均方根大小Vrms、平均值Vavg、峰-峰值Vpp。其中,均方根Vrms的计算公式如下:式中N为采样点数,为采样序列中的第i个采样点。要求2:所设计软件需要计算采样的波

2、形周期个数,并控制采样点数大于1个波形周期,且小于3个波形周期大小。要求3:对采集的数据需要加一定的数字滤波。二、硬件电路相关硬件:TMS320F28335DSP实验箱,仿真器。硬件结构图三、程序流程图1、主程序流程图程序的主流程图2、子程序流程图参数计算的流程图四、实验结果和分析1、实验过程分析(1) 使用的函数原型声明对ADC模件相关参数进行定义:ADC时钟预定标,使外设时钟HSPCLK为25MHz,ADC模块时钟为12.5MHz,采样保持周期为16个ADC时钟。(2) 定义全局变量根据程序需要,定义相关变量。主要有:ConversionCount、Voltage1024、Voltage1

3、1024、Voltage21024、filter_bufN、filter_i、Max、Min、T、temp、temp1、temp2、temp3、Num、V、Vav、Vpp、Vrm、fre。这些变量的声明请见报告后所附的源程序。(3) 编写主函数完成系统寄存器及GPIO初始化;清除所有中断,初始化PIE向量表,将程序中使用的ADC中断重新映射到ISR;对外部设备ADC模块进行初始化;使能PIE中ADCINT中断;配置ADC模块;等待ADC中断。(4) 编写中断函数第一步为对采集的数据进行数字滤波。程序中所使用的数字滤波为一种滑动滤波,将当前时刻之前的N个采样点的值取平均赋值作为当前时刻的值使用。

4、这种数字滤波的方式会产生一定的延时并且输出曲线的上下限也存在误差(这种误差可以通过一定的方法补偿)。第二步取出前800(可任意取,只要保证能在这么多点内取得两个最大值和一个最小值即可)个点中的最大值和最小值,分别用Max和Min表示。在这一步中可以首先计算出峰-峰值Vpp,计算公式为Vpp=Max-Min,单位为毫伏。第三步根据Max和Min,取出这800点中首次出现Max和Min的位置,分别用temp1和temp2表示。因为采点时不可能正好采到Max和Min,所以要实现这种功能,就要允许一定的采点误差的存在,在此设置了门限值50。在这一步中可以计算出一个周期内的采样点数T=2*abs(tem

5、p2-temp1)。第四步通过从temp1到temp3(即temp1+T)这一个周期内的各点的数据计算出信号的均方根Vrm和平均值Vav。计算出其余参数,周期T和频率fre。第五步是在循环的开始对程序计算中所需的各基本变量赋初值,为下一次计算做准备。这也是程序中至关重要的一步。(5) 调试程序程序编制完成,编译成功后,将程序装载到实验板。将需要观察的变量周期T、均方根Vrm、平均值Vav,峰-峰值Vpp,频率fre添加到Watch Window;设置图形显示,选择ViewGraphTime/Frequency,数据个数为1024、数据类型为16-bit unsigned integer、分别输

6、入数据起始地址为Voltage和Voltage1同时观察滤波前后的信号波形;对实验箱进行设置,使产生1000mV、1000Hz的正弦波;在中断程序“ConversionCount = 0;”前设置断点,选择全速运行,即可动态观察到所需测量的参数及波形变化。根据各参数的大小可在程序中适当加入补偿,使参数更准确。2、实验结果本次试验选择了正弦波,采样点数为1024个,采用断点调试,选择了150Hz,500Hz,1000Hz时的正弦波,得出的各项数据如表1所示:表1 不同频率时正弦波各参数的值150Hz: 500Hz:1000Hz:各个频率下的波形是程序在断点运行下产生的动态图,数据在某个较小的范围

7、内变化,周期是以波形采样的点数来表达出来的,从表中可以看出当频率变大时,周期点数变小,由于本程序还不够完善,所以导致高频率时,采样点数大于所要求的1到3个波形周期。试验波形对比图如下所示:150Hz:图1-a 频率为150Hz的信号滤波前波形图1-b 频率为150Hz的信号滤波后波形500Hz:图2-a 频率为500Hz的信号滤波前波形图2-b 频率为500Hz的信号滤波后波形1000Hz:图3-a 频率为1000Hz的信号滤波前波形图3-b 频率为1000Hz的信号滤波后波形3、结果分析根据本实验程序所分的两个大部分:(1) 主程序进行系统初始化、GPIO初始化、清楚中断的含义、中断向量表的

8、初始化、清楚相关中断标志位的定义、A/D模块初始化。(2) 求信号的各参数(周期,频率,均方根,平均值和峰-峰值),这部分程序是实现功能的最主要的部分,在主程序的下面给出。为了满足使采样得到的波形大于一个波形周期,且小于三个波形周期大小,可以通过改变分频系数来改善(当频率f变小时,周期采样的点数变大,可以通过改变分频系数ADC_CKPS来实现)。对于滤波我们采用了滑动滤波的方法,经过验证,输出波形明显得到了改善。但由于滑动滤波导致的误差、设置门限值导致的误差,系统本身所具有的误差,等等,使得所得的结果存在一定的误差,但是经过适当的补偿,频率误差都在10%以内,最大的误差为-6.3%。因为是首次

9、做DSP综合性试验,缺乏经验,如果在实验的初期选择了更好的滤波算法和求解信号电量参数的算法,所得的精度会有很大的提高。这使我深刻的明白到写程序不能拿到手就写,不仅要仔细考虑程序的整体流程,各种算法的优缺点的比较也是很必要的。五、源程序清单(双栏)这里列出的是改为查询方式后的源程序:#include DSP2833x_Device.h #include DSP2833x_Examples.h #include math.h/ Prototype statements for functions found within this file./interrupt void adc_isr(void

10、);#if (CPU_FRQ_150MHZ) / Default - 150 MHz SYSCLKOUT #define ADC_MODCLK 0x3 / HSPCLK = SYSCLKOUT/2*ADC_MODCLK2= 25.0 MHz#endif#if (CPU_FRQ_100MHZ) #define ADC_MODCLK 0x2 / HSPCLK = SYSCLKOUT/2*ADC_MODCLK2= 25.0 MHz#endif#define ADC_CKPS 0x1 /ADC module clock=HSPCLK/2*ADC_CKPS= 12.5MHz#define ADC_SHC

11、LK 0xf /S/H width in ADC module periods=16 ADC clocks#define AVG 1000 / Average sample limit#define ZOFFSET 0x00 / Average Zero offset#define BUF_SIZE 160 / Sample buffer size#define N 12 /滑动滤波选择的点数/ Global variables used in this example:Uint16 ConversionCount; /采样点,为一个采样周期循环Uint16 Voltage1024; /未经滤

12、波的采样点Uint16 Voltage11024; /滤波过后的采样点Uint16 Voltage21024; /存储一个波形周期中的各采样点,用于计算电量参数Uint16 filter_bufN; /存储滤波过程中使用到的前N个点Uint16 filter_i = 0; /滤波中使用的计数器,范围是:(N-1)Uint16 Max=0; /取出的波形中的最大值Uint16 Min=1400; /取出的波形的最小值float T=0; /波形的周期,程序过程中也被用作一个周期间隔的点数Uint16 temp = 0; /取最大最小值时用作中间变量Uint16 temp1 = 0; /1024个

13、点中首次出现最大值的点的位置Uint16 temp2 = 0; /1024个点中首次出现最小值的点的位置Uint16 temp3 = 0; /1024个点中第二次出现最大值的点的位置float Num=0; /一个波形周期中的采样点数float V = 0; /计算均方根中使用的中间变量float Vav = 0; /信号的平均值float Vpp = 0 ; /信号的峰峰值float Vrm = 0; /信号的均方根大小float a=9.2/1000000; /计算周期时使用的参数,加入了一定的补偿float fre=0; /信号的频率Uint16 filter(Uint16 get_ad

14、);/数字滤波器void adc_chaxun(void);/用查询方式计算各信号参数的函数main() InitSysCtrl(); InitGpio(); / Skipped for this example DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); InitAdc(); / For this example, init the ADC ConversionCount = 0; AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; AdcRegs.ADCTRL3.bit

15、.ADCCLKPS = ADC_CKPS; / 0 Non-Cascaded Mode; 1 Cascaded ModeAdcRegs.ADCTRL1.bit.SEQ_CASC = 1; AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1; AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x6; AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 15; AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0x1 ;/无线循环,采用查询方式采样 while(1) /忙则等待 while(AdcRegs.ADCST.bit.SE

16、Q1_BSY=1); /空闲则调用计算信号参数的函数 adc_chaxun(); void adc_chaxun(void) Uint16 i; Uint16 j;/存储于位中的前位,需要向右移动位 VoltageConversionCount=AdcRegs.ADCRESULT0 4;/满了个点,则对这个点滤波并计算 if(ConversionCount = 1024) ConversionCount = 0; /重新开始个点 for(i=0;i1024;i+) /数字滤波 Voltage1i = filter(Voltagei); /定义各变量的初始值,这个很重要 V=0; Vav=0;

17、Vpp=0; Vrm=0; temp1=0; temp2=0; T=0; /取出这个点中的最大最小值 for(i=0;i800;i+) temp=Voltage1i; if(Maxtemp) Min=temp; for(i=0;i800;i+) /注意设置门限值,可经过多次尝试获得 if(abs(Voltage1i-Max)50) temp1=i;/取出第一个最大值所在位置 if(abs(Voltage1i-Min)0) & (temp20) /一个周期间隔的点数 T=2*abs(temp1-temp2); /取出第二个最大值所在的位置 temp3=temp1+T; /控制取出的是第一个,否则

18、会出错误break; /取出一个周期的各点,进行参数计算 for(i=temp1,j=0;itemp3;i+,j+) /滤波产生一定的误差,加入补偿 Voltage2j=Voltage1i*1.068; V=V+(Voltage2j*Voltage2j); Vav=Vav+Voltage2j; Num=2*abs(temp1-temp2);/一周期间隔点数 Vrm=V/Num; Vrm=sqrt(Vrm); /信号的有效值 Vav=Vav/Num; /信号的平均值 Vpp=Max-Min; /信号的峰峰值 T=T*a; /信号波形的周期 fre=1/T; /信号频率 else Conversi

19、onCount+;/不满则继续采样 AdcRegs.ADCTRL2.bit.RST_SEQ1=1;/Reset SEQ1/ Clear INT SEQ1 bit AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0x1 ; return;/滤波函数Uint16 filter(Uint16 abc) Uint16 i; Uint16 sum = 0; filter_buffilter_i+ = abc; if(filter_i = N) filter_i= 0; for(i = 0;i N;i+) sum += filter_bufi; return (Uint16)(sum/N); 六、对本实验课程的几点建议在上这门课之前完全没有接触过DSP甚至是单片机,但是经过两个多月的学习、实践,在老师的认真指导下,完成了若干个单元性实验和一个综合实验,使我们对DSP技术有了一定的了解并掌握了一些基本的内容。现在我对DSP系列TMS320F28335有了一定的了解,对DSP的结构和编程都有了一定的了解。在此,非常感谢老师的辛勤工作和耐心指导,同时也要感谢同组的同学,实验过程轻松愉快。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1