DSP实验报告_数据测量和条件传输系统(含源程序)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

研究生实验报告
课程名称:DSP技术应用
综合设计名称:数据测量和条件传输系统
2009年12月28日
一、实验内容和目的
1、实验内容
本实验主要模拟某种电子信息处理设备的功能,实现下列要求:
要求1:对给定的一路波形信号,计算该信号的频率大小。

要求2:信号频率低于50HZ时,根据信号控制LED灯每隔10个信号周期点亮或熄灭一次。

要求3:信号频率高于50HZ时(不超过5KHZ),LED灯不再点亮,并且将信号频率利用SCIB接口传输给上位机,传输格式为:<xxxHZ>(例如:信号测量频率为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 模块将信号频率以<xxxHZ>的格式传输给上位机。

本次实验中,信号频率的计算方法如图3所示:
H L
开始采样计数,flag 置0
停止采样计数,重置参数
图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.Reset DSP :暂停运行中的程序并初始化所有寄存器的内容。

执行该命令后,需重
新装载.out文件。

b.Restart :将PC值恢复至当前程序的入口地址。

c.Go main :将程序运行至主程序的入口处暂停。

3)执行
CCS提供了四种执行程序的方法(Debug菜单中)
a.执行(Run):运行程序直到遇到断点为止。

b.暂停执行(Halt):停止程序运行。

c.动画执行(Animate):反复运行程序,每次遇到断点停顿一段时间。

d.自由执行(Run Free):忽略所有断点运行程序。

4)单步执行
5)查看变量:右击—Watch Window命令
6)Graph的设置及图形显示:选择View—Graph—Time/Frequency
2、运行结果
1)给定信号频率低于50HZ时,LED灯循环点亮与熄灭(间隔10个信号周期)。

图4-1 发生波形图(f=30HZ)图4-2 LED点亮图 4-3 LED熄灭图
2)给定信号频率高于50HZ时,LED灯熄灭,并且通过PC机显示信号频率,如图5所示为信号频率为600HZ时,PC机显示结果:
图5 f=600HZ时的频率显示
3、实验中遇到的问题
在实验过程中,出现了不少的问题,首先是AD中断经常需要经过开关实验板来重置,这个问题应该是硬件接触不良的原因引起的;其次,在实验初期,当频率f<50HZ时,经常会出现波形变成噪声的情况,导致不能进行信号周期的计算,如图6所示为f=30HZ的标准正弦波的波形。

但是如果f比较大时,不会出现这种情况,将f从大逐渐减小至30HZ,则波形又能正常显示,这个问题我们暂时还未能讨论出可靠的干扰原因。

图6 f=30HZ 时的error 噪声波形
四、源程序
//头文件
#include "DSP2833x_Device.h"
// DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"
// DSP2833x Examples Include File
#include "comm.h" interrupt void adc_isr(void); void scib_fifo_init(); //地址定义
volatile unsigned int* p_ceselect=(volatile unsigned int *)0x;
volatile unsigned int* p_trafficaddr=(volatile unsigned int *)0x;
volatile unsigned int* p_ioenable=(volatile unsigned int *) 0x;
//设置A/D 采样时钟频率为12.5MHz ,宽度为16 #if (CPU_FRQ_150MHZ)
// Default - 150 MHz SYSCLKOUT #define ADC_MODCLK 0x3
//HSPCLK= SYSCLKOUT/2*ADC_MODCLK2
= 150/(2*3) = 25.0 MHz
#endif
#if (CPU_FRQ_100MHZ)
#define ADC_MODCLK 0x2
//HSPCLK= SYSCLKOUT/2*ADC_MODCLK2
= 100/(2*2) = 25.0 MHz
#endif
#define ADC_CKPS 0x1
// ADC module clock=HSPCLK/2*ADC_CKPS
= 25.0MHz/(1*2) = 12.5MHz
#define ADC_SHCLK 0xf
// S/H width in ADC module periods
= 16 ADC clocks
//定义全局变量 Uint16 LoopCount; Uint16 ConversionCount;
Uint16 V oltage1[1024]; //存储波形采样数据 Uint16 num=0,cj=0,flag=0; //用于频率计算的参数 float32 T,Ts=7.68e-6; //信号、A/D 采样周期T 、Ts Uint32 f; //信号频率f=1/T Uint16 Tjc=0;
//信号采样周期计数
unsigned int iostatus=0; main() {
InitSysCtrl();/ //系统初始化 //GPIO 口初始化
InitGpio(); // Skipped for this example 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(); // Init SCI-B
InitAdc(); // For this example, init the ADC //使能AD中断
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
IER |= M_INT1; // Enable CPU Interrupt 1
EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM 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中断函数interrupt void adc_isr(void)
{
V oltage1[ConversionCount]
= AdcRegs.ADCRESULT0 >>4;
//将采样所得数据结果存储到V oltage1数组中if(V oltage1[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(V oltage1[ConversionCount]<200)
{ num++;flag=0;}
}
if(num==2)
//num=2时,计算信号频率,并重置参数{
num=0;
T=cj*Ts; //计算信号周期
f=1/T; //计算信号频率
cj=0; //信号采样点计数复位
Tjc++; //信号采样周期计数
}
if(ConversionCount == 1024)
//If 1024 conversions
//have been logged, start over {
ConversionCount = 0;
}
else ConversionCount++;
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;
// Clear INT SEQ1 bit PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;
// Acknowledge interrupt to PIE AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0x1 ; return;
}
//SCIB模块初始化函数
void scib_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;
// Disable loop back ScibRegs.SCICTL1.all =0x0023;
// Relinquish SCI from Reset 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机串行通讯的工作过程,中断处理程序的编程方法。

相关文档
最新文档