LPC步进电机控制标准系统.docx
《LPC步进电机控制标准系统.docx》由会员分享,可在线阅读,更多相关《LPC步进电机控制标准系统.docx(22页珍藏版)》请在冰豆网上搜索。
LPC步进电机控制标准系统
基于ARMLPC210系列的步进电机控制装置的设计
一、设计题目:
基于ARMLPC2100系列的步进电机控制装置的设计
二、概述:
步进电机是一种通过电脉冲信号控制相绕组电流实现定角转动的机电元件,与其他类型电机相比具有易于开环精确控制、无积累误差等优点,在众多领域中获得了广泛的应用。
为了得到性能优良的控制结果,出现了很多步进电机控制系统,其中采用单片机作为控制核心的控制系统得到了广泛的应用。
很多这种控制系统在步进电机的驱动上已经做的非常好,比如细分驱动技术,但是有的系统比较复杂,投入上也不经济;有的系统在操作上也不是很方便,交互性不强。
因此本文的研究内容就是制作一个系统比较简单、经济,适应性较强,操作方便的步进电机控制装置。
本文主要论述了以ARM为控制器的步进电机的控制系统。
可以通过键盘输入相关数据,并根据需要,对步进电机的转速及所转圈数进行监测和调整,具有实时性的特点。
该系统可应用于步进电机控制的一般场合。
当今时代,电动机在现代生产和生活中起着重要的作用。
无论在工农业生产或是日常生活中,电动机都在被大量地使用着。
所以对电动机的控制显得尤为重要。
步进电机是一种通过电脉冲信号控制相绕组电流实现定角转动的机电元件,与其他类型电机相比具有易于开环精确控制、无积累误差、快速启动和停止的优点。
其驱动速度和指令脉冲能严格同步,具有较高的重复定位精度,并能实现正反转和平滑速度调节。
它的运行速度和步距不受电源电压波动及负载的影响,因而被广泛应用于数模转换、速度控制和位置控制系统。
本文的研究内容就是设计一套较简单、经济、操作方便的步进电机控制系统,该系统能够把单片机技术和电机的控制技术较好地结合起来。
一个国家的制造业水平可以体现国家的实力,国家的发展也依赖于先进的制造业,所以大多数国家都非常重视大力发展制造业,二战后,计算机控制技术、微电子技术、信息和自动化技术有了迅速的发展,并在制造业中得到了愈来愈广泛的应用,先后出现了数控、计算机数控、柔性制造单元、柔性制造系统、计算机辅助设计与制造、计算机集成制造系统等多项先进制造技术与制造模式,推动着世界制造业进入一个崭新的阶段。
而在这些技术环节中,具有很多优点的步进电机就是一个重要角色,比如在数控技术中。
步进电动机的应用发展已有约80年的历史。
可以说步进电动机天生就是一种离散运动的装置,是纯粹的数字控制电动机,步进电机驱动器通过外加控制脉冲,控制步进电动机各相绕组的导通或截止,从而使电动机产生步进运动。
步进电动机可以在宽广的频率范围内通过改变脉冲频率来实现调速、快速起停、正反转控制等,这是步进电动机最突出的优点。
正是由于步进电机具有突出的优点,所以成了机电一体化的关键产品之一,广泛应用在各种自动化控制系统中。
随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。
比如在数控系统中就得到广泛的应用。
我国已经能够自行研制开发适合我国数控机床发展需要的各种档次的数控系统。
虽然与发达国家相比,我们我国的数控技术方面整体发展水平还比较低,但已经在我国占有非常重要的地位,并起了很大的作用。
我国数控系统在初期就是以单板机或单片机为数控核心,以步进电机为执行元件,由于其结构简单,价格便宜,只需一万元左右就可以装备一台经济型数控机床,很适合我国中小型企业使用。
采用步进电机作为伺服执行元件,不仅可以应用于经济型数控伺服系统,而且也可以辅以先进的检测和反馈元件,组成高精度全闭环数控系列,从而达到很高的加工精度。
优点明显的步进电机被广泛应用在电子计算机的许多外围设备中,例如打印机,卡片阅读机,主动轮驱动机构和存储器存取机构等,步进电机也在军用仪器,通信和雷达设备,光电组合装置,阀门控制,数控机床,医疗设备及自动绘图仪,数字控制系统,程序控制系统以及许多航天工业的系统中得到应用。
因而,对于步进电机控制的研究显得更加重要了。
为了得到良好的控制性能,对步进电机的控制的研究就一直没有停止过,许多重大的技术得以实现。
上世纪80年代以后,由于微型计算机以多功能的姿态出现,步进电动机的控制方式变得更加灵活多样。
原来的步进电机控制系统采用分立元件的控制回路,或者集成电路,不仅调试安装复杂,要消耗大量元器件,而且一旦定型之后,要改变控制方案就一定要重新设计电路,不利于系统的改进升级。
基于微型单片机的控制系统则通过软件来控制步进电机,能够更好地发挥步进电机的潜力。
因此,用微型单片机控制步进电机己经成为了一种必然的趋势,也符合数字化的时代发展要求。
还比如为了适应一些领域中高精度定位和运行平稳性的要求,出现的步进电机细分驱动技术,就包括振荡器、环形分配器控制的细分驱动、基于单片机斩波恒流驱动、基于单片机的直流电压驱动三种常见驱动方式,除上述三种步进电机的驱动方案之外,目前报道的驱动方案还有根据汇编语言或C语言进行软件开发,最终实现由PC机直接控制步电机的方法;在windows平台下和单片机配合控制步进电机,PLC控制的脉冲驱动方案等等。
但是在有些应用场合,并不需要高精度的控制,而是需要在满足一般工作要求的情况下,尽量使控制系统做到:
系统硬件结构简单,成本低;电机各种运行状态指示一目了然,操作方便;功能较为齐全;系统抗干扰和可靠性高;适应性强等特点。
本文就是采用这个思路进行设计。
一般步进电机控制器都用硬件实现,虽然电路可以做到了高集成度,可价格较贵,功能相对较单一,并且设计要求有所改变,就得改变整个硬件电路,比较麻烦。
而采用微控制器的软件和硬件结合进行控制,运用其强大的可编程和运算功能,充分利用ARM的各种资源,能灵活的对步进电机进行控制,实现其不同模式、步数、转速等控制,如果需改变控制要求,一般只需改变软件就能适应新的环境,并且在本设计中利用上位机显示和键盘电路,能做到一定的人机交换,在软件设计上加入去抖动,因此具有一定的应用价值。
三、步进电机控制系统设计简介:
1、设计的原则:
步进电机控制系统的目的是在满足其基本功能的情况下,最大限度的提高可靠性,为此,在设计时应遵循以下原则
(1)完整性原则。
最大限度的满足工业生产过程或机械设备的控制要求。
(2)可靠性原则。
确保控制系统的可靠性。
(3)经济性原则。
力求控制系统简单,实用,合理。
2、系统设计的主要步骤:
系统设计包括硬件设计和软件设计。
所谓硬件设计,是指步进电机控制器整套设备的设计,而软件设计即应用程序的设计。
整个系统的设计大致分为以下几步:
(1)深入了解被控系统是设计控制系统的基础,收集资料,对被控对象结构功能作全面细致的了解。
(2)系统I/O设备以及器件的选择和设计。
输入设备的选择即控制按钮的选择,输出设备的选择即LED显示灯及发光二极管的选择。
(3)选择驱动设备。
根据被控对象技术指标的要求,如输出电压电流等,据此确定驱动设备的类型和配置。
(4)分配ARM的I/O端口分配。
(5)绘制外部接线图。
(6)编写应用程序。
(7)编辑调试修改程序。
四、系统及系统特点简介:
步进电机控制系统是一个有机的完整的整体,由运动控制系统和操作控制系统组成。
由操作系统完成把操作者的操作转化为运动控制系统能接受的电信号,运动控制系统随之作出反应,完成规定动作。
运动控制系统的组成如图所示:
图2-1运动控制系统组成
步进电机是一种将电脉冲转化为角位移的执行机构。
当步进电驱动器接受到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,它的旋转是以固定的角度一步一步运行的。
可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度,从而达到
调速的目的,该系统是在开环系统条件下实现的调速,较闭环系统下的调速简单。
步进电机的运行要有一电子装置进行驱动,这种装置就是步进电机驱动器,它是把控制系统发出的脉冲信号,加以放大来驱动步进电机。
步进电机的转速与脉冲信号的频率成正比,控制步进脉冲信号的频率,可以对电机精确调速;控制步进脉冲的个数,可以对电机精确定位。
因此典型的步进电机驱动控制系统主要由三部分组成:
步进控制器、驱动器(把控制器输出的脉冲加以放大,来驱动步进电机)、步进电机。
不同的控制方案,步进控制器、驱动器也有不同的类型。
下面着重介绍以ARM为控制器的步进电机控制系统。
步进电机是数控式电机,其最大特点是通过输入脉冲信号来进行控制,即电机的总转动角度由输入脉冲数决定,而电机的转速由脉冲信号频率决定。
它具有输入脉冲与电机轴转角成比例的特征,将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度。
五、系统软件设计(孙宇翔)
1、软件设计主要分为系统初始化、按键、显示及控制脉冲输出几部分,事实上每一部分都是紧密相关的,每个功能模块对于整体设计都是非常重要ARM通过软件编程才能使系统真正的运行起来,软件设计的好坏也直接决定了系统的运行质量。
程序流程图的设计遵循自顶向下的原则,即从主体逐步分到每一个模块的流程。
在流程图中把设计者的控制过程梳理清楚。
本程序主要由键盘程序、上位机显示程序、步进电机驱动程序三部份组成,主程序首先初始化各变量,设定指示灯状态,步进电机驱动的各引脚输出高低电平,便进入待机状态,等待键入相应操作。
然后调用键盘程序,并作判断,如果有键按下,则调用键盘处理程序。
在各个调用程序中相应的上位机显示的程序。
2、系统软件简易流程图:
系统简易流程图
3、软件源程序代码:
/********************************************************************
********
*文件名:
main.c
*功能:
LED显示控制。
*通过GPIO控制步进电机
*说明:
将跳线JP14和JP19全部短接。
****************************************************************************/#include"config.h"unsignedintflag=1;
//P0.16
1<<20//定义按键key接口(P0.20)//P0.24
MOTOC1<<26//P0.26
MOTOD1<<27//P0.27
#defineMOTOCON0x0f000000//MOTO控制字
#defineGPIOSET(PIN)IO0SET=PIN//方便修改置位端口
#defineGPIOCLR(PIN)IO0CLR=PIN//方便修改清位端口
#defineUART_BPS9600//定义通讯波特率uint8constSEND_STRING1[]="单四拍!
\r\n";
uint8constSEND_STRING2[]="双四拍!
\r\n";
uint8constSEND_STRING3[]="单双八拍!
\r\n";
/******voidDelayNS(uint32dly);
voidMOTO_Mode1(uint8i);//A-B-C-D
voidMOTO_Mode2(uint8i);//AB-BC-CD-DA-AB
voidMOTO_Mode3(uint8i);//A-AB-B-BC-C-CD-D-DA-A
voidkeyscan();〃声明键盘扫描函数
voidUART0_Init();//串口初始化函数
voidUART0_SendByte();〃串口发送字节函数
voidUART0_SendStr();〃串口发送字符串函数****
***********/
********
名称:
DelayNS()
功能:
长软件延时
入口参数:
dly延时参数,值越大,延时越久
*出口参数:
无
*********************************************************************
*******/
voidDelayNS(uint32dly)
{uint32i;
for(;dly>0;dly--)
{
for(i=0;i<5000;i++);
}
}
*名
*功
称:
MOTOMode1()
能:
单四拍程序
********
*入口参数:
uint8i延时参数,值越大,延时越久
*出口参数:
无
*********************************************************************
*******/
voidMOTO_Mode1(uint8i)
{
//while(((IO0PIN&KEY)!
=0))//
//A-B-C-D
当外界无键按下时才一直执行
GPIOCLR(LED1);
/*A*/GPIOSET(MOTOA);DelayNS(i);
GPIOCLR(MOTOA);/*B*/
GPIOSET(MOTOB);DelayNS(i);
GPIOCLR(MOTOB);/*C*/
GPIOSET(MOTOC);DelayNS(i);
GPIOCLR(MOTOC);
//点亮LED1,方便监视程序状态
GPIOSET(LED1);
/*D*/
GPIOSET(MOTOD);DelayNS(i);
GPIOCLR(MOTOD);
//熄灭LED1,方便监视程序状态
}
*名
*功
称:
MOTO_Mode2()
能:
双四拍程序
********
*入口参数:
uint8i延时参数,值越大,延时越久
*出口参数:
无
*********************************************************************
*******/
voidMOTO_Mode2(uint8i)
{
//while(((IO0PIN&KEY)!
=0))
//AB-BC-CD-DA-AB
GPIOCLR(LED1);
/*AB*/
GPIOSET(MOTOA);
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOA);
GPIOCLR(MOTOB);/*BC*/
GPIOSET(MOTOB);
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOB);GPIOCLR(MOTOC);
//点亮LED1,方便监视程序状态
GPIOSET(LED1);
/*CD*/
GPIOSET(MOTOC);
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOC);GPIOCLR(MOTOD);/*DA*/
GPIOSET(MOTOD);
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOD);
GPIOCLR(MOTOA);
//熄灭LED1,方便监视程序状态
/********************************************************************
********
*名称:
MOTO_Mode3()
*功能:
单双八拍程序
*入口参数:
uint8i延时参数,值越大,延时越久
*出口参数:
无
*********************************************************************
*******/
voidMOTO_Mode3(uint8i)
{
//while(((IO0PIN&KEY)!
=0))
//A-AB-B-BC-C-CD-D-DA-A
GPIOCLR(LED1);
/*A*/GPIOSET(MOTOA);DelayNS(i);
GPIOCLR(MOTOA);/*AB*/GPIOSET(MOTOA);GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOA);GPIOCLR(MOTOB);/*B*/
GPIOSET(MOTOB);DelayNS(i);
GPIOCLR(MOTOB);/*BC*/
GPIOSET(MOTOB);GPIOSET(MOTOC);DelayNS(i);
GPIOCLR(MOTOB);GPIOCLR(MOTOC);/*C*/
GPIOSET(MOTOC);DelayNS(i);
GPIOCLR(MOTOC);
//点亮LED1,方便监视程序状态
GPIOSET(LED1);
/*CD*/
GPIOSET(MOTOC);
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOC);
//熄灭LED1,方便监视程序状态
GPIOCLR(MOTOD);/*D*/
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOD);/*DA*/
GPIOSET(MOTOD);
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOD);
GPIOCLR(MOTOA);
}
/********************************************************************
********
*名
*功
称:
UARTO」ni()
能:
初始化串口0。
设置为8位数据位,1位停止位,无奇偶校验,波
特率为9600
*入口参数:
无
*出口参数:
无
*********************************************************************
*******/
voidUART0_Init(void){uint16Fdiv;
U0LCR=0x83;//DLAB=1,可设置波特率
Fdiv=(Fpclk/16)/UART_BPS;//设置波特率
U0DLM=Fdiv/256;
U0DLL=Fdiv%256;
U0LCR=0x03;
}
********
*名称:
UART0_SendByte()
*功能:
向串口发送字节数据,并等待发送完毕。
*入口参数:
data要发送的数据
*出口参数:
无
*********************************************************************
*******/
voidUART0_SendByte(uint8data)
{
U0THR=data;//发送数据
while((U0LSR&0x40)==0);//等待数据发送完毕
}
********
*名
*功
称:
UARTO_SendStr()
能:
向串口发送一字符串
*入口参数:
srt要发送的字符串的指针
*出口参数:
无
*********************************************************************
*******/
voidUART0_SendStr(uint8const*str){
while
(1)
{
//发送数据
if(*str=='\0')break;
UART0_SendByte(*str++);
}
}
voidkeyscan()
{
if((IO0PIN&KEY)==0)
{
//延时消抖
DelayNS(10);
if((IO0PIN&KEY)==0){
//DelayNS(20);
flag++;if(flag>3)flag=1;
/*if((IO0PIN&KEY)==0){
flag=2;
DelayNS(20);
if((IO0PIN&KEY)==0)/{
flag=3;
DelayNS(20);
if((IO0PIN&KEY)==0){
flag=1;
}
}
}
}
}*/if(flag==1){
//A-B-C-D,单四拍
UART0_SendStr(SEND_STRING1);
MOTO_Mode1(5);
}if(flag==2)
{
UART0_SendStr(SEND_STRING2);
MOTO_Mode2(5);
//AB-BC-CD-DA-AB,双四拍
}
if(flag==3)
{UART0_SendStr(SEND_STRING3);
MOTO_Mode3(5);//A-AB-B-BC-C-CD-D-DA-A,单双八拍
}
}
/********************************************************************
********
*名称:
main()
*功能:
根据表DISP_TAB来控制LED显示。
****************************************************************************/
intmain(void)
{
IO0DIR=LEDCON|MOTOCON;//配置LED控制I/O方向
PINSEL0=0x00000005;//设置I/O连接到UART0
UART0_Init();
while
(1)
keyscan();
}
return(0);
}
附录一:
心得体会:
通过一周的ARM课程设计,让我对ARM有了更加深入的了解,真正能够去自己经历编程、调试、论证、修改的完整的过程,让我们在电子设计领域又多了一份收获。
以前我的知识仅仅停留在课本上,没有实际的动手操作经验,感谢老师能给我们提供这样优越的实验室环境,和耐心的指导,尤其是几个老师手把手教学,让我学的更快,记得更劳。
课设的每一步都倾注着黄老师的关怀,教导和帮助,黄老师渊博的知识、丰富的经验、严谨求实的工作态度和诲人不倦的工作作风都使我受益匪浅。
黄老师对待工作严肃认真的态度、求实创新的精神深深地激励着我,在为人处世上和蔼、谦逊、踏实、积极的态度将会影响我一生。
同时李老师、宋老师,还有一个我忘了问姓名的研究生给我提供了很多的帮助,在他们耐心细致的指导下,我的专业知识得以扩充,论文的工作也得以顺利地进行。
所以,在此首先向帮助过我的老师