基于ARM的步进电机细分驱动控制器设计Word文档下载推荐.docx
《基于ARM的步进电机细分驱动控制器设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于ARM的步进电机细分驱动控制器设计Word文档下载推荐.docx(35页珍藏版)》请在冰点文库上搜索。
以控制逻辑为主,不用或少用微码控制等
RISC体系结构应具有如下特点:
1 采用固定长度的指令格式,指令归整、简单、基本寻址方式有2~3种。
2 使用单周期指令,便于流水线操作执行。
3 大量使用寄存器,数据处理指令只对寄存器进行操作,只有加载/ 存储指令可以访问存储器,以提高指令的执行效率。
(4)寄存器结构
ARM处理器共有37个寄存器,被分为若干个组(BANK),这些寄存器包括:
①31个通用寄存器,包括程序计数器(PC指针),均为32位的寄存器。
②6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,均为32位,目前只使用了其中的一部分。
3.指令结构
ARM微处理器的在较新的体系结构中支持两种指令集:
ARM指令集和Thumb指令集。
其中,ARM指令为32位的长度,Thumb指令为16位长度。
Thumb指令集为ARM指令集的功能子集,但与等价的ARM代码相比较,可节省30%~40%以上的存储空间,同时具备32位代码的所有优点。
本实验采用ARM中ARM7引系列的LPC2131
二.硬件电路设计
1、硬件电路设计思路
步进电机控制系统共分为四个模块:
ARM模块、控制模块、数码显示模块、步进电机驱动模块。
ARM最小系统主要由复位电路和时钟电路组成。
复位电路为ARM系统提供可靠复位,使ARM能正常启动。
时钟电路采用外部时钟方式,保证ARM个功能部件都是以时钟频率为基准,有条不紊地一拍一拍地工作。
步进电机驱动模块选用八NPN达林顿连接晶体管2803为步进电机提供脉冲信号,驱动步进电机转动。
该模块与ARM的P1.22—P1.25相连。
2、总体框图设计
总体设计框图如图2-1所示:
图2-1总体设计框图
说明如下:
(1)ARM接受按键信息,改变系统内部变量值。
(2)ARM输出脉冲信号,控制步进电机转动。
三、步进电机
1.步进电机概念
步进电机是一种能够将电脉冲信号转换成角位移或线位移的机电元件,它实际上是一种单相或多相同步电动机。
单相步进电动机有单路电脉冲驱动,输出功率一般很小,其用途为微小功率驱动。
多相步进电动机有多相方波脉冲驱动,用途很广。
使用多相步进电动机时,单路电脉冲信号可先通过脉冲分配器转换为多相脉冲信号,在经功率放大后分别送入步进电动机各相绕组。
每输入一个脉冲到脉冲分配器,电动机各相的通电状态就发生变化,转子会转过一定的角度(称为步距角)。
正常情况下,步进电机转过的总角度和输入的脉冲数成正比;
连续输入一定频率的脉冲时,电动机的转速与输入脉冲的频率保持严格的对应关系,不受电压波动和负载变化的影响。
由于步进电动机能直接接收数字量的输入,所以特别适合于微机控制。
2.步进电机特性
步进电机转动使用的是脉冲信号,而脉冲是数字信号,这恰是计算机所擅长处理的数据类型。
从20世纪80年代开始开发出了专用的IC驱动电路,今天,在打印机、磁盘器等的OA装置的位置控制中,步进电机都是不可缺少的组成部分之一。
总体上说,步进电机有如下优点:
①不需要反馈,控制简单。
②与微机的连接、速度控制(启动、停止和反转)及驱动电路的设计比较简单。
③没有角累积误差,停止时也可保持转距。
④没有转向器等机械部分,不需要保养,故造价较低。
⑤即使没有传感器,也能精确定位。
⑥根椐给定的脉冲周期,能够以任意速度转动。
但是,这种电机也有自身的缺点。
⑦难以获得较大的转矩
⑧不宜用作高速转动
⑨在体积重量方面没有优势,能源利用率低。
⑩超过负载时会破坏同步,高速工作时会发出振动和噪声。
实验所用电机:
28BYJ-48步进电机
步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V。
当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。
每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。
当通电状态的改变完成一个循环时,转子转过一个齿距。
四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A。
。
),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。
),八拍(A-AB-B-BC-C-CD-D-DA-A。
)
由于步进电机的驱动电流较大,单片机不能直接驱动,一般都是使用ULN2003达林顿阵列驱动,当然,使用下拉电阻或三极管也是可以驱动的,只不过效果不是那么好,产生的扭力比较小。
四、外围电路设计分析
1、步进电机驱动电路
本系统的设计目的为了高效控制步进电机的转动,因此需要将脉冲转化为步进角度,才能控制步进电机转动,我们在这里采用ULN2003为步进电机提供脉冲信号。
管脚如图3-1所示:
图3-1内部管脚图
ULN2003内部集成了一个消线圈反电动势的二极管,可用来驱动继电器。
它是双列16脚封装,NPN晶体管矩阵,最大驱动电压=50V,电流=500mA,输入电压=5V,适用于TTLCOMS,由达林顿管组成驱动电路。
ULN是集成达林顿管IC,内部还集成了一个消线圈反电动势的二极管,它的输出端允许通过电流为200mA,饱和压降VCE约1V左右,耐压BVCEO约为36V。
采用集电极开路输出,输出电流大,故可直接驱动继电器或固体继电器,也可直接驱动低压灯泡。
通常单片机驱动ULN2003时,上拉2K的电阻较为合适,同时,COM引脚应该悬空或接电源。
ULN2003是一个非门电路,包含7个单元,单独每个单元驱动电流最大可达350mA,9脚可以悬空。
比如1脚输入,16脚输出,你的负载接在VCC与16脚之间,不用9脚。
ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。
可直接驱动继电器等负载。
输入5VTTL电平,输出可达500mA/50V。
ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。
该电路的特点如下:
ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器。
ULN2003是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。
引脚如图3-7所示:
图3-7ULN2003芯片引脚图
ULN2003芯片引脚介绍:
引脚1:
CPU脉冲输入端,端口对应一个信号输出端。
引脚2:
CPU脉冲输入端。
引脚3:
引脚4:
引脚5:
引脚6:
引脚7:
引脚8:
接地。
引脚9:
该脚是内部7个续流二极管负极的公共端,各二极管的正极分别接各达林顿管的集电极。
用于感性负载时,该脚接负载电源正极,实现续流作用。
如果该脚接地,实际上就是达林顿管的集电极对地接通。
引脚10:
脉冲信号输出端,对应7脚信号输入端。
参考接法如图3-8所示:
图3-8参考电路接法
引脚11:
脉冲信号输出端,对应6脚信号输入端。
引脚12:
脉冲信号输出端,对应5脚信号输入端。
引脚13:
脉冲信号输出端,对应4脚信号输入端。
引脚14:
脉冲信号输出端,对应3脚信号输入端。
引脚15:
脉冲信号输出端,对应2脚信号输入端。
引脚16:
脉冲信号输出端,对应1教信号输入端。
驱动电路如图3-9所示:
图3-9步进电机驱动原理图
2、步进电机控制系统图
通过上述对步进电机控制系统设计与分析,步进电机控制系统总体设计电路如图3-2所示:
图3-2步进电机控制系统总体设计电路图
五、软件设计
1、软件设计思路
步进电机控制系统的软件需要同时完成读取按键、处理键盘、控制步进电机转动等任务,这就必须通过查询技术来实现。
在本设计中,主程序采用查询方式扫描键盘端口,检测按键动作是否发生,若有按键动作则处理键盘,根据按键实现键盘的实时处理功能。
查询控制步进电机的转动。
2、程序流程图
步进电机控制系统的主程序在对整个系统初始化后主要完成读键盘和处理键盘的功能,如图4-1所示:
图4-1步进电机控制系统主程序流程图
系统上电复位后,先调用初始化子程序,对步进电机各端口,相关参数进行初始化。
初始化完成后,步进电机处于停止状态,然后循环扫描按键是否被按下。
如果检测到有按键被按下,先软件去抖动,确定被按下后则执行相应的子程序,然后返回,继续执行主程序。
六、运行结果
连接好硬件电路,上电复位,程序开始运行。
此时步进电机不转动,按下启停键,步进电机开始转动,初始值设为正传,按反转键开始反转,再按正传键则开始正传。
当按下加速键时电机开始加速,当按下减速键时电机开始减速。
运行结果正常,符合设计要求。
实习结论
经过老师耐心细致的指导,经过近二个星期的努力,本次毕业设计课题步进电机控制系统告一段落。
步进电机控制系统主要分为硬件设计和软件设计两个部分:
硬件设计主要是把ARM最小系统、控制模块、步进电机驱动模块、等各个硬件功能模块及其它元件合理搭配并连接起来使其能够为软件运行提供一个硬件平台。
软件设计主要是通过编写程序代码,实现对整个系统的控制。
在系统上电复位后程序自动运行,通过接受查询外部的按键参数值,控制步进电机的启停,以及转速的增减和转动方向的改变;
本系统具有相当的实用功能,能基本符合实际应用需求,
通过这次课程设计,我从一开始对系统的不太熟悉,到能开发一个简单的系统,在这整个过程中我学到了很多东西,掌握了一些常用的开发技能,也发现了大量的问题,有些在设计过程中已经解决,有些还有待今后慢慢学习。
只要学习就会有更多的问题,有更多的难点,但也会有更多的收获。
最后,在这次设计中,感谢李老师对我们论文的指导和修改,感谢同学的帮助,感谢我的父母对我的无微培养,在此表示衷心的感谢!
实验心得:
****:
本次课程设计,我主要负责软件设计部分,通过编写程序代码,实现对整个系统的控制,在系统上电复位后程序自动运行,通过接受查询外部的按键参数值,控制步进电机的启停,以及转速的增减和转动方向的改变;
本系统具有相当的实用功能,能基本符合实际应用需求。
原本考研在即,我有些分身不暇,感谢本组其他成员的体谅,给我只分了极少的任务,但因我对ARM课程设计一直都有浓厚的兴趣,因而义不容辞的又成了小组中的主力。
我们大家齐心协力,也感谢老师的帮助,终于顺利的完成了任务!
这次课程设计的硬件部分由我来完成,硬件设计主要是把ARM最小系统、控制模块、步进电机驱动模块、等各个硬件功能模块及其它元件合理搭配并连接起来使其能够为软件运行提供一个硬件平台。
焊接电路的整个过程中,我获益良多,不仅锻炼了自己的动手能力,也在向同学老师请教的过程中学到了不少东西,衷心感谢同学老师的帮助!
通过本次课程设计,我最深的感触便是,团结就是力量,多亏各个成员紧密配合,终于完成了整个课程设计。
我主要负责这次课程设计的总结,写实验报告,以使整个课设过程系统而全面的展示出来,包括其原理、程序、电路图等等,都作了较为详细的诠释。
在总结的过程中,我不仅锻炼了自己的写作能力,同时又得到了更多与老师同学交流的机会,交流各自的心得体会,总能得到新的收获!
这次试验的成果,是我们每一个成员劳动的结晶,大家携手合作,最终由我来完成这份圆满的答卷,心里很高兴!
实验过程中难免遇到很多疑问,我的任务就是查阅资料了,其实网络书籍也是很好的老师,也能给我们答疑解惑!
查阅资料后,我先独立思考,再把疑问与小组同学探讨,只要我们都积极开动脑筋,团结合作,原来很多问题都是可以迎刃而解的!
最后也要在此感谢老师同学的帮助!
任务完成了,我得为考研作最后一搏,但愿能如本次课设一样有个圆满的结果!
参考文献
[1]ARM嵌入式系统基础教程[M].北京:
北京航空航天大学出版社.2008
[2]刘宝廷.步进电动机及其驱动控制系统[M].哈尔滨:
哈尔滨工业大学出版社.1997。
[3]陆春.步进电机细分调速系统的研究[M].北京:
北京交通大学硕士毕业论文.2003
[4]松井信行.控制用电机入门[M].北京:
科学出版社.2000
[5]朱志坚.三种典型的步进电动机驱动电路特性分析[J].新疆工学院学报.步进电机驱动,1999,(26):
12-15.
[6]王鸿钰.步进电机控制技术入门[M].上海:
同济大学出版社.1996
主程序:
/****************************************************************************
*文件名:
main.c
*功能:
LED显示控制。
*通过GPIO控制步进电机
*说明:
将跳线JP14和JP19全部短接。
****************************************************************************/
#include"
config.h"
#defineLED11<
<
18//P2.16
#defineMOTOA1<
22//P1.22
#defineMOTOB1<
23//P1.23
#defineMOTOC1<
24//P1.24
#defineMOTOD1<
25//P1.25
#defineLEDCON0x03c40000//LED控制字
//#defineMOTOCON0x0f000000//MOTO控制字
#defineGPIOSET(PIN)IO1SET=PIN//方便修改置位端口
#defineGPIOCLR(PIN)IO1CLR=PIN//方便修改清位端口
uint8k;
constuint32KEY1=1<
16;
//P0.16连接KEY1
uint8keynum;
volatileuint8rcv_new;
//接收新数据标志
uint8rcv_buf;
//UART0数据接收缓冲区
uint32time=1000;
chardata[]={"
你选择的是正向单四拍方式,步距角1.8度:
"
};
chardatb[]={"
你选择的是正向双四拍方式,步距角0.9度:
chardatc[]={"
你选择的是正向单双八拍方式,步距角0.45度:
chardatd[]={"
你选择的是反向单四拍方式,步距角1.8度"
chardate[]={"
你选择的是反向双四拍方式,步距角0.9度:
chardatf[]={"
你选择的是反向单双八拍方式,步距角0.45度:
charINFO[]={"
这是EasyARM2131步进电机程序,您将可以选择控制电机的转动方向和方式;
\
按键Key1控制电机的开始和停止;
1.正向单四拍方式;
2.正向双四拍方式;
3.正向单双八拍方式;
4.反向单四拍方式;
5.反向双四拍方式;
6.反向单双八拍方式;
请输入数字选择对应方式."
/*定义串口模式设置数据结构*/
typedefstructUartMode
{
uint8datab;
//字长度,5/6/7/8可选
uint8stopb;
//停止位,1/2可选
uint8parity;
//奇偶校验位,0-无校验,1-奇校验,2-偶校验
}UARTMODE;
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
voidMOTO_Mode4(uint8i);
//D-C-B-A
voidMOTO_Mode5(uint8i);
//BA-AD-DC-CB-BA
voidMOTO_Mode6(uint8i);
//A-AD-D-DC-C-CB-B-BA-A
/*
*********************************************************************************************************
**函数名称:
IRQ_UART0()
**函数功能:
串口0接收中断服务程序
**入口参数:
无
**出口参数:
*/
void__irqIRQ_UART0(void)
if((U0IIR&
0x0F)==0x04)
rcv_new=1;
//设置接收到新的数据标志
rcv_buf=U0RBR;
//读取FIFO的数据,并清除中断
VICVectAddr=0x00;
//中断处理结束
}
UART0_SendByte()
向串口0发送1字节数据
dat要发送的数据
voidUART0_SendByte(uint8dat)
U0THR=dat;
//要发送的数据
while((U0LSR&
0x20)==0);
//等待数据发送完毕
UART0_SendStr()
向串口发送一字符串
str要发送的字符串的指针
voidUART0_SendStr(char*str)
while
(1)
{
if(*str=='
\0'
)break;
//遇到结束符,退出
UART0_SendByte(*str++);
//发送数据
}
UART0_SendBuf()
向串口发送8字节数据
voidUART0_SendBuf(uint8t)
uint8connum;
connum=t;
switch(connum)
case1:
UART0_SendStr(INFO);
break;
case2:
UART0_SendByte(rcv_buf);
case3:
UART0_SendStr(data);
case4:
UART