dsp嵌入式系统实验
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
《DSP与嵌入式系统》实验报告
专业:电子
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
目录 .................................................................... 错误~未定义书签。
实验一 IO端口实验 ......................................................................... 1 实验二 定时器实验 .......................................................................... 6 实验三 AD实验 .............................................................................. 10 实验四 DA实验 .............................................................................. 17 实验五 信号过滤波器实验 ............................................................. 20 实验一 IO端口实验
一、实验目的
1、了解 ICETEK-VC5416-A板在TMS320VC5416DSP在IO空间上的扩展。
2、了解 ICETEK-VC5416-A板上指示灯扩展原理。
3、学习在C 语言中使用扩展的控制寄存器的方法。
二、实验原理
1、I/O 空间的扩展及使用:
C54x DSP 的 I/O 空间被保留用于外部扩展。由于在程序中访问 I/O 空间
的语句只有 in 和out 指令,所以在扩展时一般将带有控制能的寄存器或
分离地址访问的存储单元的地址映射到 I/O 空间,访问这部分的单元又称
I/O 端口访问。例如:可将控制指示灯组的寄存器或锁存器映射到一个 I/O
端口地址上;A/D、D/A 等专用芯片控制端和状态寄存器也常映射到 I/O 端
口上。总之,在 I/O 空间中扩展的设备一般重点用于控制,而使用大片连
续存储空间的存储器单元一般映射到数据空间。ICETEK-VC5416-A 板将指示灯、DIP 开关、A/D、D/A、异步串行通信接口和 WatchDog的控制端等映射在 I/O 空间。
0001-0001h:WatchDog 控制寄存器
3006-3006h:A/D 转换控制寄存器
1000-1001h:D/A 转换控制寄存器
2000-2007h:异步串口通信控制寄存器
3002-3002h: 板上指示灯控制寄存器
3003-3003h: 板上 DIP 拨动开关控制寄存器
ICETEK-VC5416-A 实验箱上控制模块也使用 I/O 端口控制大部分设备:
8001-8001h: 读-键盘扫描值,写-液晶控制寄存器
8002-8002h: 液晶控制寄存器
8003-8004h: 液晶显示数据寄存器
8005-8005h: 发光二极管显示阵列控制寄存器
8006-8006h: 保留
8007-8007h: 发光二极管显示阵列控制寄存器
8008-9FFFh: 保留
在程序中,访问 I/O 端口的语句较为简单。对于汇编语言程序,可用 PORTR 和 PORTW指令,例如,从端口0008h读入一个字到变量 x 的指令为 portr 8,x,而向端口 000Ch 输出x变量的值的指令为 portw #0Ch,x;在 C 语言中访问 I/O 端口则必须首先声明 I/O 端口的类型,然后才能访问,以下语句仍完成上面汇编语言所完成的功能:
ioport unsigned int port0008;
ioport unsigned int port000C;
x = port0008;
1.2 指示灯扩展原理
详见上图,其中 7 个指示灯是 D3,D9;D10 在硬件上没做控制扩展。
1.3 实验程序流程图
三、实验代码
/////////////////////////////////////////////////// // Example For ICETEK-VC5416-EDU // // CTR Version : V4 //
// File name: LED.c // // Project : LED.pjt // // Version : 2.00 // // Write by: Daniel Hawk // // Company : Realtimedsp Co.Ltd // // // // All Rights opened & no Onus 2005.06 // ////////////////////////////////////////////////// ioport unsigned int port3002;
#define LBDS port3002
void Delay(int nDelay);
void ShiftToLeftAndRight(unsigned int nInit); main()
{
unsigned int uLED[4]={1,2,4,8};
int i;
for(;;)
{
for ( i=0;i<4;i++ )
{
LBDS=~uLED[i];
Delay(64);
}
for ( i=3;i>=0;i-- )
{
LBDS=~uLED[i];
Delay(64);
}
}
}
void Delay(int nDelay)
{
int i,j,k;
k=0;
for ( i=0;i
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
// 为LED声明IO端口
ioport unsigned int port3002; // LED 宏定义
#define LBDS port3002 // 延时和移位子函数声明
void Delay(int nDelay); //延时调用函数申明 void ShiftToLeftAndRight(unsigned int nInit);//移位主函数申明 main()
{
unsigned int uLED[4]={1,2,4,8}; // 控制字,逐位置1: 0001B 0010B 0100B
1000B,分别
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示第1,2,3,4盏灯点亮
int i;
//3位流水灯循环移位
for(;;)
{
for ( i=0;i<4;i++ ) //4盏灯正向流水作业点亮
{
LBDS=~uLED[i]; // 正向顺序送控制字
Delay(64); // 调用延时函数,每次灯闪后延时的时间长度
}
for ( i=3;i>=0;i-- ) //4盏灯反向流水作业点亮
{
LBDS=~uLED[i]; // 反向顺序送控制字
Delay(64); // 调用延时函数,每次灯闪后延时的时间长度
}
}
}
//这里nDelay=64,延时总长=64*1024*T(T指系统单脉冲周期) void Delay(int nDelay) {
int i,j,k;
k=0;
for ( i=0;i=4 )
{
LED^=0x55;
nCount=0;
}
}
四、代码分析
本实验设计的程序是在上一个实验基础上修改得来,由于上一实验控制指示
灯闪烁的延时控制是用循环计算方法得到的,延时不精确也不均匀,采用中
断方式可以实现指示灯的定时闪烁,时间更加准确。对于定时器的周期寄存
器为计数f423H,分频系数定为15,即1,000,000 个CPU 时钟计数一次,
由于DSP 工作在8MHz 主频(ICETEK-VC5416-A 板上DIP 开关U2
CLKMD1-3 均为OFF 时),正好是125ms 中断一次,所以在中断服务程序
中计算中断4 次时改变指示灯状态,实现指示灯亮0.5 秒再灭0.5 秒,即每
秒闪烁1 次。实验程序的工程中包含了两种源代码,主程序采用C 语言编
制利于控制,中断向量表在vector.asm 汇编语言文件中,利于直观地控制存
储区分配。在工程中只需将它们添加进来即可,编译系统会自动识别分别处
理完成整合工作。实验程序的C 语言主程序中包含了内嵌汇编语句,提供
一种在需要更直接控制DSP 状态的方法,同样的方法也能提高C 语言部分
程序的计算效率。
五、实验结果
- 指示灯在定时器的定时中断中按照设计定时闪烁,改变分频计数器和时钟
计数器的计数大小可以调整定时长短。
- 使用定时器和中断服务程序可以完成许多需要定时完成的任务,比如 DSP
定时启动 A/D转换,日常生活中的计时器计数、空调的定时启动和关闭等。
- 在调试程序时,有时需要指示程序工作的状态,可以利用指示灯的闪烁来
达到指示灯灵活的闪烁方式可表达多种状态信息。
实验三 AD实验
一、实验目的
1(掌握A/D 转换的基本过程;
2(熟悉TLV0832 转换模块的技术指标和常用方法。
二、实验原理
1( TLV0832 模数转换模块特性
带内置采样和保持的 8 位模数转换模块ADC,最小转换时间为500us。2
个的模拟输入通道(ADIN2—ADIN3)。
2( 模数转换工作过程
模数转换模块接到启动转换信号后,开始转换第一个通道的数据;经过
一个采样时间的延迟后,将采样结果放入转换结果寄存器保存;转换结
束,设置
标志
禁止坐卧标志下载饮用水保护区标志下载桥隧标志图下载上坡路安全标志下载地理标志专用标志下载
,也可发出中断;如果为连续转换方式则从新开始转换过
程;否则等待下一个启动信号。
3( 模数转换的程序控制
模数转换相对于计算机来说是一个较为缓慢的过程。一般采用中断方式
启动转换或保存结果,这样在CPU 忙于其他工作时可以少占用处理时
间。设计转换程序应首先考虑处理过程如何与模数转换的时间相匹配,
根据实际需要选择适当的触发转换的手段,也要能及时地保存结果。由
于TLV0832 芯片内的A/D 转换精度是8 位的,转换结果为16 位数据,
中间8 位是有效值,所以应将读回的数据右移4 位后再将高8 位清零。
4( 程序流程图
注意:
TCR 中有定时器的控制位和状态位:
15—12 保留
11--10 soft free
9—6 PSC 定时器预定标计数器
5 TRB 定时器重新加载位,用来复位片内定时器
4 TSS 定时器停止状态位,用于停止或启动定时器
3—0 TDDR 定时器分频系数
以下是 5416 的 IMR 和 IFR 寄存器的结构,其中包含了可响应的中断:
三、实验代码
/////////////////////////////////////////////////// // Example For ICETEK-VC5416-EDU // // CTR Version : V4 // // Filename: ADC.c // // Project : ADC.pjt // // Version : 2.00 // // Write by: Daniel Hawk // // Company : Realtimedsp Co.Ltd // // // // All Rights opened & no Onus 2005.06 // /////////////////////////////////////////////////// #include "c5416regs.h"
#define TIM *(int *)0x24
#define PRD *(int *)0x25
#define TCR *(int *)0x26
#define REGISTERCLKMD *(int *)0x58
ioport unsigned int port3006;
void interrupt time(void);
void initMcBSP2( void );
unsigned int nCount;
int flage;
int uWork;
int inp[256]; int length;
int channel;
main() {
int j;
asm("ssbxINTM");
*(int *)0x58=0x0;
j= PMST;
PMST = j&0xff;
IMR = 0x8;
TCR = 0x417;
TIM = 8;
PRD = 0x157;
TCR = 0x427;
IFR = 0x100;
flage=0;
channel=0;
port3006=1;
*(int *)0x58=0x2004;
initMcBSP2();
asm("rsbxINTM");
while ( 1 );
}
// 定时器中断服务程序,完成:保存转换结果、启动下次转换
void interrupt time(void) {
if(channel)
{
DXR12=0xe000;
}
else
{
DXR12=0xc000;
}
/*DXR12=0xe000;*/
uWork=DRR12;
uWork=uWork>>4;
uWork&=0xff;
inp[length]=uWork;
length++;
length%=256;
if(length==0)
{
asm(" nop");
}
}
void initMcBSP2( void ) /*configuation the McBSP1 as SPI mode*/
{
SPSA2=SPCR1;
SPSD2=0;
SPSA2=SPCR2;
SPSD2=0;
SPSA2=RCR1;
SPSD2=0x40;
SPSA2=RCR2;
SPSD2=0x01;
SPSA2=XCR1;
SPSD2=0x40;
SPSA2=XCR2;
SPSD2=0x01;
SPSA2=SRGR1;
SPSD2=0x83;
SPSA2=SRGR2;
SPSD2=0x2000;
SPSA2=PCR;
SPSD2=0xA08;
SPSA2=SPCR1;
SPSD2=0x5801;
SPSA2=SPCR2;
SPSD2=0xc1;
}
三、代码分析
#include "c5416regs.h" // 使用工具包c5416regs.h //宏定义
#define TIM *(int *)0x24 // TIM寄存器在数据存储器中的地址是0x24
#define PRD *(int *)0x25 // PRD寄存器在数据存储器中的地址是0x25
#define TCR *(int *)0x26 // TCR寄存器在数据存储器中的地址是0x26
#define REGISTERCLKMD *(int *)0x58 //REGISTERCLKMD存放在地址0x58中 //I/O接口接入
ioport unsigned int port3006;
void interrupt time(void); //中断调用函数申明
void initMcBSP2( void ); unsigned int nCount;
int flage;
int uWork;
int inp[256]; //定义数组空间
int length;
int channel;
main()
{
int j;
asm("ssbxINTM"); // 关闭可屏蔽中断
*(int *)0x58=0x0; //REGISTERCLKMD初始状态
j= PMST; // 设置PMST寄存器
PMST = j&0xff; //中断向量表起始地址=80H
IMR = 0x8; //使能TINT
TCR = 0x417; // 计数器分频系数=8
TIM = 8; //时钟计时器值=8
PRD = 0x157; //周期寄存器为 0x157
TCR = 0x427; // 控制字为0000 1000 0010 0111B,为复位片内定时器
IFR = 0x100; // 其中,时钟周期为8MHz
flage=0;
channel=0;
port3006=1;
*(int *)0x58=0x2004; //REGISTERCLKMD为2004H
initMcBSP2(); //调用 initMcBSP2
asm("rsbxINTM"); // 开中断进行转换
while ( 1 ); //不断循环
}
// 定时器中断服务程序,完成:保存转换结果、启动下次转换 void interrupt time(void) {
if(channel)
{
DXR12=0xe000; //如果channel=1,则保存转换结果
}
else
{
DXR12=0xc000; //否则启动下次转换
}
/*DXR12=0xe000;*/
uWork=DRR12;
uWork=uWork>>4;
uWork&=0xff; //
inp[length]=uWork;
length++;
length%=256;
if(length==0)
{
asm(" nop"); //等待响应,延时
}
}
void initMcBSP2( void ) /*配制McBSP1作为SPI模式*/
{
SPSA2=SPCR1;
SPSD2=0;
SPSA2=SPCR2;
SPSD2=0;
SPSA2=RCR1;
SPSD2=0x40;
SPSA2=RCR2;
SPSD2=0x01;
SPSA2=XCR1;
SPSD2=0x40;
SPSA2=XCR2;
SPSD2=0x01;
SPSA2=SRGR1;
SPSD2=0x83;//
SPSA2=SRGR2;
SPSD2=0x2000;
SPSA2=PCR;
SPSD2=0xA08;
SPSA2=SPCR1;
SPSD2=0x5801;
SPSA2=SPCR2;
SPSD2=0xc1; }
五、实验结果
- 用实验中的设置,我们可以看到结果为:
实验四 DA实验
一、实验目的
1( 了解数模转换的基本操作;
2( 了解ICETEK-VC5416-A 板扩展数模转换方式;
3( 掌握数模转换程序设计方法
二、实验原理
1( 数模转换操作
利用专用的数模转换芯片,可以实现将数字信号转换成模拟量输出的功
能。在 ICETEKVC5416-A 板上,使用的是TLC7528 数模芯片,它可以
实现同时转换2 路模拟信号数出,并有8 位精度,转换速率100K/S。其
控制方式较为简单:首先将需要转换的数值通过数据总线传送到
TLC7528 上相应寄存器,经过一个时间延迟,转换后的模拟量就从
TLC7528 输出引脚输出。
2( TLC7528 与TMS320VC5416A 的连接
由于 TMS320VC5416A DSP 没有数模转换输出设备,采用外扩数模转
换芯片的方法。在ICETEK-VC5416-A 板上选用的是TLC7528。TLC7528
的转换寄存器被映射到了DSP 的I/O 空间,地址是0x1000-0x1001,在
TLC7528 的输出端,为了增加输出功率,经过一级运放再输出到板上插
座上。
3( 程序流程图
三、实验代码
///////////////////////////////////////////////// // Example For ICETEK-VC5416-EDU // // CTR Version : V4 // // File name: DAC.c // // Project : DAC.pjt // // Version : 2.00 // // Write by: Daniel Hawk // // Company : Realtimedsp Co.Ltd // // // // All Rights opened & no Onus 2005.06 // ////////////////////////////////////////////////
ioport unsigned int port1000,port1001,port1002,port1003,port1004;
#define DAC0 port1000
#define DAC1 port1001
#define DAC2 port1002
#define DAC3 port1003
#define LDAC port1004
main()
{
unsigned int uDA0,uDA1,uDA2,uDA3;
uDA0=0;
uDA1=1023;
uDA2=2047;
uDA3=3071;
for(;;)
{
DAC0=uDA0;
DAC1=uDA1;
DAC2=uDA2;
DAC3=uDA3;
LDAC=0x1f;
uDA0+=0x10; uDA0%=256;
uDA1+=0x10; uDA1%=256;
uDA2+=0x10; uDA2%=256;
uDA3+=0x10; uDA3%=256;
}
}
四、代码分析
ioport unsigned int port1000,port1001,port1002,port1003,port1004; //4个I/O接口
接入
//宏定义
#define DAC0 port1000 //接口port1000通过DAC0接入 #define DAC1 port1001 //接口port1001通过DAC1接入 #define DAC2 port1002 //接口port1002通过DAC2接入 #define DAC3 port1003 //接口port1003通道DAC3接入 #define LDAC port1004 //接口port1004通过LDAC接出 main()
{
unsigned int uDA0,uDA1,uDA2,uDA3;
//定义各通道的初始状态
uDA0=0;
uDA1=1023;
uDA2=2047;
uDA3=3071;
for(;;)
{
DAC0=uDA0; // 通道0赋值
DAC1=uDA1; // 通道1赋值
DAC2=uDA2; // 通道2赋值
DAC3=uDA3; // 通道3赋值
LDAC=0x1f; // 启动转换
/*转换过程*/
uDA0+=0x10; uDA0%=256;
uDA1+=0x10; uDA1%=256;
uDA2+=0x10; uDA2%=256;
uDA3+=0x10; uDA3%=256;
}
}
五、实验结果
通过使用示波器可以在 DAOUT1,DAOUT2 的测试钩上量到最大值约为 5V
的三角波。
实验五 信号过滤波器实验
一、实验目的
1.1 利用ADC采集模拟信号,经过DSP内的滤波器进行滤波计算,然后经过DAC
输出,并用示波器观察
1.2 掌握数字信号处理的实际过程
1.3 掌握较复杂的控制和处理过程的编程方法 二、实验原理
2.1(AD 原理。
参见实验三
2.2(模数转换工作过程:
- 模数转换模块接到启动转换信号后,按照设置进行相应通道的数据采样转换。
- 经过一个采样时间的延迟后,将采样结果放入 AD 数据寄存器中保存。
- 等待下一个启动信号。
2.3(模数转换的程序控制:
模数转换相对于计算机来说是一个较为缓慢的过程。一般采用中断方式启动转换或保存结果,这样在 CPU 忙于其他工作时可以少占用处理时间。设计转换程序应首先考虑处理过程如何与模数转换的时间相匹配,根据实际需要选择适当的触发转换的手段,也要能及时地保存结果。由于 TMS320VC5416DSP 扩展的 A/D 转换精度是8位的,转换结果为16位数据,中间8位是有效数据。所以应将转换结果右移4位后再将高8位清零。
2.4(混频波形产生:
将接收到的两路 AD 采集信号进行相加,并对结果的幅度进行限制,从而产生混合后的输出波形。实验中采用了同相位混频方法,也可修改程序完成异相混频法。
2.5(FIR 滤波器工作原理及参数计算:
滤波器参数:带通滤波,采样频率 12KHz,截止频率 1:300Hz,截止频率 2:1KHz,增益 10dB,阶数 64。
2.6(源程序及注释:
本实验程序在中断中对 AD 进行连续采样,每次采样首先设置 AD 转换控制寄存器(ADCCTL),发送转换通道号和启动命令,然后交替转换通道 0 和通道(ICETEK-VC5416-A 实验箱上 ADCIN2 和 ADCIN3)的输入再进行混频。混频的波形在主循环中通过 FIR 滤波器,得到输出波形。由于采用了低通滤波,输入频率在 1kHz 以下的才能通过滤波器。
程序流程图:
四、代码分析
#include //使用系统工具包math.h #include "c5416regs.h" //使用系统工具包math.h
#define TIM *(int *)0x24 #define PRD *(int *)0x25 #define TCR *(int *)0x26 #define REGISTERCLKMD *(int *)0x58
ioport unsigned int port2,port3,port4;
ioport unsigned int port3006; #define AD_DATA port2
#define AD_SEL port3
#define AD_HOLD por
void interrupt time(void); int *ptr,k0,k1;
signed int uWork0,uWork,uWork1; unsigned int nCount;
int *nADC0;
#pragma DATA_SECTION(mix,".image")
int mix[256];
int kk=0;
int kkk=0;
#define FIRNUMBER 64 #define SIGNAL1F 1000 #define SIGNAL2F 4500 #define SAMPLEF 10000 #define PI 3.1415926
float InputWave(); float FIR();
void initMcBSP2( void );
/*滤波器的参数*/
float fHn[FIRNUMBER]={ 0.00026177,
-0.00179529,
-0.00610096,
-0.00918035,
-0.00739486,
-0.00075589,
0.00524243,
0.00383116,
-0.00465822,
-0.00940621,
0.00198935,
0.02820332,
0.04968835,
0.04534722,
0.01749622,
-0.00315849,
0.01413235,
0.06183342,
0.08908447, 0.04688899, -0.05413548, -0.13729633, -0.12777361, -0.03945867, 0.01205523, -0.09282195, -0.34240062, -0.55252424, -0.48648079, -0.05806945, 0.55438868, 1.00000000, 1.00000000, 0.55438868, -0.05806945, -0.48648079, -0.55252424, -0.34240062, -0.09282195, 0.01205523, -0.03945867, -0.12777361, -0.13729633, -0.05413548, 0.04688899, 0.08908447, 0.06183342, 0.01413235, -0.00315849, 0.01749622, 0.04534722, 0.04968835, 0.02820332,
0.00198935,
-0.00940621,
-0.00465822,
0.00383116,
0.00524243,
-0.00075589,
-0.00739486,
-0.00918035,
-0.00610096,
-0.00179529,
0.00026177
};
float fXn[FIRNUMBER]={ 0.0 }; //
float fInput,fOutput; float fSignal1,fSignal2; float fStepSignal1,fStepSignal2;
float f2PI;
int i;
float fIn[256],fOut[256];
int nIn,nOut;
int flage=0;
int uWork;
int inp1[256];
int inp2[256];
int length1,length2; int channel;
int www;
main()
{
int i,j;
asm("ssbxINTM"); // 关闭可屏蔽中断
*(int *)0x58=0x0;
j= PMST; //设置PMST寄存器
PMST = j&0xff; //中断向量表起始地址=80H
IMR = 0x8;
TCR = 0x417; // 计数器分频系数=8
TIM = 8; //计数器计数为8
PRD = 0x157; //周期寄存器为0x157
TCR = 0x427; //
IFR = 0x100; // 其中,时钟周期为8MHz
flage=0;
channel=1; //打开通道
length1=length2=0;
www=0;
for(i=0;i<256;i++)
{
fOut[i]=0;
}
port3006=1;
*(int *)0x58=0x1007;
initMcBSP2();
asm("rsbxINTM"); // 开中断进行转换
nIn=0; nOut=0;
f2PI=2*PI; //设定正弦波的数字角频率范围
fSignal1=0.0;
fSignal2=PI*0.1;
fStepSignal1=2*PI/30;
fStepSignal2=2*PI*1.4;
while ( 1 )
{
if(flage==1)
{
flage=0;
fInput=InputWave();
fIn[nIn]=fInput;
nIn++; nIn%=256;
fOutput=FIR();
fOut[nOut]=fOutput;
nOut++;
if ( nOut>=256 )
{
nOut=0; //等待延时
}
}
}
}
float InputWave()
{
for ( i=FIRNUMBER-1;i>0;i-- )
fXn[i]=fXn[i-1];
fXn[0]=mix[kkk];
kkk++;
if ( kkk>=256 )
{
kkk=0;
flage=0;
}
return(fXn[0]);
}
float FIR()
{
float fSum;
fSum=0;
for ( i=0;i>4;
uWork&=0xff;
inp2[length2]=uWork;
length2++;
}
else
{
DXR12=0xc000;
uWork=DRR12;
uWork=uWork>>4;
uWork&=0xff;
inp1[length1]=uWork;
length1++;
}
channel=1-channel;
www++;
www%=512;
if(www==0)
{
length1=length2=0;
flage=1;
for(i=0;i<256;i++)
{
mix[i]=inp1[i]+inp2[i];
}
asm(" nop");
}
}
}
void initMcBSP2( void )/*配制McBSP1作为SPI模式*/ {
SPSA2=SPCR1;
SPSD2=0;
SPSA2=SPCR2;
SPSD2=0;
SPSA2=RCR1;
SPSD2=0x40;
SPSA2=RCR2;
SPSD2=0x01;
SPSA2=XCR1;
SPSD2=0x40;
SPSA2=XCR2;
SPSD2=0x01;
SPSA2=SRGR1;
SPSD2=0x83;//
SPSA2=SRGR2;
SPSD2=0x2000;
SPSA2=PCR;
SPSD2=0xA08;
SPSA2=SPCR1;
SPSD2=0x5801;
SPSA2=SPCR2;
SPSD2=0xc1;
}
四、实验结果