实验报告jgh.docx
- 文档编号:29010928
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:22
- 大小:91.28KB
实验报告jgh.docx
《实验报告jgh.docx》由会员分享,可在线阅读,更多相关《实验报告jgh.docx(22页珍藏版)》请在冰豆网上搜索。
实验报告jgh
DSP短学期课程调试报告
课程名称:
DSP芯片应用系统设计
设计题目:
基于2812的电机控制系统设计
专业:
电气工程及其自动化
班级:
10自动化
(2)
设计者:
贾官洪
学号:
104173418
指导教师:
葛英辉
调试时间:
2012-7-17至2012-7-19
宁波大学信息科学与工程学院
一、设计目的
通过实验学习使用2812DSP的扩展I/O端口控制外围设备的方法,了解键盘的使用原理及编程方法;了解液晶显示器的显示控制原理及编程方法;掌握使用2812通用定时器的控制及中断服务程序的编程方法:
了解步进电机的控制方法。
通过C语言编程中断程序,控制2812DSP通用I/O管脚产生不同占空比的PWM信号,学习直流电机的控制原理及控制方法。
二、设计任务
利用小键盘控制电机的停转、转速和转向,并在液晶上实时显示电机当前运行状态以及设计者信息,实现双电机控制:
直流电机和步进电机,系统将采用查询的方式从键盘读取按键信息,然后按照转速设定驱动电机,完成正转、反转、加速、减速、启动和停止。
三、系统构成
四、调试过程
因为这次短学期课程是我们初次设计较为复杂的控制系统,所以我决定采取分割模块,逐个击破的调试方法。
1、实现对直流电机的控制:
由设计报告中直流电机工作原理可知,通过定时器0设置其中I/O端口以一定频率改变高低电平状态,输出方波,即可实现直流电机速度控制。
此外,只要对另外一I/O端口设置不同的电平,即可实现直流电机转向控制。
控制方式如下:
GpioDataRegs.GPADAT.bit.GPIOA4=1;nDir=0;//正转
GpioDataRegs.GPADAT.bit.GPIOA4=0;nDir=1;//反转
uN+=10;if(uN>90){uN=100;}//加速并控制最大转速
uN-=10;if(uN<30){uN=30;}//减速并控制最小转速
直流启动的实验具体代码如下:
uN=70;
uN1=uN;
uN=70;
Delay(128);
GpioDataRegs.GPADAT.bit.GPIOA4=1;
nDir=0;
Delay(128);
uN=uN1;//直流电机正传,与原来速度一样
zb=1;//zb为1则说明选择的为直流电机
2、实现对步进电机的控制:
本程序只要求实现正反转。
由设计报告中直流电机工作原理可知,控制的方法是设置IOPF4为高电平则顺时针转动,低电平为逆时针转动。
根据上述原理,对IOPF4口操作以控制转向。
其中:
nAddStep=-1为正向转动,nAddStep=1为反向转动。
步进启动的实验具体所需的代码如下:
uPort8000=CTRCLKEY;
*(int*)0x108007=0xc2;//开步进电机
nAddStep=-1;//正向
zb=2;//zb为2则说明选择的为步进电机
3、实现对双电机的控制:
双电机控制的基本原理是对直流电机和步进电机的结合,本程序中按键“3”选择双电机控制,直流和步进都正转启动代码如下:
nAddStep=-1;
uN=70;
uN1=uN;
Delay(128);
GpioDataRegs.GPADAT.bit.GPIOA4=1;
nDir=0;
Delay(128);
uN=uN1;
s=1;//用此变量标记为双电机模式
4、实现按键的调试:
键盘原理比较简单,只要有键盘输入时,读I/O扩展地址0x8001端口得到扫描代码。
读入语句如下:
nScanCode=*(int*)0x108001;//读扫描码
nScanCode&=0x0ff;//低8位
uPort8000=*(int*)0x108002;//
代码读入后要对其进行转换,即转换为按键对应是数字。
cKey=ConvertScanToChar(nScanCode);
nKeyCode=(cKey>='0'&&cKey<='9')?
(cKey-'0'):
(cKey-'A'+10);
至此我们可以看出,按键本质是对所按得键码进行进一步转换,以实现按键与具体数字相对应。
那我们所要编的这个转换程序就是实现0x18到0的转换,0x14到1的转换等等。
其实现代码如下为ConvertScanToChar(unsignedcharcScanCode)子函数。
此外,本程序设置的按键的功能具体设置如下:
•按‘1’键,选择直流电机并启动;
•按‘2’键,选择步进电机并启动;
•按‘3’键,选择双电机并启动;
•按‘4’键,电机正转(不改变当前转速),并显示状态;
•按‘5’键,电机反转(不改变当前转速),并显示状态;
•按‘6’键,调整电机转速为快档(不改变当前转向),并显示状态;
•按‘7’键,调整电机转速为慢档(不改变当前转向),并显示状态;
•按‘8’键,电机停止转动,返回电机选择界面;
•按‘9’键,电机停止转动;
注:
上述按键和液晶显示具体实现代码在最后给出。
4、字模的生成
利用老师提供的字模软件来对汉字进行取模的,取模时一定要按照液晶LCD控制芯片的显示数据格式。
这里选择纵向取模,高位在下。
对于数字取模,我查阅了资料,基本原理与汉字取模相同,整理出了数字的字模想量表以供调用。
以下列出名字字模样例:
unsignedcharname[3][32]=
{
//贾
{
0x02,0x02,0x3a,0xaa,0xaa,0xbe,0xaa,0xaa,0xaa,0xbe,0xaa,0xaa,0x3a,0x02,0x02,0x00,
0x00,0x80,0x80,0x5f,0x40,0x20,0x10,0x0e,0x10,0x20,0x60,0xdf,0x40,0x00,0x00,0x00,
},
//官
{
0x00,0x10,0x0c,0x04,0xf4,0x94,0x95,0x96,0x94,0x94,0xf4,0x04,0x14,0x0c,0x04,0x00,
0x00,0x00,0x00,0x00,0xff,0x44,0x44,0x44,0x44,0x44,0x44,0xfc,0x00,0x00,0x00,0x00,
},
//洪
{
0x08,0x30,0x01,0xe6,0x18,0x00,0x10,0xfe,0x10,0x10,0x10,0xfe,0x10,0x10,0x00,0x00,
0x04,0x04,0xff,0x00,0x82,0x42,0x32,0x0f,0x02,0x02,0x06,0x0b,0x32,0xe2,0x02,0x00,
},
};5、实现液晶显示模块和菜单的调试:
根据设计报告,对液晶显示的初步要求是在相应的行和列显示相应的文字,并可以通过按键在对步进电机进行控制的时候显示不同的文字。
由LCD液晶显示原理得知要操作这块液晶屏要对其输入命令和数据,命令用于控制如何显示,即在哪一页,哪一列,左半屏还是右半屏显示。
数据口用于向2812显示缓冲区输入要显示的数据,数据格式按照对应LCD控制芯片的要求来取。
液晶在显示之前首先要清除显示内存,否则会造成显示不清晰,与上次显示的数据重叠。
然后再打开显示,即:
LCDCLS();//清除显示内存
TurnOnLCD();//打开显示
清除显示内存本质上就是对左半屏和右半屏数据口送入0,代码实现如下:
voidLCDCLS()//清除屏幕显示内容
{
inti,j;
CTRLCDCMDR=LCDCMDSTARTLINE;//液晶命令寄存器CTRLCDCMDR写打开
Delay(LCDDELAY1);
CTRLCDCR=0;
Delay(LCDDELAY1);
for(i=0;i<8;i++)
{
CTRLCDCMDR=LCDCMDPAGE+i;//操作页
Delay(LCDDELAY1);
CTRLCDCR=0;
Delay(LCDDELAY1);
CTRLCDCMDR=LCDCMDVERADDRESS;//操作列
Delay(LCDDELAY1);
CTRLCDCR=0;
Delay(LCDDELAY1);
for(j=0;j<64;j++)
{
CTRLCDLCR=0;
Delay(LCDDELAY1);
CTRLCDCR=0;
Delay(LCDDELAY1);
}
CTRLCDCMDR=LCDCMDPAGE+i;
Delay(LCDDELAY1);
CTRLCDCR=0;
Delay(LCDDELAY1);
CTRLCDCMDR=LCDCMDVERADDRESS;
Delay(LCDDELAY1);
CTRLCDCR=0;
Delay(LCDDELAY1);
for(j=0;j<64;j++)
{
CTRLCDRCR=0;
Delay(LCDDELAY1);
CTRLCDCR=0;
Delay(LCDDELAY1);
}
}
}
而打开显示即向LCD液晶模块的命令口送入打开显示的命令,与此同时还要设置显示的起始行等显示参数。
接下来就是要实现如何在液晶屏指定的行和列上显示16×16的汉字。
这一步实现的时候主要要解决左右半屏显示的问题。
需要通过判断所要显示的文字所在列是否超出左半屏列的最大范围,超出后就要重新设置列号,并向右半屏数据口写入数据。
当然在判别左右半屏之前要先设定好操作页,即要在哪一行上进行显示。
显示部分实现代码可以调用一下子函数:
voiddisplay16(intpage,intline,intnumber,unsignedchar(*pos)[32])
{
inti,n,p,m;
for(n=0;n {p=0;for(m=0;m<2;m++)//每个字需要显示2个页 { CTRLCDCMDR=LCDCMDPAGE+m+page;//设置操作页=m+page CTRLCDCR=0;delay(LCDDELAY1); CTRLCDCMDR=LCDCMDVERADDRESS+n*16+line;//起始列=n*16+line CTRLCDCR=0;delay(LCDDELAY1); for(i=0;i<16;i++,p++) {if((n*16+line+i)<64) {CTRLCDLCR=pos[n][p];//屏幕左侧第1至32行第i列赋值 CTRLCDCR=0;//(赋值后当前操作列自动加1,所以不需设置) delay(LCDDELAY1);} else{ CTRLCDCMDR=LCDCMDVERADDRESS+n*16+line+i-64;//超出左屏幕范围,右半屏幕显示 CTRLCDCR=0;delay(LCDDELAY1);/*命令是需要延时的*/ CTRLCDRCR=pos[n][p];//屏幕左侧第1至32行第i列赋值 CTRLCDCR=0;//(赋值后当前操作列自动加1,所以不需设置) delay(LCDDELAY1); } } }}} 6、各部分调试基本已经完成,需要对电机整体协调控制: 首先要做的是如何对直流电机对应的定时器0周期中断产生时,所要做的中断服务程序。 对照其工作原理,即要求中断服务程序产生PWM波,以实现对直流电机和步进电机驱动控制。 实现代码如下: interruptvoidcpu_timer0_isr(void) { CpuTimer0.InterruptCount++; PieCtrlRegs.PIEACK.all=PIEACK_GROUP1; CpuTimer0Regs.TCR.bit.TIF=1; CpuTimer0Regs.TCR.bit.TRB=1; GpioDataRegs.GPBSET.bit.GPIOB4=1; GpioDataRegs.GPBDAT.bit.GPIOB4=(nCount1 1: 0;//判别2者值来设置占空比 nCount1++;nCount1%=100; *(int*)0x108007=pwm2[nStep];//根据nStep送pwm2里的控制字 nStep+=nAddStep;//根据nAddStep值来改变送pwm2里的控制字,改变步进的方向 if(nStep<0)nStep=7; elseif(nStep>7)nStep=0; nCount++;nCount%=64; StopCpuTimer0(); Delay(6); *(int*)0xc0000^=0x1; StartCpuTimer0(); } 五、调试中遇到的问题及解决办法 在整个调试的过程中,我遇到了一些问题,在不断的尝试和同学们的帮助下,我都顺利的解决了,现在就我遇到的问题做下汇总: 问题1: 在开始调试液晶显示屏时,能够正常显示,但是显示出来的姓名却是乱码情况。 解决方法: 在经过再一次仔细阅读参考资料后发现字模软件生成代码是出错,忘记勾选“纵向取模,高位在下”项,生成的代码不符合要求,所以从新使用字模软件生成相应代码。 问题2: 显示正常以后,又出现了按键设置的问题,问题现象是程序运行以后,按键没有反应,系统无法识别按键信号从而导致系统无法正常工作。 解决方法: 在进行按键程序调试,调整了按键识别程序段的延时程序后此问题得到了很好的解决。 而点击已经能够受到键盘的控制。 步进电机也能够初步完成按键控制的转速与转向控制。 问题3: 步进电机控制调试时,发现直流电机能启动,但是步进电机有震感就是启动不了。 解决方法: 经过托同学的提醒,我发现前面的程序一直都是在直流电机的工程文件下进行的,但是步进电机一定要在步进电机的工程文件下才能启动,在复制过去后步进电机能够正常启动。 问题4: 步进电机控制调试时,发现系统启动时运行没问题,但一旦停停转后再启动就启动不了了。 解决方法: 经反复检查发现停转后,步进电机的启动频率太低,没满足最低要求500pps,所以导致启动不了。 解决办法即更改定时器0的值,设置得小一点。 这样就可以启动步进电机了。 六、实验结果 利用小键盘控制电机的停转、转速和转向,并在液晶上实时显示电机当前运行状态以及学生姓名和学号。 如下可实现双菜单选择: 初始界面: 具体操作举例如下: 如果选择1后再选择4则显示: 如果选择2后再选择5则显示: 如果选择3后再选择5则显示: 又选择6,则显示: 如果选择1后再选择5后又选择6,则显示: 如果选择1或2或3进去后再选择9,则显示: 七、课程设计总结 通过这一个多星期的DSP课程设计,让我对TMS320F2812芯片有了更为深刻的了解,熟悉了ICETEK-F2812-A教学实验箱主要功能模块和DSP2000系列的开发流程。 本次课程的设计调试是对我们上一学期所学知识的综合考验。 要求掌握DSP芯片的结构、功能和接口原理,,使我们对电机及其数字控制有较为系统的了解,以便为进一步解决更多实际问题打下基础,较为系统地掌握电机控制系统的硬件和软件设计方法,有助于我们快速地了解整个电机的DSP控制系统的框架、需要设计的重点及难点。 此次设计中我们遇到了一些问题,在顺利完成之后,我深刻感知开发一套系统的不易,从最初的设计思想,进而是总体原理图及流程图的设计,再者要对所使用的模块进行深入研究,熟悉各模块的工作特性,并能熟练驱动。 要充分查阅网络资料,尽可能多的了解前人已经做过的工作。 在调试时,要能够冷静对待,遇到问题不惊慌。 深入分析,充分利用软件的单步调试功能,缩小错误范围。 对于液晶显示模块,要尽可能多的对其进行了解,充分认识到人机交互的重要性,一个系统不仅仅要拥有良好的运行效果,还要有高效简洁的人机交互界面,让使用者能够较为快速的掌握它。 今后,我觉得做任何事都要沉下心去做,不能浮躁,要有耐心,不断完善细节,多从用户的角度进行思考,要充分考虑多方面的因素,从而能够全方面的完成一个任务,解决一个问题。 同时,我们要注重个人能力的提高固然不错,但更要懂得协作和虚心求教。 以后的任务可能会会越来越复杂,唯有通过合作和交流才能取得成功,所以要虚心向别人学习,充分了解别人的长处,以其能够达到最大效率。 附: 按键和液晶显示代码: while (1) { if(nCount==0){ nScanCode=*(int*)0x108001;//读扫描码 nScanCode&=0x0ff;//低8位 uPort8000=*(int*)0x108002; //Delay(5); if(nScanCode! =0) { if(nScanCode==9){{LCDCLS(); display16(0,0,3,yituichu); display16(4,0,4,name); display16(6,0,5,xuehao);}break;}//输入9,停止 num=cKey; cKey=nScanCode; switch(cKey) { case1: {if(zb! =2&&zb! =3){ uN=70; uN1=uN; uN=70;//降速 Delay(128); GpioDataRegs.GPADAT.bit.GPIOA4=1; nDir=0; Delay(128); uN=uN1;//直流电机正传,与原来速度一样 zb=1; if(cKey! =num) { LCDCLS(); display16(0,0,1,shuzi4); display16(0,16,2,zhengzhuan); display16(0,64,1,shuzi5); display16(0,80,2,fanzhuan); display16(2,0,1,shuzi6); display16(2,16,2,jiasu); display16(2,64,1,shuzi7); display16(2,80,2,jiansu); display16(4,0,1,shuzi8); display16(4,16,2,fanhui); display16(4,64,1,shuzi9); display16(4,80,2,tingzhi); } } }break; case2: {if(zb! =1&&zb! =3){nAddStep=0;//正向 zb=2; if(cKey! =num) { LCDCLS(); display16(0,0,1,shuzi4); display16(0,16,2,zhengzhuan); display16(0,64,1,shuzi5); display16(0,80,2,fanzhuan); display16(4,0,1,shuzi8); display16(4,16,2,fanhui); display16(4,64,1,shuzi9); display16(4,80,2,tingzhi); }} }break; case3: { if(zb! =1&&zb! =2){nAddStep=-1; uN=70; uN1=uN; uN=70;//降速 Delay(128); GpioDataRegs.GPADAT.bit.GPIOA4=1; nDir=0; Delay(128); uN=uN1;//直流电机正传,与原来速度一样 s=1; if(cKey! =num) { LCDCLS(); display16(0,0,1,shuzi4); display16(0,16,2,zhengzhuan); display16(0,64,1,shuzi5); display16(0,80,2,fanzhuan); display16(2,0,1,shuzi6); display16(2,16,2,jiasu); display16(2,64,1,shuzi7); display16(2,80,2,jiansu); display16(4,0,1,shuzi8); display16(4,16,2,fanhui); display16(4,64,1,shuzi9); display16(4,80,2,tingzhi); }} }break; case4: if(zb==1||s==1) { d+=1;f=0; uN1=uN; uN=60;//降速 Delay(128); GpioDataRegs.GPADAT.bit.GPIOA4=1; nDir=0; Delay(128); uN=uN1;//直流电机正传,与原来速度样 } if(zb==2||s==1) { d+=1;f=0; nAddStep=-1; }//正向 if(cKey! =num) { LCDCLS(); display16(0,0,5,xuehao); display16(2,0,4,name); if(zb==1){display16(4,16,2,zhiliu);} elseif(zb==2){display16(4,16,2,bujin);} elseif(s==1){display16(4,0,3,shuangdianji);} if(d>0){display16(4,64,2,zhengzhuan);}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告 jgh