DSP技术与应用实验报告.docx_第1页
DSP技术与应用实验报告.docx_第2页
DSP技术与应用实验报告.docx_第3页
DSP技术与应用实验报告.docx_第4页
DSP技术与应用实验报告.docx_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

DSP实验报告姓 名: 年 级: 专 业: 学 号: 任课教师: 目 录实验一、CCS入门实验实验二、编写一个以C语言为基础的DSP程序实验三、异步串口通信实验四、A/D及D/A转换实验五、PID算法控制实验实验六、快速傅里叶变换(FFT)算法实验一、CCS入门实验实验课程: DSP实验 实验题目: CCS入门实验 实验日期: 2013年 12 月 3 日 姓名: 学号: Project/new;输入:volume,按Finish;Project/add files to project;查找范围:C:CCStudio_v3.3tutorialdsk2812volume1;文件类型:all files;分别添加:Volume.c、Load.asm、Vectors.asm、Volume.cmd;在C:CCStudio_v3.3C2000cgtoolslib中添加:rts2800_ml.lib;将C:CCStudio_v3.3tutorialdsk2812volume1 volume.h复制到:C:CCStudio_v3.3C2000cgtoolsinclude文件夹中;Project/rebuild all;File/load program;打开C:CCStudio_v3.3MyProjectsvolumeDebugvolume.out;鼠标双击:volume.c,找到dataIO(),右击,运行toggle software breakpoint;File/data,查找范围:C:CCStudio_v3.3tutorialdsk2812volume1;文件类型:all files,打开:sina.dat,输入:0x8000、0x2000;View/memory,0x8000;View/graph/timefrequency;如下图波形:频谱 实验二、编写一个以C语言为基础的DSP程序实验课程: DSP实验 实验题目: 编写一个以C语言为基础的DSP程序 实验日期: 2013年 12 月 3 日 姓名: 学号: 一实验目的 1学习用标准C语言编制程序;了解常用的C语言程序设计方法和组成部分。 2学习编制连接命令文件,并用来控制代码的连接。 3学会建立和改变map文件,以及利用它观察DSP内存使用情况的方法。 4熟悉使用软件仿真方式调试程序。 二实验原理 1 标准C语言程序 CCS支持使用标准C语言开发DSP应用程序。当使用标准C语言编制的程序时,其源 程序文件名的后缀应为.c(如:volume.c)。 CCS在编译标准C语言程序时,首先将其编译成相应汇编语言程序,再进一步编译成目 标DSP的可执行代码。最后生成的是coff格式的可下载到DSP中运行的文件,其文件名后 缀为.out。 由于使用C语言编制程序,其中调用的标准C的库函数由专门的库提供,在编译连接时 编译系统还负责构建C运行环境。所以用户工程中需要注明使用C的支持库。 2 命令文件的作用 命令文件(文件名后缀为cmd)为链接程序提供程序和数据在具体DSP硬件中的位置分配 信息。通过编制命令文件,我们可以将某些特定的数据或程序按照我们的意图放置在DSP 所管理的内存中。命令文件也为链接程序提供了DSP外扩存储器的描述。在程序中使用CMD 文件描述硬件存储区,可以只说明使用部分,但只要是说明的,必须和硬件匹配,也就是只 要说明的存储区必须是存在的和可用的。 3 内存映射(map)文件的作用 一般地,我们设计、开发的DSP程序在调试好后,要固化到系统的ROM中。为了更 精确地使用ROM空间,我们就需要知道程序的大小和位置,通过建立目标程序的map文件可以了解DSP代码的确切信息。当需要更改程序和数据的大小和位置时,就要适当修改cmd文件和源程序,再重新生成map文件来观察结果。另外,通过观察map文件,可以掌握DSP存储器的使用和利用情况,以便进行存储器方面的优化工作。4程序设计要求程序框图(图2-1):三实验设备 PC兼容机一台,操作系统为Windows2000(或Windows98,WindowsXP,以下默认为Windows2000),安装Code Composer Studio 2.0软件。四实验内容与步骤1实验准备 设置软件仿真模式,参看:本书第一部分、四、1。2建立新的工程文件 (1)启动 Code Composer Studio 2.21。 (2)进行以下设置3编辑输入源程序 (1)C语言程序 -先新建源程序窗口: -输入源程序:int x,y,z;main()x=1; y=2;while ( 1 )z=x+y;-保存源程序为CProgram.c:(2)连接命令文件-如同第(1)步操作,建立空的源程序窗口。-输入连接命令文件内容:-lrts55x.libMEMORYDARAM:O=0x100,l=0x7f00DARAM2:O=0x8000,l=0x8000SECTIONS .text:DARAM .bss:DARAM .stack:DARAM .cinit:DARAM -如同第(1)步操作,将文件存为:C:ICETEK-F2812-A-EDUlabDSP281x_examplesLab0102-CProgram CProgram.cmd(3)将上述编译的源程序加入工程 CProgram.pjt。5编译源文件、下载可执行程序(1)单击菜单“Project”、“Rebuild All”。(2)执行 FileLoad Program,在随后打开的对话框中选择刚刚建立的C:ICETEK-F2812-EDULabLab0102-CProgramdebugCProgram.out 文件。完成后,系统自动打开一个反汇编窗口“Disassembly”,并在其中指示程序的入口地址为“_c_int00”。6打开观察窗口开启 CPU 寄存器观察窗口:单击菜单 View-Registers-Core。7观察程序运行结果这时,在“Disassembly”代表程序运行位置的绿色箭头指向程序的入口地址,程序将从此开始执行。(1)选择菜单中 Debug-Go Main,CCS 自动打开 CProgram.c,程序会停在用户主程序入口 main 上,这从反汇编窗口和 CProgram.c 窗口中的指示箭头位置可以看出。(2)在内存观察窗口中观察变量的值:选择“View”菜单中“Memory”项,在“Memroy Window Options”窗口中的“Adress”项中输入&x,单击“OK”完成设置;“Memory”窗口中 x 的当前取值显示在第 1 个地址的后。(3)将变量 x、y、z 分别加入观察窗口:在源程序中双击变量名,再单击鼠标右键,选择“Add to Watch Window”。这时,这 3个变量还未作初始化。(4)单步运行 2 次,在观察窗中观察到变量 x、y 被赋值。变化的值被显示成红色。同时在“Memory”窗口中也能观察到 x 和 y 值的改变。(5)再单步运行,可观察到 z 的值被计算出来。双击观察窗口中变量 x、y 在“Value”栏中的取值并修改成其他取值,单步运行后观察结果。(6)双击观察窗口中变量 x、y 在“Value”栏中的取值,并修改成 0;选择菜单Debug-Restart,返回程序起点。(7)重新单步运行程序8内存映像文件(1)选择菜单 Project-Build Options,启动“Build Options”工程设置对话框。(2)单击“Linker”属性页,在“Map Filename”项中观察生成的 map 文件名和路径。(3)单击“取消”退出。9对照观察 map 文件和 cmd 文件的内容(1)选择菜单 File-Open,将找到C:ICETEK-F2812-A-EDUlabDSP281x_examplesLab0102-CProgram Debug 目录,将文件类型改为“Memory Map Files”,选择 CProgram.map 文件、打开。打开 CProgram.cmd 文件。(3)程序的入口地址:map 文件中“ENTRY POINT SYMBOL”中说明了程序入口地址(_c_int00)。 (4)内存使用情况:-map 文件中“MEMORY CONFIGURATION”标明了程序占用 RAM 的使用情况,共占用 aaH 个存储单元。-观察 map 文件中的“SECTION ALLOCATION MAP”段,可以看出 CProgram.obj 的入口地址为 0x3e801e,这也是 main 函数的入口地址。-用户堆栈段从 400H 开始,程序运行到 main 函数中后,变量 x、y、z 均开设在栈中。-还能看出程序运行都需要调用 rts2800.lib 中的哪些模块。10改变内存分配修改 cmd 文件中的PAGE 0 : PROG(R) : origin = 0x3E8000, length = 0x10000 改为PAGE 0 : PROG(R) : origin = 0x3E9000, length = 0x10000 重新编译工程,观察 map 文件中有何变化。11退出 CCS 实验三、异步串口通信实验课程: DSP实验 实验题目: 异步串口通信 实验日期: 2013年 12 月 12 日 姓名: 学号: 一、实验目的1、熟悉2812 内部具有两个相同的 SCI 模块,SCIA 和 SCIB。2、通过学习串口通讯实验,理解DSP的传口与PC之间是怎样进行交互的。5、学会C语言中断程序设计,以及运用中断程序控制程序流程。二、实验要求1、做到独立建立CCS开发环境2、以使用DSP内部的事件管理器为例,学会编译程序调试、仿真、下载程序;三、实验设备计算机,串行通信数据线、DSP2812实验箱(包括USB仿真器+2812系统板+相关连线及电源)。四、实验原理、方法1、SCI模块2812 内部具有两个相同的 SCI 模块,SCIA 和 SCIB,每一个 SCI 模块都各有一个接收器和发送器。SCI的接收器和发送器各具有一个16 级深度的FIFO(First in fist out 先入先出)队列,它们还都有自己独立的使能位和中断位,可以在半双工通信中进行独立的操作,或者在全双工通信中同时进行操作。根据信息的传送方向,串行通信可以分为单工、半双工和全双工三种,其各自的定义如下图所示。图1 串行通信的三种方式首先,我们从图2可以看到,SCI 模块具有两个引脚,SCITXDA和 SCIRXDA,分别实现发送数据和接收数据的功能,这两个引脚对应于 GPIOF 模块的第 4 和第 5 位,在编程初始化的时候,需要将 GPIOFMUX 寄存器的第 4和第 5位置为1,才能使得这两个引脚具有发送和接收的功能,否则就是普通的I/O 引脚。 外部晶振通过 PLL 模块产生了 CPU 的系统时钟 SYSCLKOUT,然后 SYSCLKOUT 经过低速预定标器之后输出低速时钟LSPCLK供给SCI。要保证 SCI 的正常运行,系统控制模块下必须使能 SCI 的时钟,也就是在系统初始化函数中需要将外设时钟控制寄存器PCLKCR的SCIAENCLK位置1。 从图 2,我们可以清楚的看到 SCIA 可以产生两个中断,SCIRXINTA 和 SCITXINTA,即发送中断和接收中断。 图2 SCIA的CPU接口SCI模块的其他一些特点见下面的表格:2、SCI模块发送和接受数据的原理SCI模块的工作原理如图3所示,之所以 SCI能工作于全双工模式,是因为它有独立的数据发送器和数据接收器,这样能够保证SCI既能够同时进行,也能够独立进行发送和接收的操作。 SCI 发送数据的过程如下:如图 3 右半部分所示,在FIFO 功能使能的情况下,首先,发送数据缓冲寄存器 SCITXBUF 从 TX FIFO中获取由CPU 加载的需要发送的数据,然后 SCITXBUF 将数据传输给发送移位寄存器 TXSHF,如果 SCI的发送功能使能,TXSHF则将接收到的数据逐位逐位的移到SCITXD引脚上。 SCI 接收数据的过程如下:如图 3 的左半部分所示,首先,接收移位寄存器 RXSHF 逐位逐位的接收来自于 SCIRXD 引脚的数据,如果 SCI 的接收功能使能,RXSHF 将这些数据传输给接收缓冲寄存器 SCIRXBUF,CPU就能从 SCIRXBUF读取外部发送来的数据。当然,如果FIFO功能使能的话,SCIRXBUF会将数据加载到RX FIFO的队列中,CPU再从 FIFO的队列读取数据。3、SCI的数据格式在 SCI中,通信协议体现在SCI的数据格式上。通常将 SCI的数据格式称之为可编程的数据格式,原因就是可以通过 SCI 的通信控制寄存器 SCICCR 来进行设置,规定通信过程中所使用的数据格式。SCI 使用的是 NRZ的数据格式,NRZ数据格式包括了如下表所示的内容:序号内容11 个起始位218 个数据位31 个奇/偶/非极性位412 个结束位5在地址位模式下,有1个用于区别数据或者地址的特殊位(仅用于多处理器通信)从上面的表中我们可以看到,真正的数据内容是18 位,1个字符的长度。我们通常将带有格式信息的每一个数据字符叫做一帧,在通信中常常是以帧为单位的。前面已经介绍过,SCI 有空闲线模式和地址位模式,而在平常使用的时候,我们一般都是两个处理器之间的通信,例如2812和 PC 机或者2812和 2812之间通信,这时候,我们更适合使用空闲线模式,而地址位模式一般用于多处理器之间的通信。在空闲线模式下,SCI发送或者接收一帧的数据格式如图4所示,其中 LSB是数据的最低位,MSB 是数据的最高位。具体的定义如图 4 所示的这些数据格式的寄存器是通信控制寄存器 SCICCR,其内容如图 5 所示。使用 SCICCR 进行数据格式编程如表2所示。4、SCI的波特率前面我们知道了 SCI 在通信时采用的数据格式的问题,那么 SCI 是以什么样的速度去发送这些数据的呢?这个速度就是由波特率来决定的。所谓的波特率就是指每秒所能发送的位数。2812 的每个 SCI都具有两个 8 位的波特率寄存器,SCIHBAUD 和 SCILBAUD,通过编程,可以实现达到 64K 不同的速率。波特率的计算公式如下所示:其中 BRR=波特率选择寄存器中的值,从十进制转换成十六进制后,高8 位赋值给 SCIHBAUD,低 8位赋值给 SCILBAUD。 值得注意的是,式1 所示的波特率公式仅仅适用于1BRR65535,当BRR=0时,波特率如下:我们举例来进行说明。例如外部晶振位 30M,经过 PLL 之后 SYSCLKOUT 为 150MHz,然后,当低速预定标器LOSPCP的值为2的时候, SYSCLKOUT经过低速预定标器之后产生低速外设时钟LSPCLK为37.5MHz,也就是说 SCI 的时钟为 37.5MHz。如果我们需要 SCI 的波特率为 19200,则将 LSPCLK 和波特率的数值代入式 1,便可得到:BRR=243.14,由于寄存器都是正整数,所以省略掉小数后可以得到 BRR=243。将 243 转换成16 进制是0xF3,因此 SCIHBAUD的值为0,SCIHBAUD的值为0XF3。由于省略了小数,将会产生0.06%的误差。当 LSPCLK 为37.5M时,对于 SCI常见的波特率,其寄存器的值如下表所示:在进行通信的时候,双方都必须以相同的数据格式和波特率进行通信,否则通信会失败。例如 2812和 PC 机上的串口调试软件进行通信时,2812 采用了什么样的数据格式和波特率,那么串口调试软件也需要设定成相同的数据格式和波特率,反之也一样,这是 SCI 通信不成功最简单,然而大家常常会忽略的问题。5、实验要求: 编写程序,打开串口调试工具,波特率设置在19200,数据位8,停止位1,其他无,然后输入一串数据,发送给DSP,DSP也将收到的数据原样回发给上位机.五、实验内容1实验准备(1)连接USB-UART数据线,USB端接计算机的USB,串行数据口接DSP的串口。(2)当计算机发现新设备时,安装USB驱动CH341SER;(3)打开计算机的设备管理器,查看端口,记下USB-SERIAL CH340(COM?),串口号COM后面的数字;(4)设置串口调试助手的通讯设置,和DSP程序中设置的要一致。2、按上次实验的方法连接实验设备;打开DSP电路板电源;3启动CCS2.2选择菜单DebugReset CPU;4打开工程文件;5、编写主程序main.c;6编译程序;7、运行程序,观察结果。通过CCS中FileLoad Program 装载Debug文件夹中的.out文件;Debug-GO Main;Debug-RUN(快捷键 F5)全速运行;8退出CCS。六、预习要求1了解DSP串行通信的原理。2波特率的计算及配置。七、思考:写出本实验中所设置的预定标系数,并写出计算波特率的过程。附程序:#include DSP28_Device.hunsigned int Sci_VarRx100;unsigned int i,j;unsigned int Send_Flag;void main(void)InitSysCtrl(); /初始化系统DINT; /关中断IER = 0x0000;IFR = 0x0000;InitPieCtrl(); /初始化PIE中断InitPieVectTable(); /初始化PIE中断矢量表 InitSci(); /初始化SCIA寄存器 for(i = 0; i 100; i+) Sci_VarRxi = 0; i = 0; j = 0; Send_Flag = 0; #if SCIA_INT /*设置中断服务程序入口地址*/EALLOW;/ This is needed to write to EALLOW protected registersPieVectTable.TXAINT = &SCITXINTA_ISR;PieVectTable.RXAINT = &SCIRXINTA_ISR;EDIS; / This is needed to disable write to EALLOW protected registers/*开中断*/IER |= M_INT9;#endifEINT; / Enable Global interrupt INTMERTM;/ Enable Global realtime interrupt DBGM for(;)if(SciaTx_Ready() = 1) & (Send_Flag = 1)SciaRegs.SCITXBUF = Sci_VarRxi;Send_Flag = 0;i+;if(i = j)i = 0;j = 0;#if !SCIA_INTif(SciaRx_Ready() = 1)Sci_VarRxj = SciaRegs.SCIRXBUF.all;Send_Flag = 1;j+;if(j = 100)j = 0;#endif 实验四、A/D及D/A转换实验课程: DSP实验 实验题目: A/D及D/A转换 实验日期: 2013年 12 月 19 日 姓名: 学号: 2 一、 实验目的1通过实验熟悉F28335A的定时器;2掌握F28335A片内AD的控制方法;3了解数模转换的基本操作; 4了解ICETEKF28335-A评估板扩展数模转换方式;5掌握数模转换程序设计方法。二、 实验设备计算机,示波器,ICETEK-F28335-A实验箱(或ICETEK仿真器+ICETEKF28335-A系统板+相关连线及电源)。三、 实验程序#include DSP2833x_Device.h / DSP2833x Headerfile Include File#include DSP2833x_Examples.h / DSP2833x Examples Include File/ Determine when the shift to right justify the data takes place/ Only one of these should be defined as 1./ The other two should be defined as 0.#define POST_SHIFT 0 / Shift results after the entire sample table is full#define INLINE_SHIFT 1 / Shift results as the data is taken from the results regsiter#define NO_SHIFT 0 / Do not shift the results/ ADC start parameters#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 0x0 / ADC module clock = HSPCLK/1= 25.5MHz/(1) = 25.0 MHz#define ADC_SHCLK 0x1 / S/H width in ADC module periods = 2 ADC cycle#define AVG 1000 / Average sample limit#define ZOFFSET 0x00 / Average Zero offset#define BUF_SIZE 1024 / Sample buffer size/ Global variable for this exampleUint16 SampleTableBUF_SIZE;Uint16 SampleTable1BUF_SIZE;Uint16 AD064;main() Uint16 i; Uint16 j,k; Uint16 array_index; Uint16 array_index1;/ Step 1. Initialize System Control:/ PLL, WatchDog, enable Peripheral Clocks/ This example function is found in the DSP2833x_SysCtrl.c file. InitSysCtrl();/ Specific clock setting for this example: EALLOW; SysCtrlRegs.HISPCP.all = ADC_MODCLK;/ HSPCLK = SYSCLKOUT/ADC_MODCLK EDIS;/ Step 2. Initialize GPIO:/ This example function is found in the DSP2833x_Gpio.c file and/ illustrates how to set the GPIO to its default state./ InitGpio(); / Skipped for this example/ Enable the pin GPIO34 as output EALLOW; GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; / GPIO pin GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; / Output pin 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 DSP2833x_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 DSP2833x_DefaultIsr.c./ This function is found in DSP2833x_PieVect.c. InitPieVectTable();/ Step 4. Initialize all the Device Peripherals:/ This function is found in DSP2833x_InitPeripherals.c/ InitPeripherals(); / Not required for this example InitAdc(); / For this example, init the ADC/ Specific ADC setup for this example: AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; / Sequential mode: Sample rate = 1/(2+ACQ_PS)*ADC clock in ns / = 1/(3*40ns) =8.3MHz (for 150 MHz SYSCLKOUT) / = 1/(3*80ns) =4.17MHz (for 100 MHz SYSCLKOUT) / If Simultaneous mode enabled: Sample rate = 1/(3+ACQ_PS)*ADC clock in ns AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; / 1 Cascaded mode AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; AdcRegs.ADCTRL1.bit.CONT_RUN = 1; / Setup continuous run AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; / Enable Sequencer override feature AdcRegs.ADCCHSELSEQ1.all = 0x10; / Initialize all ADC channel selects to A0 AdcRegs.ADCCHSELSEQ2.all = 0x0; AdcRegs.ADCCHSELSEQ3.all = 0x0; AdcRegs.ADCCHSELSEQ4.all = 0x0; AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x1; / convert and store in 8 results registers/ Step 5. User specific code, enable interrupts:/ Clear SampleTable for (i=0; iBUF_SIZE; i+) SampleTablei = 0; SampleTable1i = 0; for(i=0;i64;i+) AD0i=0;/ Start SEQ1 AdcRegs.ADCTRL2.all = 0x2000; for(;) array_index = 0; array_index1 = 0; for (i=0; i4); SampleTable1array_index1+= ( (AdcRegs.ADCRESULT1)4); for(j=0;j100;j+) k+; for (i=0; i4); SampleTable1i = (SampleTable1i) 4); GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1; / Break point 四、实验结果 实验五、PID算法控制实验实验课程: DSP实验 实验题目: PID算法控制实验 实验日期: 2013年 12 月 19 日 姓名: 学号: 一实验目的1掌握PID算法的原理和方法;2熟悉PID算法的特性;离散化公式:注:各符号含义如下u(t); 控制器的输出值。e(t); 控制器输入与设定值之间的误差。Kp; 比例系数。Ti; 积分时间常数。Td; 微分时间常数。T; 调节周期。对于增量式算法,可以选择的功能有:(1) 滤波的选择可以对输入加一个前置滤波器,使得进入控制算法的给定值不突变,而是有一定惯性延迟的缓变量。(2) 系统的动态过程加速在增量式算法中,比例项与积分项的符号有以下关系:如果被控量继续偏离给定值,则这两项符号相同,而当被控量向给定值方向变化时,则这两项的符号相反。由于这一性质,当被控量接近给定值的时候,反号的比例作用阻碍了积分作用,因而避免了积分超调以及随之带来的振荡,这显然是有利于控制的。但如果被控量远未接近给定值,仅刚开始向给定值变化时,由于比例和积分反向,将会减慢控制过程。为了加快开始的动态过程,我们可以设定一个偏差范围v,当偏差|e(t)|= 时,则不管比例作用为正或为负,都使它向有利于接近给定值的方向调整,即取其值为|e(t)-e(t-1)|,其符号与积分项一致。利用这样的算法,可以加快控制的动态过程。(3) PID增量算法的饱和作用及其抑制在PID增量算法中,由于执行元件本身是机械或物理的积分储存单元,如果给定值发生突变时,由算法的比例部分和微分部分计算出的控制增量可能比较大,如果该值超过了执行元件所允许的最大限度,那么实际上执行的控制增量将时受到限制时的值,多余的部分将丢失,将使系统的动态过程变长,因此,需要采取一定的措施改善这种情况。纠正这种缺陷的方法是采用积累补偿法,当超出执行机构的执行能力时,将其多余部分积累起来,而一旦可能时,再补充执行。PID位置算法离散公式:对于位置式算法,可以选择的功能有:a、滤波:同上为一阶惯性滤波b、饱和作用抑制: #include DSP2833x_Device.h / DSP2833x Headerfile Include File#include DSP2833x_Examples.h / DSP2833x Examples Include File#include ctr.h#include PID.h#include scancode.h/ Prototype statements for functions found within this errupt void cpu_timer0_isr(void);#define LEDS *(int *)0x180000#define port8000 (*(unsigned int *)0x208000)#define port8001 (*(unsigned int *)0x208001)#define port8002 (*(unsigned int *)0x208002)#define port8003 (*(unsigned int *)0x208003)#define port8004 (*(unsigned int *)0x208004)#define port8007 (*(unsigned int *)0x208007)void Gpio_select(void);void Gpio_PortB(void);void Gpio_PortA(void);void ShowParameters();void LCDPutString(unsigned int *pData,int x,int y,unsigned int nCharNumber,unsigned color);void PIDControl(int rk,int yk);char ConvertScanToChar(unsigned char cScanCode);void Delay(unsigned int nTime);/ 延时子程序Uint16 var1 = 0;Uint16 var2 = 0;Uint16 var3 = 0;Uint16 test_count = 0;Uint16 Test_flag = 0;Uint16 Test_var = 0;Uint16 Test_status32;int i=0,nnn;unsigned int nCount,nCount1,nCount2,nCount3,nJSSpeed,uWork,uN;unsigned int uLBD;float a=0.6f,b=0.2f,c=0.1f,duk;int ek,ek1,ek2,tz;int nInput;int nSSS,pwm;int md,wc;unsigned int nScreenBuffer1024;#define CTRGR *(int *)0x208000#define CTRLCDCMDR *(int *)0x208001#define CTRKEY *(int *)0x208001#define CTRLCDCR *(int *)0x208002#define CTRCLKEY *(int *)0x208002#define CTRLCDLCR *(int *)0x208003#define CTRLCDRCR *(int *)0x208004#define CTRLA *(int *)0x208005#define CTRLR *(int *)0x208007void main(void) unsigned int uPort8000;unsigned int nScanCode;unsigned char cKey;int speed100,sp,lj;float ljh;char strInput4;int i,w1,w2,w3;uLBD=nnn=0;nCount=nCount1=nCount2=nCount3=nJSSpeed=0;for ( sp=0;sp100;sp+ )speedsp=0;sp=nSSS=nCount=nCount1=nCount2=nJSSpeed=0; cKey=0; nInput=tz=wc=0;ek=ek1=ek2=0;for ( uWork=0;uWork4;uWork+ )strInputuWork=0;uN=100; md=41; pwm=50; InitSysCtrl(); DINT; InitPieCtrl(); InitXintf16Gpio();/ Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000; InitPieVectTa

温馨提示

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

评论

0/150

提交评论