DSP综合实验报告Word文档下载推荐.docx

上传人:b****5 文档编号:19132551 上传时间:2023-01-04 格式:DOCX 页数:23 大小:99.40KB
下载 相关 举报
DSP综合实验报告Word文档下载推荐.docx_第1页
第1页 / 共23页
DSP综合实验报告Word文档下载推荐.docx_第2页
第2页 / 共23页
DSP综合实验报告Word文档下载推荐.docx_第3页
第3页 / 共23页
DSP综合实验报告Word文档下载推荐.docx_第4页
第4页 / 共23页
DSP综合实验报告Word文档下载推荐.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

DSP综合实验报告Word文档下载推荐.docx

《DSP综合实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《DSP综合实验报告Word文档下载推荐.docx(23页珍藏版)》请在冰豆网上搜索。

DSP综合实验报告Word文档下载推荐.docx

四.实验原理

1.事件管理器说明

DSP281x处理器包含EVA和EVB2个事件管理器,每个事件管理器包含通用定时器(GP)、比较器、PWM单元、捕获单元以及正交编码脉冲电路(QEP),事件管理器结构见图6.1,PWM单元主要有两方面的应用:

一是产生脉宽调制信号控制数字电机,另外一个是直接用PWM输出作为A/D转换使用。

事件管理器的捕获单元用来对外部硬件信号的时间进行测量,利用6个边沿检测单元测量外部信号的时间差,从而确定电机转子的转速,正交编码脉冲电路根据增量编码器信号获得电机转子的速度和方向信息。

通用定时器相关寄存器有GPTCONA(通用定时器全局控制寄存器)、TxCNT(通用定时器计数寄存器)、TxCMPR(通用定时器比较寄存器)、TxPR(通用定时器周期寄存器)、TxCON(通用定时器控制寄存器)。

比较单元相关寄存器有COMCONA(比较控制寄存器)、ACTRA(比较操作控制寄存器)、DBTCONA(死区定时器控制寄存器)、CMPRx(比较寄存器)。

事件管理器模块的具体内容参见课程教材第九章,学习事件管理器的基本原理,熟悉各个模块的功能(课程设计中需要使用通用定时器、比较单元,正交编码脉冲单元和事件管理器中断中的功能),理解各模块寄存器的功能及配置使用方法,为综合课程设计做好准备。

图6.1事件管理器结构图

2.电机自带的驱动箱使用说明

电机自带驱动箱可直接驱动电机,驱动箱需要接入电源,控制信号只需一路PWM信号,

直流电机及其驱动箱简易接线图如图1。

L1、L2为电机驱动信号,U+、U-为电机编码盘电源(5V电源供电),A、B为编码器输出信号。

图1电机及其驱动箱简易接线图

驱动箱输入的一路PWM信号可用导线直接从DSP扩展实验箱上的跳线插座JP407中选

取一路接入(如PWM1)。

当PWM1占空比为100%时,电机为正向转速最快;

当PWM1占空比为0%时为电机反向转速最快,当PWM1占空比为50%时,电机不转。

五、实验方案

实验中用事件管理器a输出PWM,选PWM2作为电机驱动信号。

要实现电机正反转及速度的调节,就需要对PWM信号占空比进行调节。

为此需修改相应比较器的值。

实验最终选取通用定时器1的计数周期为0x9000,即9*16*16*16,实验箱提供了4个按键,可表示0-15共16个数字。

于是可以产生16个比较器的值,每段间隔9*16*16。

实验中利用变量num(1-16变化)来决定比较器值:

num*9*16*16。

且实验中发现,num为1-8时,电机反转;

为9-12时,电机进入死区,停止转动;

为13-16时,电机正转。

这样就实现了电机反转8级调速,正转4级调速。

电机转速的测量则利用如下公式计算得到:

即转过一定的圈数与所需的时间的比值。

具体实现见代码注解。

主要代码如下:

主程序for循环如下:

for(;

;

{

//利用4位数码管显示速度

DisBuffer[3]=(int)Speed%1000;

//个位

DisBuffer[2]=(int)Speed/10%10;

//十位

DisBuffer[1]=(int)Speed/100%10;

//百位

DisBuffer[0]=(int)Speed/1000%10;

//千位

DisBuffer[4]=0;

//其他位清零

DisBuffer[5]=0;

DisBuffer[6]=0;

DisBuffer[7]=0;

//赋值给数码管

WriteWord(Digit0,DisBuffer[3]);

WriteWord(Digit1,DisBuffer[2]);

WriteWord(Digit2,DisBuffer[1]);

WriteWord(Digit3,DisBuffer[0]);

WriteWord(Digit4,DisBuffer[7]);

WriteWord(Digit5,DisBuffer[6]);

WriteWord(Digit6,DisBuffer[5]);

WriteWord(Digit7,DisBuffer[4]);

//变量abcd记录4个开关按下情况,为方便处理,做如下简单处理,开关按下时为1

//其中abc做调速用d控制转向

a=1-GpioDataRegs.GPBDAT.bit.GPIOB2;

//开关0

b=1-GpioDataRegs.GPBDAT.bit.GPIOB3;

//开关1

c=1-GpioDataRegs.GPBDAT.bit.GPIOB4;

//开关2

d=1-GpioDataRegs.GPBDAT.bit.GPIOB5;

//开关3

if(d==1)//开关3按下,改变方向

{

change=0;

//标记abc是否有键按下

ttt++;

//ttt为1表示反转为2表示正转

if(ttt>

2)//开关3按下,ttt递增,做12循环变化,实现控制转向

ttt=1;

}

if(ttt==1)//反转

if(change==0)//缺省状态下abc未按下(刚改变方向)

{

num=8;

//设定初始比较器值,从而设定初始PWM占空比

}

if(a==1||b==1||c==1)//开关012有键按下

change=1;

//改变标记变量

num=8-4*c-2*b-a;

//计算num,num变化范围1-8

delayX10ms(0x64);

//延时,按键防抖

if(ttt==2)//正转

if(change==0)//设定初始比较器值,从而设定初始PWM占空比

num=13;

if(a==1||b==1||c==1)//有按键按下

//改变标记变量

num=13+2*b+a;

//改变num,num变化范围13-16

//延时,按键防抖

EvaRegs.CMPR1=num*9*16*16;

//更新比较器值

}

//PWM初始化

voidinit_PWM(void)

{

//InitializeEVATimer1:

//SetupTimer1Registers(EVA)

EvaRegs.GPTCONA.all=0;

EvaRegs.T1PR=0x9000;

//设置周期,即PWM周期

EvaRegs.T1CMPR=0x3C00;

//Timer1compare

EvaRegs.T1CNT=0x0000;

//设置计数初值

EvaRegs.T1CON.all=0x0842;

//设置计数模式,使能定时器和比较操作,

//比较器赋值

EvaRegs.CMPR1=8*9*16*16;

//EvaRegs.CMPR2=0x69f6;

//EvaRegs.CMPR3=0x7fff;

//控制比较操作

EvaRegs.ACTRA.all=0x0666;

EvaRegs.DBTCONA.all=0x0000;

//禁止无控制作用区

EvaRegs.COMCONA.all=0xA600;

//事件管理器初始化

voidinit_QEP(void)

//InitializeEVATimer2:

//SetupTimer2Registers(EVA)

//SetthePeriodfortheGPtimer2to0x0200;

EvaRegs.T2PR=M1;

//设置脉冲计数个数

EvaRegs.T2CNT=0x0000;

//计数初值为0

EvaRegs.T2CON.all=0x1870;

//方向加减计数,QEP作为时钟源,使能定时器

EvaRegs.CAPFIFOA.all=0x0000;

//清捕捉状态标志

EvaRegs.CAPCONA.all=0x0000;

//允许QEP,禁止CAP1,2

//EnablePeriodinterruptbitsforGPtimer2

EvaRegs.EVAIMRB.bit.T2PINT=1;

//使能周期中断

EvaRegs.EVAIFRB.bit.T2PINT=1;

//中断标志位复位

//定时器初始化

voidinit_evb_timer3(void)

//InitializeEVBTimer3:

//SetupTimer3Registers(EVB)

EvbRegs.GPTCONB.all=0;

//SetthePeriodfortheGPtimer3to0x0200;

EvbRegs.T3PR=0xFFFF;

//Period

EvbRegs.T3CNT=0x0000;

EvbRegs.T3CON.all=0x1040;

//EnablePeriodinterruptbitsforGPtimer3

//Countup,x128,internalclk,enablecompare,useownperiod

EvbRegs.EVBIMRA.bit.T3PINT=1;

EvbRegs.EVBIFRA.bit.T3PINT=1;

//事件管理器中断服务子程序

interruptvoidQep_isr(void)

Uint32Count=0;

QEPInterruptCount++;

//根据EvbRegs.T3CNT和Timer3InterruptCount计算M2;

M2=EvbRegs.T3CNT+Timer3InterruptCount*65536;

Count=M1;

Count++;

Speed=Count*75*10000*1.25/M2;

//根据Count,M2计算Speed;

Timer3InterruptCount=0;

//Enablemoreinterruptsfromthistimer

//使能EvaRegs.EVAIMRB.bit.T2PINT;

//Note:

Tobesafe,useamaskvaluetowritetotheentire

//EVAIFRBregister.Writingtoonebitwillcausearead-modify-write

//operationthatmayhavetheresultofwriting1'

stoclear

//bitsotherthenthoseintended.

EvaRegs.EVAIFRB.all=BIT0;

//AcknowledgeinterrupttoreceivemoreinterruptsfromPIEgroup3

PieCtrlRegs.PIEACK.all=PIEACK_GROUP3;

速度的计算公式由来:

Timer3InterruptCount表示定时器中断次数,每计满65536个周期中断一次

EvbRegs.T3CNT当前计数器值,即未记满65536个周期的周期数

M2=EvbRegs.T3CNT+Timer3InterruptCount*65536则M2表示转过固定的圈数所花费的周期数

Count=M1;

Count++;

Count=M1+1表示脉冲数设定值

QEP中断触发条件是记录到M1个脉冲

将Count转换为圈数:

Count/4/1200=Count/4800(1200为每圈脉冲数,除以4是因为脉冲计数器同时记录AB相上升沿下降沿,故实际脉冲数为总脉冲数的1/4)

M2转换为所花费的时间:

M2/75M

于是可以得到

六、实验小结

初次接触事件管理器的相关编程,开始时抱着书看了很久,希望利用定时中断实现测速,但翻阅书本的过程中发现自己对事件管理器的理解很有很大的差距,对于前后的关系还不是很清楚,或者说不知道如何具体操作,给自己代码可以看得懂,明白其中的工作原理,但是让自己编写却有很大的困难。

最后大实验的Qep部分老师给了代码,实验的时候因为时间很紧,对代码没有细细看,只是知道可以测速,然后把显示和自己的调速部分加上,也便差不多了。

所以在验收完写实验报告的时候又细细看了一次代码,明白了如何具体实现相同路程测时间来测速的方法。

从开始的硬件起步实验到最后的课程综合设计实验,所需要编写的代码都不是很多,更重要的在于理解,理解各部分的工作原理,这样编程的时候就会事半功倍。

综合设计实验中用到的直流励磁电机是自控基础实验中已经摆弄了许久的,所以也是比较熟悉的,电机的接线便没有碰到什么困难。

这种软硬件相结合的实验总是能给人以极大的乐趣,看着自己编写的代码功能,可以在相应的硬件上直观的显示出来很是鼓舞人,当然这是因为硬件部分不需我们自己动手去调试,在保证硬件设施没有问题的情况下才会显得较为容易。

如果一开始硬件电路的设计与实现也由自己来逐步完成,那就可能会碰到许许多多的问题,那样的经历应该就像毕业设计了吧。

附录:

//###########################################################################

//

//SystemName:

//DCMOTOR

//FileName:

//DCMOTOR.C

//Description:

//PrimarysystemfilefortheRealImplementationofSensored

//speed/PositionControlforaPermanent-MagnetDCMotor

//Originator:

//DigitalcontrolsystemsGroup-TexasInstruments

//Note:

//Inthissoftware,thedefaultinverterissupposedtobeDMC550board.

//

#include"

DSP281x_Device.h"

//DSP281xHeaderfileIncludeFile

DSP281x_Examples.h"

//DSP281xExamplesIncludeFile

#defineM10x00ff;

#definedis_CLKGpioDataRegs.GPFDAT.bit.GPIOF2

#definedis_DINGpioDataRegs.GPFDAT.bit.GPIOF0

#definedis_LOADGpioDataRegs.GPFDAT.bit.GPIOF3

#defineNoOp0x00/*空操作*/

#defineDigit00x01/*数码管1*/

#defineDigit10x02/*数码管2*/

#defineDigit20x03/*数码管3*/

#defineDigit30x04/*数码管4*/

#defineDigit40x05/*数码管5*/

#defineDigit50x06/*数码管6*/

#defineDigit60x07/*数码管7*/

#defineDigit70x08/*数码管8*/

#defineDecodeMode0x09/*译码模式*/

#defineIntensity0x0a/*亮度*/

#defineScanLimit0x0b/*扫描界限*/

#defineShutDown0x0c/*掉电模式*/

#defineDisplayTest0x0f/*显示测试*/

#defineShutdownMode0x00/*掉电方式工作*/

#defineNormalOperation0x01/*正常操作方式*/

#defineDecodeDigit0xff/*译码位数设置*/

#defineIntensityGrade0x0a/*显示亮度级别设置*/

#defineScanDigit0x07/*扫描位数设置*/

#defineTestMode0x01/*显示测试方式*/

#defineTextEnd0x00/*显示测试结束,正常工作*/

unsignedcharDisBuffer[8]={0,0,0,0,0,0,0,0};

/*显示缓存区*/

unsignedchardispaly_list[]=

0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,/*0,1,2,3,4,5,6,7,8,9*/

0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff,0x00};

/*A,B,C,D,E,F,P,U,全

亮,全灭*/

inti=0;

intj;

inta,b,c,d;

intnum;

intttt=1;

intchange=0;

voiddelayX10ms(intcount);

voidSendChar(intch);

voidWriteWord(intaddr,intnum);

voidInitDis(void);

//函数声明

//Prototypestatementsforfunctionsfoundwithinthisfile.

//interruptvoideva_timer1_isr(void);

interruptvoidQep_isr(void);

interruptvoidevb_timer3_isr(void);

//interruptvoidevb_timer4_isr(void);

voidinit_PWM(void);

voidinit_QEP(void);

voidinit_evb_timer3(void);

//voidinit_evb_timer4(void);

//全局变量定义

//Globalcountsusedinthisexample

Uint32QEPInterruptCount;

Uint32Timer3InterruptCount;

Uint32M2;

float32Speed;

voidmain(void)

//Step1.InitializeSystemControl:

//PLL,WatchDog,enablePeripheralClocks

//ThisexamplefunctionisfoundintheDSP281x_SysCtrl.cfile.

InitSysCtrl();

/**********************************************************************

//高速外设时钟设置=SYSCLKOUT,默认值为SYSCLKOUT/2

//HISPCPprescaleregistersettings,normallyitwillbesettodefaultvalues

//EALLOW;

//ThisisneededtowritetoEALLOWprotectedregisters

//SysCtrlRegs.HISPCP.all=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1