实习报告.docx
《实习报告.docx》由会员分享,可在线阅读,更多相关《实习报告.docx(31页珍藏版)》请在冰豆网上搜索。
实习报告
一、实习目的:
1.要求掌握一般的运动控制方法和原理。
2.要求熟练掌握步进电机驱动技术、微机接口技术、单片机原理及接口技术,数控轮廓插补原理,计算机高级语言硬件编程。
3.了解一般运动控制系统常用机械结构,熟练掌握步进电机控制方法。
4.了解一般交流伺服电机控制方法,变频器使用方法等。
二、实验内容:
1.键盘显示综合实验
2.单片机控制电路
3.步进电机驱动检测电路
4.步进电机驱动技术
5.两轴运动十字工作台结构
6.步进电机的正反加速转动
8.单片机控制系统圆弧插补
三、实验装置:
运动控制实验仪是一个平面两轴驱动的运动装置,机械部分采用丝杆螺母的传动方式,脉冲当量0.0125mm,由单片机控制,通过步进电机驱动。
通过编制相应的控制程序,可以在图板上给出不同的图形,使运动过程更加明了,便于观察。
运动控制仪可采用单片机控制也可以采用计算机控制,其结构如下图所示:
驱动检测电路板上留有单片机控制和计算机控制的接口。
单片机控制系统和计算机控制系统分开来控制,当采用单片机控制系统时,不能同时采用计算机控制,这时应将计算机与驱动检测电路接线断开。
反之亦然。
原理图如下:
单片机控制电路分为显示电路,键盘电路、脉冲锁存和光槽开关信号读取电路、光隔电路组成。
步进电机分配脉冲对应锁存器地址为A000H,其中高四位是Y轴信号,低四位是X轴信号。
信号从高到低排列依次为:
高压(+24V)信号(置0关断,置1开通)、A相信号(置0关断,置1开通)、B相信号(置0关断,置1开通)、C相信号(置0关断,置1开通)。
光槽开关信号缓冲器74LS244读写地址为E000H。
四、实验原理:
1.键盘显示综合
功能要求:
1.实现数据输入过程自动左移,譬如要输入数字123,则按下1键后数码管最右端显示1,按下2键后2占据原来最右端的数码管,1要左移一位。
2.编制十进制到二进制转换程序将输入的十进制数转换成二进制存储起来。
3.编制二进制到十进制转换程序,将要送显的二进制数,先转换成十进制数
4.编写显示程序
5.编制功能键跳转程序
6.联机作总体调试
2.步进电机单片机控制实验①
功能要求:
测试出步进电机工作频率范围,确定其正常工作中脉冲频率,加减速控制,正反转控制。
3.步进电机单片机控制实验②
圆弧插补画曲线
插补流程如下所示:
4.单片机运动控制系统总体实验
五、程序实现功能:
1.首先实现的是步进电机通过按键控制前后左右运动的控制。
2.实时的显示步进电机的移动步数。
3.通过按键设定所做圆的半径,数码管显示步进电机所在象限以及剩余步数。
4.通过按键设定半径然后在园内接一个正方形并且实时的显示步进电机所在象限以及剩余步数。
5.通过按键控制电机做出奥迪图标。
六、注意事项:
1.实验中注意不要触摸变压器,以免导致触电。
2.打开实验仪侧面电源开关,即可进入调试键盘和显示。
功放在不用时应及时关闭开关。
3.电机运行过程中如果听到电机运行声音异常,要立刻关闭电源。
4.注意在实验过程中严禁任何异物掉在丝杆上。
5.尽量不要让电机长时间运转。
6.爱护实验仪器和装置,注意接线不要接错或接反,上电前要仔细检查。
心得体会:
这一个周的运动控制实习,让我受益匪浅。
通过看电路图,我们可以更好的了解硬件和各个元件的功能。
让我加深了单片机控制的强大功能,刚开始实验我们用的是汇编语言进行的编程,运用的过程也复习了以前的知识;但是最后用圆弧插补进行步进电机控制是感觉用汇编编辑公式没那么容易,改为用c语言进行编辑,成功实现了以上的功能。
最后利用圆弧插补的方法,使电机画圆弧、直线、斜线。
这次实习,我对单片机有了更深刻的认识。
通过这次学习让我更加熟悉单片机以及c语言编程。
实习中有些不懂的地方通过和同学讨论以及请教学长和老师得到解决。
我衷心感谢老师给了我们这次实践的机会。
附运动控制系统程序:
/*********************************步进电机控制****************************************/
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineLED1XBYTE[0X0000]
#defineLED2XBYTE[0X2000]
#defineLED3XBYTE[0X4000]
#defineLED4XBYTE[0X6000]
#defineLED5XBYTE[0X8000]
#defineMOTOXBYTE[0XA000]
ucharcodeled[14]={0x7e,0x60,0x57,0x75,0x69,0x3d,0x3f,0x70,0x7f,0x7d,0x7b,0x0e,0x1b,0x7f};
ucharcodemotox6[6]={0x09,0x0b,0x0a,0x0e,0x0c,0x0d};
ucharcodemotoy6[6]={0x90,0xb0,0xa0,0xe0,0xc0,0xd0};
ucharcodekey[14]=
{0xee,0xde,0xbe,0x7e,0xf5,0xed,0xdd,0xbd,0x7d,0xf3,0xeb,0xdb,0xbb,0x7b};
voiddelay1ms();
voiddelay1s();
voidmotonx();
voidmotopx();
voidmotony();
voidmotopy();
voidyuanhu1(int);
voidyuanhu2(int);
voidyuanhu3(int);
voidyuanhu4(int);
voidxiexian1(int);
voidxiexian2(int);
voidxiexian3(int);
voidxiexian4(int);
voidsheyuan(int);
voidbanjing();
voidyuan(int);
voidaodi(int);
voidzhixian1(int);
voidzhixian2(int);
voidzhixian3(int);
voidzhixian4(int);
/*************************************主函数********************************/
voidmain()
{
while
(1)
{banjing();};
}
/******************************延时子程序*************************************/
voiddelay1ms()
{
inti,j;
for(i=17;i--;i>0)
{
for(j=10;j--;j>0);
}
}
voiddelay5ms()
{
inti,j;
for(i=35;i--;i>0)
{
for(j=10;j--;j>0);
}
}
voiddelay1s()
{
inti,j;
for(i=600;i--;i>0)
{
for(j=10;j--;j>0);
}
}
/****************************电机移动方向***************************/
voidmotonx()/*****X轴反向*******/
{
inti;
for(i=5;i>=0;i--)
{
MOTO=motox6[i];
delay5ms();
}
}
voidmotopx()/********X轴正向**********/
{
inti;
for(i=0;i<6;i++)
{
MOTO=motox6[i];
delay5ms();
}
}
voidmotony()/*******Y轴反向************/
{
inti;
for(i=5;i>=0;i--)
{
MOTO=motoy6[i];
delay5ms();
}
}
/*********Y轴正向***********/
voidmotopy()
{
inti;
for(i=0;i<6;i++)
{
MOTO=motoy6[i];
delay5ms();
}
}
/**************************特定图形定义********************/
voidyuan(intstep)
{
yuanhu1(step);
yuanhu2(step);
yuanhu3(step);
yuanhu4(step);
xiexian1(step);
xiexian2(step);
xiexian3(step);
xiexian4(step);
while
(1){banjing();}
}
/************************圆********************************/
voidsheyuan(intstep)
{
yuanhu1(step);
yuanhu2(step);
yuanhu3(step);
yuanhu4(step);
while
(1){banjing();}
}
/***********************奥迪图标***************************/
voidaodi(intstep)
{uintm=4;
do
{yuanhu1(step);
yuanhu2(step);
yuanhu3(step);
yuanhu4(step);
zhixian1(step);
m--;
}
while(m>0);
}
/***************************一象限圆弧************************/
voidyuanhu1(intstep)
{intx;inty;intFm;intz;
x=step;y=0;Fm=0;
z=2*x+y;
while(z>=0)
{
if(Fm>=0)
{
motonx();
z--;
LED1=led[1];
LED2=led[z/100];
LED3=led[z%100/10];
LED4=led[z%10];
Fm=Fm-2*x+1;
x--;
}
elseif(Fm<0)
{
motopy();
z--;
LED1=led[1];
LED2=led[z/100];
LED3=led[z%100/10];
LED4=led[z%10];
Fm=Fm+2*y+1;
y++;
}
}
}
/*************************二象限圆弧***************************/
voidyuanhu2(intstep)
{intx;inty;intFm;intz;
x=0;y=step;Fm=0;
z=x+2*y;
while(z>=0)
{
if(Fm>=0)
{
motony();
z--;
LED1=led[2];
LED2=led[z/100];
LED3=led[z%100/10];
LED4=led[z%10];
Fm=Fm-2*y+1;
y--;
}
elseif(Fm<0)
{
motonx();
z--;
LED1=led[2];
LED2=led[z/100];
LED3=led[z%100/10];
LED4=led[z%10];
Fm=Fm+2*x+1;
x++;
}
}
}
/**********************三象限圆弧*******************************/
voidyuanhu3(intstep)
{intx;inty;intFm;intz;
x=step;y=0;Fm=0;
z=2*x+y;
while(z>=0)
{
if(Fm>=0)
{
motopx();
z--;
LED1=led[3];
LED2=led[z/100];
LED3=led[z%100/10];
LED4=led[z%10];
Fm=Fm-2*x+1;
x--;
}
elseif(Fm<0)
{
motony();
z--;
LED1=led[3];
LED2=led[z/100];
LED3=led[z%100/10];
LED4=led[z%10];
Fm=Fm+2*y+1;
y++;
}
}
}
/***********************四象限圆弧*****************************/
voidyuanhu4(intstep)
{intx;inty;intFm;intz;
x=0;y=step;Fm=0;
z=x+2*y;
while(z>=0)
{
if(Fm>=0)
{
motopy();
z--;
LED1=led[4];
LED2=led[z/100];
LED3=led[z%100/10];
LED4=led[z%10];
Fm=Fm-2*y+1;
y--;
}
elseif(Fm<0)
{
motopx();
z--;
LED1=led[4];
LED2=led[z/100];
LED3=led[z%100/10];
LED4=led[z%10];
Fm=Fm+2*x+1;
x++;
}
}
}
/********************************一象限斜线*************************************/
voidxiexian1(intstep)
{
intz;
z=step;
while(z>=0)
{
motonx();
motopy();
z--;
LED1=led[1];
LED2=led[z/100];
LED3=led[z%100/10];
LED4=led[z%10];
}
}
/********************************二象限斜线*******************************/
voidxiexian2(intstep)
{
intz;
z=step;
while(z>=0)
{
motony();
motonx();
z--;
LED1=led[2];
LED2=led[z/100];
LED3=led[z%100/10];
LED4=led[z%10];
}
}
/****************************三象限斜线********************************/
voidxiexian3(intstep)
{intz;
z=step;
while(z>=0)
{motopx();
motony();
z--;
LED1=led[3];
LED2=led[z/100];
LED3=led[z%100/10];
LED4=led[z%10];
}
}
/***************************四象限斜线******************************/
voidxiexian4(intstep)
{
intz;
z=step;
while(z>=0)
{
motopx();
motopy();
z--;
LED1=led[4];
LED2=led[z/100];
LED3=led[z%100/10];
LED4=led[z%10];
}
}
/****************************直线1*************************************/
voidzhixian1(intstep)
{uinti;
i=4*step/3;
do
{motopx();
i--;
LED1=led[10];
LED2=led[i/100];
LED3=led[i%100/10];
LED4=led[i%10];
}
while(i>0);
}
/****************************直线2*************************************/
voidzhixian2(intstep)
{uinti;
i=4*step/3;
do
{motonx();
i--;
LED1=led[11];
LED2=led[i/100];
LED3=led[i%100/10];
LED4=led[i%10];
}
while(i>0);
}
/****************************直线3*************************************/
voidzhixian3(intstep)
{uinti;
i=4*step/3;
do
{motopy();
i--;
LED1=led[12];
LED2=led[i/100];
LED3=led[i%100/10];
LED4=led[i%10];
}
while(i>0);
}
/****************************直线4*************************************/
voidzhixian4(intstep)
{uinti;
i=4*step/3;
do
{motony();
i--;
LED1=led[13];
LED2=led[i/100];
LED3=led[i%100/10];
LED4=led[i%10];
}
while(i>0);
}
/*****************************半径设定*******************************/
voidbanjing()
{inti,j,k,step;
i=1;j=1;k=1;step=0;
while
(1)
{P1=0xfd;
delay5ms();
delay1s();
switch(P1)
{case0xf5:
{LED1=led[i];step=step+100;i++;i=i%10;};break;
case0xed:
{LED2=led[j];step=step+10;j++;j=j%10;};break;
case0xbd:
{LED3=led[k];step=step+1;k++;k=k%10;};break;
case0x7d:
{LED5=led[1];yuan(step);};break;
}
P1=0xfb;
switch(P1)
{case0xf3:
{LED5=led[2];aodi(step);};break;
case0xeb:
{LED5=led[3];sheyuan(step);};break;
case0xbb:
{LED5=led[4];zhixian1(step);}break;
case0x7b:
{LED5=led[5];zhixian2(step);}break;
}
P1=0xfe;
switch(P1)
{case0xee:
{LED5=led[6];zhixian3(step);}break;
case0xbe:
{LED5=led[7];zhixian4(step);}break;
}
}
}
一、实验目的:
1、了解显示电路
2、分析A/D转换电路
3、信号采集放大电路
4、炉温控制电路接口电路
二、实验内容:
(1)熟悉了解硬件电路。
(2)信号采样,转换显示以及在数码管上显示时间。
(3)炉温检测与控制。
(4)定时器、中断的使用
(5)PID的整定
三、实验原理:
本实验装置利用温度传感器AD590作为测温器,选择AD0809转换器,通过温度传感器AD590检测到电热杯的温度,然后通过AD0809转换器转换为数字量,再把数字量送入单片机进行数据处理,与设定值进行比较,把采集到的温度送到数码显示管上显示,同时,通过调节可控硅导通角来控制电热杯的温度和升温速率,从而达到对电热杯的温度进行控制的目的,如下图:
1.显示电路部分:
由8位LED数码显示管,CD4051多路开关,74LS373数据锁存器组成。
可用于显示被测量的温度值和升温时间等值,显示的内容可由软件设定。
显示电路如下图所示,该电路属于动态显示,利用多路开关CD4051实现位选,P0口的输出通过锁存器实现段选。
可以根据这硬件接口电路实现要求的数据的动态显示。
显示电路:
2.A/D转换电路:
主要由AD0809组成的A/D转换电路,它共有8路采集,我们在硬件电路上选择的是其中的第5个通道。
A/D转换电路
如上图的A/D转换电路可知,通道5是作为数据采集通道,模拟信号通过该通道进入A/D转换器实现转换。
对于该电路主要的不同在于利用P2.1口输出合适频率的脉冲以提供A/D转换器的时钟信号,对于AD0809,它的时钟信号频率fclk〉640khz。
通过实现对相关控制信号的合理设置(P2.3,P3.6,P3.7),实现采样,转换。
EOC连P3.2(INT0)口,利用查询的方式查询A/D转换是否结束并处理相关的数据。
3.信号采集放大电路:
信号采集放大电路
AD590温度传感集成芯片将温度变化量转换成电压值变化量,经过OP07一级跟随后输入到电压放大电路,放大后的信号输入到A/D转换器将模拟信号转换成数字信号,利用CPU采集并存储采集到的数据。
4.炉温接口控制电路:
利用合理的算法,对于不同的采集数据进行分析,处理。
通过