湖南工业大学DSP实验报告_第1页
湖南工业大学DSP实验报告_第2页
湖南工业大学DSP实验报告_第3页
湖南工业大学DSP实验报告_第4页
湖南工业大学DSP实验报告_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DSP实验报告院系名称电气与信息工程学院专业名称电气工程及其自动化班级学生姓名学号指导老师2013年11月试验一拨码开关实验—、实验目的1.了解DSP开发系统的组成和结构2.了解IO的基本编程方法二、实验设备计算机,CCS3.1版本软件,DSP仿真器,E300实验箱,2812CPU板(新的)三、实验原理8位的数字量输入(由拨码开关产生),当拨码打到靠近LED时为低。相反为高。通过74LS244(可读)缓冲连接到DSP的数据总线的低8位。CPU通过读指令读取到拨码开关产生的8位输出的数字量,然后CPU通过写指令把读出的8位数字量写入(0x0200)单元内,使连接到DSP的数据总线的低8位的74LS273的输出端产生高低信号,此时LED灯产生亮灭。当对应LED灯点亮时说明输出为低,熄灭时为高。(器件74LS244和74LS273详细的介绍请参看数据手册)。数字量输入输出单元的资源分配如下:基地址:0000h(当CS0为0时分配有效)数字量分配空间为数据空间地址:基地址+0x200(低8位,只读)拨码开关扩展工作原理说明:74LS244片选号、74LS273片选信号和74LS273复位信号由E300上CPLD译码产生。本实验使用DSP数据总线的低8位。本实验的程序流程框图如下:四、实验步骤1.2812CPU板上的JUMP1的1和2脚短接,拨码开关SW1的第二位置ON。2.E300板上的开关SW4的第一位置ON,其余OFF;SW5开关全部置ON;其余开关全部置OFF。3.运行CodeComposerStudio(CCS)(ccs3.1需要“DEBUG→Connect”)4.用“Project\Open”打开系统项目文件\e300.test\normal\DSP2801x_example\e300_02_swich\Exampla_281_swich.pjt;5.编译全部文件并装载\normal\DSP2801x_example\e300_02_swich\Exampla_281_swich.out;6.单击“Debug\GoMain”跳到主程序的开始;7.单击“Debug\RUN”运行程序8.任意拨动E300底板上的拨动开关,观察LED和拨动开关的对应情况。(LED1-LED7分别对应DSP数据总线的D0-D7);9.单击“Debug\Halt”暂停持续运行,开关将对灯失去控制.10.关闭所有窗口,本实验完。五、实验结果设置好CCS的环境,打开本工程,编译、下载、运行。调整数字输入输出单元的开关K1~K8,观察LED1~LED8灯亮灭的变化为:拨动LED1~LED8灯相应的开关K1~K8,则对应的灯亮灭。修改后的实验原程序:#include"DSP281x_Device.h"//DSP281xHeaderfileIncludeFile#include"DSP281x_Examples.h"//DSP281xExamplesIncludeFilevoidmain(void){unsignedinttemp;temp=0;InitSysCtrl();//初始化PLL,WatchDog,使能外围时钟,该初始化文件在"DSP281x_SysCtrl.c"中DINT;//关闭CPU中断//InitializePIEcontrolregisterstotheirdefaultstate.//ThedefaultstateisallPIEinterruptsdisabledandflags//arecleared.InitPieCtrl();IER=0x0000;//关闭中断和清除所有中断标志IFR=0x0000;//InitializethePIEvectortablewithpointerstotheshellInterrupt//ServiceRoutines(ISR).InitPieVectTable();for(;;){ asm("nop"); temp=*(int*)0x2200&0x0007;//读入0x2200地址的开关量值并赋给temp switch(temp) {case0x0000: *(int*)0x2200=0x00fe;break; case0x0001: *(int*)0x2200=0x00fd;break;case0x0002: *(int*)0x2200=0x00fb;break; case0x0003: *(int*)0x2200=0x00f7;break; case0x0004: *(int*)0x2200=0x00ef;break; case0x0005: *(int*)0x2200=0x00df;break; case0x0006: *(int*)0x2200=0x00bf;break; case0x0007: *(int*)0x2200=0x007f;break; default:break;} asm("nop");//*(int*)0x2200=temp;//temp值输出0x2200地址的LED灯 asm("nop");}}实验二定时器实验一、实验目的1、熟悉F2812的CPU定时器;2、掌握F2812的CPU定时器的控制方法;3、学会使用CUP定时器中断方式控制程序流程。二、实验设备计算机,CCS3.1版软件,DSP硬件仿真器,E300实验箱,2812CPU板。实验原理说明样例实验是采用CPU定时器来定时LED亮灭的。F2812的CPU定时器不同于事件管理器(EVA\EVB)中的通用定时器(GP)。F2812的CPU共有三个定时器,其中,CPU1定时器1和2被保留用作实验操作系统OS例如DSPBIOS),CPU定时器0可以供用户使用。定时器的一般操作如下:将周期寄存器PRDH:PRD中的值装入32位计数器寄存器TIMI:TIM。然后计数器寄存器以F2812x的SYSCLKLT速率递减。当计数器减到0,就会产生一个定时器中断输出定时信号(一个中断脉冲)。下图为CPU定时器的内部结构:样例实验的程序如下:实验步骤和内容1、F2812CPU板的JUPMI的1和2脚短接,拨码开关 SW1的第二位置ON;其余OFF。2、E300底板的开关SW4的第1位置ON,其余位置OFF。其余开关设置为OFF;3、运行CCS软件,调入样例程序,装载并运行;(进入CCS界面后需要点“Debug--Connect”);4、加载“..\e300_03cpu_timer\Debug\Eample_281x_cpu_timer.out”;单击“Debug\Animate”运行,可观察到LED1~LED8的变化规律:先LED1,8点亮—LED2,7D点亮—LED1,8熄灭—LED3,6点亮—LED2,7熄灭—LED4,5点亮—LED3,6熄灭—后LED4,5熄灭—LED3,6点亮—LED3,6熄灭—LED2,7点亮—LED2,7熄灭—LED1,8点亮。6、单击“Debug\Halt”,暂停程序运行,LED灯停止闪烁;单击“RUN”,LED灯又开始闪烁变化;结束试验程序修改后的实验原程序:#include"DSP281x_Device.h"//DSP281xHeaderfileIncludeFile#include"DSP281x_Examples.h"//DSP281xExamplesIncludeFileinterruptvoidcpu_timer0_isr(void);voidConfigCpuTimer(structCPUTIMER_VARS*Timer,floatFreq,floatPeriod);voidmain(void){unsignedinttemp;temp=0;InitSysCtrl();DINT;InitPieCtrl();IER=0x0000;IFR=0x0000;InitPieVectTable();EALLOW;//ThisisneededtowritetoEALLOWprotectedregistersPieVectTable.TINT0=&cpu_timer0_isr;EDIS;//ThisisneededtodisablewritetoEALLOWprotectedregistersInitCpuTimers();//Forthisexample,onlyinitializetheCpuTimersConfigCpuTimer(&CpuTimer0,100,100000);StartCpuTimer0();IER|=M_INT1;PieCtrlRegs.PIEIER1.bit.INTx7=1;EINT;//EnableGlobalinterruptINTMERTM;//EnableGlobalrealtimeinterruptDBGMfor(;;){temp=*(int*)0x2200&0x0001;if(temp==0){if(CpuTimer0.InterruptCount<1){asm("nop"); asm("nop");*(int*)0x2200=0x00fe; *(int*)0x2200=0x007f;}elseif(CpuTimer0.InterruptCount<2){asm("nop"); asm("nop"); *(int*)0x2200=0x00fe; *(int*)0x2200=0x007f;*(int*)0x2200=0x00fd; *(int*)0x2200=0x00bf;}elseif(CpuTimer0.InterruptCount<3){asm("nop"); asm("nop");*(int*)0x2200=0x00fd; *(int*)0x2200=0x00bf;}elseif(CpuTimer0.InterruptCount<4){asm("nop"); asm("nop");*(int*)0x2200=0x00fd; *(int*)0x2200=0x00bf;*(int*)0x2200=0x00fb;*(int*)0x2200=0x00df;}elseif(CpuTimer0.InterruptCount<5){asm("nop"); asm("nop");*(int*)0x2200=0x00fb;*(int*)0x2200=0x00df;}elseif(CpuTimer0.InterruptCount<6){asm("nop"); asm("nop");*(int*)0x2200=0x00fb;*(int*)0x2200=0x00df;*(int*)0x2200=0x00f7;*(int*)0x2200=0x00ef;}elseif(CpuTimer0.InterruptCount<7){asm("nop"); asm("nop");*(int*)0x2200=0x00f7;*(int*)0x2200=0x00ef;}elseif(CpuTimer0.InterruptCount<8){asm("nop");asm("nop"); *(int*)0x2200=0x00ff;}elseif(CpuTimer0.InterruptCount<9){asm("nop"); asm("nop");*(int*)0x2200=0x00fb;*(int*)0x2200=0x00df;}elseif(CpuTimer0.InterruptCount<10){asm("nop"); asm("nop"); *(int*)0x2200=0x00ff;}elseif(CpuTimer0.InterruptCount<11){asm("nop"); asm("nop");*(int*)0x2200=0x00fd; *(int*)0x2200=0x00bf;}elseif(CpuTimer0.InterruptCount<12){asm("nop"); asm("nop"); *(int*)0x2200=0x00ff;}else{CpuTimer0.InterruptCount=0;}}elseif(temp==1){if(CpuTimer0.InterruptCount<9){asm("nop"); asm("nop");*(int*)0x2200=0x00fe; *(int*)0x2200=0x007f;}elseif(CpuTimer0.InterruptCount<8){asm("nop"); asm("nop"); *(int*)0x2200=0x00fe; *(int*)0x2200=0x007f;*(int*)0x2200=0x00fd; *(int*)0x2200=0x00bf;}elseif(CpuTimer0.InterruptCount<3){asm("nop"); asm("nop");*(int*)0x2200=0x00fd; *(int*)0x2200=0x00bf;}elseif(CpuTimer0.InterruptCount<4){asm("nop"); asm("nop");*(int*)0x2200=0x00fd; *(int*)0x2200=0x00bf;*(int*)0x2200=0x00fb;*(int*)0x2200=0x00df;}elseif(CpuTimer0.InterruptCount<5){asm("nop"); asm("nop");*(int*)0x2200=0x00fb;*(int*)0x2200=0x00df;}elseif(CpuTimer0.InterruptCount<6){asm("nop"); asm("nop");*(int*)0x2200=0x00fb;*(int*)0x2200=0x00df;*(int*)0x2200=0x00f7;*(int*)0x2200=0x00ef;}elseif(CpuTimer0.InterruptCount<7){asm("nop"); asm("nop");*(int*)0x2200=0x00f7;*(int*)0x2200=0x00ef;}elseif(CpuTimer0.InterruptCount<8){asm("nop"); asm("nop"); *(int*)0x2200=0x00ff;}elseif(CpuTimer0.InterruptCount<9){asm("nop"); asm("nop");*(int*)0x2200=0x00fb;*(int*)0x2200=0x00df;}elseif(CpuTimer0.InterruptCount<10){asm("nop"); asm("nop"); *(int*)0x2200=0x00ff;}elseif(CpuTimer0.InterruptCount<11){asm("nop"); asm("nop");*(int*)0x2200=0x00fd; *(int*)0x2200=0x00bf;}elseif(CpuTimer0.InterruptCount<12){asm("nop"); asm("nop"); *(int*)0x2200=0x00ff;}else{CpuTimer0.InterruptCount=0;}}}}interruptvoidcpu_timer0_isr(void){CpuTimer0.InterruptCount++;PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;}试验三键盘接口实验(E300)—、实验目的1.了解DSP开发系统的组成和结构2.了解键盘的基本编程方法3.内存观察工具的使用二、实验设备计算机,CCS3.1版本软件,DSP仿真器,E300实验箱,2812CPU板三、实验原理本实验程序由二部分组成:1.由外部中断2产生中断信号2.键值读取程序:该部分有两种方法进行键值的判断。方法1:利用内存观察工具进行观察方法2:利用LED1-LED8的亮灭对应显示键值。a)外部中断2的应用参照实验二;b)内存观察键值:程序中定义了三个变量“W”“row”和“col”。“W”代表是CPLD中键盘的扫描数值,“row”和“col”分别代表键盘的行和列,由行和列可以判定按键的位置。上述三个变量可以在观察窗口中观察的。c)利用LED灯显示键值原理,参看实验一。具体的LED灯显示值以查表的形式读出,请参看“e300_codec.h”库文件。本实验的CPLD地址译码说明:基地址:0x2000,当底板片选CS1为低时,分配有效。CPU的数据空间:基地址+0x0200LED灯output8外部中断用XINT2:由CPLD分配,中断信号由键盘产生。中断下降沿触发。KEY_DAY_REG(R):基地址+0x0004;四、实验步骤和内容1.2812CPU板JUMP1的1和2脚短接,拨码开关SW1的第二位ON;2.E300板上的开关SW4的第一位置ON,其余OFF;SW3的第四位置ON其余的SW置OFF;3.运行CodeComposerStudio(CCS)(ccs3.1需要“DEBUG→Connect”);4.打开系统项目文件\e300.test\normal\DSP281x_examples\e300_06_keyinterface\Example_281x_keyled.pjt;5.编译全部文件并装载“\Debug\keyled.out”文件;6.单击“Debug\GoMain”跳到主程序的开始;7.指定位置设置断点;View--〉WatchWindow打开变量观察窗口;将变量“w”“row”和“col”添加到观察窗口中,改变变量观察窗口的显示方式为HEX显示;点击“Debug--〉Animate”全速运行,然后点击E300板上键盘按键,观察窗口中变量变化,同时LED1-LED8灯也相应变化,指示键值。(注意程序中KEY_E和KEY_F分别代表键盘上的“*”和“#”键值。十六进制数代表的意义为:高4位为按键的行值,低4位为按键的列值。注意:“w”中的低八位表;11.关闭所有窗口,本实验完毕。五、实验程序框图修改后的实验原程序:#include"DSP281x_Device.h"//DSP281xHeaderfileIncludeFile#include"DSP281x_Examples.h"//DSP281xExamplesIncludeFile#include"e300_codec.h"/****************************************************************/voidinit_xint2(void);interruptvoidxint2_isr(void);//中断2中断子程序voidread_data();//读取数据子函数voidconv(void);//键盘数值转换子函数interruptvoidcpu_timer0_isr(void);voidConfigCpuTimer(structCPUTIMER_VARS*Timer,floatFreq,floatPeriod);/************************定义全局变量****************************/unsignedintrow,col,w;inta=0;unsignedinttemp=0;/************************用到的子函数****************************/voidinit_xint2(){XIntruptRegs.XINT2CR.all=0x0001;//低电平触发中断}interruptvoidxint2_isr()//中断2中断子程序{a=1;//开总中断//AcknowledgeinterrupttoreceivemoreinterruptsfromPIEgroup2PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;}interruptvoidcpu_timer0_isr(void){CpuTimer0.InterruptCount++;//Acknowledgethisinterrupttoreceivemoreinterruptsfromgroup1//CpuTimer0Regs.TCR.bit.TIF=1;PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;}/************************主函数********************************/voidmain(void){//PLL,WatchDog,enablePeripheralClocks//ThisexamplefunctionisfoundintheDSP281x_SysCtrl.cfile.InitSysCtrl();//DisableCPUinterruptsDINT;//InitializePIEcontrolregisterstotheirdefaultstate.//ThedefaultstateisallPIEinterruptsdisabledandflags//arecleared.InitPieCtrl();//DisableCPUinterruptsandclearallCPUinterruptflags:IER=0x0000;IFR=0x0000;//InitializethePIEvectortablewithpointerstotheshellInterrupt//ServiceRoutines(ISR).InitPieVectTable();EALLOW;//ThisisneededtowritetoEALLOWprotectedregistersPieVectTable.XINT2=&xint2_isr;PieVectTable.TINT0=&cpu_timer0_isr;EDIS;InitCpuTimers();//Forthisexample,onlyinitializetheCpuTimers//ConfigureCPU-Timer0tointerrupteverysecond://100MHzCPUFreq,1secondPeriod(inuSeconds)ConfigCpuTimer(&CpuTimer0,100,100000);StartCpuTimer0();init_xint2();PieCtrlRegs.PIEIER1.all=0x0050;IER|=M_INT1;EINT;//EnableGlobalinterruptINTMERTM;//EnableGlobalrealtimeinterruptDBGMfor(;;){if(a==1)//加软件断点{//a=0;temp=*(int*)0x2200&0x0001;if(temp==0){if(CpuTimer0.InterruptCount<1){asm("nop"); asm("nop");*(int*)0x2200=0x00fe; *(int*)0x2200=0x007f;}elseif(CpuTimer0.InterruptCount<2){asm("nop"); asm("nop"); *(int*)0x2200=0x00fe; *(int*)0x2200=0x007f;*(int*)0x2200=0x00fd; *(int*)0x2200=0x00bf;}elseif(CpuTimer0.InterruptCount<3){asm("nop"); asm("nop");*(int*)0x2200=0x00fd; *(int*)0x2200=0x00bf;}elseif(CpuTimer0.InterruptCount<4){asm("nop"); asm("nop");*(int*)0x2200=0x00fd; *(int*)0x2200=0x00bf;*(int*)0x2200=0x00fb;*(int*)0x2200=0x00df;}elseif(CpuTimer0.InterruptCount<5){asm("nop"); asm("nop");*(int*)0x2200=0x00fb;*(int*)0x2200=0x00df;}elseif(CpuTimer0.InterruptCount<6){asm("nop"); asm("nop");*(int*)0x2200=0x00fb;*(int*)0x2200=0x00df;*(int*)0x2200=0x00f7;*(int*)0x2200=0x00ef;}elseif(CpuTimer0.InterruptCount<7){asm("nop"); asm("nop");*(int*)0x2200=0x00f7;*(int*)0x2200=0x00ef;}elseif(CpuTimer0.InterruptCount<8){asm("nop"); asm("nop"); *(int*)0x2200=0x00ff;}elseif(CpuTimer0.InterruptCount<9){asm("nop"); asm("nop");*(int*)0x2200=0x00fb;*(int*)0x2200=0x00df;}elseif(CpuTimer0.InterruptCount<10){asm("nop"); asm("nop"); *(int*)0x2200=0x00ff;}elseif(CpuTimer0.InterruptCount<11){asm("nop"); asm("nop");*(int*)0x2200=0x00fd; *(int*)0x2200=0x00bf;}elseif(CpuTimer0.InterruptCount<12){asm("nop"); asm("nop"); *(int*)0x2200=0x00ff;}else{CpuTimer0.InterruptCount=0;}}elseif(temp==1){if(CpuTimer0.InterruptCount<9){asm("nop"); asm("nop");*(int*)0x2200=0x00fe; *(int*)0x2200=0x007f;}elseif(CpuTimer0.InterruptCount<8){asm("nop"); asm("nop"); *(int*)0x2200=0x00fe; *(int*)0x2200=0x007f;*(int*)0x2200=0x00fd; *(int*)0x2200=0x00bf;}elseif(CpuTimer0.InterruptCount<3){asm("nop"); asm("nop");*(int*)0x2200=0x00fd; *(int*)0x2200=0x00bf;}elseif(CpuTimer0.InterruptCount<4){asm("nop"); asm("nop");*(int*)0x2200=0x00fd; *(int*)0x2200=0x00bf;*(int*)0x2200=0x00fb;*(int*)0x2200=0x00df;}elseif(CpuTimer0.InterruptCount<5){asm("nop"); asm("nop");*(int*)0x2200=0x00fb;*(int*)0x2200=0x00df;}elseif(CpuTimer0.InterruptCount<6){asm("nop"); asm("nop");*(int*)0x2200=0x00fb;*(int*)0x2200=0x00df;*(int*)0x2200=0x00f7;*(int*)0x2200=0x00ef;}elseif(CpuTimer0.InterruptCount<7){asm("nop"); asm("nop");*(int*)0x2200=0x00f7;*(int*)0x2200=0x00ef;}elseif(CpuTimer0.InterruptCount<8){asm("nop"); asm("nop"); *(int*)0x2200=0x00ff;}elseif(CpuTimer0.InterruptCount<9){asm("nop"); asm("nop");*(int*)0x2200=0x00fb;*(int*)0x2200=0x00df;}elseif(CpuTimer0.InterruptCount<10){asm("nop"); asm("nop"); *(int*)0x2200=0x00ff;}elseif(CpuTimer0.InterruptCount<11){asm("nop"); asm("nop");*(int*)0x2200=0x00fd; *(int*)0x2200=0x00bf;}elseif(CpuTimer0.InterruptCount<12){asm("nop"); asm("nop"); *(int*)0x2200=0x00ff;}else{CpuTimer0.InterruptCount=0;}} read_data();//conv(); }else{}}}实验建议本实验程序采用外部中断的方式来判断键盘是否被按下,除了这种方法外,还可以根据键盘按下标志位“KEY_FLAG”,利用查询方式来编写程序,“KEY_FLAG”是CPLD内部状态寄存器中的一个只读位.CPLD内部状态寄存器:CPLD_ST

试验四A/D转换实验(E300)一、实验目的1.了解DSP中A/D转换模块的特点;2.了解A/D转换模块的原理结构;3.掌握A/D转换模块的使用。二、实验设备计算机,DSP仿真器,THRSC-2型实验箱各一台。三、实验原理TMS320F2812的ADC模块是一个12位分辨率、高达80ns转换时间、具有流水线结构的模—数转换器。此转换器的模拟电路包括:前端模拟多路复用器(MUXs)、采样/保持电路(S/H)、转换核、电压调节器以及其他模拟支持电路。数字电路包括:可编程转换序列发生器、转换结果寄存器、模拟电路接口、设备外围总线接口以及其他片上模块接口等,可以直接用于电机或运动控制场合。四、实验内容与步骤连接好仿真器、计算机与实验箱,系统上电,实验箱电源指示灯亮,仿真器上红色指示灯亮,系统连接正常。打开CCS3.1软件。图1.6.3实验程序流程图1.图1.6.3为A/D实验程序流程图:采集电位器电压。A/D用16个通道采集当前电压值,取平均值,将十六进制数转换成十进制数,并处理成电压量输出给液晶屏显示,循环上述操作。2.打开实验程序dsp2812.1.6-ADC目录下的工程ADC.pjt,点编译、下载。按“F5”运行,液晶屏显示当前DSP的ADCINA2(对应试验箱A/D转换单元的ADCINA)通道电压值,调节A/D转换单元的电位器,改变输入电压,显示随之变化,显示电压在0~3.3V之间。3.点“Halt”,停止程序运行,恢复程序指令初始值,并保存,关闭所有窗口,实验完毕。修改后的实验原程序:#include"DSP281x_Device.h"//DSP281xHeaderfileIncludeFile#include"DSP281x_Examples.h"//DSP281xExamplesIncludeFileinterruptvoidadc_isr(void);Uint16LoopCount;Uint16ConversionCount;doubleinput1[256];doubleinput2[256];Uint16 a[4],b[4];Uint16sum1=0,sum2=0voidmain(void){InitSysCtrl();EALLOW;SysCtrlRegs.PLLCR.all=0x8;SysCtrlRegs.HISPCP.all=0x3;//HSPCLK=SYSCLKOUT/6EDIS;DINT;InitPieCtrl();IER=0x0000;IFR=0x0000;InitPieVectTable();EALLOW;//ThisisneededtowritetoEALLOWprotectedregisterPieVectTable.ADCINT=&adc_isr;EDIS;//ThisisneededtodisablewritetoEALLOWprotectedregistersInitAdc();//Forthisexample,inittheADCPieCtrlRegs.PIEIER1.bit.INTx6=1;IER|=M_INT1;//EnableCPUInterrupt1EINT;//EnableGlobalinterruptINTMERTM;//EnableGlobalrealtimeinterruptDBGMLoopCount=0;ConversionCount=0;AdcRegs.ADCTRL1.bit.SEQ_CASC=1;AdcRegs.ADCMAXCONV.all=0x0007;//Setup2conv'sonSEQ1AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0;//SetupADCINA0as1stSEQ1conv.AdcRegs.ADCCHSELSEQ1.bit.CONV01=0x0;//SetupADCINA2as2ndSEQ1conv.AdcRegs.ADCCHSELSEQ1.bit.CONV02=0x0;AdcRegs.ADCCHSELSEQ1.bit.CONV03=0x0;AdcRegs.ADCCHSELSEQ2.bit.CONV04=0x2;AdcRegs.ADCCHSELSEQ2.bit.CONV05=0x2;AdcRegs.ADCCHSELSEQ2.bit.CONV06=0x2;AdcRegs.ADCCHSELSEQ2.bit.CONV07=0x2;AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1;//EnableEVASOCtostartSEQ1AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;//EnableSEQ1interrupt(everyEOS)EvaRegs.T1CMPR=0x0380;//SetupT1comparevalueEvaRegs.T1PR=0x07FF;//SetupperiodregisterEvaRegs.GPTCONA.bit.T1TOADC=1;//EnableEVASOCinEVA01下溢中断启动ADCEvaRegs.T1CON.all=0x1042;//Enabletimer1compare(upcountmode)//WaitforADCinterruptfor(;;){*(int*)0x2200=0x0005;LoopCount++;}}interruptvoidadc_isr(void)Uint16i;//,j // while(AdcRegs.ADCST.bit.SEQ1_BSY!=0){}//等待AD转换完成 a[0]=AdcRegs.ADCRESULT0>>4; a[1]=AdcRegs.ADCRESULT1>>4; a[2]=AdcRegs.ADCRESULT2>>4; a[3]=AdcRegs.ADCRESULT3>>4; b[0]=AdcRegs.ADCRESULT4>>4; b[1]=AdcRegs.ADCRESULT5>>4; b[2]=AdcRegs.ADCRESULT6>>4; b[3]=AdcRegs.ADCRESULT7>>4; for(i=0;i<4;i++) { sum1=sum1+a[i]; sum1=sum1/2; } for(i=0;i<4;i++) { sum2=sum2+b[i]; sum2=sum2/2; }input1[ConversionCount]=sum1/4095.0*3;input2[ConversionCount]=sum2/4095.0*3;//Mixing[ConversionCount]=input1[ConversionCount]+input2[ConversionCount];if(ConversionCount==256){ConversionCount=0;//加软件断点}elseConversionCount++;//ReinitializefornextADCsequenceAdcRegs.ADCTRL2.bit.RST_SEQ1=1;//ResetSEQ1AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;//ClearINTSEQ1bitPieCtrlRegs.PIEACK.all=PIEACK_GROUP1;//AcknowledgeinterrupttoPIEreturn;}实验结果波形:

实验五PWM波形产生实验一、实验目的1.了解PWM波的产生原理;2.掌握PWM波的使用方法。二、实验设备计算机,DSP仿真器,THRSC-2型实验箱,示波器,电机扩展板三、实验原理1.事件管理器EVA模块和EVB模块中分别有3个全比较单元,EVA的3个全比较单元为:比较单元1、2和3;EVB的3个全比较单元为:比较单元4、5和6。每个比较单元都有两个相应的PWM输出。比较单元的时基由通用定时器1(EVA模块)和通用定时器3(EVB模块)提供。当比较操作使能时,GP定时器1和3可以工作在它的任何一种计数模式。3.PWM波形发生器有以下特征:z有5个独立的PWM波形输出,其中3个由比较单元产生,另外2个由GP定时器产生,3个比较单元PWM波形输出还会产生3个附加的PWM波形输出,即3个带可编程死区控制的比较单元产生独立的3对输出。所以每个事件管理器总共有8个PWM波形输出。z最小的死区宽度为1个CPU时钟周期。z可编程的对称、非对称以及空间向量PWM波形。zPWM载波频率的快速变化(具有双缓冲比较寄存器)。zPWM脉宽的快速变化(具有双缓冲比较寄存器)。四、实验内容与步骤连接好仿真器、计算机与实验箱,电机扩展板排线接到实验箱电机扩展接口上;系统上电,实验箱电源指示灯亮,仿真器上红色指示灯亮,系统连接正常。打开CCS3.1软件。1.打开dsp2812.1.13-PWM目录下的工程PWM.pjt,点编译、下载。按“F5”运行,用示波器探头观测电机扩展板上的“PWM脉冲测试口”的PWM1、PWM2、PWM3、PWM4、PWM5和PWM6插针。6路PWM波中的PWM1、PWM3、PWM5占空比分别为:1:3、1:1、3:1;PWM2、PWM4、PWM6占空比分别为:3:1、1:1、1:3。采用双踪观察,PWM1和PWM2输出波形相互对称,调宽波形,可以看到由于加入了死区时间,波形不是完全对称。PWM3、PWM4和PWM5、PWM6同上。2.用户可以修改文件“pwm.c”初始化函数“init_eva()”内的初始化设置:定时器周期值(TIPR)、全比较器值(CMPR1、CMPR2、CMPR3)及死区控制寄存器(DBTCONA)的第5~7THRSC-2型DSP综合实验/开发系统天煌科技天煌教仪187位等(例如此时定时器初值EvaRegs.T1PR=0xEA8;比较寄存器1的值为EvaRegs.CMPR1=0x3AA;(设置PWM1为低有效EvaRegs.ACTRA.all=0x0999;设置死区定时器为不使能EvaRegs.DBTCONA.all=0x051C;则我们测到的PWM1输出波形高低占空比为1:3=0x3AA:(0Xea8-0x3AA))。死区控制寄存器(DBTCONA)的第5~7分别为死区定时器1、2、3的使能位(用户可以修改使能位:置1为使能死区定时器,置0为不使能死区定时器),用户可以通过修改死区控制寄存器(DBTCONA)第5~7位的相应位来改变相应PWM波带死区与不带死区的输出结果比较。重复上述操作。(各寄存器详细说明参考该程序目录下的2812_ev.pdf文档说明)3.点“Halt”,停止程序运行,恢复程序指令初始值,并保存,关闭所有窗口,关闭电源,修改后的实验原程序:#include"DSP281x_Device.h"//DSP281xHeaderfileIncludeFile#include"DSP281x_Examples.h"//DSP281xExamplesIncludeFile//Prototypestatementsforfunctionsfoundwithinthiserruptvoidadc_isr(void);//Globalvariablesusedinthisexample:Uint16LoopCount;Uint16ConversionCount;Uint16input1[256];Uint16input2[256];Uint16Mixing[256];intc=0;//Prototypestatementsforfunctionsfoundwithinthisfile.voidinit_eva(void);//Globalcountsusedinthisexamplevoidmain(void){//InitializeSystemControl://PLL,WatchDog,enablePeripheralClocksInitSysCtrl();//Forthisexample,setHSPCLKtoSYSCLKOUT/6(25Mhzassuming150MhzSYSCLKOUT)EALLOW;SysCtrlRegs.PLLCR.all=0x8;SysCtrlRegs.HISPCP.all=0x3;//HSPCLK=SYSCLKOUT/6EDIS;//InitializeonlyGPAMUXandGPBMUXforthistestEALLOW;//EnablePWMpinsGpioMuxRegs.GPAMUX.all=0x003F;//EVAPWM1-6pinsEDIS;//ClearallinterruptsandinitializePIEvectortable://DisableCPUinterruptsDINT;//InitializePIEcontrolregisterstotheirdefaultstate.InitPieCtrl();//DisableCPUinterruptsandclearallCPUinterruptflags:IER=0x0000;IFR=0x0000;//InitializethePIEvectortablewithpointerstotheshellInterruptInitPieVectTable();EALLOW;//ThisisneededtowritetoEALLOWprotectedregisterPieVectTable.ADCINT=&adc_isr;EDIS;//ThisisneededtodisablewritetoEALLOWprotectedregistersInitAdc();//Forthisexample,inittheADCPieCtrl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论