步进电机设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
步进电动机的设计报告
题目:步进电动机的设计与制作
学院:大数据与信息工程学院
专业:计算机科学与技术
班级:电信113 学生姓名:王浩
指导教师:马光喜老师
2015年1月6日
目录
前言---------------------------------------------------------------2 1.设计目标及内容------------------------------------------------3
1.1 设计内容---------------------------------------------------4
1.2 设计目的---------------------------------------------------4
2.硬件原理及设计分析--------------------------------------------4
2.1 步进电机的工作原理-----------------------------------------5
2.2 液晶显示原理 ----------------------------------------------5
2.3 步进电机转速控制及显示设计(LCD显示转速)的硬件框图--------6
2.4 总的硬件电路图---------------------------------------------7
3.软件分析及设计------------------------------------------------8
3.1 软件需求分析-----------------------------------------------8
3.2 程序流程图-------------------------------------------------8
3.3 软件代码---------------------------------------------------9
4.操作说明及结果分析-------------------------------------------18
5.调试过程中遇到的问题和解决方法-------------------------------18
6.硬件实习总结-------------------------------------------------19 7.参考文献-----------------------------------------------------19
前言
在电子科技不断飞速发展的今天,数字控制技术得到了广泛而深入的应用。
步进电机是一种将数字信号直接转换成角位移或线位移的控制驱动元件, 具有快速起动和停止的特点。
因为步进电动机组成的控制系统结构简单,价格低廉,性能上能满足工业控制的基本要求,所以广泛地应用于手工业自动控制、数控机床、组合机床、机器人、计算机外围设备、照相机,投影仪、数码摄像机、大型望远镜、卫星天线定位系统、医疗器件以及各种可控机械工具等等。
步进电机突出的优点是它可以在宽广频率范围内通过改变脉冲频率来实现调速,在需要精确定位的地方都要用到它,比如打印机、绘图仪等。
而LCD显示屏在很多数码产品中有着广泛的应用,如计算器,IC卡电话机,电子手表,掌上电脑,仪表显示屏等。
同时,单片机也广泛应用于实时控制、智能仪器、仪表通信和家用电器等各个领域,所涉及的内容非常广泛,是计算机科学、电子学、自动控制等基础知识的综合应用。
单片机的应用系统有硬件和软件所组成。
本次硬件实习是基于51单片机对步进电机转速进行控制,加之液晶的显示,使其转速的档位和方向显示在液晶上。
1.设计目标及内容
1.1 设计内容
1.1.1利用实验平台上单片机P0口输出脉冲序列,74LS244输出开关量,开关K2—K7控制步进电机转速,(分6档),K0,K1控制转向。
驱动方式分两种,四相四拍、四相八拍,通过软件设计,控制步进电机的转速和方向。
并将转速(1~6档)和转向(正转“1”,反转“0”)显示在LCD显示器上
1.2 设计目的
1.2.1 了解步进电机控制的基本原理;
1.2.2 掌握液晶显示图形的基本方法,从而对其它液晶屏的使用也能得心应手。
2.硬件原理及设计分析
2.1 步进电机的工作原理
该步进电机为一四相步进电机,采用单极性直流电源供电。
只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。
图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线圈驱动,按这种顺序切换,电机轴按顺时针方向旋转。
若通电顺序相反,则电机轴按逆时针方向旋转。
(注:为提高步进电机负载能力和运行平稳,可使用四相八拍驱动方式。
)
表二:驱动方式
2.2 液晶显示原理
本实验用的是1602液晶,1602液晶可以显示两行字符,其写入字符是根据
表二:基本
操作时序表
读写操作时序如图所示
图3:读操作时序
图4:写操作时序
2.3 步进电机转速控制及显示设计(LCD显示转速)的硬件框图
如图5所示,整个硬件围绕51单片机,根据开关输入通过外接电路控制步进电机的转速和方向,并显示在液晶上。
8051单片机作为处理器,整个硬件功能围绕8051进行实现,首先,由开关通过扩展输入实现对整个硬件功能的控制。
当开关设置为某个状态时,由8051单片机输出相应的值,通过扩展输出对步进电机进行相应方向和转速的控制,并由1602进行相应的显示。
图5 硬件框图
2.4 总的硬件电路图
如硬件电路图图6所示。
其中,74LS373为地址锁存器,74LS244为带3态输出的八缓冲器,74LS273为带清除的八触发器;74LS138为三八译码器。
开关由扩展输入对单片机进行输入相关变量,从而通过单片机对步进电机的转速和方向进行控制。
再有液晶进行相应的显示。
3.软件分析及设计
3.1软件需求分析
本实习要求用开关控制步进电机的转速和方向,并将相应的数据显示在液晶上;通过分析,我们只需将开关的输入量转换成相应的步进电机转速即可,然而,通过前面讲过的步进电机的相关驱动方式我们可以知道,转速可以通过设置延时子程序的时间长短来实现,而步进电机的方向则通过不同的时序来控制,从而加上很容易的实现步进电机的转速控制,在根据液晶的时序规则来显示相应的数据,很简单的实现了整个实习要求。
3.2程序流程图
如图(图7:程序流程图)所示,在程序开始后先进行各个参数的初始化,然后对开关量进行读取,根据读取的数值进行对步进电机的转速量和方向量进行设置,并同时在LCD上显示出相应的数据,定时,置输出地址,然后输出相应的参数,从而实现对步进电机和液晶的相应控制。
图7:
如下图(图8:LCD框图所示)为LCD液晶的显示子程序框图,程序先进行LCD 初始化,然后进行清屏,在需要写入时,对LCD进行写操作,最后就可以显示出来你想要的字符。
3.3软件代码
#include "reg52.h"
#include <intrins.h>
//#define uchar unsigned char
//#define uint unisgned int
//#define BYTE unsigned char
//#define num unsigned int
sbit k1 = P2^0;
sbit k2 = P2^1;
sbit k3 = P2^2;
sbit k4 = P2^3;
sbit k5 = P2^4;
sbit k6 = P2^5;
sbit k7 = P2^6;
sbit k8 = P2^7;
void delay1(unsigned int t) //电机驱动延时程序
{
unsigned int k;
while(t--)
{
for(k=0; k<100; k++)
}
}
void motor_ffw(unsigned char i) //电机顺时针转动程序
{
P1=0x01;
delay1(i);
P1=0x02;
delay1(i);
P1=0x04;
delay1(i);
P1=0x08;
delay1(i);
}
void motor_ffz(unsigned char i) //电机逆时针转动程序
{
P1=0x01;
delay1(i);
P1=0x02;
delay1(i);
P1=0x04;
delay1(i);
P1=0x08
delay1(i);
}
sbit RS = P0^5; //定义P2^5为液晶控制端口RS
sbit RW = P0^6;
sbit E = P0^7;
uchar code table[]=" Gui zhou da xue " //字符定义uchar code table1[]="wangxiaogang "
uchar code table2[]="1120020075 "
uchar code table3[]=" SPEED:123456";
uchar code table4[]=" startstepmotor ";
uchar code table5[]=" SPEED: ";
uchar code table6[]="123456";
typedef unsigned char BYTE; //定义字符变量BYTE
typedef unsigned int WORD; //定义整形变量WORD
typedef bit BOOL; //字符变量BOOL
//LCD驱动程序
void lcddelay(BYTE ms) // 延时子程序
{
BYTE i;
while(ms--)
{
for(i = 0; i< 250; i++) //循环250次
{
_nop_();
_nop_();
_nop_(); //空操作延时1us
_nop_();
}
}
}
// 测试LCD忙碌状态-忙检测函数
BOOL lcd_bz()
{
BOOL result; //定义字符变量result,用于存放测试的LCD忙碌状态值
RS = 0; // 寄存器的选择控制口,选择指令寄存器
RW = 1; // 读写操作控制端口,RW = 1表示读操作
E = 1; //
_nop_(); // 延时4us
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80);
E = 0;
return result;
}
//写入指令数据到LCD
void lcd_wcmd(BYTE cmd)
{
while(lcd_bz());
RS = 0;
RW = 0;
E = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
E = 1;
_nop_();
_nop_();
_nop_();
_nop_();
E = 0;
}
//写入字符显示数据到LCD
void lcd_wdat(BYTE dat)
{
while(lcd_bz());
RS = 1;
RW = 0;
E = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
E = 1;
_nop_();
_nop_();
_nop_();
_nop_();
E = 0;
}
}
//LCD初始化设定
void lcd_init()
{
lcd_wcmd(0x38); //设置LCD为8位数据,两行显示,5*7点阵
lcddelay(1);
lcd_wcmd(0x0E); //显示开关控制指令设定,LCD开显示和光标,不闪烁
lcddelay(1);
lcd_wcmd(0x06); //设光标和画面的移动方式I/D=1,S=0 设置读写操作之后AC自动加一,显示不移动
lcddelay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
lcddelay(1);
}
void out0init()//外部中断0的初始化
EX0 = 1;
IT0 = 1;
EA = 1;
void lcd_xianshi() //lcd液晶显示程序
lcd_wcmd(0x00);
for(num=0;num<15;num++)
{
lcd_wdat(table[num]);
delay(1);
}
lcd_wcmd(0x80+0x40);
for(num=0;num<12;num++)
{
lcd_wdat(table1[num]);
delay(1);
}
lcd_wcmd(0x80+0x40);
for(num=0;num<10;num++)
{
lcd_wdat(table2[num]);
}
lcd_wcmd(0x80+0x40);
for(num=0;num<11;num++)
{
lcd_wdat(table3[num]);
delay(1);
}
lcd_wcmd(0x80+0x40);
for(num=0;num<14;num++)
{
lcd_wdat(table4[num]);
delay(1);
}
lcd_wcmd(0x80+0x40);
for(num=0;num<6;num++)
{
lcd_wdat(table5[num]);
delay(1);
}
void delay1ms(void) //判断按键是否按下延时时间误差0us {
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void 0ut0inter(void) interrupt 0 using 1 delay1ms(10)
if(k1 = = 0)
{
delay1ms(2)
if(k1 = =0)
{
lcd_wcmd(0x80+0x40+0x07);
delay(1);
lcd_wdat(table6[0]);
delay(1);
}
else if(k2 = =0)
{
delay1ms(2)
if(k2 = =0)
{
lcd_wcmd(0x80+0x40+0x07);
delay(1);
i=100;
lcd_wdat(table6[1]);
}
else if(k3 = =0)
delay1ms(2)
if(k3 = =0)
{
lcd_wcmd(0x80+0x40+0x07);
delay(1);
i=80;
lcd_wdat(table6[2]);
}
else if(k4 = =0)
delay1ms(2)
if(k4 = =0)
{
lcd_wcmd(0x80+0x40+0x07);
delay(1);
i=60;
lcd_wdat(table6[3]);
}
else if(k5 = =0)
delay1ms(2)
if(k5 = =0)
{
lcd_wcmd(0x80+0x40+0x07);
delay(1);
i=40;
lcd_wdat(table6[4]);
}
else if(k6 = =0)
delay1ms(2)
if(k6 = =0)
{
lcd_wcmd(0x80+0x40+0x07);
delay(1);
i=30;
lcd_wdat(table6[5]);
}
motor_ffw(i);
else if(k7 = =0)
delay1ms(2)
if(k7 = =0)
{
lcd_wcmd(0x80+0x40+0x07);
delay(1);
lcd_wdat(table6[0]);
delay(1);
if(k2 = = 0)
delay1ms(2)
{
lcd_wcmd(0x80+0x40+0x07);
delay(1);
i=100;
lcd_wdat(table6[1]);
}
else if(k3==0)
delay1ms(2)
if(k3 = =0)
{
lcd_wcmd(0x80+0x40+0x07);
delay(1);
i=80;
lcd_wdat(table6[2]);
}
else if(k4 = =0)
delay1ms(2)
if(k4 = =0)
{
lcd_wcmd(0x80+0x40+0x07);
delay(1);
i=60;
lcd_wdat(table6[3]);
}
else if(k5 = =0)
delay1ms(2)
if(k5 = =0)
{
lcd_wcmd(0x80+0x40+0x07);
delay(1);
i=40;
lcd_wdat(table6[4]);
}
else if(k6 = =0)
delay1ms(2)
{
lcd_wcmd(0x80+0x40+0x07);
delay(1);
i=30;
lcd_wdat(table6[5]);
}
lcd_wdat(table6[5]);
motor_ffz(i);
}
void main (void)
{
lcd_xianshi();
lcd_init();
out0init();
while(1)
{
motor_ffw(i);
delay1ms(80)
motor_ffz(i);
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:4;K6上拨时显示SPEED:7;K7上拨时显示SPEED:8;整个程序运行符合实习要求。
5.调试过程中遇到的问题与解决方法
在整个调试过程中遇到了很多问题,现在就几个比较有代表性和常见的问题加以说明。
首先,在本人调试步进电机速度时,刚开始遇到了电机只抖不转的现象,当时检查了整个程序,未发生程序上的错误,于是很纳闷。
不过再后来上网差了很多资料后才慢慢了解到,是一下子给步进电机的速度太大,使其无法正常加速到那个速度。
比较好的解决方法就是减速或是慢慢加速到那个快的速度。
其次,就是在液晶显示程序完成后,调试过程中会遇到没执行完一次程序闪一下,通过查找相关资料和仔细阅读自己程序后才知道,原来是自己在写程序的时候,每次判断后都有液晶清屏,后来改了之后正常显示了。
其他方面没有大的问题。
最终我们完成了完美的程序。
6.硬件实习总结
为期两个星期的单片机软件、硬件实习很快就结束了,虽然整个过程进行的不是那么太顺利,实习过程中遇到了种种问题,但在自己不懈的努力和指导老师的殷切教诲下,终归还是依依解决,正如大家所说,在自己努力之下尝到成功的滋味是一件很幸福的事情,的确如此。
在这次实习中收获很多,我觉得最值得一提的是通过本次实习,培养了我对单片机的浓厚兴趣,完成了这次实习任务觉得很有成就感。
在专业只是方面也收获很多,首先,提高了自己的动手能力,并且在编程方面也有了很大的飞跃,通过本次的实习,巩固了单片机的知识,学以致用才是学习的最终目标。
我想这次实习在我以后的学习和工作中都会起到至关重要的帮助。
7.参考文献
【1】赵德安.单片机原理与应用.机械工业出版社
【3】向艳.周天彤.程起才.史兵.C语言程序设计.清华大学出版社
【4】朱正伟.何宝祥.刘训飞.数字电路逻辑设计.清华大学出版社
【5】坂本正文(日).步进电机应用技术.北京科学出版社
【6】丛爽.李泽湘.实用运动控制技术.电子工业出版社。