(1)了解线性调频信号的脉冲压缩、动目标显示和动目标检测的原理,及其DSP实现的整个流程;
(2)掌握C语言与汇编语言混合编程的基本方法。
(3)使用MATLAB进行性能仿真,并将DSP的处理结果与MATLAB的仿真结果进行比较。
1. MATLAB仿真
设定信号带宽为B= ,脉宽,采样频率为,脉冲重复周期为,用MATLAB产生16个脉冲的线性调频信号,每个脉冲包含三个目标,速度和距离如下表:
对回波信号进行脉冲压缩,MTI,MTD。并且将回波数据和频域脉压系数保存供DSP使用。
2.DSP实现
在Visual Dsp中,经MATLAB保存的回波数据和脉压系数进行脉压,MTI和MTD。
1.脉冲压缩原理
在雷达系统中,人们一直希望提高雷达的距离分辨力,而距离分辨力定义为:。其中,表示脉冲时宽,表示脉冲带宽。从上式中我们可以看出高的雷达分辨率要求时宽小,而要求带宽大。但是时宽越小雷达的平均发射功率就会很小,这样就大大降低了雷达的作用距离。因此雷达作用距离和雷达分辨力这两个重要的指标变得矛盾起来。然而通过脉冲压缩技术就可以解决这个矛盾。脉冲压缩技术能够保持雷达拥有较高平均发射功率的同时获得良好的距离分辨力。
在本实验中,雷达发射波形采用线性调频脉冲信号(LFM),其中频率与时延成正比关系,因此我们就可以将信号通过一个滤波器,该滤波器满足频率与时延成反比关系。那么输入信号的低频分量就会得到一个较大的时延,而输入信号的高频分量就会得到一个较小的时延,中频分量就会按比例获得相应的时延,信号就被压缩成脉冲宽度为1/B的窄脉冲。
从以上原理我们可以看出,通过使用一个与输入信号时延频率特性规律相反的滤波器我们可以实现脉冲压缩,即该滤波器的相频特性与发射信号时共轭匹配的。所以说脉冲压缩滤波器 就是一个匹配滤波器。从而我们可以在时域和频域两个方向进行脉冲压缩。
滤波器的输出为输入信号与匹配滤波器的系统函数 卷积的结果:。转换到频域就是。因此我们可以将输入信号和系统函数分别转化到频域:,,进行频域相乘得,然后将结果再转化到时域,就可以得到滤波器输出:。我们可用FFT和IFFT来实现作用域的转换。原理图如下:
图1.脉冲压缩原理框图
2.MTI原理
动目标显示(MTI)技术是用来抑制各种杂波,来实现检测或者显示运动目标的技术。利用它可以抑制固定目标的信号,显示运动目标的信号。以线性调频信号为例,其波形为:。从式子中可以看到,相对于静止目标而言,运动的目标产生多普勒频移,表现在时域就是相继的回波产生了相位的变化。也就是说,静止目标的各个回波波形相同,而运动的目标各个回波之间不同,是有相位变化。所以我们就可以通过对消器来实现固定杂波的抑制。一次对消器原理如下(在试验中我们采用一次对消器):
图2.MTI原理框图
3.MTD原理
动目标检测(MTD)即Moving Target Detection,根据线性最佳滤波理论,要在杂波背景下检测运动目标回波,除了需要杂波抑制滤波器外,还应串接有对脉冲信号匹配的滤波器。要对回波脉冲串做匹配滤波,必须知道目标的多普勒频移以及天线扫描对脉冲串的调制情况(亦即信号的时宽,它决定信号的频宽)。在实际工作中,多普勒频移不能预知,因此需要采用一组相邻且部分重叠的滤波器组,覆盖整个多普勒频率范围,这就是窄带多普勒滤波器组。具有N个输出的横向滤波器(N个脉冲和N-1根延迟线),经过各脉冲不同的加权并求和后,可以做成N个相邻的窄带滤波器组。该滤波器组的频率覆盖范围为0到fr,fr为雷达工作重复频率。
横向滤波器实现MTD时的组成如图3所示:
图3.MTD原理框图
如上图所示,横向滤波器有N-1根延迟线,每根延迟线的延迟时间Tr=1/fr。设加在N个输出端头的加权值为:
i表示第i个抽头,而k表示从0到N-1的标记,每一个k值对应一组不同的加权值,相应地对应于一个不同的多普勒滤波器响应。利用MTD可分辨不同速度的目标,其速度分辨力为:,其中为多普勒频率分辨力。
若信号的多普勒频率满足:,其中, 则会出现多普勒频率模糊现象,即速度模糊。MTI同样也会出现同样的问题。
1.脉冲压缩结果:
MATLAB中时域脉冲压缩结果,频域脉压结果,分别如图4,5
图4.Matlab时域脉冲结果
图5.Matlab频域脉冲结果
理论MATLAB脉冲压缩和实际DSP脉冲压缩的结果,以及两者的误差分析的对比曲线,如图:
图6.理论和实际DSP脉冲压缩的对比
分析:在脉冲压缩之前,目标回波重叠,无法分辨到底有几个目标,而经过脉压以后,能够很清楚的看到每个脉冲中含有三个目标,效果明显。而且MATLAB结果与DSP脉压效果都很明显。图中可以看出DSP运行的结果和MATLAB仿真结果完全吻合。由于雷达在发射信号时不能接收,所以故最大无遮挡距离(闭锁期)为:,而第一个目标的距离为3000m,因此在闭锁区内,被遮挡一部分,故第一个脉冲的幅度远小于第二个脉冲的幅度。由脉压结果的误差曲线可以看出,其数量级为,说明DSP的脉压结果是正确的。
2.MTI结果:
Matlab理论MTI结果和实际DSPMTI结果,以及两者对比,分别在下图中所示。
图7.MATLAB的MTI结果的三维效果 图8.MATLAB的MTI二维结果
图9. Matlab和Dsp做MTI的误差对比
分析:经过MTI后,杂波和静止以及慢速目标被对消掉了,图像中只有两个目标。大致分别处于第107距离门和第261距离门,只留下运动目标。利用公式(其中k代表第k个距离门),可以算出两个目标的距离分别为:8025和19575,与真实距离8025和19600相比误差较小。从误差分析可以看出,MATLAB与DSP在计算结果上的误差数量级为10-4, DSP处理的结果精度较高,处理结果比较理想。
3.MTD结果:
MATLAB和DSP 进行MTD的结果以及误差分析如图所示。
图10.Matlab做MTD结果的三维效果
图11.合并距离单元结果 图12.合并多普勒通道结果
图13.理论Matlab和实际DSP做MTD的结果和对比
由速度模糊可知:
(17)
此时的速度称为盲速,取时所得到的速度称为第一盲速。当目标的速度与盲速相等时,回波的频谱结构与静止目标相同;大于盲速时,所出现的现象称为速度模糊。
第一盲速计算可得。当目标速度超过这一速度时,由信号采样的周期性,其显示的速度将与真实速度有N倍的差距(N为正整数)。从图11可以看到,MTD结果的能量集中于目标速度对应的速度门上,即峰值出现在离其真实速度最近的速度门上。实验中目标的实际速度分别为:0,100,294,从图11可以看出,三个目标分别落入:第 1, 5, 14 个多普勒通道,由此可以算出各目标的多普勒频移,从而测出三个目标的运动速度分别为:0, 99.5223,323.4475,而目标的真实速度为0,100,318 。从误差分析可以看出,MATLAB与DSP在计算结果上的误差数量级为10-4, DSP处理的结果精度较高,处理结果比较理想。
4 . IFFT是怎么实现的?
X(n)=(x*(n))*=( )*
调用FFT来实现,X(k)取共轭,最后整体取共轭,再最后除以N就可以算得IFFT。
5 . 统计在DSP上频域脉压处理(从FFT到IFFT)所需时钟数,并和估算的时域方法运算量进行比较。
DSP上频域脉压处理所需时钟周期数:304836。估算的时域方法运算量为:N2+(N-1)*N=7370880。可见时域方法运算量比频域脉压所需时钟数要多。说明利用FFT算法实现频域脉压要比时域脉压的效率要高。
编写C程序,建立磁盘文件,练习读写数据。
编写C程序,产生1000个随机浮点数(随机类型和参数自行确定),建立一个磁盘文件,把所有随机数依序、按照相应格式写入文件;关闭文件。再打开此文件,从文件中把数据读入,计算其均值、方差,并写入另一个文件中。
产生随机浮点数:使用rand()函数产生一个随机数,范围在0至RAND_MAX(定义在stdlib.h中)之间。产生两个随机数,进行相除,得到的数即是一个随机浮点数。
写入文件、读出文件:利用格式化输入输出函数fprintf()和fscanf()进行文件操作。
计算均值、方差:,
1000个随机数文件datafile.txt,保存均值、方差的result.txt文件。在Analog Devices VisualDSP++中仿真运行,其中一次的时间为3分03秒。
计算机和DSP各自起什么作用?如果DSP脱离计算机,此程序还能运行吗?
在此练习中,计算机的作用是保存数据文件,DSP的作用是运行程序,对数据进行处理。如果DSP脱离计算机,此程序能够运行,能够对产生的随机数进行运算,但是不能把数据保存起来。
调试器和EZ-KIT板的性能比较。
建立仿真环境,选择file\open\project,在visualDSP++的安装路径下找到,TS\Examples\NoHardwareRequired\ADSP-TSxxx\DFT\DFT_C\ ADSP-TS201_dft_c.dpj文件。
1.编译该工程:选Project\Build Project,或通过工具栏中的Build Project图标;
2.编译成功后,选择tools\linear profiling\,打开一个linear profiling的观察窗口。运行之后能够看到运行的结果。观察发现,用去Total Samples(指令周期),983008;程序用时01:22,主程序用时最多,其次是调用的输出语句。此程序运
行的指令周期远远的大于汇编程序。说明C语言的效率远低于汇编程序。
3.按照上一个练习的方法打开一个绘图。在选择地址时,应查看相应的变量名和变量的大小。
4.观察output windows 可以看到C语言printf输出的计算结果。
对上述程序执行100次、1000次,在软仿真环境下运行,并用记录执行的时间;然后,再在EZ KIT板上执行此程序,记录执行时间。
软件仿真一次运行时间为33秒,运行10次时间为330秒,运行20次时间为11分09秒,EZ-KIT板运行1000次时间为2秒,运行5000次时间为7秒,运行10000次时间为13秒。
结论:此程序在硬件上运行的效率远远高于软件仿真。软件仿真平均每次运行时间为33秒,硬件运行平均每次时间为0.0013秒。说明了DSP能够高速、实时地进行数字信号处理运算。
龙 岩 学 院
实验报告
班 级 07电本(1)班 学号 2007050344 姓 名 杨宝辉 同组人 独立
实验日期 20##-5-18 室温 大气压 成 绩
一、实验目的
1. 掌握CCS实验环境的使用;
2. 掌握用C语言编写DSP程序的方法。
二、实验设备
1. 一台装有CCS软件的计算机;
2. DSP实验箱的TMS320F2812主控板;
3. DSP硬件仿真器。
三、实验原理
浮点数的表达和计算是进行数字信号处理的基本知识;产生正弦信号是数字信号处理中经常用到的运算;C语言是现代数字信号处理表达的基础语言和通用语言。写实现程序时需要注意两点:(1)浮点数的范围及存储格式;(2)DSP的C语言与ANSI C语言的区别。
四、实验步骤
1. 打开CCS 并熟悉其界面;
2. 在CCS环境中打开本实验的工程(Example_base.pjt),编译并重建 .out 输出文件,然后通过仿真器把执行代码下载到DSP芯片中;
3. 把X0 , Y0 和Z0添加到Watch窗口中作为观察对象(选中变量名,单击鼠标右键,在弹出菜单中选择“Add Watch Window”命令);
4. 选择view->graph->time/frequency… 。 设置对话框中的参数: 其中“Start Address”设为“sin_value”,“Acquisition buffer size”和“Display Data size”都设为“100”,并且把“DSP Data Type”设为“32-bit floating point”,
设置好后观察信号序列的波形(sin函数,如图);
5. 单击运行;
6. 观察三个变量从初始化到运算结束整个过程中的变化;观察正弦波形从初始化到运算结束整个过程中的变化;
7. 修改输入序列的长度或初始值,重复上述过程。
五、实验心得体会
通过本次实验,加深了我对DSP的认识,使我对DSP实验的操作有了更进一步的理解。基本掌握了CCS实验环境的使用,并能够使用C语言进行简单的DSP程序设计。
从软件的安装到使用软件进行程序设计与仿真,锻炼了自己的动手能力,也遇到了不少的坎坷,例如芯片的选择,不能因为麻烦而省略该步骤,否则将会运行出错。
附录实验程序:
#include "math.h"
#include "stdio.h"
#define N 100
#define pi 3.14159
float sin_value[100];
float X0,Y0,Z0;
void main(void)
{
int i;
for(i=0;i<N;i++)
sin_value[i]=0;
X0=0.5; /* 0.100 0000 0000 0000 */
Y0=0.5; /* 0.100 0000 0000 0000 */
Z0=X0*Y0; /* 00.01 0000 0000 0000 0000 0000 0000 0000 */
for(i=0;i<N;i++)
sin_value[i]=100*(sin(2*pi*i/N));
}
龙 岩 学 院
实验报告
班 级 07电本(1)班 学号 2007050344姓 名 杨宝辉 同组人 独立
实验日期 20##-5-20 室温 大气压 成 绩
数码管控制实验
一、实验目的
1. 熟悉2812的指令系统;
2. 熟悉74HC573的使用方法。
3. 熟悉DSP的IO操作使用方法。
二、实验设备
1. 一台装有CCS2000软件的计算机;
2. 插上2812主控板的DSP实验箱;
3. DSP硬件仿真器。
三、实验原理
此模块由数码管和四个锁存器组成 。数码管为共阴极型的。数据由2812模块的低八位输入,锁存器的控制信号由2812模块输出,但经由CPLD模块译码后再控制对应的八个
四、实验步骤
1. 把2812模块小板插到大板上;
2. 在CCS2000环境中打开本实验的工程编译Example_7segled.prj,生成输出文件,通过仿真器把执行代码下载到DSP芯片;
3. 运行程序;数码管会显示1~8的数字。
五、实验心得体会
通过本次实验中,基本掌握了2812的指令系统的特点,并能够了解并熟悉74HC573的使用方法,进一步加深了对DSP的认识。同时,通过实验操作DSP的IO操作使用方法,对于DSP的IO操作可以熟悉的运用,学到更多的知识。
程序见附录:
#include "include/DSP281x_Device.h" // DSP281x Headerfile Include File
#include "include/DSP281x_Examples.h" // DSP281x Examples Include File
// Prototype statements for functions found within this file.
void delay_loop(void);
void Gpio_select(void);
// Global variable for this example
short codetab[17]=
{0x4020,0x6cc0,0x5800,0x4840,0x6440,0xC040,0xC000,0x4cc0,
0x4000,0x4040,0x4400,0xE000,0xD080,0xE800,0xD000,0xD400,0xffff};
main()
{
short i;
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP281x_SysCtrl.c file.
InitSysCtrl();
// Specific clock setting for this example:
EALLOW;
EDIS;
// Step 2. Initalize GPIO:
// This example function is found in the DSP281x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio(); // Skipped for this example
// For this example use the following configuration:
Gpio_select();
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
DINT;
// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP281x_PieCtrl.c file.
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in DSP281x_DefaultIsr.c.
// This function is found in DSP281x_PieVect.c.
InitPieVectTable();
// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP281x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
InitXintf(); // For this example, init the Xintf
// Step 5. User specific code, enable interrupts:
GpioDataRegs.GPADAT.all=0;
Reg01=0x00;
GpioDataRegs.GPADAT.all=0;
Reg02=0x00;
GpioDataRegs.GPADAT.all=0;
Reg03=0x00;
GpioDataRegs.GPADAT.all=0;
Reg04=0x00;
while(1)
{
for(i=0;i<17;i++)
{
GpioDataRegs.GPADAT.all =~codetab[i];
Reg01=0x00;
delay_loop();
}
for(i=0;i<17;i++)
{
GpioDataRegs.GPADAT.all =~codetab[i];
Reg02=0x00;
delay_loop();
}
for(i=0;i<17;i++)
{
GpioDataRegs.GPADAT.all =~codetab[i];
Reg03=0x00;
delay_loop();
}
for(i=0;i<17;i++)
{
GpioDataRegs.GPADAT.all =~codetab[i];
Reg04=0x00;
delay_loop();
}
}
}
void delay_loop()
{
short i,j;
for (i = 0; i < 32767; i++)
{for (j = 0; j < 10; j++);}
}
void Gpio_select(void)
{ Uint16 var1;
Uint16 var2;
Uint16 var3;
var1= 0x0000; // sets GPIO Muxs as I/Os
var2= 0xFFFF; // sets GPIO DIR as outputs
var3= 0x0000; // sets the Input qualifier values
EALLOW;
GpioMuxRegs.GPAMUX.all=var1;
GpioMuxRegs.GPBMUX.all=var1;
GpioMuxRegs.GPDMUX.all=var1;
GpioMuxRegs.GPFMUX.all=var1;
GpioMuxRegs.GPEMUX.all=var1;
GpioMuxRegs.GPGMUX.all=var1;
GpioMuxRegs.GPADIR.all=var2; // GPIO PORTs as output
GpioMuxRegs.GPBDIR.all=var2; // GPIO DIR select GPIOs as output
GpioMuxRegs.GPDDIR.all=var2;
GpioMuxRegs.GPEDIR.all=var2;
GpioMuxRegs.GPFDIR.all=var2;
GpioMuxRegs.GPGDIR.all=var2;
GpioMuxRegs.GPAQUAL.all=var3; // Set GPIO input qualifier values
GpioMuxRegs.GPBQUAL.all=var3;
GpioMuxRegs.GPDQUAL.all=var3;
GpioMuxRegs.GPEQUAL.all=var3;
EDIS;
}
// No more.
龙 岩 学 院
实验报告
班 级 07电本(1)班 学号 2007050344 姓 名 杨宝辉 同组人 独立
实验日期 20##-5-25 室温 大气压 成 绩
交通灯控制实验
一、实验目的
1. 熟悉2812的指令系统;
2. 熟悉74HC573的使用方法。
3. 熟悉DSP的IO操作使用方法。
二、实验设备
1. 一台装有CCS2000软件的计算机;
2. 插上2812主控板的DSP实验箱;
3. DSP硬件仿真器。
三、实验原理
此模块由发光二极管和一个锁存器组成。
数据由2812模块的低八位输入,锁存器的控制信号由2812模块输出,但经由CPLD模块译码后再控制锁存器。
四、实验步骤
1. 把2812模块小板插到大板上;
2. 在CCS2000环境中打开本实验的工程编译Example_crossled.prj,生成输出文件,通过仿真器把执行代码下载到DSP芯片;
3. 运行程序,发光二极管按交通灯方式点亮熄灭。
4. 参考源代码,自行修改程序,实现不同的交通灯控制方式。
五、实验心得体会
通过次实验中,使我掌握了 2812的指令系统和74HC573的使用方法。同时,使我掌握了DSP的IO操作使用方法。
实验程序见附录:
附录:
#include "include/DSP281x_Device.h" // DSP281x Headerfile Include File
#include "include/DSP281x_Examples.h" // DSP281x Examples Include File
// Prototype statements for functions found within this file.
void delay_loop(void);
void Gpio_select(void);
// Global variable for this example
main()
{
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP281x_SysCtrl.c file.
InitSysCtrl();
// Specific clock setting for this example:
EALLOW;
EDIS;
// Step 2. Initalize GPIO:
// This example function is found in the DSP281x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio(); // Skipped for this example
// For this example use the following configuration:
Gpio_select();
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
DINT;
// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP281x_PieCtrl.c file.
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in DSP281x_DefaultIsr.c.
// This function is found in DSP281x_PieVect.c.
InitPieVectTable();
// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP281x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
InitXintf(); // For this example, init the Xintf
// Step 5. User specific code, enable interrupts:
while(1)
{
GpioDataRegs.GPADAT.all =0xdc80;
Reg00=0x00;
delay_loop();
GpioDataRegs.GPADAT.all =0xec40;
Reg00=0x00;
delay_loop();
GpioDataRegs.GPADAT.all =0xf0c0;
Reg00=0x00;
delay_loop();
GpioDataRegs.GPADAT.all =0xec40;
Reg00=0x00;
delay_loop();
}
}
void delay_loop()
{
short i,j;
for (i = 0; i < 32767; i++)
{for (j = 0; j < 50; j++);}
}
void Gpio_select(void)
{
Uint16 var1;
Uint16 var2;
Uint16 var3;
var1= 0x0000; // sets GPIO Muxs as I/Os
var2= 0xFFFF; // sets GPIO DIR as outputs
var3= 0x0000; // sets the Input qualifier values
EALLOW;
GpioMuxRegs.GPAMUX.all=var1;
GpioMuxRegs.GPBMUX.all=var1;
GpioMuxRegs.GPDMUX.all=var1;
GpioMuxRegs.GPFMUX.all=var1;
GpioMuxRegs.GPEMUX.all=var1;
GpioMuxRegs.GPGMUX.all=var1;
GpioMuxRegs.GPADIR.all=var2; // GPIO PORTs as output
GpioMuxRegs.GPBDIR.all=var2; // GPIO DIR select GPIOs as output
GpioMuxRegs.GPDDIR.all=var2;
GpioMuxRegs.GPEDIR.all=var2;
GpioMuxRegs.GPFDIR.all=var2;
GpioMuxRegs.GPGDIR.all=var2;
GpioMuxRegs.GPAQUAL.all=var3; // Set GPIO input qualifier values
GpioMuxRegs.GPBQUAL.all=var3;
GpioMuxRegs.GPDQUAL.all=var3;
GpioMuxRegs.GPEQUAL.all=var3;
EDIS;
}
//===========================================================================
// No more.
//===========================================================================
龙 岩 学 院
实验报告
班 级 07电本(1)班 学号 2007050344 姓 名 杨宝辉 同组人 独立
实验日期 20##-05-27 室温 大气压 成 绩
步进电机控制实验
一、实验目的
1. 掌握2812通用IO口的使用方法;
2. 掌握2812对步进电机的控制。
二、实验设备
1. 一台装有CCS软件的计算机;
2. DSP实验箱(插上电机模块);
3. DSP硬件仿真器;
4. 示波器。
三、实验原理
步进电机工作原理,给步进脉冲电机就转,不给脉冲电机就不转,步进脉冲的频率越高,步进控制电机就转的越快;改变各相的通电方式可以改变电机的运行方式;改变通电顺序可以控制步进电机的运行方式;改变通电顺序可以控制步进电机的正反转。
步进电机的控制问题可以总结为两点:
1. 产生工作方式需要的时序脉冲;
2. 控制步进电机的速度使它始终遵循加速-匀速-减速的规律工作。
对于I/O口有二类寄存器:
1. 控制寄存器和数据方向寄存器,使用方法如下:首先确定引脚的功能,即IO控制器寄存器,为1表示引脚功能是原模块的功能,否则为IO功能。
2. 如果引脚被配置为IO功能,就需要确定它的方向:输入还是输出,。为1表示是输出引脚,否则是输入引脚。对于IO功能的输入或输出是通过读写相应的数据方向寄存器来实现。输入引脚对应读操作;输出引脚对应写操作。
四、实验步骤
1. 连接好DSP开发系统;
2. 本实验工程文件(Example_stepmotor.pjt),编译,下载程序到DSP;
运行程序,用观察步进电机运行方向和速度的变化;
五、实验心得体会
通过本次实验对于2812通用的IO口进一步熟悉实验,使我基本掌握了2812通用的IO口的使用方法,加深了对IO口的认识。本次实验的主要目的是通过2812对步进机的的控制,开始对于程序的设计没有头绪,通过查阅步进机控制的原理,结合有关资料才正式设计出程序,基本掌握了2812对步进机的控制,也更加熟悉了对DSP程序的设计,受益匪浅。
程序:
#include "include/DSP281x_Device.h" // DSP281x Headerfile Include File
#include "include/DSP281x_Examples.h" // DSP281x Examples Include File
// Prototype statements for functions found within this file.
void delay_loop(void);
void Gpio_select(void);
// Global variable for this example
short codetab[17]=
{0x0001,0x0002,0x0004,0x0008,0x0008,0x0004,0x0002,0x0001,
0x0001,0x0002,0x0004,0x0008,0x0001,0x0002,0x0004,0x0008,0x0000};
main()
{ short i,j;
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP281x_SysCtrl.c file.
InitSysCtrl();
// Specific clock setting for this example:
EALLOW;
EDIS;
// Step 2. Initalize GPIO:
// This example function is found in the DSP281x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio(); // Skipped for this example
// For this example use the following configuration:
Gpio_select();
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
DINT;
// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP281x_PieCtrl.c file.
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in DSP281x_DefaultIsr.c.
// This function is found in DSP281x_PieVect.c.
InitPieVectTable();
// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP281x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
InitXintf(); // For this example, init the Xintf
// Step 5. User specific code, enable interrupts:
GpioDataRegs.GPADAT.all=0;
Reg06=0x00;
while(1)
{
for(j=0;j<400;j++)
{
for(i=0;i<4;i++)
{
GpioDataRegs.GPADAT.all =codetab[i];
Reg06=0x00;
delay_loop();
}
}
for(j=0;j<400;j++)
{
for(i=4;i<8;i++)
{
GpioDataRegs.GPADAT.all =codetab[i];
Reg06=0x00;
delay_loop();
}
}
}
}
void delay_loop()
{
short i,j;
for (i = 0; i < 1000; i++)
{for (j = 0; j < 10; j++);}
}
void Gpio_select(void)
{
Uint16 var1;
Uint16 var2;
Uint16 var3;
var1= 0x0000; // sets GPIO Muxs as I/Os
var2= 0xFFFF; // sets GPIO DIR as outputs
var3= 0x0000; // sets the Input qualifier values
EALLOW;
GpioMuxRegs.GPAMUX.all=var1;
GpioMuxRegs.GPBMUX.all=var1;
GpioMuxRegs.GPDMUX.all=var1;
GpioMuxRegs.GPFMUX.all=var1;
GpioMuxRegs.GPEMUX.all=var1;
GpioMuxRegs.GPGMUX.all=var1;
GpioMuxRegs.GPADIR.all=var2; // GPIO PORTs as output
GpioMuxRegs.GPBDIR.all=var2; // GPIO DIR select GPIOs as output
GpioMuxRegs.GPDDIR.all=var2;
GpioMuxRegs.GPEDIR.all=var2;
GpioMuxRegs.GPFDIR.all=var2;
GpioMuxRegs.GPGDIR.all=var2;
GpioMuxRegs.GPAQUAL.all=var3; // Set GPIO input qualifier values
GpioMuxRegs.GPBQUAL.all=var3;
GpioMuxRegs.GPDQUAL.all=var3;
GpioMuxRegs.GPEQUAL.all=var3;
EDIS;
}
//===========================================================================
// No more.
//===========================================================================
龙 岩 学 院
实验报告
班 级 07电本(1)班 学号 2007050344 姓 名 杨宝辉 同组人独立
实验日期 20##-6-1 室温 大气压 成 绩
直流电机控制实验
一、实验目的
1. 要求学生掌握2812 PWM的使用方法;
2. 掌握2812对直流电机的控制。
二、实验设备
1. 一台装有CCS软件的计算机;
2. DSP实验箱;
3. DSP硬件仿真器;
4. 示波器。
三、实验原理
电机模块的原理图如下
四、实验步骤
3. 连接好DSP开发系统;
4. 本实验工程文件(Example_dcmotor.pjt),编译,下载程序到DSP;
5. 运行程序,用观察直流电机运行方向和速度的变化;
五、实验心得体会
通过本次实验,认识了PWM的使用方法,通过亲身体验,初步掌握了2812对PWM的控制使用方法,加深了对PWM的认识。本次实验的主要目的是通过2812对直流电机的控制,开始对于程序的设计没有头绪,通过查阅直流电机的原理,结合有关资料才正式设计出程序,基本掌握了2812对直流电机的控制,也更加熟悉了对DSP程序的设计,受益匪浅。
附:实验程序:
#include "include/DSP281x_Device.h" // DSP281x Headerfile Include File
#include "include/DSP281x_Examples.h" // DSP281x Examples Include File
// Prototype statements for functions found within this file.
void init_eva(void);
void init_evb(void);
void delay_loop();
// Global variable for this example
main()
{ unsigned short i;
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP281x_SysCtrl.c file.
InitSysCtrl();
// Specific clock setting for this example:
EALLOW;
EDIS;
// Step 2. Initalize GPIO:
// This example function is found in the DSP281x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio(); // Skipped for this example
// Initialize only GPAMUX and GPBMUX for this test
EALLOW;
// Enable PWM pins
GpioMuxRegs.GPAMUX.all = 0x00FF; // EVA PWM 1-6 pins
GpioMuxRegs.GPBMUX.all = 0x00FF; // EVB PWM 7-12 pins
EDIS;
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
DINT;
// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP281x_PieCtrl.c file.
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in DSP281x_DefaultIsr.c.
// This function is found in DSP281x_PieVect.c.
InitPieVectTable();
// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP281x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
InitXintf(); // For this example, init the Xintf
// Step 5. User specific code, enable interrupts:
init_eva();
//init_evb();
while(1)
{
for(i=0;i<65535;i+=1000)
{
Reg06=0;
EvbRegs.CMPR6 = i;
delay_loop();
}
}
}
void delay_loop()
{ short i,j;
for (i = 0; i < 1000; i++)
{for (j = 0; j < 10; j++);}
}
void init_eva()
{
// EVA Configure T1PWM, T2PWM, PWM1-PWM6
// Initalize the timers
// Initalize EVA Timer1
EvaRegs.T1PR = 0xFFFF; // Timer1 period
EvaRegs.T1CMPR = 0x3C00; // Timer1 compare
EvaRegs.T1CNT = 0x0000; // Timer1 counter
// TMODE = continuous up/down
// Timer enable
// Timer compare enable
EvaRegs.T1CON.all = 0x1042;
// Initalize EVA Timer2
EvaRegs.T2PR = 0x0FFF; // Timer2 period
EvaRegs.T2CMPR = 0x03C0; // Timer2 compare
EvaRegs.T2CNT = 0x0000; // Timer2 counter
// TMODE = continuous up/down
// Timer enable
// Timer compare enable
EvaRegs.T2CON.all = 0x1042;
// Setup T1PWM and T2PWM
// Drive T1/T2 PWM by compare logic
EvaRegs.GPTCONA.bit.TCMPOE = 1;
// Polarity of GP Timer 1 Compare = Active low
EvaRegs.GPTCONA.bit.T1PIN = 1;
// Polarity of GP Timer 2 Compare = Active high
EvaRegs.GPTCONA.bit.T2PIN = 2;
// Enable compare for PWM1-PWM6
//EvaRegs.CMPR1 = 0x0C00;
//EvaRegs.CMPR2 = 0x3C00;
EvaRegs.CMPR3 = 0xFC00;
// Compare action control. Action that takes place
// on a cmpare event
// output pin 1 CMPR1 - active high
// output pin 2 CMPR1 - active low
// output pin 3 CMPR2 - active high
// output pin 4 CMPR2 - active low
// output pin 5 CMPR3 - active high
// output pin 6 CMPR3 - active low
EvaRegs.ACTRA.all = 0x0666;
EvaRegs.DBTCONA.all = 0x0000; // Disable deadband
EvaRegs.COMCONA.all = 0xA600;
}
void init_evb()
{
// EVB Configure T3PWM, T4PWM and PWM7-PWM12
// Step 1 - Initialize the Timers
// Initialize EVB Timer3
// Timer3 controls T3PWM and PWM7-12
EvbRegs.T3PR = 0xFFFF; // Timer3 period
EvbRegs.T3CMPR = 0x3C00; // Timer3 compare
EvbRegs.T3CNT = 0x0000; // Timer3 counter
// TMODE = continuous up/down
// Timer enable
// Timer compare enable
EvbRegs.T3CON.all = 0x1042;
// Initialize EVB Timer4
// Timer4 controls T4PWM
EvbRegs.T4PR = 0x00FF; // Timer4 period
EvbRegs.T4CMPR = 0x0030; // Timer4 compare
EvbRegs.T4CNT = 0x0000; // Timer4 counter
// TMODE = continuous up/down
// Timer enable
// Timer compare enable
EvbRegs.T4CON.all = 0x1042;
// Setup T3PWM and T4PWM
// Drive T3/T4 PWM by compare logic
EvbRegs.GPTCONB.bit.TCMPOE = 1;
// Polarity of GP Timer 3 Compare = Active low
EvbRegs.GPTCONB.bit.T3PIN = 1;
// Polarity of GP Timer 4 Compare = Active high
EvbRegs.GPTCONB.bit.T4PIN = 2;
// Enable compare for PWM7-PWM12
EvbRegs.CMPR4 = 0x0C00;
EvbRegs.CMPR5 = 0x3C00;
EvbRegs.CMPR6 = 0xFC00;
// Compare action control. Action that takes place
// on a cmpare event
// output pin 1 CMPR4 - active high
// output pin 2 CMPR4 - active low
// output pin 3 CMPR5 - active high
// output pin 4 CMPR5 - active low
// output pin 5 CMPR6 - active high
// output pin 6 CMPR6 - active low
EvbRegs.ACTRB.all = 0x0666;
EvbRegs.DBTCONB.all = 0x0000; // Disable deadband
EvbRegs.COMCONB.all = 0xA600;
}
龙 岩 学 院
实验报告
班 级 07电本(1)班 学号 2007050344 姓 名 杨宝辉 同组人 独立
实验日期 20##-6-3 室温 大气压 成 绩
高速A/D转换实验
一、实验目的
1.了解高速 AD工作的基本原理。
2.了解如果通过软件正确的控制高速AD。
3.掌握对高速 AD正确操作的过程
二、实验设备
1. 一台装有CCS软件的计算机;
2. DSP实验箱;
3. DSP硬件仿真器;
三、实验原理
实验箱用的高速 AD 为 TLC5510,它是一个 CMOS 结构的、具有高达20MSPS 的8位模数转换器。TLC5510 采用单5V 供电,功耗仅为 130mW。TLC5510 内部包含有一个采样保持电路、具有高阻输出的并行接口以及内部参考电压等。
TLC5510 采用半 FlASh 结构,与 FlASh 结构相比,它不仅减少了功耗,而且提高了芯片的集成度。TLC5510 采用两步转换实现一次完整的转换,这样就大大减少了内部比较器的个数,其输出数据的延迟为2.5个时钟周期。TLC5510 采用 3 个内部参考电阻产生一个标准2V的参考电压,要实现内部参考电压仅需要通过外部的简单连线即可。TLC5510 的功能框图如图所示。
TLC5510内部有一个高位采样比较器和两个低位采样比较器。如图3-36所示,输入的电压 VI(1)在 CLK1 的上升沿被采样到高位比较器和低位比较器(A),对应的值为 S(1)。高位比较器在 CLK2 上升沿的时候完成高位数据UD(1)的转换,与此同时,根据高位数据产生了低位的参考电压 RV(1),低位比较器(A)在 CLK3 的上升沿完成完成低位数据 LD(1)的转换。在 CLK4的上升沿,高位数据 UD(1)和低位数据 LD(1)组成一个完整的数据 OUT(1)输出。整个数据的输出与输入的电压采样点相比有 2.5 个时钟周期的延迟。
输入电压VI(2)在CLK2的上升沿被采样,UD(2)在CLK3的上升沿完成,LD(2)在由低位比较器(B)在 CLK4 的上升沿完成,最终数据 OUT(2)在 CLK5的上升沿完成。
四、实验步骤
1. 连接好DSP开发系统,跳线连接高速AD输入和信号发生模块的输出;
2. 调节信号发生模块的工作频率和幅度;
3. 本实验工程文件(Example_hsad.pjt),编译,下载程序到DSP;
4. 运行程序,用观察A/D数据的变化;
五、实验心得体会
通过本次A/D转换实验,对于A/D信号的发生有了认识,使我掌握了高速 AD工作的基本原理和通过软件正确的控制高速AD。 同时掌握了对高速 AD正确操作的过程。
实验程序:
#include "include/DSP281x_Device.h"
#include "include/DSP281x_Examples.h"
// Prototype statements for functions found within this file.
void scia_loopback_init(void);
void scia_fifo_init(void);
void scia_xmit(int a);
void error(int);
interrupt void scia_rx_isr(void);
interrupt void scia_tx_isr(void);
// Global counts used in this example
Uint16 LoopCount;
Uint16 ErrorCount;
void main(void)
{ Uint16 SendChar;
Uint16 ReceivedChar;
// Step 1. Initialize System Control registers, PLL, WatchDog, Clocks to default state:
// This function is found in the DSP281x_SysCtrl.c file.
InitSysCtrl();
// Step 2. Select GPIO for the device or for the specific application:
// This function is found in the DSP281x_Gpio.c file.
// InitGpio(); skip this as this is example selects the I/O for SCI in this file itself
EALLOW;
GpioMuxRegs.GPFMUX.all=0x0030; // Select GPIOs to be Sci pins
// Port F MUX - x000 0000 0011 0000
EDIS;
// Step 3. Initialize PIE vector table:
// The PIE vector table is initialized with pointers to shell Interrupt
// Service Routines (ISR). The shell routines are found in DSP281x_DefaultIsr.c.
// Insert user specific ISR code in the appropriate shell ISR routine in
// the DSP28_DefaultIsr.c file.
// Disable and clear all CPU interrupts:
DINT;
IER = 0x0000;
IFR = 0x0000;
// Initialize Pie Control Registers To Default State:
// This function is found in the DSP281x_PieCtrl.c file.
// InitPieCtrl(); PIE is not used for this example
// Initialize the PIE Vector Table To a Known State:
// This function is found in DSP281x_PieVect.c.
// This function populates the PIE vector table with pointers
// to the shell ISR functions found in DSP281x_DefaultIsr.c.
InitPieVectTable();
// Enable CPU and PIE interrupts
// This example function is found in the DSP281x_PieCtrl.c file.
EnableInterrupts();
// Step 4. Initialize all the Device Peripherals to a known state:
// This function is found in DSP281x_InitPeripherals.c
// InitPeripherals(); skip this for SCI tests
// Step 5. User specific functions, Reassign vectors (optional), Enable Interrupts:
LoopCount = 0;
ErrorCount = 0;
scia_fifo_init(); // Initialize the SCI FIFO
scia_loopback_init(); // Initalize SCI for digital loop back
// Note: Autobaud lock is not required for this example
// Send a character starting with 0
SendChar = 0;
// Step 6. Send Characters forever starting with 0x00 and going through
// 0xFF. After sending each, check the recieve buffer for the correct value
for(;;)
{ scia_xmit(SendChar);
while(SciaRegs.SCIFFRX.bit.RXFIFST !=1) { } // wait for XRDY =1 for empty state
// Check received character
ReceivedChar = SciaRegs.SCIRXBUF.all;
if(ReceivedChar != SendChar) error(1);
// Move to the next character and repeat the test
SendChar++;
// Limit the character to 8-bits
SendChar &= 0x00FF;
LoopCount++;
if(LoopCount==256)
{
LoopCount=0;
SciaRegs.SCICCR.bit.LOOPBKENA =0; // Disable loop back
SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
while((ReceivedChar = SciaRegs.SCIRXBUF.all)!=0x0d);
scia_loopback_init(); // Initalize SCI for digital loop back
}
}
}
// Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here:
void error(int ErrorFlag)
{ ErrorCount++;
// asm(" ESTOP0"); // Uncomment to stop the test here
// for (;;);
}
// Test 1,SCIA DLB, 8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity
void scia_loopback_init()
{ // Note: Clocks were turned on to the SCIA peripheral
// in the InitSysCtrl() function
SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
SciaRegs.SCICTL2.all =0x0003;
SciaRegs.SCICTL2.bit.TXINTENA =1;
SciaRegs.SCICTL2.bit.RXBKINTENA =1;
SciaRegs.SCIHBAUD =0x0001;
SciaRegs.SCILBAUD =0x00e7;
SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
}
// Transmit a character from the SCI'
void scia_xmit(int a)
{ SciaRegs.SCITXBUF=a;
}
// Initalize the SCI FIFO
void scia_fifo_init()
{ SciaRegs.SCIFFTX.all=0xE040;
SciaRegs.SCIFFRX.all=0x204f;
SciaRegs.SCIFFCT.all=0x0;
}
//===========================================================================
// No more.
//===========================================================================
湖北汽车工业学院SPSS实习报告学号20xx0530501姓名杨文弟指导教师彭娟娟曾智实验一描述性统计分析一实验目的利用SPSS进…
管理统计实验报告实验一一实验目的掌握用spss软件对数据进行相关性分析熟悉其操作过程并能分析其结果二实验原理相关性分析是考察两个变…
统计分析与SPSS的应用实验报告一一数据来源及说明本次试验报告数据来源于19xx年美国社会变迁普查19xxUSGeneralSoc…
实验报告实验三连续变量的统计描述与参数估计实验目的1了解连续变量的统计描述指标体系和参数估计指标体系2掌握具体案例的统计描述和分析…
TMS320F2812xDSP原理及应用技术实验心得体会1.设置环境时分为软件设置和硬件设置,根据实验的需要设置,这次实验只是软件…
DSP课程设计总结(20##-20##学年第2学期)题目:专业班级:电子1103学生姓名:学号:指导教师:设计成绩:20##年6月…
FIR数字滤波器的设计目录1前言22数字滤波器及MATLAB语言概述221数字滤波器的定义和分类322常用滤波器的性能指标423M…
数字信号处理实验报告实验项目名称AD采样与DA输出实验实验日期20xx年10月30日实验成绩实验评定标准一实验目的熟悉CCS的开发…