第一篇:调研报告-步进电动机单片机调速控制电路设计
大连交通大学信息工程学院2011届本科生毕业设计(论文)实习(调研)报告
调研报告课题来源及意义
在电气时代的今天,电动机作为最主要的动力源,一直在现代化的生产和生活中起着十分重要的作用。无论是在工农业生产、交通运输、国防、航空航天、医疗卫生、商务与办公设备,还是在日常生活中的家用电器,都大量地使用着各种各样的电动机。据有关部门统计的资料显示,现在有90%以上的动力源来自于电动机,我国生产的电能60%用于电动机。电动机与人们的生活息息相关,密不可分。步进电机是一种将电脉冲信号转换成相应的角位移或线位移的机电执行元件,具有快速启停、精确以及直接接受数字量的特点,因而得到了广泛的应用。如在绘图机、打印机及光学仪器中,都采用步进电机来定位绘图笔印字头或光学镜头,特别是工业过程式控制的位置控制系统中,由于它的精确以及不用位移传感器即可达到精确定位,随着计算机控制技术的不断发展,应用会越来越广泛。
对电动机控制可分为简单控制和复杂控制两种。简单控制是指对电动机进行启动、制动、正反转和顺序控制。复杂控制是指对电动机的转速、转角、转矩、电压、电流等物理量进行控制。电动机的控制技术的发展得力于微电子技术、电力电子技术、传感器技术、自动控制技术、微机应用技术等的最新发展成就。正是这些技术的进步使电动机控制技术在近二十年内发生了天翻地覆的变化。其中电动机的控制部分已由模拟控制逐渐让位于以单片机为主的微处理器控制,形成数字与模拟的混合控制系统和纯数字控制系统的应用,并正向全数字控制方向快速发展。电动机的驱动部分所用的功率器件经历了几次更新换代,目前开关速度更快、控制更容易的全控型功率器件MOSFET和IGBT成为主流。
单片机介于工业控制计算机和可编程控制器之间,它有较强的控制功能、低廉的成本。人们在选择电动机的控制器时,常常是在先满足功能的需要的同时,优先选择成本低的控制器。因此,单片机往往成为优先选择的目标。从最近的统计数字可以看出,世界上每年要有25亿片各种单片机投入使用。单片机是目前世界上使用量最大的微处理器。
单片机取代模拟电路作为电动机的控制器有如下特点:电路简单;可以实现复杂控制;灵活性和适应性好;无零点漂移,控制精度高;可提供人机界面,多机联网工作。2 步进电动机的发展历程
步进电机最早在1920年由英国人开发,1950年代后期晶体管的发明也逐渐应用在步进电机上。步进电动机的发展与计算机工业和数字控制技术密切相关,产品按结构划分有磁阻式、永磁式和混合型等多种形式。近年来,伴随着微电子技术大功率电力电子器件及驱动技术的进步,发达国家已普遍使用性能优越的混合式步进电机,最典型的产品是二相8极50齿的电动机,步距角1.8°/0.9°(全步/半步);还有五相10极50齿和一些转子100齿的二相和五相步进电动机,五相电动机主要用于运行性能较高的场合。驱动技术采用恒相电流与细分驱动相结合,使步进电机在中、小功率控制系统内的精度提高,并逐步向高速大功率应用领域渗透。步进电动机最大的生产国是日本,如日本伺服公司、东方公司、SANYO DENKI和MINEBEA及NPM公司等,特别是日本东方公司,无论是电动机性能和外观质量还是生产手段,都是世界上最好的。
我国对步进电动机的研究从1958年开始,1970年代以前受苏联的影响,以三相磁阻式步进电动机为主,如1960年代末为快走丝数控线切割机床研制的BF1840-75,一直延续生产到现在。1970年代受到国内研制生产数控机床和其他数控设备的推动,并受到当时日本数控机床系统的影响开始发展磁阻式步进电动机的系列产品,以定子6个极、转子40齿的三相磁阻式电动机为主,还有定子10个极、转子100齿的五相磁阻式电动机和四相电动机等。
1980年代开始发展混合式步进电动机,以定子8极、转子50齿的二相(四相)混合式步进电动机为主。1987年开始自行设计定子10极、转子50齿的五相混合式步进电动机,同时还发展了一些不同于国外的非典型产品,如定子8极、转子60齿的二相(四相)混合式步进电动机。这是为了与磁阻式步进电动机的步距角相一致,转子200齿的五相混合式步进电动机,转子100齿的九相(三相)混合式步进电动机,主要特点是具有高分辨率和可变步矩角。
经过多年的发展,我国步进电机形成一种品种规格繁多的局面,其中最主要的产品系列,一是1970年代形成的磁阻式步进电动机系列产品在低端应用仍有较多的市场,继续生产;二是混合式步进电机的系列产品,包括引进技术和生产设备,按照国外的设计生产的二相和五相混合式步进电机,以及国内自行开发生产的混合式步进电动机,仍然拥有各自不同的应用领域,短期内很难统一到几个限定的规格品种上。
步进电机几十年的发展经验总结是:磁阻式适用于平稳运行以及转速大于1 000 r/min的用途;永磁式成本低,主要用在价格低廉的消费性产品中;永磁感应子式更适合于低速大转矩用途。步进电动机的前景展望
步进电动机经过几十年的发展,已成为除直流电动机和交流电动机以外的应用最广泛的第三类电动机.在开环高分辨率的定位系统中,至今还没有发现更合适取代它的产品,特别是在一些功率相当小的系统中,步进电机更具有无可替代的主流地位。
预计未来步进电机的研究还会持续深入下去,研究方向之一是电机与驱动的一体化,使步进电机体积更小巧、性能更优越,性价比更高,在大量的民用设备中批量化使用,如家庭机器人、民用智能化设备等;研究方向之二是在功率或机座号相对较大的步进电动机中,与属于BIDCM(稀土永磁无刷直流电机)的交流伺服电动机系统会合,具体来说可能会借鉴交流伺服系统的控制技术,但保留了部分步进电动机的特点,形成一种新的“步进伺服电动机”或“伺服步进电动机”,在克服低频振荡、高频过载能力小、快速性不足和效率低等方面取得突破性进展,从而在现代军事、精密机械加工、航空航天等领域的应用越来越深入。研究内容和目标
采用系列单片机实现对步进电动机调速系统的自动控制,利用计算机软件与单片机的串行口通信,达到上位机控制下位机实现步进电动机的启动、停止、正转、反转、加速、减速和状态显示的目的,使步进电动机控制更加灵活。
通过查阅资料,研究出以单片机为核心的实用控制电路,并进行调试。可以用显示电路进行对步进电动机工作状态的显示,而且要有完善的保护、互锁功能。设计方案的可行性分析
本次课题在以前《单片机的C语言》等书中有所涉及,而且网络和图书馆资源丰富,可以方便查到相关方面的文献、期刊、书籍和论文等,同时学院为我们提供的电脑机房,给予了我们很好的实验环境。因此,从主客观方面我认为这一方案是可行的。进度计划
为了更好的完成课题,通过查阅资料,特做如下安排:
第1周:根据题目,查找课题相关资料文献,初步从整体上了解课题,并撰写进度计划与考核表。
第2周:学习相关资料,初步撰写一篇与课题相关的调研报告。
第3周:继续学习相关资料,开始翻译相关的外文文献。
第4周:继续学习相关资料,了解课题内容及思路。
第5周:阅读国内外有步进电动机调速单片机控制的资料,掌握步进电动机控制系统的组成、原理等,并在此基础上掌握工程设计方法。
第6周:对自己要展开的设计方案进行初步设计和论证。
第7周:对步进电动机调速单片机控制进行电路设计,包括系统电路图,还有器件资料。
第8周:进行系统的软件设计,程序流程图,程序设计。
第9周:进行调试,看操作控制,并且总结设计中遇到的问题及解决方法。
第10周:继续上述总结工作,并逐步完善。
第11周:继续进行软件的分析,撰写毕业论文提纲,规划论文内容,并开始着手写毕业论文初稿。
第12周:整理材料,文件图标等,完成毕业论文的撰写并交给指导教师审查。第13周:论文修改,打印,装订成册,并提交。复习各种资料,准备答辩。
第14周:答辩,毕业论文成绩评定。参考文献
[1] 王宗培.任雷.混合式步进电动机的研究[J].电工技术杂志.1998.11(3):12-22
[2] 陈敏祥.五相混合式步进电动机驱动新技术[J].电机与控制学报.1998.22(6):1-9
[3] 华蕊.步进电机细分驱动技术综述[J].佛山科学技术学院学报(自然科学
版).1999.14(2):13-25
[4] 周明安.朱光忠.宋晓华.肖俊建.步进电机驱动技术发展及现状[J].机电工程技
术.2005.24(2):135-244
[5] 易长松.新型三相混合式步进电机驱动器[J].机电一体化.2001.22(9):21-66
[6] 赵永瑞.李刚.三相混合式步进电机系统[J].机电一体化.2000.21(6):33-87
[7] 林蔚天.焦斌.应用集成芯片UC3845构成高频开关电源[J].上海工程技术大学学
报.2001.12(2):1-14
[8] 叶斌.电力电子应用技术及装置[M].机械工业出版社.1999.[9] 孙育才.MCS-51系列单片机型计算机及其应用[M].东南大学出版社.1998
[10] 刘凤君.正弦波逆变器[M].科学出版社.2002
[11] 胡汉才.单片机原理及其接口技术[M].清华大学出版社.1996
[12] 林成武.步进电机微步驱动分析[J].沈阳工业大学学报.1996.23(6)33-36
[13] 宋受俊.刘卫国.李珉宇.通用混合式步进电动机驱动控制系统硬件设计[J].电气
传动.2007.22(9):45-77
[14] Robert Bosch GmbH.Autoelektrik Systeme and Komponenten Braunschweig[J]
Vieweg & Sohn Verlag.2002.21(3):22-39
第二篇:单片机课程设计任务书(步进电机控制)
湖北工程学院新技术学院课程设计任务书
课程单片机原理及仿真课程设计
题目单片机控制步进电机
专业姓名学号
主要内容、基本要求、主要参考资料等
1、主要内容:
根据单片机课程所学内容,结合其他相关课程知识,设计步进电机控制,以加深对单片机知识的理解,锻炼实践动手能力,为以后的毕业设计和工作打下坚实基础。
2、基本要求:
本设计以MCS-51系列单片机为核心,采用常用电子器件设计。根据要求设计一个单片机仿真控制,要求:设计一个数码管;一个外中断通过门电路连接五个按键,这五个按键分别控制步进电机的正转反转暂停、加速与减速;正转时,数码管上显示‘Z’,反转时显示“F”,暂停时显示“S”,按加速键时,电机加速,按减速键时,电机减速。
(1)用PROTOUS设计出步进电机控制工作原理实验电路图
(2)通过对AT89S51单片机编程,编写定步进电机控制程序,实现用步进电机控制。
(3)上交相应仿真的电路图与编程文档。
(4)写出详细的设计原理说明小论文。
3、主要参考资料:
[1] 李泉溪,倪水平.单片机原理与应用实例仿真.北京:北京航空航天大学出版社,2012.[2] 张友德,赵志英,徐时亮.单片微机原理应用与实验.上海:复旦大学出版社,2010.[3] 单片机仿真实验系统说明书.完成期限
指导教师
2012年12月2 日
第三篇:基于51单片机的交通灯控制电路设计
交通灯
一、功能要求
要求甲车道和乙车道两条交叉道路上的车辆交替运行,每次通行时间都设为25秒,黄灯先亮5秒钟,才能变换运行车道;黄灯亮时,要求每秒钟闪亮一次。
二、电路图
说明:1)每一位数码管位选要分开,对应IO口参照程序中红色部分 2)图示数码管为共阳,没加驱动数码管显示较暗,建议加驱动
三、程序
//TrafficLight.c #include“reg52.h”
//IO口定义 sbit red_1 =P2^0;//南北方向 sbit red_2 =P2^3;//东西方向 sbit yellow_1 =P2^1;sbit yellow_2 =P2^4;sbit green_1 =P2^2;sbit green_2 =P2^5;sbit com1_1 =P3^6;//十位 南北方向 数码管位选 sbit com1_2 =P3^7;//个位 南北方向 sbit com2_1 =P3^4;//十位 东西方向 sbit com2_2 =P3^5;//个位 东西方向
//全局变量 char time=30;//倒计时
unsigned char num1=0,num2=0;//辅助计时 unsigned char flag1=0,flag2=0;//黄灯闪标志位 unsigned char shi1,shi2,ge1,ge2;//数码管十位个位
const unsigned char ledNum[] =
{// 0 1
A
b
c
d
E
F
不显示-o(18)H(19)h(20)C(21)0(22)n(23)0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8e,0xFF,0xbf,0xa3,0x89,0x8b,0xc6,0xc0,0xab };//共阳数码管
//中断优先级别T0>T1,数码管显示中断间隔2ms,计时时间间隔50ms //计时要求比较精确,间隔长,不应该被打断,故中断优先级要高,使用T0 //数码管中断可以被打断,打断时间较短,不会影响显示,使用T1 //在交通灯中,计时和数码管显示一直进行,故定时器开启后不用停止 void InitInter(void){ TMOD=0x11;//设置定时器工作方式为16位计时器
TH0=(65535-45872)/256;//11.0592M晶振,50ms TL0=(65535-45872)%256;TH1=(65535-1835)/256;//11.0592M晶振,2ms TL1=(65535-1835)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;}
void Display(void){ static unsigned char i=1;
switch(i){ case 1:
com2_2=0;
P0=ledNum[shi1];
com1_1=1;
break;case 2:
com1_1=0;
P0=ledNum[ge1];
com1_2=1;
break;case 3:
com1_2=0;
P0=ledNum[shi2];
com2_1=1;
break;case 4:
com2_1=0;
P0=ledNum[ge2];
com2_2=1;
break;
default:;}
i++;if(i>4)i=1;}
//红灯可以直接变成绿灯,但绿灯必须先变成黄灯再变红灯 void main(void){ bit i=0;InitInter();
while(1){
red_1=0;//0为亮
red_2=1;
green_2=0;
time=30;
while(time>5)
{
shi1=time/10;
ge1=time%10;
shi2=(time-5)/10;
ge2=(time-5)%10;
}
green_2=1;
yellow_2=0;
flag2=1;
num2=0;
while(time>0)
{
shi1=time/10;
ge1=time%10;
shi2=time/10;
ge2=time%10;
}
flag2=0;
yellow_2=1;
red_2=0;
red_1=1;
green_1=0;
time=30;
while(time>5)
{
shi2=time/10;
ge2=time%10;
shi1=(time-5)/10;
ge1=(time-5)%10;
}
green_1=1;
yellow_1=0;
flag1=1;
num2=0;
while(time>0)
{
shi2=time/10;
ge2=time%10;
shi1=time/10;
ge1=time%10;
}
flag1=0;
yellow_1=1;
//red_1=0;
//green_2=0;} } void Timer_0(void)interrupt 1//计时 { TH0=(65535-45872)/256;TL0=(65535-45872)%256;num1++;if(num1>=20){
num1=0;
time--;
//if(time<0)time=30;
//处理time,显示方式
} if(flag1||flag2){
num2++;
if(num2>=10)
{
num2=0;
if(flag1)yellow_1=~yellow_1;
if(flag2)yellow_2=~yellow_2;
} } }
void Timer_1(void)interrupt 3 { TH1=(65535-1835)/256;//11.0592M晶振,2ms TL1=(65535-1835)%256;
Display();}
第四篇:基于单片机的视力保护器电路设计(开题报告)
安 徽 科 技 学 院
毕业论文(设计)开题报告
教学院(部):理学院
专业名称:电子科学与技术
姓名:毕成治
学号:1886080201
届别:2012届指导教师:吕越凤
2012年 3月
第五篇:ARM的步进电机细分控制报告
基于ARM的步进电机细分驱动控制设计
一、ARM简介
ARM 公司是一家IP供应商,其核心业务是IP核以及相关工具的开发和设计。半导体厂商通过购买ARM公司的IP授权来生产自己的微处理器芯片。由此以来,处理器内核来自ARM公司、各芯片厂商结合自身已有的技术优势以及芯片的市场定位等因数使芯片设计最优化,从而产生了一大批高度集成、各据特色的SOC芯片。
ARM微处理器具有以下特点:采用RISC指令集、使用大量寄存器、ARM/THUMB指令支持、三/五级流水线具有低功耗、低成本、高性能等。
到目前为止,ARM公司的IP核已经由ARM7,ARM9发展到今天的ARM11版本,ARM微处理器及技术的应用已经广泛深入到国民经济的各个领域, 如工业控制领域、网络应用、消费类电子产品及成像和安全产品等领域。
鉴于ARM7所具备的强大功能完全可以满足本次设计要求,本次设计仍使用ARM7系列芯片。
二.步进电机细分控制方案
1、步进电机细分技术简介
细分驱动技术在七十年代中期由美国学者首次提出,基本原理是将绕组中的电流细分。由常规的矩形波供电改为阶梯波供电,此时绕组中的电流将按一定的阶梯顺序上升和下降,从而将每一自然步进行细分。步进电机细分控制的本质是通过对励磁绕组中的电流控制,使步进电机合成磁场为均匀离散化的圆形旋转磁场。采用细分驱动技术可以改善步进电机的运行品质,减少转矩波动、抑制振荡、降低噪音、提高步距分辨率。
2、硬件框图设计
系统总体硬件框图设计如图2-1所示:
0
图2-1总体设计框图
3、软件总体设计流程图
图2-2 软件设计流程图
4、步进电机
图2-3 28BYJ-48-5VDC步进电机
中间部分是转子,由一个永磁体组成,边上的是定子绕组。当定子的一个绕组通电时,将产生一个方向的电磁场,如果这个磁场的方向和转子磁场方向不在同一条直线上,那么定子和转子的磁场将产生一个扭力将定子扭转。依次改变绕组的磁场,就可以使步进电机正转或反转(比如通电次序为A->B->C->D正转,反之则反转)。而且按照通电顺序的不同,可分为单四拍(A-B-C-D)、双四拍(AB-BC-CD-DA)、单双八拍(A-AB-B-BC-C-CD-D-DA)三种工作方式。单四拍与双四拍的步距角相等,但单四拍的转动力矩小。八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。
由于步进电机的驱动电流较大,单片机不能直接驱动,一般都是使用ULN2003达林顿阵列驱动,当然,使用下拉电阻或三极管也是可以驱动的,只不过效果不是那么好,产生的扭力比较小。
5、电机驱动ULN2003简介
ULN2003 是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成。ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。可直接驱动继电器等负载。输入5VTTL电平,输出可达500mA/50V。ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。
图2-4 ULN2003芯片引脚图
该电路的特点如下: ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路 直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003 是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V 的电压,输出还可以在高负载电流并行运行。其接线图如下所示:
图2-5 步进电机驱动电路 6、12864液晶显示简介
12864是128*64点阵液晶模块的点阵数简称。液晶屏类型:STN FSTN;模块显示效果:黄绿底黑字、蓝底白字、白底黑字;驱动方式:1/64 DUTY 1/9 BIAS;背光:LED白色、LED黄绿色;控制器:KS0108或兼容 ST7920 T6963C;数据总线:8 位并口/6800 方式 串口;工作温度:-20℃~+70℃;储藏温度:-30℃~+80℃;点阵格式:128 x 64;现实角度:6:00直视;基本用途:该点阵的屏显成本相对较低,适用于各类仪器,小型设备的显示领域。其接线图如下所示:
图2-6 12864液晶显示与LPC2131接口接线图
三、硬件电路图
图2-7 系统硬件电路图
四、总结
此次基于ARM的步进电机细分驱动控制设计,由于掌握知识及时间有限,我们目前只实现了对步进电机正反转控制以及三种运行方式(单四拍、双四拍、单双八拍)的选择控制,并且实现了在12864液晶显示屏上显示相关的信息。连接好硬件电路,上电复位,程序开始运行。此时步进电机不转动,按下启停键,步进电机开始转动,初始值设为正传,按反转键开始反转,再按正传键则开始正传。当按下加速键时电机开始加速,当按下减速键时电机开始减速。
当然,此次课程设计还存在很多问题,实现的功能较简单,这都需要以后不断加强相关知识的学习从而不断提高自己。
最后,感谢李红岩老师和黄梦涛老师的辛勤教诲。
五、心得体会
这次课程设计的硬件部分由我来完成,虽然不用焊接电路,但是在画硬件图的过程中仍遇到很多问题。例如对Protel软件的不熟悉,许多操作需要多次尝试,才能正确完成;还有就是在电路的连接过程中,由于自己的马虎,线路有错连和少连的现象。但是经过自己的不断努力,最终还是完成了任务。
通过这次课程设计,我从一开始对系统的不太熟悉,到能开发一个简单的系
统,在这整个过程中我学到了很多东西,掌握了一些常用的开发技能,也发现了大量的问题,有些在设计过程中已经解决,有些还有待今后慢慢学习。只要学习就会有更多的问题,有更多的难点,但也会有更多的收获。
在本次ARM课程设计训练中,不仅锻炼了自己的动手能力,也在向同学老师请教的过程中学到了不少东西,十分感谢老师和同学的帮助。通过本次课程设计,我最深的感触便是,许多东西都需要自己亲自去做去实践去学习,才能真正的弄懂,才能真正的学到东西。
在整个的设计和实践过程中,通过老师的指导和同学的帮助,我们组最终在最后时间完成了任务。通过这次课程设计,才知道自己需要学习的东西还有很多,下来之后一定得加紧学习。平常我们都只是在课堂上学习,通过这次课程设计,实现了从理论到实践的飞跃。增强了认识问题,分析问,解决问题的能力。
最后感谢老师对我们此次课设的耐心指导和帮助!
经过这次ARM课程设计,使我对这学期ARM课程做了全面的复习,并学会将其应用于实践,在这次基于ARM的步进电机细分控制中,我对于ARM、步进电机、液晶显示及相关软件都有了进一步的认识,也是我发现团队合作的重要性,更激起了我对于电子设计方面的热情。
不过,通过这次课程设计,我同样感受到了自身知识的缺乏,如不太熟悉使用上位机进行监控、ARM的掌握不够透彻、还不能脱离参考资料独立进行软硬件设计等,这些都需要我以后不断加强学习锻炼加以增强,这将对于我今后进一步的学习打下基础,我以后会不断根据自身缺点进行学习锻炼,使自己不断提高。最后,感谢老师的辛勤教诲!
六、参考文献
1.ARM嵌入式系统基础教程[第2版] 主编 周立功 北京航空航天大学出版社.2008 2.步进电动机及其驱动控制系统 主编 刘宝廷 哈尔滨工业大学出版社.1997
附录
#include“config.h” #define
MOTOA
1<<10
// P0.10
#define
MOTOB
1<<11
// P0.11
#define
MOTOC
1<<12
// P0.12 #define
MOTOD
1<<13
// P0.13 #define
key1
1<<17
// 加速 #define
key2
1<<18
// 减速 #define
key3
1<<19
//正反转 #define
key4
1<<20
//启停
#define
KEYCON 0x001e0000 // LED控制字 #define
MOTOCON 0x00003c00 // MOTO控制字
#define
GPIOSET(PIN)IO0SET = PIN
// 方便修改置位端口 #define
GPIOCLR(PIN)IO0CLR = PIN
// 方便修改清位端口 #define
RS
1<<9
//P0.9 #define
SID
1<<6
//P0.6 #define
E
1<<4
//P0.4 #define
PSB
1<<2
//P0.2并行或串行,选择低电平串行模式 #define
RST
1<<25
//P1.25,复位脚
unsigned char DAT1[64]=“低速—单四拍A-B-C-D运行方式”;unsigned char DAT2[64]=“中速—双四拍AB-BC-CD-DA运行方式”;unsigned char DAT3[64]=“高速—单双八拍A-AB-B-BC-C-CD-D-DA运行方式”;unsigned char DAT4[64]=“低速反转—单四拍D-C-B-A运行方式”;unsigned char DAT5[64]=“中速反转—双四拍AD-DC-CB-BA运行方式”;unsigned char DAT6[64]=“高速反转—单双八拍D-CD-C-BC-B-AB-A-DA运行方式”;unsigned char DAT7[64]=“
停
止
”;unsigned char DAT8[64]=“步进电机细分控制测控1002班:刘怡楠&石娟利”;
void TransferCom(unsigned char data0);void TransferData(unsigned char data1);void delay(unsigned int m);void lcd_mesg(unsigned char *adder1);void SendByte(unsigned char Dbyte);void init(void);void LCD12864_init(void);void DelayNS(uint32 dly);void MOTO_Mode1(uint8 i);
// A-B-C-D void MOTO_Mode10(uint8 i);void MOTO_Mode2(uint8 i);
// AB-BC-CD-DA-AB void MOTO_Mode20(uint8 i);void MOTO_Mode3(uint8 i);
// A-AB-B-BC-C-CD-D-DA-A void MOTO_Mode30(uint8 i);
int main(void){
unsigned int t=0;//启停标志
unsigned int f=0;//正反转标志
unsigned int i=0;//电机运行模式标志
PINSEL0=0x00000000;
PINSEL1=0X00000000;
PINSEL2&=~(0x00000006);//设置所有I/O口为普通GPIO口
IO0DIR =MOTOCON;// 配置I/O输入输出方向
LCD12864_init();//液晶端口初始化
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key4)!=0)
{ init();
lcd_mesg(DAT8);
//显示界面
}
while(1)
{
if(t==0)//电机停止
{ init();
lcd_mesg(DAT7);
IO0CLR=MOTOCON;
if((IO0PIN&key4)==0)t=!t;//key4控制启停转换
} else if(t==1)//电机启动
{ if((IO0PIN&key1)==0)//key1控制加速
{ if(i>=2)i=2;
else i++;
DelayNS(10);
}
if((IO0PIN&key2)==0)//key2控制减速
{ if(i<=0)i=0;
else i--;
DelayNS(10);
}
if((IO0PIN&key3)==0)f=!f;//key3控制正反转
if((IO0PIN&key4)==0)t=!t;
if(f==0)
//正转
{ if(i==0)MOTO_Mode1(10);//低速
else if(i==1)MOTO_Mode2(10);//中速
else if(i==2)MOTO_Mode3(10);//高速
}
else if(f==1)//反转
{ if(i==0)MOTO_Mode10(10);//低速
else if(i==1)MOTO_Mode20(10);//中速
else if(i==2)MOTO_Mode30(10);//高速
} }
}
return(0);}
void DelayNS(uint32 dly){ uint32 i;
for(;dly>0;dly--)
for(i=0;i<5000;i++);} void MOTO_Mode1(uint8 i)
//单四拍A-B-C-D运行方式 {
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key4)!=0)
{
init();
lcd_mesg(DAT1);//显示字符串DAT1
/* A */
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOA);
/* B */
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOB);
/* C */
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOC);
/* D */
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOD);
} } void MOTO_Mode10(uint8 i)
//单四拍D-C-B-A运行方式 {
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key4)!=0)
{
init();
lcd_mesg(DAT4);
//显示字符串DAT4
/* D */
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOD);
/* C */
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOC);
/* B */
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOB);
/* A */
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOA);
} } void MOTO_Mode2(uint8 i)
//双四拍AB-BC-CD-DA运行方式 {
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key4)!=0)
{
init();
lcd_mesg(DAT2);
//显示字符串DAT2
GPIOSET(MOTOA);
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOA);
GPIOCLR(MOTOB);
/* BC */
GPIOSET(MOTOB);
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOB);
GPIOCLR(MOTOC);
/* CD */
GPIOSET(MOTOC);
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOC);
GPIOCLR(MOTOD);
/* DA */
GPIOSET(MOTOD);
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOD);
GPIOCLR(MOTOA);
} } void MOTO_Mode20(uint8 i)
//双四拍AD-DC-CB-BA运行方式 {
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key4)!=0)
{
init();
lcd_mesg(DAT5);
//显示字符串DAT5
GPIOSET(MOTOA);
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOA);
GPIOCLR(MOTOD);
/* DC */
GPIOSET(MOTOD);
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOD);
GPIOCLR(MOTOC);
/* CB */
GPIOSET(MOTOC);
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOC);
GPIOCLR(MOTOB);
/* BA */
GPIOSET(MOTOB);
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOB);
GPIOCLR(MOTOA);
} } void MOTO_Mode3(uint8 i)
//单双八拍A-AB-B-BC-C-CD-D-DA运行方式 {
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key4)!=0)
{
init();
lcd_mesg(DAT3);
//显示字符串DAT3
/* 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);
/* CD */
GPIOSET(MOTOC);
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOC);
GPIOCLR(MOTOD);
/* D */
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOD);
/* DA */
GPIOSET(MOTOD);
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOD);
GPIOCLR(MOTOA);
} } void MOTO_Mode30(uint8 i)
//单双八拍D-CD-C-BC-B-AB-A-DA运行方式 {
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key4)!=0)
{
init();
lcd_mesg(DAT6);
//显示字符串DAT6
/* D */
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOD);
/* CD */
GPIOSET(MOTOC);
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOC);
GPIOCLR(MOTOD);
/* C */
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOC);
/* BC */
GPIOSET(MOTOB);
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOB);
GPIOCLR(MOTOC);
/* B */
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOB);
/* AB */
GPIOSET(MOTOA);
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOA);
GPIOCLR(MOTOB);
/* A */
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOA);
/* DA */
GPIOSET(MOTOD);
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOD);
GPIOCLR(MOTOA);
} } void delay(unsigned int m){
unsigned int i,j;
for(i=0;i for(j=0;j<50;j++);} void init(void){ delay(40); //大于40ms的延时程序 IO0SET=PSB;//设置为串行工作方式 delay(1); IO1CLR=RST;//复位 delay(1); IO1SET=RST;//复位置高 delay(10); TransferCom(0x30);//RE=0,G=0,图片显示关 delay(100); TransferCom(0x0C);//D=1,显示开 delay(100); TransferCom(0x01);//清屏 delay(10); TransferCom(0x06);//模式设置,光标从右向左加1位移动 delay(100);} void lcd_mesg(unsigned char *adder1){ unsigned char i; TransferCom(0x80); delay(100); for(i=0;i<32;i++) { TransferData(*adder1); adder1++; } TransferCom(0x90); delay(100); for(i=32;i<64;i++) { TransferData(*adder1); adder1++; } } void SendByte(unsigned char Dbyte){ unsigned char i; for(i=0;i<8;i++) { IO0CLR=E; if((Dbyte&0x80)==0x80)IO0SET=SID; else IO0CLR=SID; Dbyte=Dbyte<<1; IO0SET=E; IO0CLR=E; } } void TransferCom(unsigned char data0){ IO0SET=RS; SendByte(0xf8); // 11111,RW=0,RS=1,0 SendByte(0xf0&data0);//高4位 SendByte(0xf0&data0<<4);//低4位 IO0CLR=RS; } void TransferData(unsigned char data1){ IO0SET=RS; SendByte(0xfa); // 11111,RW=0,RS=1,0 SendByte(0xf0&data1);//高4位 SendByte(0xf0&data1<<4);//低4位 IO0CLR=RS;} void LCD12864_init(void){ IO0DIR|=(E|SID|RS);//设置为输出 IO0CLR=(E|SID|RS); IO1DIR|=RST; IO1CLR=RST; //复位 delay(1); IO1SET=RST; //复位置高 }