鼠标控制步进电机运动设计报告.docx
- 文档编号:1735794
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:15
- 大小:213.87KB
鼠标控制步进电机运动设计报告.docx
《鼠标控制步进电机运动设计报告.docx》由会员分享,可在线阅读,更多相关《鼠标控制步进电机运动设计报告.docx(15页珍藏版)》请在冰点文库上搜索。
鼠标控制步进电机运动设计报告
《鼠标控制步进电机运动》
设计报告
题目:
《鼠标控制步进电机运动》
作者:
ss(www.eisoc.co.cc)
设计日期:
二零一零年八月
摘要:
本作品实现用PC鼠标控制触杆在半球型空间内高精度运动,及记忆运行路径,回放路径功能。
动力采用两个四相步进电机,由电机驱动芯片L298搭建驱动电路板。
控制器没有单独做,采用学习板的P3口输出驱动信号。
上位机界面用MicroSoftVisualBasic6.0编写,通过串口通信协议与单片机实现数据和命令的传输。
1、方案论证
最初设想实现远程的电机控制器,能够将电机参数实时传送给控制端,控制端能够高精度地控制电机运动。
方案一:
采用红外控制原理,用遥控器控制两台电机运转。
红外技术可以实现“无线化”,具有较高的数据传输速率。
动力源采用直流减速电机,驱动电路采用大功率晶体管构成的桥式驱动电路,采用PWM调节电机转速。
方案二:
STC单片机具有异步全双工串行通信能力,串行口所需传输线少、通信距离长、通信速率高的特点,特别适用于控制系统以及远程通信。
利用PC对数据的高速处理能力可以实现比用按键更高的命令传输率,适合高精度实时控制。
采用步进电机以实现对运动体角度和位移的精确控制。
综合考虑以上两种方案,红外遥控器只能通过按键控制,操作者不可能每秒按超过5下,故其控制信号是离散的,无法实现“实时”、“高精度”的要求。
自编的上位机程序将控制界面设定的区域内鼠标器的运动信息通过算法转换成命令代码,传送给单片机,经单片机就译码输出相应的驱动相序即可控制两台步进电机的运动情况。
考虑到步进电机经每相励磁后需要5ms至10ms的缓冲时间重新建立,单片机每10ms接收以一次上位机发送的方向信号,故1S内控制器最多可接收100个命令,大大高于红外按键式遥控器。
单片机将控制器运转情况发送给上位机。
步进电机更适合用单片机控制,并且消除了脉宽调制带来的高功耗和误差大。
没有驱动信号时电机四个线圈不同电,线圈只在驱动信号到来的一瞬间通电,即使电机以全速运转,线圈的大部分时间是不同电的,这样就减小了电源负载。
综上分析,采用方案二。
2、总体方案组成与设计:
该设计分为上位机模块、电机控制模块、运转平台模块。
3、设计实现:
3.1上位机的设计
3.1.1通信协议与通信部件的实现
MicroSoftVisualBasic6.0提供了丰富的控件,“MicroSoftCommControl6.0”是串口通信要用到的部件。
将串口部件的通信参数设置为:
.Settings="9600,n,8,1"
.InBufferSize=500
.OutBufferSize=1
.InputMode=0
.InputLen=100
.SThreshold=1
.InBufferCount=0'清除接收缓冲区
.OutBufferCount=0'清除发送缓冲区
.RThreshold=1
完整程序附在附录1中。
设计完成的“HelloMotor!
”软件界面如下:
上位机界面分为鼠标移动信息采集区、信息显示、控制按钮区三部分。
3.1.2鼠标移动信息的采集与转换
为防止电机误操作,软件界面规定了一矩形框定义为“HelloMotor!
”软件的可控区域(如图黑色区域所示)。
约定只有鼠标进入此区域并且单击(在可控区域的任意位置)才触发控制事件。
这个矩形框有自身的坐标系,如图所示:
通过Picture1_MouseMove方法采集到鼠标的坐标信息(X,Y),与上次采集到的坐标值(X1,Y1)进行比较,tempX=X-X1,tempY=Y-Y1。
在此约定:
tempX大于0,输出一号电机左移信号,tempX小于0,输出一号电机右移信号,tempX等于0,输出一号电机保持信号(即不动作);tempY大于0,输出二号电机上移移信号,tempY小于0,输出二号电机下移信号,tempY等于0,输出二号电机保持信号(即不动作)。
3.3电机控制模块
单片机部分借用学习板,使用P3口作两台步进电机的驱动相序输出。
驱动电路用驱动芯片L298N和光耦P521搭建。
原理图如下:
L298N为SGS-THOMSONMicroelectronics所出产的双全桥步进电机专用驱动芯片(DualFull-BridgeDriver),内部包含4信道逻辑驱动电路,是一种二相和四相步进电机的专用驱动器,可同时驱动2个二相或1个四相步进电机,内含二个H-Bridge的高电压、大电流双全桥式驱动器,接收标准TTL逻辑准位信号,可驱动46V、2A以下的步进电机,且可以直接透过电源来调节输出电压;此芯片可直接由单片机的IO端口来提供模拟时序信号。
L298N主要参数:
综合考虑步进电机的扭矩、反应时间和功耗,这里用+12V的驱动电压。
在调试中发现,在12V直流稳压电源供电的情况下,电机运转五分钟后表面发烫,温度在70-80°,差了相关资料,这个值在电机机身允许温度范围内。
本控制器不用L298产生相序,相序表由单片机提供。
电机采用的是洛社微特电机厂生产的28BYJ48A型号电机,为四相八拍电机,电压为DC5V—DC12V。
当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。
每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。
当通电状态的改变完成一个循环时,转子转过一个齿距。
四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A),双(双相绕组通电)四拍(AB-BC-CD-DA-AB),八拍(A-AB-B-BC-C-CD-D-DA-A)。
1相励磁方式:
在每一瞬间只有一个线圈导通,其特点是励磁方法简单、消耗电力小、精确度良好。
但是转矩小、振动较大,每送一次励磁信号电机内部可走2.8125°(从外部看电机转了0.0879°)
2相励磁方式:
在每一瞬间有两个线圈导通,特点是转矩大、振动较小,每送一次励磁信号可走2.8125°。
1-2相励磁方式:
1相与2相轮流导通,精确度提高,且运行平滑。
每送一次励磁信号可走5.625°。
综上考虑采用1-2相励磁方式。
相序表如下:
ucharcodeCCW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //逆时钟旋转相序表
ucharcodeCW[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; //正时钟旋转相序表
3.3运转平台模块
一号电机水平放置,二号电机垂直放置,两电机轴线共面垂直,电机机身固定在一起,构成两个自由度的装置。
四、设计总结
经过一段时间的调试,可以用鼠标灵活地控制电机按指定路径运转。
这个作品虽然没有实际应用场合,但这个过程让我学到了步进电机的控制方法,也尝试了一种新颖的电机控制方式。
步进电机有很广阔的应用领域,在以后,用鼠标远程实时控制执行机构运作这种思路可能有某种应用。
参考文献:
[1]王守中.51单片机开发入门与典型实例北京:
人民邮电出版社,2008.8
[2]童诗白.模拟电子技术基础第四版.北京:
高等教育出版社,2001.1
[3]黄智伟.全国大学生电子设计竞赛训练教程.北京:
电子工业出版社,2005
附录1:
上位机软件代码
DimX1,Y1AsSingle
DimOutByte(0)AsByte
Dimpicture_clickAsBoolean
PublicSubComPortOpen()
WithMSComm1
.CommPort=1
.Settings="9600,n,8,1"
.InBufferSize=500
.OutBufferSize=1
.InputMode=0
.InputLen=100
.SThreshold=1
.InBufferCount=0'清除接收缓冲区
.OutBufferCount=0'清除发送缓冲区
.RThreshold=1
EndWith
EndSub
PrivateSubPicture1_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
IfButton=1Then
picture_click=True
Else:
picture_click=False
EndIf
EndSub
PrivateSubPicture1_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
DimcontrolAsString
Label2.Caption=X
Label4.Caption=Y
IfX>9900OrX<0OrY>4545OrY<0Then
picture_click=False
EndIf
Ifpicture_click=TrueThen
tempX=X-X1
tempY=Y-Y1
X1=X
Y1=Y
IftempX<0AndtempY=0Then'left
control="1"
ElseIftempX>0AndtempY=0Then'right
control="2"
ElseIftempX=0AndtempY<0Then'up
control="3"
ElseIftempX=0AndtempY>0Then'down
control="4"
ElseIftempX<0AndtempY<0Then'left-up
control="5"
ElseIftempX<0AndtempY>0Then'left-down
control="6"
ElseIftempX>0AndtempY>0Then'right-down
control="7"
ElseIftempX>0AndtempY<0Then'right-up
control="8"
Else:
control="0"
EndIf
OutByte(0)=Val(control)
MSComm1.Output=OutByte
EndIf
EndSub
PrivateSubMSComm1_OnComm()
DimBuf
WithMSComm1
SelectCase.CommEvent
CasecomEvReceive
Buf=MSComm1.Input
Label7.Caption=Label7.Caption&Buf'按照ASCII码接收,MCU端已将数字0-9处理成其ASCII码值发送
MSComm1.InBufferCount=0
EndSelect
EndWith
EndSub
PrivateSubForm_Load()
CallComPortOpen
MSComm1.PortOpen=True
EndSub
附录2:
单片机控制部分代码
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//**************************************定义变量********************
ucharspeed_para=10;
bdatazero=0;
ucharcodep1[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//1号电机相序表,1-2相励磁方式
ucharcodep2[8]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10};//2号电机相序表,1-2相励磁方式
ucharcodeok[]="电机准备就绪!
\0";
ucharcodeyuandian[]="正在回到原点!
";
ucharmemory1[];
//ucharcodememory2[];
//*************************************************************//
//声明函数//
//*************************************************************//
voiddelayms(uintz);
voidsend_str(uchar*str);
//voidyuandian();
//voidPCre();
//voidMCUre();
//********************************************************************
voiddelayms(uintz)//延时1ms
{
uchara,b,c;
while(z--)
{
for(a=0;a<1;a++)
for(b=0;b<3;b++)
for(c=0;c<219;c++);
}
}
voidsend_str(uchar*str)/*发送字符串函数*/
{
unsignedchari=0;/*声明无符号字符变量i,初始i=0*/
while(str[i]!
='\0')/*遇到'\0',则停止发送*/
{
SBUF=str[i];/*发送字符串*/
while(!
TI);/*等特数据传送*/
TI=0;/*清除数据传送标志*/
i++;/*i加1,下一个字符*/
}
}
voidmain(void)
{uchardata_UART,m,n;
//zero=0;
SCON=0x50;/*设定串行口工作方式1*/
TMOD=0x20;/*定时器1,自动重载,产生波特率*/
TH1=0xFD;/*波特率9600*/
TR1=1;
/*启动定时器1*/
ES=1;
IE=0x90;
P1=0x00;
delayms(5000);
send_str(ok);
//l1=0;
while
(1)
{
if(RI)
{
RI=0;
data_UART=SBUF;
REN=0;
switch(data_UART)
{
case0:
break;
case1:
m=m-1;if(m<0)m=8;//left
P1=p1[m];
delayms(10);
m=m-1;if(m<0)m=8;
P1=p1[m];
delayms(10);
data_UART=0;
break;
case2:
m=m+1;if(m>8)m=0;//right
P1=p1[m];
delayms(10);
m=m+1;if(m>8)m=0;
P1=p1[m];
delayms(10);
data_UART=0;
break;
case3:
n+=1;if(n>8)n=0;//up
P1=p2[n];
delayms(10);
n+=1;if(n>8)n=0;
P1=p2[n];
delayms(10);
data_UART=0;
break;
case4:
n-=1;if(n<0)n=8;//down
P1=p2[n];
delayms(10);
n-=1;if(n<0)n=8;
P1=p2[n];
delayms(10);
data_UART=0;
break;
case5:
m=m-1;if(m<0)m=8;//left-up
n-=1;if(n<0)n=8;
P1=p1[m]+p2[n];
delayms(10);
m=m-1;if(m<0)m=8;
n-=1;if(n<0)n=8;
P1=p1[m]+p2[n];
delayms(10);
data_UART=0;
break;
case6:
//left-down
m=m-1;if(m<0)m=8;
n+=1;if(n>8)n=0;
P1=p1[m]+p2[n];
delayms(10);
m=m-1;if(m<0)m=8;
n+=1;if(n>8)n=0;
P1=p1[m]+p2[n];
delayms(10);
data_UART=0;
break;
case7:
//right-down
m=m+1;if(m>8)m=0;
n+=1;if(n>8)n=0;
P1=p1[m]+p2[n];
delayms(10);
m=m+1;if(m>8)m=0;
n+=1;if(n>8)n=0;
P1=p1[m]+p2[n];
delayms(10);
data_UART=0;
break;
case8:
//right-up
m=m+1;if(m>8)m=0;
n+=1;if(n>8)n=0;
P1=p1[m]+p2[n];
delayms(10);
m=m+1;if(m>8)m=0;
n+=1;if(n>8)n=0;
P1=p1[m]+p2[n];
delayms(10);
data_UART=0;
break;
default:
//send_str(error);
break;
}
}REN=1;
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 鼠标 控制 步进 电机 运动 设计 报告