嵌入式实验报告
- 格式:doc
- 大小:64.00 KB
- 文档页数:8
1
实验名称:DSP控制步进电机实验
一、 实验目的
1、学习DSP外部中断的使用;掌握DSP中断向量表的划分。
2、了解汇编和C混合编程以及IO空间操作等基本DSP编程技巧。
二、 实验仪器设备
PC机一台,SZDSPF型开发实验平台一套
三、 实验原理
1、中断向量表
实验使用的DSP为TMS320VC5416,了解DSP的中断向量表。
2、按键与显示
本实验采用CPLD(EPM7128)给DSP扩展了一个I/O口(地址为C000h),来完成DSP对I/O口的访问。对数码管的操作,DSP通过IO方式对数码管送数据,高8位D8~D15数据为数码管的位码,低8位D7~D0数据为数码管的段码。 同时,CPLD(EPM7128)给DSP扩展了一个I/O口(地址为C001h),来完成DSP对读所按键键值。
实验采用键盘中断,当有键(任意一个键)按下时,给DSP一个中断信号(INT2),DSP通过I/O端口(地址为C001h)读键值,读取键值后由数码管显示出来。其中“键1”对应数据D8位,“键2”对应数据D9位……“键8”对应数据D15位。LCD为128*64液晶屏。
3、步进电机工作原理
步进电机驱动原理是通过对每相线圈中的电流的顺序切换来使电机作步进式旋转。切换是通过单片机输出脉冲信号来实现的。
调节脉冲信号的频率便可以改变步进电机的转速,改变各相脉冲的先后顺序,可以改变电机的旋转方向。步进电机的转速应由慢到快逐步加速。
电机驱动方式可以采用双四拍(AB→BC→CD→DA→AB)方式,也可以采用单四拍(A→B→C→D→A)方式,或单、双八拍(A→AB→B→BC→C→CD→D→DA→A)方式。
实验可通过DSP的I/O方式来控制电机的运转,CPLD(EPM7128)给DSP扩展了一个I/O口。在来完成对步进电机的控制。DSP的I/O方式下,将DSP的经过电平转换的四位数据线D5~D2送往步进电机模块的锁存器,信号再经过隔离和驱动后对四相(A、B、C、D)步进电机控制。DSP对步进电机控制的I/O访问地址为C004h。 2
四、 实验内容
1、 验证性实验
在CCS下运行硬件中断实验程序和12864液晶显示程序,观察实验结果。
2、 设计性实验
设计程序,实现用按键控制四相步进电机的转速:例如:按键1是正转、按键2是反转、键3是停止,同时在液晶上显示“正转”、“反转”和“停止”。
五、 实验数据
1、验证性实验
在CCS下建立工程文件,加载中断实验的所有源程序(cmd文件与c程序文件)到该工程中,编译、链接后生成out文件,将out文件通过JTAG下载到实验箱中,运行程序,依次按键key0-key8,观察数码管结果。
新建工程,添加12864液晶显示的所有源程序,编译链接后将目标文件下载到实验箱,观察到显示屏结果。
2、设计性实验
实现功能:按键1是正转,同时在液晶屏上显示“正转”;按键2是反转,液晶屏上显示“反转”;键3是停止,液晶屏上显示“停止”。
部分程序代码如下:
static const uchar zhengzhuan[2][32]={
/*-- 文字: 正转 --*/
0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0x02,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,0xC8,0xA8,0x9C,0xEB,0x88,0x88,0x88,0x40,0x48,0xF8,0x4F,0x48,0x48,0x48,0x40,0x00,
0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x08,0x08,0x04,0xFF,0x04,0x04,0x00,0x02,0x0B,0x12,0x22,0xD2,0x0E,0x02,0x00,0x00};
static const uchar fanzhuan[2][32]={
/*-- 文字: 反转 --*/
0x00,0x00,0xFE,0x12,0x72,0x92,0x12,0x12,0x12,0x11,0x91,0x71,0x01,0x00,0x00,0x00,0xC8,0xA8,0x9C,0xEB,0x88,0x88,0x88,0x40,0x48,0xF8,0x4F,0x48,0x48,0x48,0x40,0x00,
0x40,0x30,0x4F,0x40,0x20,0x21,0x12,0x0C,0x0C,0x12,0x11,0x20,0x60,0x20,0x00,0x00,0x08,0x08,0x04,0xFF,0x04,0x04,0x00,0x02,0x0B,0x12,0x22,0xD2,0x0E,0x02,0x00,0x00};
static const uchar tingzhi[2][32]={
/*-- 文字: 停止 --*/
0x80,0x40,0x20,0xF8,0x07,0x02,0x04,0x74,0x54,0x55,0x56,0x54,0x74,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x00,0x00,
0x00,0x00,0x00,0xFF,0x00,0x03,0x01,0x05,0x45,0x85,0x7D,0x05,0x05,0x05,0x03,0x00,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x00};
void play() //液晶屏正转显示程序
{
uchar dat1,ypos,xpos;
for(ypos=3;ypos<=4;ypos++)
{ 3
for(xpos=47;xpos<79;xpos++)
{
dat1=zhengzhuan[ypos-3][xpos-47];
lcdwrite(dat1,ypos,xpos);
}}
}
void play1() //液晶屏反转显示程序
{
uchar dat1,ypos,xpos;
for(ypos=3;ypos<=4;ypos++)
{
for(xpos=47;xpos<79;xpos++)
{
dat1=fanzhuan[ypos-3][xpos-47];
lcdwrite(dat1,ypos,xpos);
}}
}
void play2() //液晶屏停止显示程序
{
uchar dat1,ypos,xpos;
for(ypos=3;ypos<=4;ypos++)
{
for(xpos=47;xpos<79;xpos++)
{
dat1=tingzhi[ypos-3][xpos-47];
lcdwrite(dat1,ypos,xpos);
} }
}
//主测试程序
void main()
{
cpu_init(); //CPU 初始化
lcdreset(); //lcd初始化
lcdfill() ; //lcd清屏
while(1)
{
//判断标志位,判断转向
if (flag==1) //电机正转
{
play(); //液晶屏上显示正转
portc004=0x0024;
delay20ms();
portc004=0x000C;
delay20ms();
portc004=0x0018;
delay20ms();
portc004=0x0030;
delay20ms();
}
else if (flag==2) //电机反转
{ 4
play1(); //液晶屏上显示反转
portc004=0x0030;
delay20ms();
portc004=0x0018;
delay20ms();
portc004=0x000c;
delay20ms();
portc004=0x0024;
delay20ms();
}
else if (flag==0) //电机停止
{
play2(); //液晶屏上显示停止
portc004=0x0000;
delay20ms();
}
}
}
interrupt void keyint0() //键盘测试
{
int a;
a=portc001;
a=a&0xff00;
if(a!=0xff00)
{
delay10ms();
a=portc001;
a=a&0xff00;
switch(a)
{
case 0xfe00: portc000=0x013f; //0
asm(" nop");
break;
case 0xfd00: portc000=0x0206; //1
asm(" nop");
flag=1;
lcdfill() ;
asm(" nop");
break;
case 0xfb00: portc000=0x045b; //2
flag=2;
lcdfill() ;
asm(" nop");
break;
……
}
六、 数据处理及结果分析
1、 验证性实验
在CCS下运行硬件中断实验程序,依次按键key0-key8,数码管分别显示数字1-8。当按下键时,进入键盘中断程序,在子程序中读取键的端口地址,判断被按下的键,并给数码管的端口地址送对应的数字。