步进电机设计报告Word文档下载推荐.docx
《步进电机设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《步进电机设计报告Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
该步进电机为一四相步进电机,采用单极性直流电源供电。
只要对步进电机的各相绕组按适宜的时序通电,就能使步进电机步进转动。
图1是该四相反响式步进电机工作原理示意图。
图1四相步进电机步进示意图 开场时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相
绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。
当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。
而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。
依次类推,A、B、C、D四相绕组轮流供电,那么转子会沿着A、B、C、D方向转动。
四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。
单四拍与双四拍的步距角相等,但单四拍的转动力矩小。
八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。
单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图2.a、b、c所示:
a.单四拍
b.双四拍
c八拍
图2通电时序波形
本实验使用的步进电机用直流+12V电压,电机线圈由A、B、C、D四相组成。
驱动方式为四相四拍方式,各线圈通电顺序如下表。
表中首先向A线圈输入驱动电流,接着B、C、D线圈驱动,最后又返回到A线圈驱动,按这种顺序切换,电机轴按顺时针方向旋转。
假设通电顺序相反,那么电机轴按逆时针方向旋转。
〔注:
为提高步进电机负载能力和运行平稳,可使用四相八拍驱动方式。
〕
顺序/相
A
B
C
D
0
1
2
3
1
表二:
驱动方式
2.2液晶显示原理
本实验用的是1602液晶,1602液晶可以显示两行字符,其写入字符是根据时序特点,写指令,写数据等操作。
以下是1602液晶的相关资料,
读状态
输入
RS=L,R/W=H,E=H
输出
D0—D7=状态字
写指令
RS=L,R/W=L,D0—D7=指令码,E=高脉冲
无
读数据
RS=H,R/W=H,E=H
D0—D7=数据
写数据
RS=H,R/W=L,D0—D7=数据,E=高脉冲
表
二:
根本操作时序表
读写操作时序如以下图
图3:
读操作时序
图4:
写操作时序
2.3步进电机转速控制及显示设计〔LCD显示转速〕的硬件框图
如图5所示,整个硬件围绕51单片机,根据开关输入通过外接电路控制步进电机的转速和方向,并显示在液晶上。
8051单片机作为处理器,整个硬件功能围绕8051进展实现,首先,由开关通过扩展输入实现对整个硬件功能的控制。
当开关设置为某个状态时,由8051单片机输出相应的值,通过扩展输出对步进电机进展相应方向和转速的控制,并由1602进展相应的显示。
8051单片机
开关
液晶LCD
步进电机
扩展输出
驱动电路
LCD驱动电路
扩展输入
图5硬件框图
2.4总的硬件电路图
如硬件电路图图6所示。
其中,74LS373为地址锁存器,74LS244为带3态输出的八缓冲器,74LS273为带去除的八触发器;
74LS138为三八译码器。
开关由扩展输入对单片机进展输入相关变量,从而通过单片机对步进电机的转速和方向进展控制。
再有液晶进展相应的显示。
3.软件分析及设计
3.1软件需求分析
本实习要求用开关控制步进电机的转速和方向,并将相应的数据显示在液晶上;
通过分析,我们只需将开关的输入量转换成相应的步进电机转速即可,然而,通过前面讲过的步进电机的相关驱动方式我们可以知道,转速可以通过设置延时子程序的时间长短来实现,而步进电机的方向那么通过不同的时序来控制,从而加上很容易的实现步进电机的转速控制,在根据液晶的时序规那么来显示相应的数据,很简单的实现了整个实习要求。
3.2程序流程图
如图(图7:
程序流程图)所示,在程序开场后先进展各个参数的初始化,然后对开关量进展读取,根据读取的数值进展对步进电机的转速量和方向量进展设置,并同时在LCD上显示出相应的数据,定时,置输出地址,然后输出相应的参数,从而实现对步进电机和液晶的相应控制。
图7:
如以下图(图8:
LCD框图所示)为LCD液晶的显示子程序框图,程序先进展LCD初始化,然后进展清屏,在需要写入时,对LCD进展写操作,最后就可以显示出来你想要的字符。
图8:
LCD程序框图
3.3软件代码
#include"
reg52.h"
#include<
intrins.h>
//#defineucharunsignedchar
//#defineuintunisgnedint
//#defineBYTEunsignedchar
//#definenumunsignedint
sbitk1=P2^0;
sbitk2=P2^1;
sbitk3=P2^2;
sbitk4=P2^3;
sbitk5=P2^4;
sbitk6=P2^5;
sbitk7=P2^6;
sbitk8=P2^7;
voiddelay1(unsignedintt)//电机驱动延时程序
{
unsignedintk;
while(t--)
for(k=0;
k<
100;
k++)
}
}
voidmotor_ffw(unsignedchari)//电机顺时针转动程序
{
P1=0x01;
delay1(i);
P1=0x02;
P1=0x04;
P1=0x08;
voidmotor_ffz(unsignedchari)//电机逆时针转动程序
{
P1=0x01;
P1=0x08
}
sbitRS=P0^5;
//定义P2^5为液晶控制端口RS
sbitRW=P0^6;
sbitE=P0^7;
ucharcodetable[]="
Guizhoudaxue"
//字符定义
ucharcodetable1[]="
wangxiaogang"
ucharcodetable2[]="
1120020075"
ucharcodetable3[]="
SPEED:
123456"
;
ucharcodetable4[]="
startstepmotor"
ucharcodetable5[]="
"
ucharcodetable6[]="
typedefunsignedcharBYTE;
//定义字符变量BYTE
typedefunsignedintWORD;
//定义整形变量WORD
typedefbitBOOL;
//字符变量BOOL
//LCD驱动程序
voidlcddelay(BYTEms)//延时子程序
BYTEi;
while(ms--)
{
for(i=0;
i<
250;
i++)//循环250次
{
_nop_();
_nop_();
//空操作延时1us
}
}
//测试LCD忙碌状态-忙检测函数
BOOLlcd_bz()
BOOLresult;
//定义字符变量result,用于存放测试的LCD忙碌状态值
RS=0;
//存放器的选择控制口,选择指令存放器
RW=1;
//读写操作控制端口,RW=1表示读操作
E=1;
//
_nop_();
//延时4us
result=(BOOL)(P0&
0x80);
E=0;
returnresult;
}
//写入指令数据到LCD
voidlcd_wcmd(BYTEcmd)
while(lcd_bz());
RS=0;
RW=0;
E=0;
_nop_();
P0=cmd;
E=1;
//写入字符显示数据到LCD
voidlcd_wdat(BYTEdat)
RS=1;
P0=dat;
//LCD初始化设定
voidlcd_init()
lcd_wcmd(0x38);
//设置LCD为8位数据,两行显示,5*7点阵
lcddelay
(1);
lcd_wcmd(0x0E);
//显示开关控制指令设定,LCD开显示和光标,不闪烁
lcd_wcmd(0x06);
//设光标和画面的移动方式I/D=1,S=0设置读写操作之后AC自动加一,显示不移动
lcd_wcmd(0x01);
//去除LCD的显示内容
voidout0init()//外部中断0的初始化
EX0=1;
IT0=1;
EA=1;
voidlcd_xianshi()//lcd液晶显示程序
lcd_wcmd(0x00);
for(num=0;
num<
15;
num++)
lcd_wdat(table[num]);
delay
(1);
lcd_wcmd(0x80+0x40);
12;
lcd_wdat(table1[num]);
10;
lcd_wdat(table2[num]);
11;
lcd_wdat(table3[num]);
14;
lcd_wdat(table4[num]);
lcd_wcmd(0x80+0x40);
6;
lcd_wdat(table5[num]);
voiddelay1ms(void)//判断按键是否按下延时时间误差0us
unsignedchara,b,c;
for(c=1;
c>
0;
c--)
for(b=142;
b>
b--)
for(a=2;
a>
a--);
void0ut0inter(void)interrupt0using1
delay1ms(10)
if(k1==0)
delay1ms
(2)
if(k1==0)
{
lcd_wcmd(0x80+0x40+0x07);
lcd_wdat(table6[0]);
elseif(k2==0)
if(k2==0)
delay
(1);
i=100;
lcd_wdat(table6[1]);
elseif(k3==0)
delay1ms
(2)
if(k3==0)
{
i=80;
lcd_wdat(table6[2]);
elseif(k4==0)
if(k4==0)
i=60;
lcd_wdat(table6[3]);
elseif(k5==0)
if(k5==0)
i=40;
lcd_wdat(table6[4]);
elseif(k6==0)
if(k6==0)
i=30;
lcd_wdat(table6[5]);
motor_ffw(i);
elseif(k7==0)
if(k7==0)
if(k2==0)
if(k2==0)
elseif(k3==0)
lcd_wdat(table6[2]);
motor_ffz(i);
voidmain(void)
lcd_xianshi();
lcd_init();
out0init();
while
(1)
delay1ms(80)
4.操作说明及结果分析
P1八位分别接开关开关的八个口,F208接38译码器,PO前四口分别接步进电机四口,F200接液晶
把程序烧写进去后运行,液晶第一行显示FX:
当K0拨上时液晶显示FX:
1,步进电机顺时钟转,当K1拨上时液晶显示FX:
0,步进电机逆时针转,开关K2—K7控制步进电机转速,〔分6档〕,并正常显示在液晶上,K2上拨时,第二行显示SPEED:
1;
K3上拨时显示SPEED:
2;
K4上拨时显示SPEED:
3;
K5上拨时显示SPEED:
4;
K5上拨时显示SPEED:
K6上拨时显示SPEED:
7;
K7上拨时显示SPEED:
8;
整个程序运行符合实习要求。
5.调试过程中遇到的问题与解决方法
在整个调试过程中遇到了很多问题,现在就几个比较有代表性和常见的问题加以说明。
首先,在本人调试步进电机速度时,刚开场遇到了电机只抖不转的现象,当时检查了整个程序,未发生程序上的错误,于是很纳闷。
不过再后来上网差了很多资料后才慢慢了解到,是一下子给步进电机的速度太大,使其无法正常加速到那个速度。
比较好的解决方法就是减速或是慢慢加速到那个快的速度。
其次,就是在液晶显示程序完成后,调试过程中会遇到没执行完一次程序闪一下,通过查找相关资料和仔细阅读自己程序后才知道,原来是自己在写程序的时候,每次判断后都有液晶清屏,后来改了之后正常显示了。
其他方面没有大的问题。
最终我们完成了完美的程序。
6.硬件实习总结
为期两个星期的单片机软件、硬件实习很快就完毕了,虽然整个过程进展的不是那么太顺利,实习过程中遇到了种种问题,但在自己不懈的努力和指导教师的殷切教诲下,终归还是依依解决,正如大家所说,在自己努力之下尝到成功的滋味是一件很幸福的事情,确实如此。
在这次实习中收获很多,我觉得最值得一提的是通过本次实习,培养了我对单片机的浓厚兴趣,完成了这次实习任务觉得很有成就感。
在专业只是方面也收获很多,首先,提高了自己的动手能力,并且在编程方面也有了很大的飞跃,通过本次的实习,稳固了单片机的知识,学以致用才是学习的最终目标。
我想这次实习在我以后的学习和工作中都会起到至关重要的帮助。
7.参考文献
【1】赵德安.单片机原理与应用.机械工业出版社
【3】向艳.周天彤.程起才.史兵.C语言程序设计.清华大学出版社
【4】朱正伟.何宝祥.刘训飞.数字电路逻辑设计.清华大学出版社
【5】坂本正文〔日〕.步进电机应用技术.北京科学出版社
【6】丛爽.李泽湘.实用运动控制技术.电子工业出版社