DSP实验报告数据测量和条件传输系统含源程序.docx
- 文档编号:5097109
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:13
- 大小:252.93KB
DSP实验报告数据测量和条件传输系统含源程序.docx
《DSP实验报告数据测量和条件传输系统含源程序.docx》由会员分享,可在线阅读,更多相关《DSP实验报告数据测量和条件传输系统含源程序.docx(13页珍藏版)》请在冰豆网上搜索。
DSP实验报告数据测量和条件传输系统含源程序
研究生实验报告
课程名称:
DSP技术应用
综合设计名称:
数据测量和条件传输系统
2009年12月28日
一、实验内容和目的
1、实验内容
本实验主要模拟某种电子信息处理设备的功能,实现下列要求:
要求1:
对给定的一路波形信号,计算该信号的频率大小。
要求2:
信号频率低于50HZ时,根据信号控制LED灯每隔10个信号周期点亮或熄灭一次。
要求3:
信号频率高于50HZ时(不超过5KHZ),LED灯不再点亮,并且将信号频率利用SCIB接口传输给上位机,传输格式为:
信号测量频率为124HZ的时候,传输格式为<124HZ>)。
2、实验目的
(1)掌握TMS320F28335扩展数字I/O口的方法及应用;
(2)掌握A/D转换模块的性能、数据采集及编程方法;
(3)了解F28335的SCI模块的结构及特点,掌握串行口工作方式及编程方法,了解PC机串行通讯的工作过程;
(4)掌握中断处理程序的编程方法;
二、硬件电路
硬件电路原理图如图1所示。
图1实验硬件电路原理图
由图1可见,试验系统由以下三个部分组成:
(1)PC机
(2)SEED-XDS510系列仿真器
(3)SEED-DTK28335综合实验系统
PC机通过并口或USB口与SEED-XDS510系列仿真器相连;SEED-XDS510系列仿真器通过JTAG口与SEED-DTK综合实验系统相连。
本实验主要用到以下三个模块:
(1)数字I/O模块
DSP系统中一般只有少量的数字I/O资源,而一些控制系统中经常需要大量数字量的输入与输出。
因而,在外部扩展I/O资源非常重要。
扩展I/O资源时,可以采用74LS273、74LS373之类的锁存器,或者采用CPLD在其内部做锁存逻辑,SEED-DEC28335实验箱中采用的是后者。
实验箱上I/O控制部分映射到F28335的Zone7,其起始地址为0x(字地址)。
交通灯控制口的偏移地址为0x0000,地址为0x。
(2)SCI串行通讯模块
在SEED-DEC28335模板直接采用F28335片上的2通道SCI作为异步收发器UART。
SEED-DEC28335采用MAX3160多协议收发器,使得异步串口接口电平可配置为RS232/RS422/RS485多种接口电平标准。
(3)A/D转换模块
F28335的A/D转换模块是带内置采样和保持(S/H)的12位模数转换模块,共有16个模拟输入通道(ADCIN0-ADCIN15)。
SEED-DEC28335板卡上AD接口的ADCINA0、ADCINA2、ADCINA4及ADCINA6共四个通道与波形发生器通道0的输出相连。
实验中选用ADCINA6进行数据采集,通过键盘设置波形发生器通道0的波形及其参数。
三、实验设计说明
1、主程序流程图:
图2-1主程序流程图
2、中断子程序流程图:
图2-2中断子程序流程图
3、程序设计思路:
实验程序主要包括两个部分:
主程序,AD中断子程序。
主程序主要有以下功能:
系统的初始化,SCIB通讯模块初始化,I/O口设置,A/D模块初始化及中断设置。
AD中断子程序中,首先对给定信号进行采样,根据采样数据计算信号频率。
如果计算得到的信号频率小于50HZ,则每隔10个信号周期点亮或熄灭LED灯一次;信号频率大于50HZ时,通过SCIB模块将信号频率以
本次实验中,信号频率的计算方法如图3所示:
图3信号频率计算方法原理图
为了防止采样无效计数,故设置了两个比较值:
H&L。
每当采样值大于比较值H时,就将flag置1,继续比较。
在flag=1的情况下,当采样值一旦小于比较值L时,num++,观察num值
(1)如果num<=1,采样数cj开始计数,并将flag置0;
(2)如果num>1(num=2),cj停止采样计数。
这样得到的cj的值便是一个周期内所得的采样点数,已知采集一个数据所需时间为AD中断周期Ts,那么显然,信号周期T=cj×Ts。
计算完成后,重置参数为flag=0,num=0,cj=0。
本实验中,设定H=500HZ,L=200HZ。
三、实验结果和分析
1、实验步骤及程序调试
实验主要步骤如下:
(1)关掉PC电源;
(2)将并口线一端连接到PC并行端口;
(3)将并口线另一端连接到SEED-XDS510PP仿真器上;
(4)用XDS510PP仿真器上的接头与SEED-DTK28335综合实验系统上JTAG仿真端口连接。
程序调试方法:
1)设置断点
2)复位目标板
有三种复位目标板的方法:
a.ResetDSP:
暂停运行中的程序并初始化所有寄存器的内容。
执行该命令后,需重新装载.out文件。
b.Restart:
将PC值恢复至当前程序的入口地址。
c.Gomain:
将程序运行至主程序的入口处暂停。
3)执行
CCS提供了四种执行程序的方法(Debug菜单中)
a.执行(Run):
运行程序直到遇到断点为止。
b.暂停执行(Halt):
停止程序运行。
c.动画执行(Animate):
反复运行程序,每次遇到断点停顿一段时间。
d.自由执行(RunFree):
忽略所有断点运行程序。
4)单步执行
5)查看变量:
右击—WatchWindow命令
6)Graph的设置及图形显示:
选择View—Graph—Time/Frequency
2、运行结果
1)给定信号频率低于50HZ时,LED灯循环点亮与熄灭(间隔10个信号周期)。
图4-1发生波形图(f=30HZ)图4-2LED点亮图4-3LED熄灭图
2)给定信号频率高于50HZ时,LED灯熄灭,并且通过PC机显示信号频率,如图5所示为信号频率为600HZ时,PC机显示结果:
图5f=600HZ时的频率显示
3、实验中遇到的问题
在实验过程中,出现了不少的问题,首先是AD中断经常需要经过开关实验板来重置,这个问题应该是硬件接触不良的原因引起的;其次,在实验初期,当频率f<50HZ时,经常会出现波形变成噪声的情况,导致不能进行信号周期的计算,如图6所示为f=30HZ的标准正弦波的波形。
但是如果f比较大时,不会出现这种情况,将f从大逐渐减小至30HZ,则波形又能正常显示,这个问题我们暂时还未能讨论出可靠的干扰原因。
图6f=30HZ时的error噪声波形
四、源程序
//头文件
#include"DSP2833x_Device.h"
//DSP2833xHeaderfileIncludeFile
#include"DSP2833x_Examples.h"
//DSP2833xExamplesIncludeFile
#include"comm.h"
interruptvoidadc_isr(void);
voidscib_fifo_init();
//地址定义
volatileunsignedint*p_ceselect=(volatileunsignedint*)0x;
volatileunsignedint*p_trafficaddr=(volatileunsignedint*)0x;
volatileunsignedint*p_ioenable=(volatileunsignedint*)0x;
//设置A/D采样时钟频率为12.5MHz,宽度为16
#if(CPU_FRQ_150MHZ)
//Default-150MHzSYSCLKOUT
#defineADC_MODCLK0x3
//HSPCLK=SYSCLKOUT/2*ADC_MODCLK2
=150/(2*3)=25.0MHz
#endif
#if(CPU_FRQ_100MHZ)
#defineADC_MODCLK0x2
//HSPCLK=SYSCLKOUT/2*ADC_MODCLK2=100/(2*2)=25.0MHz
#endif
#defineADC_CKPS0x1
//ADCmoduleclock=HSPCLK/2*ADC_CKPS
=25.0MHz/(1*2)
=12.5MHz
#defineADC_SHCLK0xf
//S/HwidthinADCmoduleperiods
=16ADCclocks
//定义全局变量
Uint16LoopCount;
Uint16ConversionCount;
Uint16Voltage1[1024];//存储波形采样数据
Uint16num=0,cj=0,flag=0;//用于频率计算的参数
float32T,Ts=7.68e-6;//信号、A/D采样周期T、Ts
Uint32f;//信号频率f=1/T
Uint16Tjc=0;//信号采样周期计数
unsignedintiostatus=0;
main()
{
InitSysCtrl();///系统初始化
//GPIO口初始化
InitGpio();//Skippedforthisexample
InitSciGpio();//设置SCI模块所用到的GPIO口
DINT;
InitXintf();
InitPieCtrl();//初始化中断
IER=0x0000;//清除中断标志
IFR=0x0000;//清除中断标志
*p_ceselect=0x3;//打开ce3空间
DELAY_US(100);//延迟函数
*p_ioenable=0xfff;//IO空间始能
DELAY_US(100);
InitPieVectTable();//I初始化中断向量表
//设置A/D中断入口
EALLOW;
PieVectTable.ADCINT=&adc_isr;
EDIS;
//初始化SCIB模块和A/D模块
scib_fifo_init();//InitSCI-B
InitAdc();//Forthisexample,inittheADC
//使能AD中断
PieCtrlRegs.PIEIER1.bit.INTx6=1;
IER|=M_INT1;//EnableCPUInterrupt1
EINT;//EnableGlobalinterruptINTM
ERTM;//EnableGlobalrealtimeinterruptDBGM
LoopCount=0;
ConversionCount=0;
//AD模块初始化
AdcRegs.ADCTRL1.bit.ACQ_PS=ADC_SHCLK;//采样时间预定标
AdcRegs.ADCTRL3.bit.ADCCLKPS=ADC_CKPS;//AD时钟预定标
AdcRegs.ADCTRL1.bit.SEQ_CASC=1;//级联排序
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=0x1;//中断使能
AdcRegs.ADCTRL2.bit.RST_SEQ1=0x1;
AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x6;//将第6通道的转换结果存放在CONV00中
AdcRegs.ADCMAXCONV.bit.MAX_CONV1=15;//最大转换通道为16
AdcRegs.ADCTRL2.bit.SOC_SEQ1=0x1;//软件触发启动
for(;;);//循环等待AD中断
}
//AD中断函数
interruptvoidadc_isr(void)
{
Voltage1[ConversionCount]
=AdcRegs.ADCRESULT0>>4;
//将采样所得数据结果存储到Voltage1数组中
if(Voltage1[ConversionCount]>50)
flag=1;//当采样值大于50时,flag置1
if(num>=1)
cj++;//num大于1时,cj开始计数
if(flag==1)//flag为1时,如果采样值小于200,//num计数加1,同时将flag置0;
{
if(Voltage1[ConversionCount]<200)
{num++;flag=0;}
}
if(num==2)
//num=2时,计算信号频率,并重置参数
{
num=0;
T=cj*Ts;//计算信号周期
f=1/T;//计算信号频率
cj=0;//信号采样点计数复位
Tjc++;//信号采样周期计数
}
if(ConversionCount==1024)
//If1024conversions
//havebeenlogged,startover
{
ConversionCount=0;
}
elseConversionCount++;
if(Tjc%10==0)//每10个信号周期,
//执行一些操作
{
if(f<50)//信号频率小于50Hz时的一些操作
{
iostatus=*p_trafficaddr;
if(iostatus==0)
//判断上一次LED灯的状态
iostatus=0xfff;//点亮LED灯
else
iostatus=0;//熄灭LED灯
*p_trafficaddr=iostatus;
}
else//信号频率大于或等于50HZ时
{
iostatus=0;
*p_trafficaddr=iostatus;//熄灭LED灯
//将信号频率传输给上位机,传输格式为:
xxxHZ
while(ScibRegs.SCIFFTX.bit.TXFFST!
=0);
//SCI端口不空闲,循环等待
ScibRegs.SCITXBUF=f/1000+48;//信号频率千位转化为字符输出
while(ScibRegs.SCIFFTX.bit.TXFFST!
=0);
ScibRegs.SCITXBUF=f%1000/100+48;
//信号频率百位转化为字符输出
while(ScibRegs.SCIFFTX.bit.TXFFST!
=0);
ScibRegs.SCITXBUF=f%100/10+48;//信号频率十位转化为字符输出
while(ScibRegs.SCIFFTX.bit.TXFFST!
=0);
ScibRegs.SCITXBUF=f%10+48;
//取信号频率个位转化为字符输出
while(ScibRegs.SCIFFTX.bit.TXFFST!
=0);
ScibRegs.SCITXBUF='H';//输出字符'H'
while(ScibRegs.SCIFFTX.bit.TXFFST!
=0);
ScibRegs.SCITXBUF='Z';//输出字符'Z'
}
}
//复位AD模块
AdcRegs.ADCTRL2.bit.RST_SEQ1=1;
//重置排序器SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;
//ClearINTSEQ1bit
PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;//AcknowledgeinterrupttoPIE
AdcRegs.ADCTRL2.bit.SOC_SEQ1=0x1;
return;
}
//SCIB模块初始化函数
voidscib_fifo_init()
{ScibRegs.SCICCR.all=0x0007;
//1位停止位,数据位为8个字节,//无奇偶校验位,空闲线方式
ScibRegs.SCICTL1.all=0x0003;//发送、接收使能
ScibRegs.SCICTL2.all=0x0003;
ScibRegs.SCICTL2.bit.TXINTENA=1;
ScibRegs.SCICTL2.bit.RXBKINTENA=1;
ScibRegs.SCIHBAUD=0x0001;
//设置通讯频率为9600
ScibRegs.SCILBAUD=0x00e7;
ScibRegs.SCICCR.bit.LOOPBKENA=0;
//Disableloopback
ScibRegs.SCICTL1.all=0x0023;
//RelinquishSCIfromReset
ScibRegs.SCIFFTX.bit.TXFIFOXRESET=0;
ScibRegs.SCIFFRX.bit.RXFIFORESET=0;
ScibRegs.SCIFFTX.all=0xE040;
ScibRegs.SCIFFRX.all=0x204f;
ScibRegs.SCIFFCT.all=0x0;
}
五、实验总结
通过本次实验,初步掌握了TMS320F28335扩展数字I/O口的方法及应用,A/D转换模块的性能、数据采集及编程方法,了解了F28335的SCI模块的结构及特点,串行口工作方式及编程方法,PC机串行通讯的工作过程,中断处理程序的编程方法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP 实验 报告 数据 测量 条件 传输 系统 源程序