DSP 实 验 报 告
姓名: 班级: 学号: 指导老师:
湖南工业大学电气与信息工程学院
实验一 A/D实验CPU
一、实验目的
1.熟悉CPU内部AD转换的基木原理,
2.掌握TMS320F2812的内部ADC功能模块的指标和常用方法。
二、实验设备
计算机、CCS3.l版本软件、DSP仿真器、E300实验箱、2812CPU板(新的)、信号线、示波器
三、实验原理
TMS320F2812DSP自带16路12位单极性ADC转换器.并且内置双采样保持器。快速转换时间运行在25MHz。16个通道可配置为两个独立的8通道模块以便为事件管理器A和B服务。两个独立的8通道模块可以级联组成一个16通道模块。虽然有多个输入通道和两个序列器,但是ADC模块只有一个转换器。 下图给出了F2812的ADC模块框图
两个8通道模块具有一对系列转换和自动序列化的能力,通过模拟多路复用器,每个模块都可以选择可用的8个通道中的任何一个通道。在级联模式下,自动序列发生器可作为一个单一的16通道序列发生器。在每个序列发生器上,一旦转换结束,己选择的通道值就保存在各个通道的结果寄存器ADCRESULT中。
自动序列化允许系统对同一通道转换多次,允许用户执行过采样算法。这较传统的单一采样转换结果增加了更多的解决方案。
输入模拟电压的数字值为:
数字值=4095 X(输入模拟电压值)/3 多触发源启动序列转换(SOC)包括:
S/W:软件直接启动、EVA/B:事件管理器A/B(EVA/B内有多个事件源)、S/W:外部引脚。 本实验是用DSP自带的ADC转换器采集信号源的信号。并将采集到的信号储存到指定的内存
1
区域。由于ADC是单极性的,所以从信号源过来的双极性信号经过偏置电路转换成单极性信号然后由ADC采样。
四、实验步骤和内容
1.2812CPU板JUMPI的1和2脚短接,拨码开关SW1的第二位置ON 2. E300板上的开关SW4的第二位置ON,其余OFF,S盯全部置洲。其余开关全部置OFF。 3.用导线连接E300底板“Signal expansion unit”的2号接口SIN到“signalexpansionunit”的。2号孔“AINO\":\"SQU'”到“AINI\".SlN输出正弦波、SQU输出方波.
4.运行Code Composer Studio(CCS3.l): (ccs3.l需要“DEBUG一Connect\") 5.用“Project\\opell”打开系统项目文件
\\e300.test\\normal\\DSP28lx_exaples\\e300_07_ad\\Example_28lx_e300_AD.pjt。
6.编译全部文件并装载“Debug\\Example_28lx_AD.out”文件:
7.在加软件断点处加软件断点。单击“Debug\\RUN”运行程序,程序运行到断点处停止
8.用下拉菜单中的View/Graph的“Time/Frequence”打开一个图形观察窗日:设置该图形观察窗口的参数设置如下:观察起始地址为input1和input2,长度为256的存储器单元内的数据,该数据为输入信号经AD转换之后的数据,数据类型为16位整
9.单击“Debug/Animate”运行程序,在图形观察窗口观察AD转换后的数据波形变化,Input1:输入通道AINI孔的方波,input2:输入通道AINO孔的正弦波单击“Debug\\Halt”暂停程序运行.
2
五、实验流程图
六、实验心得
通过本次实验对DSP有了一个感性的认识,熟悉仿真软件的使用方法,熟悉CPU内部AD转换的基木原理,掌握TMS320F2812的内部ADC功能模块的指标和常用方法。发现了自己的不足,在以后的学习中需要加强。
源程序部分
#include \"DSP281x_Device.h\" // DSP281x Headerfile Include File #include \"DSP281x_Examples.h\" // DSP281x Examples Include File interrupt void adc_isr(void); Uint16 LoopCount;
Uint16 ConversionCount; Uint16 input1[256]; Uint16 input2[256]; Uint16 Mixing[256]; void main(void) {
InitSysCtrl();
3
SYSCLKOUT) EALLOW;
SysCtrlRegs.PLLCR.all=0x8;
SysCtrlRegs.HISPCP.all = 0x3; // HSPCLK = SYSCLKOUT/6 EDIS; DINT;
InitPieCtrl(); IER = 0x0000; IFR = 0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected register PieVectTable.ADCINT = &adc_isr;
EDIS; // This is needed to disable write to EALLOW protected registers InitAdc(); // For this example, init the ADC 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;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;
AdcRegs.ADCMAXCONV.all = 0x0001; // Setup 2 conv's on SEQ1
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA0 as 1st SEQ1 conv. AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2; // Setup ADCINA2 as 2nd SEQ1 conv. AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1; // Enable EVASOC to start SEQ1 AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // Enable SEQ1 interrupt (every EOS) EvaRegs.T1CMPR = 0x0380; // Setup T1 compare value EvaRegs.T1PR = 0x07FF; // Setup period register
EvaRegs.GPTCONA.bit.T1TOADC = 1; // Enable EVASOC in EVA
EvaRegs.T1CON.all = 0x1042; // Enable timer 1 compare (upcountmode) for(;;) {
LoopCount++; } }
interrupt void adc_isr(void) {
input1[ConversionCount] = AdcRegs.ADCRESULT0 >>4; input2[ConversionCount] = AdcRegs.ADCRESULT1 >>4;
Mixing[ConversionCount]= input1[ConversionCount] + input2[ConversionCount]; if(ConversionCount == 256) {
ConversionCount = 0;//加软件断点 }
4
else ConversionCount++;
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE return; }
实验二 拨码开关实验
一、实验目的
1.了解DSP开发系统的组成和结构 2.了解I/O的基木编程方法
二、实验设备
计算机,CCS3.l版木软件.DSP仿真器,E300实验箱,2812CPL7板(新的)
三、实验原理
8位的数字量输入(由拨码开关产生),当拨码打到靠近LED时为低。相反为高。通过74LS244(可读)缓冲连接到DSP的数据总线的低8位。CPU通过读指令读取到拨码开关产生的8位输出的数字最,然后CPU通过写指令把读出的8位数字量写入(0x2200)单元内,使连接到DSP的数据总线的低8位的74LS273的输出端产生高低信号,此时LED灯产生亮灭。当对应LED灯点亮时说明输出为低,熄灭时为高。 拨码开关扩展工作原理
说明:74LS244片选号、74LS273片选信号和74LS273复位信号由E300上CPLD译码产生。本实验使用DSP数据总线的低8位。 本实验的程序流程框图
5
四、实验步骤
1.2812CPU板的JUMP1和2脚短接,拨码开关SW1的第二位置ON
2.E300板上的开关SW4的第二位置ON,其余OFF,SW5开关全部置ON,其余开关全部置OFF。
3.运行Code Composer Studio(CCS)(ccs3.l需要“DEBUG Connect\") 4.用“Project\\open”打开系统项目文件\e300.test\\normal\\DSP28lx_examples\\e300_02_swich\\ Example_281x_switch.pjt:
6编译装载 \\Normal\\DSP281x_examples\\e300_02_swich\\Debug\\Example_28lx_switch.out 6.单击“Debug-Go main”跳到上程序的开始 7.单击“Debug\\Run”运行程序。
8.任意拨动E300底板上的拨动开关,观察LED和拨动开关的对应情况。 (LEDI-LE07分别对应DSP数据总线的DO-D7)
6
9.单击“Debug\\Halt”暂停持续运行,开关将对灯失去控制. 10.关闭所有窗口本实验完毕。
五、实验说明
实验中采用简单的二映射关系来对数据地址进行验证,目的是使实验者能够对数据有一目了然的认识。
六、实验心得
通过本次实验,加深了对DSP拨码开关理解,学会了怎么使用拨码开关,同时了解DSP
开发系统的组成和结构以及I/O的基木编程方法。
拨码开关实验源程序:
#include \"DSP281x_Device.h\" // DSP281x Headerfile Include File #include \"DSP281x_Examples.h\" // DSP281x Examples Include File
/****************************主程序*******************************/ void main(void) {
unsigned int Temp; Temp = 0;
InitSysCtrl();//初始化PLL,WatchDog,使能外围时钟,该初始化文件在\"DSP281x_SysCtrl.c\"中DINT;//关闭CPU中断
// Initialize PIE control registers to their default state. // The default state is all PIE interrupts disabled and flags // are cleared. InitPieCtrl();
IER = 0x0000;//关闭中断和清除所有中断标志 IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). InitPieVectTable(); for(;;) { asm(\" nop \"); Temp = *(int *)0x2200&0x00ff; //读入0x2200地址的开关量值并赋给Temp asm(\" nop \"); * (int *)0x2200 = Temp; //Temp值输出0x2200地址的LED灯 asm(\" nop \"); } }
实验三 PWM波形产生实验
一、实验目的
l. 了解TMS320F28lx芯片的EVA、EVB的功能:
7
2.理解EVA、EVB的工作原理:
3.掌握EVA、EVB产生PMW波的方法:
二、实验设备
计算机,CCS3.1版软件,DSP仿真器,E300实验箱,示波器。
三、实验原理
TI公司的C2000系列的DSP器件都包括两个事件管理模块EVA、EVB,每个事件管理器模块包括通用定时器(GP)、比较单元、捕获单元以及正交编码脉冲电路。EVA和EVB的定时器.比较单元以及捕获单元的功能都相同,只是定时器和单元的名称不同。事件管理模块的功能框图如下(以EVA为例):
对于TMS5320F2812DSP每个事件管理模块可同时产生多达8路的PMW波形输出。由3个带可编程死区控制的比较单元产生独立的3对,以及由GP定时器比较产生的2个独立的PWM输出。
PMW的特性如下:
8
. 1 6位寄存器:
.为PMW输出对提供范围宽广的可编程死区:
.可变的MW载体频率,提供所需的PMW摇摆频率: .根据需要在PWM周期内或之后变化PMW脉冲: .外部可屏蔽功率和驱动保护中断:
.脉冲方式发生器电路,用于可编程的产生对称、非对称和四维空间向量PMW波形; .使用自动重新装载功能的比较和周期寄存器使CPU的开销最小.
PMW电路的设计:
PMW波形的产生及与比较单元相关的PMW电路由以下寄存器控制: 对于EVA模块:T1CON,COMCONA,ACTRA和DBTCONA 对于EVB模块:T3CON,COMCONB,ACTRB和DBTCONA
产生PWM的寄存器的设置如下:
设置和装载ACTRx寄存器
如果使能死区,则设置和装载DBTC仍x寄存器
设置和装载TIPR或T3PR寄存器,即规定PMW波形的周期 初始化CMPRX寄存器
设置和装载COMCONx寄存器
设置和装载TICON或T3CON、寄存器,来启动比较操作
更新CMPRx寄存器的位植.使输出的PMW波形的占空比发生变化
四、实验步骤
l、F2812CPU板的JUMPI的l和2脚短接,拨码开关SWI的第二位置ON
2、E300底板的开关SW4的第2位置ON,其余位置OFF。其余开关设置为OFF 3、运行ccs软件,调入样例程序,装载并运行:(进入CCS界面后需要点Debug-connect) 4\\打开系统项目文件e300.test\\normal\\DSP28lx_examples\\ee300_11_pwm\\Examples 28lx-pwm.pjt 5、双击Examples 28lx-pwm.pjt及“Source”可查看各源程序:并加载“Examples 28lx-pwm out\"
6、单击“Debug\\Run”运行程序,然后用示波器观察F2407CPU板上PwMI~6的输出波形(如下图)
9
7、修改EvaRegs.coprl、EvaRegs.Cmpr2、EvaRegs.cmpr3的值可改变相应输出的占空比。改变EvaRegs.TIPR的值,可以提高MW波频率,占空比不变。
8、关闭Examples 28lx-pwm.pjt工程文件:关闭所有窗口.本实验完毕。
五、实验心得
通过本次DSP实验,进一步对DSP了解,尤其是对PMW波形的知识,同时了解TMS320F28lx
芯片的EVA、EVB的功能、理解EVA、EVB的工作原理、掌握EVA、EVB产生PMW波的方法。
PWM源程序
#include \"DSP281x_Device.h\" // DSP281x Headerfile Include File #include \"DSP281x_Examples.h\" // DSP281x Examples Include File // Prototype statements for functions found within this file. interrupt void adc_isr(void);
// Global variables used in this example: Uint16 LoopCount;
Uint16 ConversionCount; Uint16 input1[256]; Uint16 input2[256]; void main(void) {
InitSysCtrl(); EALLOW;
GpioMuxRegs.GPAMUX.all = 0x003F; EDIS; EALLOW;
SysCtrlRegs.PLLCR.all=0x8;
SysCtrlRegs.HISPCP.all = 0x3; // HSPCLK = SYSCLKOUT/6 EDIS;
InitPieCtrl(); IER = 0x0000; IFR = 0x0000;
InitPieVectTable();
10
EALLOW; // This is needed to write to EALLOW protected register PieVectTable.ADCINT = &adc_isr;
EDIS; // This is needed to disable write to EALLOW protected registers InitAdc(); // For this example, init the ADC 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;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; AdcRegs.ADCMAXCONV.all = 0x0001; AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2; AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1; AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;
EvaRegs.T2CMPR = 0x0380; // Setup T1 compare value EvaRegs.T2PR = 0x07FF; // Setup period register
EvaRegs.GPTCONA.bit.T2TOADC = 1; // Enable EVASOC in EVA EvaRegs.T1CMPR = 0x3C00; // Timer1 compare EvaRegs.T1CNT = 0x0000; // Timer1 counter EvaRegs.ACTRA.all=0x0666; EvaRegs.DBTCONA.all=0x0000; EvaRegs.COMCONA.all=0xA600; for(;;) {
LoopCount++; } }
interrupt void adc_isr(void) {
input1[ConversionCount] = AdcRegs.ADCRESULT0 >>4; input2[ConversionCount] = AdcRegs.ADCRESULT1 >>4;
Mixing[ConversionCount] = input1[ConversionCount] + input2[ConversionCount]; if(ConversionCount == 256) {
ConversionCount = 0;//加软件断点 }
else ConversionCount++;
// Reinitialize for next ADC sequence
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE }
11
实验四 CPU定时器实验
一、实验目的
l、熟悉F2812的CPU定时器:
2、掌握F2812的CPU定时器的控制方法:
3、学会使用CPU定时器中断方式控制程序流程。
二、实验设备
计算机,CCS3.1版软件.DSP硬件仿真器,E300实验箱,2812CPU板。
三、实验原理说明
样例实验是采用CPU定时器来定时使LED亮灭的。F2812的CPU定时器不同事件管理器模块(EVA、EVB)中的通用定时器(GP)。F2812的CPU共有三个定时器,其中,CPU定时器l和2被保留用作实时操作系统OS(例如OSPBIOS),CPU定时器0可以供用户使用。
定时器的一般操作如下:将周期寄存器PRDH:PRD中的值装入32为计数器寄存器T15IH:TIM。然后计数器寄存器以F28lx的SYSCLKOLT速率递减。当计数器减到O时,就会产生一个定时器中断输出信号(一个中断脉冲)。 下图为CPU定时器的内部结构:
流程图如下
四、实验步骤和内容
l、F2812CPU板的JUMP1的l和2脚短接,开关SW1的第二位置ON,其余置OFF 2、E300底板的开关SW4的第2位置ON,其余位置OFF。其余开关设置为OFF。 3、运行CCS软件,调入样例程序.装载并运行
12
4、加载“\\e300_03_cpu—timer\\Debug\\Example_28lx_cpu—timer.out\":
5、单击“Debug\\Animate”运行,
6、单击Debug\\Halt,暂停程序运行,LED灯停止闪烁单击“Debug\\Run”,运行程序,LED 灯又开始按上述规律变化。 7、本实验结束
LED1—LED8灯的变化情况:
五、实验心得
不知不觉四次DSP实验就要结束了。通过这四次实验对DSP有了一个系统的认识,熟悉F2812的CPU定时器,掌握F2812的CPU定时器的控制方法,学会使用CPU定时器中断方式控制程序流程。懂得了理论联系实际的重要性,最后感谢老师对我的指导!
CPU 定时器实验源程序
/*************************头文件*********************************/ #include \"DSP281x_Device.h\" // DSP281x Headerfile Include File #include \"DSP281x_Examples.h\" // DSP281x Examples Include File
/*************************定义函数说明***************************/ // Prototype statements for functions found within this file. interrupt void cpu_timer0_isr(void);
void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period); /*************************主程序*********************************/ int Flag,Temp; void main(void)
13
{
InitSysCtrl(); DINT;
InitPieCtrl(); IER = 0x0000; FR = 0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.TINT0 = &cpu_timer0_isr;
EDIS; // This is needed to disable write to EALLOW protected registers InitCpuTimers(); // For this example, only initialize the Cpu Timers ConfigCpuTimer(&CpuTimer0, 100, 1000000); StartCpuTimer0(); IER |= M_INT1;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM for(;;) {
Temp=*(int*)0x2200&0xff; if(Temp!=0xff) {
if(CpuTimer0.InterruptCount<1) {
asm(\" nop \"); asm(\" nop \");
*(int *)0x2200=0x0081; }
else if(CpuTimer0.InterruptCount<2) {
asm(\" nop \"); asm(\" nop \");
*(int *)0x2200=0x0042; }
else if(CpuTimer0.InterruptCount<3) {
asm(\" nop \"); asm(\" nop \");
*(int *)0x2200=0x0024; }
else if(CpuTimer0.InterruptCount<4) {
asm(\" nop \"); asm(\" nop \");
14
*(int *)0x2200=0x0018; }
else if(CpuTimer0.InterruptCount<5) {
asm(\" nop \"); asm(\" nop \");
*(int *)0x2200=0x0024; }
else if(CpuTimer0.InterruptCount<6) {
asm(\" nop \"); asm(\" nop \");
*(int *)0x2200=0x0042; }
else if(CpuTimer0.InterruptCount<7) {
asm(\" nop \"); asm(\" nop \");
*(int *)0x2200=0x0081; } } else {
CpuTimer0.InterruptCount = 0; } } } }
int cnt;
interrupt void cpu_timer0_isr(void) {
cnt++; if(cnt%2==0) {
CpuTimer0.InterruptCount++; } else {
CpuTimer0.InterruptCount++; }
// Acknowledge this interrupt to receive more interrupts from group 1 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; }
15
因篇幅问题不能全部显示,请点此查看更多更全内容