DSP短学期 实验报告.docx

上传人:b****6 文档编号:8740897 上传时间:2023-05-14 格式:DOCX 页数:40 大小:154.39KB
下载 相关 举报
DSP短学期 实验报告.docx_第1页
第1页 / 共40页
DSP短学期 实验报告.docx_第2页
第2页 / 共40页
DSP短学期 实验报告.docx_第3页
第3页 / 共40页
DSP短学期 实验报告.docx_第4页
第4页 / 共40页
DSP短学期 实验报告.docx_第5页
第5页 / 共40页
DSP短学期 实验报告.docx_第6页
第6页 / 共40页
DSP短学期 实验报告.docx_第7页
第7页 / 共40页
DSP短学期 实验报告.docx_第8页
第8页 / 共40页
DSP短学期 实验报告.docx_第9页
第9页 / 共40页
DSP短学期 实验报告.docx_第10页
第10页 / 共40页
DSP短学期 实验报告.docx_第11页
第11页 / 共40页
DSP短学期 实验报告.docx_第12页
第12页 / 共40页
DSP短学期 实验报告.docx_第13页
第13页 / 共40页
DSP短学期 实验报告.docx_第14页
第14页 / 共40页
DSP短学期 实验报告.docx_第15页
第15页 / 共40页
DSP短学期 实验报告.docx_第16页
第16页 / 共40页
DSP短学期 实验报告.docx_第17页
第17页 / 共40页
DSP短学期 实验报告.docx_第18页
第18页 / 共40页
DSP短学期 实验报告.docx_第19页
第19页 / 共40页
DSP短学期 实验报告.docx_第20页
第20页 / 共40页
亲,该文档总共40页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

DSP短学期 实验报告.docx

《DSP短学期 实验报告.docx》由会员分享,可在线阅读,更多相关《DSP短学期 实验报告.docx(40页珍藏版)》请在冰点文库上搜索。

DSP短学期 实验报告.docx

DSP短学期实验报告

DSP应用系统设计实验报告

一、设计任务

通过矩阵键盘的输入,利用TMS320LF2407的事件管理模块,可以简单有效的控制步进电机的停转、转速和转向。

系统中设计了相应的人机界面,进行相应变量的显示、操作即可在液晶上实时显示电机当前运行状态。

利用拓展端口控制外围设备的方法,掌握使用2407DSP通用计时器的控制原理及中断服务程序的编程方法;了解蜂鸣器发生原理和音乐发生方法;了解步进电机的使用方法;了解液晶显示控制原理及编程方法及小键盘的应用。

该实验设计分成4个模块完成:

•液晶模块

•键盘模块

•电机模块

•其它模块(蜂鸣器、点阵)

具体化即:

1.DSP芯片接受矩阵键盘的输入。

2.DSP芯片对LED灯,蜂鸣器控制模块。

3.DSP芯片对相应信息的反馈,即:

LCD液晶显示。

4.DSP控制电机正反转以及对电机速度调节。

二、系统构成及子模块原理:

1.硬件原理方框图1所示,该系统由LCD液晶显示模块、矩阵键盘模块、电机模块及包含蜂鸣器和点阵的模块组成。

 

 

图1硬件原理方框图

 

2:

系统总流程图:

3:

子模块工作原理

a.键盘输入:

键盘在信号采集系统中是一个很关健的部件,它能向系统输入数据、传送命令等功能,是人工干预系统的主要手段,键盘输入功能主要提供控制信号和数据的输入。

键盘的扫描码由DSP的I/O扩展地址0x8001给出,当有键盘输入时,读此端口得到扫描码,当无键按下时读此端口的结果为0。

各按键的扫描码排列如下所示。

0x18,0x14,0x12,0x110123

0x28,0x24,0x22,0x214567

0x48,0x44,0x42,0x4189AB

0x88,0x84,0x82,0x81CDEF

扫描码对应键值

也即,当读8001H端口时,如果其值为‘18H’,则表示键盘按下的键是“0”,如果其值为‘0’,则表示没有键按下。

将键盘扫描得到的数据存入内存,然后根据数据值就能够确定所输入的键,通过映射关系,就能过将每一个键设为特定的功能。

读键盘输入值的语句如下:

nScanCode=port8001;

nScanCode&=0x0ff;

端口在被读一次取以后就将端口值置为0,准备下一个按键的输入。

输入的数据保存在nScanCode中,nScanCode同0x0ff与是把nScanCode的高位清零。

b.蜂鸣器控制原理:

其中蜂鸣器由DSP通用I/O管脚IOPC6输出控制,可将此管脚上的频率输出转换成声音输出。

控制的方法是使用DSP通用定时器设置IOPC6以一定的频率改变高低状态,输出方波。

c.LCD显示原理:

由于LCD具有低功耗、体积小、质量轻、超薄等诸多其他显示器无法比拟的优点,它广泛用干各种智能型仪器和低功耗电子产品中。

①文字图像编码原理

文字图像在液晶上点阵显示的数据是按照一定的规则编码后通过液晶显示的驱动模块在液晶上显示的。

点阵液晶上的像素只能显示黑与白,所以要显示的图像必须先转化为黑白的,否则显示效果会相差很多。

编码的步骤如下:

Step1:

像素化

要对文字图像取模,也就是把文字图像像素化。

比如一个“口”字,我们要在液晶上显示的大小为16×16像素,则应该对其按16×16的模像素化,如图5-2。

把文字“口”放在16×16的模板上,黑色的点形成文字,所以黑色的点就是我们要显示点。

Step2:

分页

液晶屏是以8行为一页的,所以16×16的点阵必须分两页才能完整显示出来。

实验箱上的液晶是按每8行分为一页的,所以我们把前8行作为第一页,后8行作为第二页。

对于行数大于16行的,只须按照每8行分一页即可。

由于液晶的大小是128×64,所以图像的行数最多为64行,列数最多为128列。

Step3编码

液晶的图像编码按照取字节方向有横向格式和纵向格式。

横向格式是指LCD显示数据是以横向的连续8个像素为一个字节的数据格式,例如东芝公司的T6963C或爱普森公司的SED1330和SED1331等LCD控制芯片的显示数据均为横向格式。

纵向格式是指LCD显示数据是以纵向的连续8个像素为一个字节的数据格式,其取模的走向正好符合LCD写入显示数据的顺序。

按照横向格式,第一个字节为横向的8位,纵向格式则为纵向的8位。

如图5-3:

实验箱上的液晶是按照纵向取模方式的。

按照取字节的顺序,有顺序方式和倒序方式。

顺序方式是字节的8位按照由上到下的方式取,倒序则按照由下到上的方式。

例如“口”字的第三列,点阵上的8位值为:

00111111。

按照顺序方式,编码第三个字节的值应该为0x3f,按照倒序方式则为0xfc。

现在按照以上的步骤对“口”字的16×16点阵正确的编码应该为:

0x00,0x00,0xFC,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0xFC,0x00,0x00,0x00,

0x00,0x00,0x3F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3F,0x00,0x00,0x00,

对于图像的编码也按照同样的方式进行。

②液晶点阵显示原理

液晶显示模块的访问、控制是由DSP对扩展I/O接口的操作完成。

控制I/O口的寻址:

命令控制I/O接口的地址为0x8001,数据控制I/O接口的地址为0x8003和0x8004,辅助控制I/O接口的地址为0x8002。

液晶显示模块中有两片显示缓冲存储器,分别对应屏幕显示的象素,向其中写入数值将改变显示,写入“1”则显示一点,写入“0”则不显示。

其地址与象素的对应方式如下表格:

表1地址与象素对应表

左侧显示内存

右侧显示内存

Y=

0

1

……

62

63

0

1

……

62

63

行号

X=0

 

……

 

X=7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

0

……

7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

B0

……

DB7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

8

……

55

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

DB0

……

DB7

56

……

63

发送控制命令:

向液晶显示模块发送控制命令的方法是通过向命令控制I/O接口写入命令控制字,然后再向辅助控制接口写入0。

d.步进电机控制原理:

步进电机是由DSP通用I/O管脚输出直接控制。

步进电机的起动频率大于500PPS(拍每秒),空载运行频率大于900PPS。

通用I/O口IOPE5控制电机的转动频率,IOPF4控制转动方向。

控制的方法是使用DSP通用定时器设置IOPE5以一定的频率改变高低状态,输出方波,设置IOPF4为高电平则顺时针转动,低电平为逆时针转动。

根据上述原理,用通用定时器让IOPE5口输出一定频率的方波,来控制四相的电极的改变,从而带动电机的转动。

对IOPF4口操作以控制转向。

原理流程图:

三、调试报告:

由于这次实验操作部分较上学期做的DSP实验难且复杂,所以在实验过程中遇到了很多以前没有碰到过的问题,通过不断调试,检查,修改,并在同学和老师的帮助下,完成了本次实验。

实验的基本流程及遇到的问题例举如下:

第一次实验的时候,依次运行了四个模块的例程,发现四个模块的基本功能都能依次实现,所以确定了以后实验的思路,即:

对LCD模块需较大改动;电机模块再设置启动和停止键;而KEY模块和Speaker模块只要整合到电机模块里去就好。

因为电机模块的构成比较合理,选用它作为基础模块,在这个基础上逐渐加入其它模块的功能。

(一)首先修改Motor.c例程,它只含按正转、反转、加速、减速,所以要添加启动和停止按钮。

我复制了和正转一样的代码做开启键,即按下此键,以默认速度正转:

if(cKey=='0')

{

*T1PR=T46uS*9/5;

uWork1=(*PFDATDIR);

uWork1|=0x0010;/*Setdirect=1*/

(*PFDATDIR)=uWork1;

Delay(128);

*T1PR=nSpeed;

}

然后在这之前清中断。

相应原来“0”键是正转,所以要换成“1”键正转,以此类推。

接下来是添加停止按钮“5”,在刚才的if语句里再添加语句:

elseif(cKey=='5')

{Delay(128);

*T1PR=T46uS/10;

nSpeed=T46uS;

}

(二)添加LCD模块,这个模块需要大量的修改。

也遇到大量问题:

我先把LCD.c的例程代码几乎全部复制到电机模块里,编译出错。

问题1:

端口不匹配,原来在lcd.c理端口类型全是int型。

解决方法将:

ioportunsignedintport8001;改为ioportunsignedcharport8001;

问题2:

有些函数名、变量名与原motor.c里有冲突。

解决方法:

对这些变量名、函数名进行修改,例如,两个模块里都有延时子程序,保持motor.c里Delay不变:

voidDelay(unsignedintnDelay)

{inti,j,k;

for(i=0;i

for(j=0;j<16;j++)

k++;

}

而把添加进去的lcd里的Delay改成voiddelay(unsignedintnDelay)

{intii,jj,kk;

for(ii=0;ii

for(jj=0;jj<256;jj++)

kk++;

}

接下来,进行修改lcd程序,首先在首页添加自己的名字,我用字模转换生成自己的名字后,写入源程序代码里,编译出错。

问题3:

编译显示我的姓名数组存在错误。

解决方法:

在字模转化是输入字体必须是宋体,用了其他的就出错了;在方向设置时,我没有选第四个:

纵向取模,高位在下,所以又出错。

重新生成代码载入实验箱,能成功显示名字。

问题4:

由问题3接踵而来,名字是有了,可原来显示的“课程设计”四个字,只剩下后面两个字,变成了“池璟设计”。

解决方法:

通过查看

display16(intpage,intline,intnumber,unsignedchar(*pos)[32])函数的定义,才知道原来液晶的显示不是任意的,不仅有位置要求,还有个数范围,当每行每列显示的具体汉字个数超过制定范围是还必须得换行。

而且一个汉字需要两行,所以我选择display16(2,0,2,name)来显示姓名,而

display16(4,32,2,coursedesign0);display16(4,64,2,coursedesign);来显示“课程设计”。

问题5:

在首页里我还要显示学号,我选择只显示学号的后8位:

64171304,由于字模转换不能自动完成,所以我根据LCD显示原理,自己画了16*16的方框图,在上面画好我要显示的数字,根据二进制,黑的地方读出来,得到学号的数组,可最后都只能在第一行显示出形似“口口”的字符。

老师帮我单步运行后,发现我要显示的数字在固定在那两格并从6到4依次显示,最后停留在“口口”状态。

解决办法:

仔细检查后才发现,没有把display16(0,0,2,xuehao);改成display16(0,0,8,xuehao);原来的思路是只显示两个数字。

后来增至8位时忘了改回来,粗心的错误要避免。

问题6:

在按下0键时,我欲显示“电机启动”,当把这四个字的数组加入到程序里后,发现.bss出错。

解决方法:

老师告诉我们这是由于数组所在段的空间太小,所以我进行了CMD文件的修改,把data2里的origen=0x0c00,l=0x0400改为:

origen=0x0800,l=0x0700,扩大其空间。

所以,当我按下“0”键后,就能显示电机启动了,就在原代码的基础上加了两个display16()的调用。

其他“1”到“5”键的对应LCD显示也是同理。

if(cKey=='0')

{

*T1PR=T46uS*9/5;

uWork1=(*PFDATDIR);

uWork1|=0x0010;/*Setdirect=1*/

(*PFDATDIR)=uWork1;

Delay(128);

*T1PR=nSpeed;

display16(4,32,2,coursedesign7);

display16(4,64,2,coursedesign8);

不过键3跟键4要复杂一些,因为他们要保持当前转向不变,而改变转速,所以要对转向进行判断,才能显示出正确的转向,

elseif(cKey=='3')

{

if(nSpeed==0x17D9)

nSpeed=T46uS;

else

nSpeed=0x17D9;

*T1PR=nSpeed;

uWork1=(*PFDATDIR);

uWork2=(*PFDATDIR);

uWork2|=0x0010;

uWork1&=0xffef;

if((*PFDATDIR)==uWork1)//如果原来是正转则显示加速正转

{display16(4,32,2,coursedesign3);

display16(4,64,2,coursedesign2);}

elseif((*PFDATDIR)==uWork2)//如果原来是反转则显示加速反转

{display16(4,32,2,coursedesign3);

display16(4,64,2,coursedesign1);

}

}

}

(三)添加Key模块,基本上就是在main()外对用到的函数定义,在main里主要就是添加Key子模块;

nScanCode=port8001;

nScanCode&=0x0ff;

if(nScanCode!

=0)

{

cKey=ConvertScanToChar(nScanCode);

}

if(nScanCode!

=0)

{

nKeyCode=(cKey>='0'&&cKey<='9')?

(cKey-'0'):

(cKey-'A'+10);

for(i=0;i<8;i++)

ledbuf[i]=~ledkey[nKeyCode][7-i];

}

for(i=0;i<8;i++)

{

port8005=ledx[i];

port8005=ledbuf[i];

}//当按下“0”到“15”键时,依次在LED上显示0~9,A~F

问题7:

运行之后出现LED屏幕整片红色,花屏。

解决方法:

关掉整个实验箱的电源,重新开启,lord程序之后,LED不再花屏。

问题8:

添加了该模块之后,当按下0键后,液晶能继续显示相应内容,可是LED灯却很暗,再次load后还出现了闪烁现象。

解决方法:

比对两个例程,我发现在for(;;){}循环里,原来motor里的nCount=0;nScanCode=port8001;nScanCode&=0x0ff;与添加的key子模块有重复,所以我删去了原motor里的这三条语句。

结果LED能明亮的显示按键0到F。

(四)添加speaker模块,主要是在main()里加了:

for(i=0;i

{

music[i][0]*=24;

music[i][1]/=1;

}//完成开机时蜂鸣器输出一段音乐

问题:

蜂鸣器没有声音。

解决方法:

重新放置蜂鸣器子程序的位置,结果能输出一段开机音乐。

调试总结:

由于原先有四个模块的子程序,所以在总程序调用各个子程序时总出现一些问题,每次总是只能发挥部分功能,就感觉每个模块的功能脱节了,所以不再采用整体拼凑到基础模块里的方法,而是选择重点的子程序,在恰当的位置添加它们,然后不断排错、不断修改直至没有错误。

在调试过程中,除了程序本身的问题外,也有很多硬件上的问题,有部分损坏,在老师的帮助下完成了调试。

四:

程序最终测试结果:

1:

程序载入实验箱运行后,开机先听到一段开机音乐,同时LCD液晶显示屏显示:

(此时电机不转动)

2:

按下“0”键电机开启并以默认速度、方向转动,LCD显示:

 

3:

按下“1”键,电机正转,速度不变,LCD显示:

 

4:

按下“2”键,电机反转,速度不变,LCD显示:

 

5:

如果在按“3”键之前电机是反转,则按下“3”电机反转加速,LCD显示:

 

如果在按“3”键之前电机是正转,则按下“3”电机正转加速,LCD显示:

6:

如果在按“4”键之前电机是反转,则按下“4”电机减速反转,LCD显示:

 

如果在按“4”键之前电机是正转,则按下“4”电机减速正转,LCD显示:

7:

按下“5”键,电机停止转动,显示:

 

五、实验总结:

通过这次短学期的DSP课程设计,了解到“DSP芯片技术及应用”是宁波大学信息工程专业的重要专业基础课程。

该课程教学内容包括DSP芯片技术的发展趋势、DSP芯片硬件结构特点介绍、DSP的指令系统、软件与硬件开发过程、汇编语言程序设计、应用举例、开发工具介绍、软件仿真与硬件仿真。

实验过后对DSP有了进一步的了解,一般的DSP芯片具有信号处理器,凭借其对数字信号处理速度快、数据量大、效率高的优势,在语音与图像处理、信息的压缩和编码、信号的调制与解调、信号的辨识与均衡、各种智能控制与移动通讯、嵌入式等各个领域得到广泛应用。

比如对电机的智能控制。

此次实验最大的感受是锻炼了解决实际问题的能力、通过不断的调试,排错,最后得到正确的代码的能力。

在解决难题的过程中还培养了思维,尤其在连接各个模块时真是绞尽脑汁,也正因为如此才能体会到调试成功的那份乐趣。

通过这样的实际操作,让我更好的理解了各个模块的工作原理和实现的方法,为以后的实际应用打下良好的基础。

附加:

程序代码

#include"2407c.h"

#definenMusicNumber32

#defineT46uS0x0d40

#defineLCDDELAY1

#defineLCDCMDTURNON0x3f

#defineLCDCMDTURNOFF0x3e

#defineLCDCMDSTARTLINE0xc0

#defineLCDCMDPAGE0xb8

#defineLCDCMDVERADDRESS0x40

ioportunsignedcharport8001;

ioportunsignedintport8002;

ioportunsignedintport8003;

ioportunsignedintport8004;

ioportunsignedcharport8005;

unsignedcharledbuf[8],ledx[8];

unsignedcharledkey[16][8]=

{

{0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00},//0

{0x00,0x00,0x00,0x84,0xFE,0x80,0x00,0x00},//1

{0x00,0x00,0x84,0xC2,0xA2,0x92,0x8C,0x00},//2

{0x00,0x00,0x44,0x92,0x92,0x92,0x6C,0x00},//3

{0x00,0x00,0x30,0x28,0x24,0xFE,0x20,0x00},//4

{0x00,0x00,0x4E,0x92,0x92,0x92,0x62,0x00},//5

{0x00,0x00,0x7C,0x92,0x92,0x92,0x64,0x00},//6

{0x00,0x00,0x02,0xC2,0x32,0x0A,0x06,0x00},//7

{0x00,0x00,0x6C,0x92,0x92,0x92,0x6C,0x00},//8

{0x00,0x00,0x4C,0x92,0x92,0x92,0x7C,0x00},//9

{0x00,0x00,0xF8,0x24,0x22,0x24,0xF8,0x00},//A

{0x00,0x00,0xFE,0x92,0x92,0x92,0x6C,0x00},//B

{0x00,0x00,0x7C,0x82,0x82,0x82,0x44,0x00},//C

{0x00,0x00,0xFE,0x82,0x82,0x82,0x7C,0x00},//D

{0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x00},//E

{0x00,0x00,0xFE,0x12,0x12,0x12,0x12,0x00}//F

};

voidinterruptgptime1(void);

voidgp_init1(void);

charConvertScanToChar(unsignedcharcScanCode);

voidDelay(unsignedintnDelay);

voiddelay(unsignedintnDelay);

voidTurnOnLCD();//打开显示

voidLCDCLS();//清除屏幕显示内容

voiddisplay16(intpage,intline,intnumber,unsignedchar(*pos)[32]);

ioportunsignedcharport8001;

unsignedintuWork,nCount;

voidgp_init3(void);

unsignedintmusic[nMusicNumber][2]=//音乐

{

{182,480},{151,480},{135,480},{121,480},{135,480},{151,480},{182,480},{0,480},

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2