DSP综合实验报告.docx
- 文档编号:6132319
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:23
- 大小:99.40KB
DSP综合实验报告.docx
《DSP综合实验报告.docx》由会员分享,可在线阅读,更多相关《DSP综合实验报告.docx(23页珍藏版)》请在冰豆网上搜索。
DSP综合实验报告
东南大学
《TMS320X281XDSP原理及C程序开发》
实验报告
直流电机控制实验
姓名:
学号:
专业:
自动化实验室:
实验时间:
2011年05月27日报告时间:
2010年05月29日
评定成绩:
审阅教师:
一.实验目的
1.了解DSP2812芯片的事件管理器的功能;
2.熟悉DSP2812芯片的事件管理器的使用设置方法;
3.了解PWM的概念,掌握利用事件管理器产生PWM波形的方法。
二.实验设备
1.PC机一台,操作系统为WindowsXP(或Windows98、Windows2000),安装了ccs3.1;
2.TI2000系列的TMS320F2812eZdsp开发板一块;
3.扩展实验箱一台;
4.示波器一台;
5.直流电机及其驱动箱一套。
三.设计要求
课程设计中使用的直流电机(THBLD-1型力矩电机控制)驱动有两种方式,可以使用其自带的驱动箱,也可以使用扩展实验箱中的驱动电路,因此可任选一种方式完成课程设计,具体要求:
使用电机自带的驱动箱
1利用DSP的事件管理器产生一路PWM接入驱动箱,控制电机;
2利用按键检测控制电机,一个按键控制电机正转和反转(按键一次改变电机转向),另一个按键控制电机转速(三级调速,按键一次改变一次速度);
3利用QEP采样电路检测电机转速;
4数码管显示电机当前转速。
四.实验原理
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);//延时,按键防抖
delayX10ms(0x64);
delayX10ms(0x64);
delayX10ms(0x64);
delayX10ms(0x64);
delayX10ms(0x64);
delayX10ms(0x64);
delayX10ms(0x64);
delayX10ms(0x64);
delayX10ms(0x64);
}
}
if(ttt==2)//正转
{
if(change==0)//设定初始比较器值,从而设定初始PWM占空比
{
num=13;
}
if(a==1||b==1||c==1)//有按键按下
{
change=1;//改变标记变量
num=13+2*b+a;//改变num,num变化范围13-16
delayX10ms(0x64);//延时,按键防抖
delayX10ms(0x64);
delayX10ms(0x64);
delayX10ms(0x64);
delayX10ms(0x64);
delayX10ms(0x64);
delayX10ms(0x64);
delayX10ms(0x64);
delayX10ms(0x64);
delayX10ms(0x64);
}
}
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)
EvaRegs.GPTCONA.all=0;
//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;
EvbRegs.T3CNT=0x0000;
Timer3InterruptCount=0;
//Enablemoreinterruptsfromthistimer
EvaRegs.EVAIMRB.bit.T2PINT=1;//使能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
#include"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文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP 综合 实验 报告