步进电机(键盘控制可调速)

合集下载

步进电机控制方法及编程实例

步进电机控制方法及编程实例

步进电机控制方法及编程实例
步进电机在现代自动化控制系统中广泛应用,其精准的位置控制和相对简单的驱动方式使其成为许多工业和家用设备中的理想选择。

本文将介绍步进电机的控制方法及编程实例,帮助读者更好地理解和应用这一技术。

步进电机的基本原理
步进电机是一种将电能转换为机械能的电机,其运行原理基于磁场相互作用。

步进电机内部包含多个电磁线圈,根据电流方向和大小的不同来控制转子的运动。

通过逐个激活线圈,可以实现步进电机的准确位置控制,使其能够按照指定的步长旋转。

步进电机的控制方法
1.单相激励控制:最简单的步进电机控制方式之一。

通过依次激活每一相的线圈,
使电机按照固定步长旋转。

这种方法控制简单,但稳定性较差。

2.双相正交控制:采用两相电流的正交控制方式,提高了步进电机的稳定性和精
度。

可以实现正向和反向旋转,常用于对位置要求较高的应用场景。

3.微步进控制:将步进电机每个步进细分为多个微步进,以提高控制精度和减小振
动。

虽然增加了控制复杂度,但可以获得更平滑的运动和更高的分辨率。

步进电机的编程实例
下面以Python语言为例,演示如何通过控制步进电机的相序来实现简单的旋转控制。

通过以上代码,可以实现对步进电机的简单控制,按照设定的相序进行旋转,实现基本的位置控制功能。

结语
步进电机是一种常用的精准位置控制设备,掌握其控制方法和编程技巧对于工程师和爱好者来说都是有益的。

希望本文介绍的步进电机控制方法及编程实例能够帮助读者更好地理解和应用这一技术。

大学毕业设计 C51程序控制步进电机

大学毕业设计 C51程序控制步进电机

题目:简易步进电机控制步进电机控制摘要:本设计采用ATMEL公司DIP-40封装的AT89S52单片机实现对四相步进电机的手动和按键控制。

由单片机产生的脉冲信号经过分配后分解出对应的四相脉冲,分解出的四相脉冲经驱动电路功率放大后驱动步进电机的转动。

转速的调节和状态的改变由按键进行选择,此过程由程序直接进行控制。

通过键盘扫描把选择的信息反馈给单片机,单片机根据反馈信息做出相应的判断并改变输出脉冲的频率或转动状态信号。

电机转动的不同状态由液晶LCD1602显示出来。

而设计的扩展部分可以通过红外信号的发射由另一块单片机和红外线LED完成,用红外万能接收头接收红外信号,可以实现对电机的控制进行红外遥控。

关键字:四相步进电机单片机功率放大 LCD1602步进电机控制 (1)摘要 (1)关键字 (1)前言 (3)1系统总体方案设计及硬件设计 (4)1.1步进电机 (4)1.1.1 步进电机的种类 (4)1.1.2 步进电机的特点 (4)1.1.3 步进电机的原理 (5)1.2 控制系统电路设计 (7)1.3 液晶显示LCD1602 (7)1.4 AT89S52核心部件及系统SCH原理图 (9)1.5 LN2003A驱动 (10)2软件设计及调试 (13)2.1程序流程 (13)2.2软件设计及调试 (14)3 扩展功能说明 (15)4设计总结 (16)5 设计源程序 (16)6 附录 (21)参考文献 (22)附2:系统原理图及实物图 (23)步进电机广泛应用于对精度要求比较高的运动控制系统中,如机器人、打印机、软盘驱动器、绘图仪、机械阀门控制器等。

目前,对步进电机的控制主要有由分散器件组成的环形脉冲分配器、软件环形脉冲分配器、专用集成芯片环形脉冲分配器等。

分散器件组成的环形脉冲分配器体积比较大,同时由于分散器件的延时,其可靠性大大降低;软件环形分配器要占用主机的运行时间,降低了速度;专用集成芯片环形脉冲分配器集成度高、可靠性好,但其适应性受到限制,同时开发周期长、需求费用较高。

步进电机调速方法

步进电机调速方法

一、变极对数调速方法这种调速方法是用改变定子绕组的接红方式来改变笼型电动机定子极对数达到调速目的,特点如下: 1、具有较硬的机械特性,稳定性良好; 2、无转差损耗,效率高; 3、接线简单、控制方便、价格低; 4、有级调速,级差较大,不能获得平滑调速; 5、可以与调压调速、电磁转差离合器配合使用,获得较高效率的平滑调速特性。

本方法适用于不需要无级调速的生产机械,如金属切削机床、升降机、起重设备、风机、水泵等。

二、变频调速方法变频调速是改变电动机定子电源的频率,从而改变其同步转速的调速方法。

变频调速系统主要设备是提供变频电源的变频器,变频器可分成交流-直流-交流变频器和交流-交流变频器两大类,目前国内大都使用交-直-交变频器。

其特点: 1、效率高,调速过程中没有附加损耗; 2、应用范围广,可用于笼型异步电动机; 3、调速范围大,特性硬,精度高; 4、技术复杂,造价高,维护检修困难。

5、本方法适用于要求精度高、调速性能较好场合。

三、串级调速方法串级调速是指绕线式电动机转子回路中串入可调节的附加电势来改变电动机的转差,达到调速的目的。

大部分转差功率被串入的附加电势所吸收,再利用产生附加的装置,把吸收的转差功率返回电网或转换能量加以利用。

根据转差功率吸收利用方式,串级调速可分为电机串级调速、机械串级调速及晶闸管串级调速形式,多采用晶闸管串级调速,其特点为: 1、可将调速过程中的转差损耗回馈到电网或生产机械上,效率较高; 2、装置容量与调速范围成正比,投资省,适用于调速范围在额定转速70%-90%的生产机械上; 3、调速装置故障时可以切换至全速运行,避免停产; 4、晶闸管串级调速功率因数偏低,谐波影响较大。

5、本方法适合于风机、水泵及轧钢机、矿井提升机、挤压机上使用。

四、绕线式电动机转子串电阻调速方法绕线式异步电动机转子串入附加电阻,使电动机的转差率加大,电动机在较低的转速下运行。

串入的电阻越大,电动机的转速越低。

步进电机的调速原理

步进电机的调速原理

步进电机的调速原理
调速原理是指控制步进电机转速的方法。

常见的调速原理有以下几种:
1. 定常电流控制:通过控制步进电机的驱动电流大小来实现调速。

电机转速与驱动电流成正比关系,增大电流可以提高转速,减小电流可以降低转速。

2. 单微步调速:通过改变步进电机的微步数来实现调速。

步进电机分为全步和微步两种工作模式,全步每转一周,电机转动一个完整的步距角,而微步则是将步距角进一步细分。

通常通过控制电机可执行的微步数,来调控电机的转速。

3. 物理机械调速:通过改变步进电机的负载来实现调速。

例如,在电机轴上增加负载可以降低转速,减小负载则可以提高转速。

4. 闭环调速:通过反馈系统来实现闭环控制,实时调整电机驱动信号以达到预定转速。

常见的闭环调速方法有位置反馈和速度反馈。

位置反馈通常使用编码器等装置来实时监测电机转动角度,根据误差信号调整驱动信号;速度反馈则是通过速度传感器实时监测电机转速,并根据误差信号进行调整。

这些调速原理可以根据实际需求进行选择和组合,以实现步进电机的精确调速。

51单片机按键控制步进电机加减速及正反转

51单片机按键控制步进电机加减速及正反转

51单片机按键控制步进电机加减速及正反转之前尝试用单片机控制42步进电机正反转,电机连接导轨实现滑台前进后退,在这里分享一下测试程序及接线图,程序部分参考网上找到的,已经实际测试过,可以实现控制功能。

所用硬件:步进电机及驱动器、STC89C52单片机、直流电源1、硬件连接图•注意:上图为共阳极接法,实际连接参考总体线路连接。

•驱动器信号端定义:PUL+:脉冲信号输入正。

( CP+ )PUL-:脉冲信号输入负。

( CP- )DIR+:电机正、反转控制正。

DIR-:电机正、反转控制负。

EN+:电机脱机控制正。

EN-:电机脱机控制负。

•电机绕组连接A+:连接电机绕组A+相。

A-:连接电机绕组A-相。

B+:连接电机绕组B+相。

B-:连接电机绕组B-相。

•电源连接VCC:电源正端“+”GND:电源负端“-”注意:DC直流范围:9-32V。

不可以超过此范围,否则会无法正常工作甚至损坏驱动器.•总体线路连接输入信号共有三路,它们是:①步进脉冲信号PUL+,PUL-;②方向电平信号DIR+,DIR-③脱机信号EN+,EN-。

输入信号接口有两种接法,可根据需要采用共阳极接法或共阴极接法。

在这里我采用的是共阴极接法:分别将PUL-,DIR-,EN-连接到控制系统的地端(接入单片机地端);脉冲输入信号通过PUL+接入单片机(代码中给的P2^6脚),方向信号通过DIR+接入单片机(代码中给的P2^4脚),使能信号通过EN+接入(不接也可,代码中未接,置空)。

按键连接见代码,分别用5个按键控制电机启动、反转、加速、减速、正反转。

注意:接线时请断开电源,电机接线需注意不要错相,相内相间短路,以免损坏驱动器。

2、代码1.#include<reg51.h>2.#define MotorTabNum 53.unsigned char T0_NUM;4.sbit K1 = P3^5; // 启动5.sbit K2 = P3^4; // 反转6.sbit K3 = P3^3; // 加速7.sbit K4 = P3^2; // 减速8.sbit K5 = P3^1; //正反转9.10.sbit FX = P2^4; // 方向11.//sbit MotorEn = P2^5; // 使能12.sbit CLK = P2^6; // 脉冲13.14.inttable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};15.16.unsigned char g_MotorSt = 0; //17.unsigned char g_MotorDir = 0; //18.unsigned char MotorTab[7] = {12, 10, 8, 6, 4, 2,1};19.20.signed char g_MotorNum = 0;21.22.void delayms(xms);23.void mDelay(unsigned int DelayTime);24.void T0_Init();25.26.void KeyScan(void);27.28.29.30.void main(void)31.{32.T0_Init();33.// MotorEn = 0; //34.FX = 0;35.while(1)36.{37.KeyScan(); //38.}39.40.41.}42.43.void T0_Init()44.{45.TMOD = 0x01;46.TH0 = (65535-100)/256; // 1ms47.TL0 = (65535-100)%256;48.EA = 1;49.ET0 = 1;50.// TR0 = 1;51.52.}53.54.void T0_time() interrupt 155.{56.// TR0 = 0;57.TH0 = (65535-100)/256;58.TL0 = (65535-100)%256;59.T0_NUM++;60.if(T0_NUM >= MotorTab[g_MotorNum]) //61.{62.T0_NUM = 0;63.CLK=CLK^0x01; //64.}65.// TR0 = 1;66.}67.68.69.//--------------------------70.void KeyScan(void)71.{72.if(K1 == 0)73.{74.delayms(10);75.if(K1 == 0)76.{77.g_MotorSt = g_MotorSt ^ 0x01;78.// MotorEn ^= 1;79.TR0 = 1;80.FX ^= 0; //反转81.}82.}83.84.if(K2 == 0)85.{86.delayms(10); //正转87.if(K2 == 0)88.{89.g_MotorDir = g_MotorDir ^ 0x01;90.FX ^= 1; //加速91.}92.}93.94.if(K3 == 0) //95.{96.delayms(5); //加速97.if(K3 == 0)98.{99.g_MotorNum++;100.if(g_MotorNum > MotorTabNum) 101.g_MotorNum = MotorTabNum; 102.}103.}105.if(K4 == 0) //106.{107.delayms(5); // 减速108.if(K4 == 0)109.{110.g_MotorNum--;111.if(g_MotorNum < 0)112.g_MotorNum = 0;113.}114.}115.116.if(K5 == 0) //117.{118.delayms(10); // 正反转119.if(K5 == 0)120.{121.g_MotorSt = g_MotorSt ^ 0x01; 122.g_MotorDir = g_MotorDir ^ 0x01; 123.MotorEn ^= 1;124.TR0 = 1;125.while(1)126.{127.FX ^= 1; //128.delayms(90000);129.FX ^= 0; //130.delayms(90000);131.}132.}133.}135.136.void delayms(xms)//延时137.{138.unsigned int x,y;139.for(x=xms;x>0;x--)140.for(y=110;y>0;y--);141.}3、常见问题解答•控制信号高于5v一定要串联电阻,否则可能会烧坏驱动器控制接口电路。

基于51单片机的步进电机调速系统(含完整代码)

基于51单片机的步进电机调速系统(含完整代码)

课程设计报告设计题目:遥控小车——基于51单片机的步进电机调速系统学院:专业:班级:学号:姓名:电子邮件:时间:成绩:指导教师:华南农业大学理学院应用物理系课程设计(报告)任务书学生姓名指导教师职称学生学号专业电子信息科学与技术题目基于51单片机的步进电机调速系统(遥控小车)任务与要求1. 设计并制作电路,利用单片计控制步进电机运转。

2. 通过键盘可以不间断地设定改变电机的转速、转向。

3. 利用显示器实时显示转速等参数。

4. 扩展功能:可设定转动步数。

开始日期2014 年3 月完成日期2014 年3 月1引言步进电机是一种将电脉冲转化为角位移的执行机构。

目前,步进机已经广泛应用于领域,例如工业生产中的机械臂的控制,照明装置和监控摄像机转动等。

步进机在装置转动、精确位移方面有很重大的作用。

本系统是基于STC89C51 单片机的遥控小车。

采用STC89C51单片机作为控制核心,通过ULN2003A驱动步进机(28BYJ-48)转动,由按键和显示屏1602组成人机交互模块,同时通过315M无线发射和接收模块向单片机输入控制信号,将整个系统固定于简易小车上,最终实现小车测试和远程遥控功能。

基本达到预定的设计要求以及功能的扩展。

2系统的设计与理论分析2.1系统总体设计2.2理论分析本设计分为两种工作模式:测试模式、遥控模式。

在电路板上有一个带锁的开关进行设置。

测试模式工作时,通过控制小车上的按键进行加速、减速、反转、设置、步数增、步数减等按键,单片机扫描按键,通过软件控制液晶模块显示对应的转速、设置的速度和步数,同时控制步进机模块进行相应的转动。

步进机的是由ULN2003A达林顿管驱动,由单片机控制输入脉冲的频率来控制步进机的转速,单片机是通过程序查表对4个I/O口输出脉冲,本次设计采用的是两相四线减速步进机,步进角为5.625°,减速比为64:1,程序采用的是8拍查表,具有较好的扭矩。

遥控模式工作时,遥控部分五个按键分别输入前、后、左、右、暂停,单片机扫描按键,通过无线发射模块发射串行编码,小车的无线接收模块接收对应的编码,送至单片机进行解码,从而控制液晶模块的显示和步进机模块的工作,进而完成功能。

如何控制步进电机速度(即如何计算脉冲频率)

如何控制步进电机速度(即如何计算脉冲频率)

如何控制步进电机速度(即如何计算脉冲频率)步进电机是一种常用的控制器件,它通过接收脉冲信号来进行精确的位置控制。

控制步进电机的速度就是控制脉冲的频率,也就是发送给电机的脉冲数目和时间的关系。

下面将介绍几种常见的方法来控制步进电机的速度。

1.简单定频控制方法:这种方法通过固定每秒脉冲数(也称为频率)来控制步进电机的速度。

通常,在开发步进电机控制系统时,我们会选择一个合适的频率,然后通过改变脉冲的间隔时间来调整步进电机的速度。

脉冲频率可以通过以下公式计算:频率=目标速度(转/秒)×每转需要的脉冲数。

2.脉冲宽度调制(PWM)控制方法:使用PWM调制技术可以在不改变脉冲频率的情况下改变脉冲的时间宽度,从而控制步进电机的速度。

通过改变每个脉冲的高电平时间和低电平时间的比例,可以实现步进电机的速度控制。

较长的高电平时间会导致步进电机转动较快,而较短的高电平时间会导致步进电机转动较慢。

3.脉冲加速与减速控制方法:步进电机的加速和减速是通过改变脉冲信号的频率和间隔时间来实现的。

在加速时,脉冲的频率逐渐增加,间隔时间逐渐减小,从而使步进电机从静止状态加速到目标速度。

在减速时,脉冲的频率逐渐减小,间隔时间逐渐增加,从而使步进电机从目标速度减速到静止状态。

在实际应用中,可以通过编程控制脉冲信号的频率来控制步进电机的速度。

根据不同的需求,可以选择适合的控制方法来实现步进电机的精准控制。

除了控制脉冲频率,步进电机的速度还受到其他因素的影响,如驱动器的最大输出速度、电机的最大速度等。

因此,在进行步进电机速度控制时,还需要考虑这些因素,并做好相应的调整以确保步进电机的正常运行。

步进电机控制方法

步进电机控制方法

步进电机控制方法步进电机是一种常见的电动执行器,广泛应用于各个领域的控制系统中。

它具有结构简单、控制方便、定位精度高等优点,是现代自动化控制系统中必不可少的重要组成部分。

本文将从基本原理、控制方法、应用案例等方面对步进电机进行详细介绍。

1. 基本原理步进电机是一种通过输入控制信号使电机转动一个固定角度的电机。

其基本原理是借助于电磁原理,通过交替激励电机的不同线圈,使电机以一个固定的步距旋转。

步进电机通常由定子和转子两部分组成,定子上布置有若干个线圈,而转子则包含若干个极对磁体。

2. 控制方法步进电机的控制方法主要包括开环控制和闭环控制两种。

开环控制是指根据既定的输入信号频率和相位来驱动电机,控制电机旋转到所需位置。

这种方法简单直接,但存在定位误差和系统响应不稳定的问题。

闭环控制则是在开环控制的基础上,增加了位置反馈系统,通过不断校正电机的实际位置来实现更精确的控制。

闭环控制方法相对复杂,但可以提高系统的定位精度和响应速度。

3. 控制算法控制步进电机的常用算法有两种,一种是全步进算法,另一种是半步进算法。

全步进算法是指将电流逐个向电机的不同线圈通入,使其按照固定的步长旋转。

而半步进算法则是将电流逐渐增加或减小,使电机能够以更小的步长进行旋转。

半步进算法相对全步进算法而言,可以实现更高的旋转精度和更平滑的运动。

4. 应用案例步进电机广泛应用于各个领域的控制系统中。

例如,在机械领域中,步进电机被用于驱动数控机床、3D打印机等设备,实现精确的定位和运动控制。

在医疗设备领域,步进电机被应用于手术机器人、影像设备等,为医疗操作提供准确定位和精确运动。

此外,步进电机还广泛应用于家用电器、汽车控制、航空航天等领域。

总结:步进电机作为一种常见的电动执行器,具有结构简单、控制方便、定位精度高等优点,在自动化控制系统中扮演着重要的角色。

通过本文的介绍,我们了解到步进电机的基本原理、控制方法、算法以及应用案例等方面的知识。

步进电机控制说明书

步进电机控制说明书

目录1 题目.............................................................2 电路原理图的设计.................................................2.1 步进电机控制电路原理图......................................2.2 LCD显示模块.................................................2.3 L297/298电机驱动模块……………………………………………………2.4 晶振电路和复位电路………………………………………………………2.5 键盘控制模块(加速、减速、正转、反转)................................3 软件系统设计......................................................3.1 软件系统的流程结构..........................................3.2 主程序bujindianji.c模块....................................3.3头文件reg52.h程序模块.......................................3.4 头文件1602.h程序模块.....................................3.5头文件intrins.h程序模块.....................................4 仿真及调试........................................................总论..............................................................参考文献..........................................................致谢.............................................................1题目: 步进电机的单片机控制功能要求:用MCS-51系列单片机作为控制器;采用两相双极性步进电机为控制对象;采用L297/298驱动芯片为步进电机驱动器;用加速、减速、正转、反转4个键进行相应的控制;用LCD 显示步进的电机的工作状态。

什么是步进电机?

什么是步进电机?

什么是步进电机?一、步进电机的基本原理步进电机是一种能够精确控制位置和运动的电机,它的工作原理和普通的直流电机有所不同。

普通的直流电机通过通电使得电流在绕组中流动,形成电磁力以产生转矩,从而驱动电机旋转。

而步进电机则是通过不断改变绕组中的电流方向,从而产生磁场的位置变化,实现精确的步进运动和位置控制。

步进电机中最关键的两部分是定子和转子。

定子是一个由绕组组成的磁铁,通常为两极或四极的磁石,而转子则是由磁铁组成的一个或多个磁极,通常为一圆柱形的部件。

二、步进电机的工作模式步进电机有两种常见的工作模式,即全步进和半步进。

1. 全步进模式:在全步进模式下,步进电机会按照固定的角度(通常为1.8°或0.9°)一步一步地转动。

这种模式下,电机的每个脉冲信号都会让电机转动一小步,从而实现位置的精确调整和控制。

2. 半步进模式:在半步进模式下,步进电机可以实现更精确的位置调整,每个脉冲信号可以让电机转动半个步距(通常为0.9°或0.45°)。

通过在全步进模式下的每个步距之间插入一个半步距,电机可以实现更加平滑和精确的运动。

三、步进电机的特点和应用场景步进电机具有以下几个特点,使得它在很多场景下得到广泛应用:1. 高精度:步进电机可以控制位置和转向,精度通常在几个角度或更小。

这使得它在需要精确定位和控制的场景下得到广泛应用,如机器人、三维打印机等。

2. 高效能:步进电机在工作过程中没有摩擦和机械损耗,因此效率较高。

它可以在低速和高负载条件下工作,而且能提供一定的持续转矩。

3. 简单控制:步进电机的控制电路相对较为简单,只需一个控制器和几个驱动器即可实现精确的位置和速度调整。

4. 广泛应用:步进电机广泛应用于各个领域,如电子设备、汽车制造、医疗设备等。

特别是在需要实现精确运动控制的场景下,步进电机更是不可或缺的一种电机。

综上所述,步进电机是一种能够精确控制位置和运动的电机,它通过改变绕组中的电流方向来实现位置的精确调整和控制。

步进电机的控制方法

步进电机的控制方法

步进电机的控制方法步进电机(Stepper Motor)是一种将电信号转化为角位移的输出设备,通常用于需要精确控制角度和位置的应用领域,如3D打印机、CNC数控机床、机器人等。

步进电机的控制方法主要有三种:全步进控制、半步进控制和微步进控制。

下面将详细介绍这三种控制方法的原理和特点。

全步进控制是步进电机最简单和常用的控制方式之一。

它是通过改变电流的方向和大小来控制电机的转动。

步进电机内部有一个旋转磁场,当电流方向与旋转磁场方向一致时,电机会顺时针旋转;当电流方向与旋转磁场方向相反时,电机会逆时针旋转。

因此,通过改变电流的方向可以实现电机的正反转。

而改变电流的大小可以调节电机每一步转动的角度,从而控制精度。

例如,电流较小时电机每一步的转动角度较大,电流较大时电机每一步的转动角度较小,通过不同的电流设置可以实现不同的控制要求。

全步进控制简单可靠,适用于一些对控制精度要求相对较低的场合。

半步进控制是在全步进控制的基础上发展起来的一种控制方式。

它通过在两个相邻的全步进驱动脉冲之间改变电流的大小和方向来控制电机的转动。

在正向或逆向时,先施加一定大小的电流使电机进入半步状态,此时电机只旋转半个步距;然后再施加相反于旋转方向的电流使电机进入全步状态,此时电机旋转一个步距。

通过这种方式,半步进控制可以实现更高的分辨率和较大的控制精度。

但是,半步进控制的缺点是启动和停止过程中存在冲击、振动等不稳定现象,对控制系统的动态响应要求较高。

微步进控制是进一步提高步进电机控制分辨率和精度的一种控制方式。

它通过改变电流的大小和时间来实现对电机的微步控制。

微步进控制可以将电机每一步的移动量分割为更小的部分,从而实现更高的分辨率。

例如,微步进控制可以将电机每一步的移动量分割为10等分或更多等分,从而实现更精确的控制。

微步进控制的原理是通过调节电流大小和时间,使电机在磁力矩的作用下,从一个磁极到相邻磁极之间平滑地过渡,从而实现平稳的转动。

基于51系列单片机控制步进电机调速实验

基于51系列单片机控制步进电机调速实验

基于51系列单片机控制步进电机调速实验实验指导书仇国庆编写重庆邮电大学自动化学院自动化专业实验中心2009年2月基于51系列单片机控制步进电机调速实验实验目的及要求:1、熟悉步进电机的工作原理2、熟悉51系列单片机的工作原理及调试方法3、设计基于51系列单片机控制的步进电机调速原理图(要求实现电机的速度反馈测量,测量方式:数字测量)4、实现51系列单片机对步进电机的速度控制(步进电机由实验中心提供,具体型号42BYG )由按钮控制步进电机的启动与停止;实现加速、匀速、和减速控制。

速度设定由键盘设定,步进电机的反馈速度由LED数码管显示。

实验原理:步进电机控制原理一般电动机都是连续旋转,而步进电动却是一步一步转动的,故叫步进电动机。

步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。

步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机(简称HB)。

因此步进电动机是一种把脉冲变为角度位移(或直线位移)的执行元件。

步进电动机的转子为多极分布,定子上嵌有多相星形连接的控制绕组,由专门电源输入电脉冲信号,每输入一个脉冲信号,步进电动机的转子就前进一步。

由于输入的是脉冲信号,输出的角位移是断续的,所以又称为脉冲电动机。

随着数字控制系统的发展,步进电动机的应用将逐渐扩大。

步进电机区别于其他控制电机的最大特点是,它是通过输入脉冲信号来进行控制的,即电机的总转动角度由输入脉冲数决定,而电机的转速由脉冲信号频率决定。

步进电机的驱动电路根据控制信号工作,控制信号可以由单片机产生。

电机转子均匀分布着很多小齿,定子齿有三个励磁绕阻,其几何轴线依次分别与转子齿轴线错开0、1/3て、2/3て,(相邻两转子齿轴线间的距离为齿距以て表示),即A与齿1相对齐,B与齿2向右错开1/3て,C与齿3向右错开2/3て,A'与齿5相对齐,(A'就是A,齿5就是齿1)下面是定转子的展开图:(图2所示)图1 是反应式步进电动机结构示意图,它的定子具有均匀分布的六个磁极,磁极上绕有绕组。

步进电机调速系统

步进电机调速系统

步进电机调速系统一.设计目的1.掌握步进电机的工作原理及控制方法2.了解控制步进电机转速的原理3.进一步掌握微机接口中的相关知识4.熟悉设计系统的方法二.设计要求1.以8086极其支持电路为基础,配必要的存储器、定时系统、控制接口、驱动电路、LED显示接口等构成微机控制的电机调速系统。

2.对步进电机的工作原理进行分析,通过“启、停、转速”等按键命令,实现对电机的平稳启动、停止和不同速率上的匀速转动,并通过LED显示转速;3.方案设计中要突出信号的变换、驱动电路的设计和步进电机控制程序的编制;三.设计思路(1)步进电机基本原理所谓步进,就是指每给步进电机一个递进脉冲,步进电机各绕组的通电顺序就改变一次,电机就回转动一次。

使用键盘控制方式能对步进电机的转动方向、速度和角度进行调节。

(2)步进电机激励方式步进电机有三相激励,也有四相激励的。

现以两相四拍为例说明。

2相激励。

这种方式的工作波形如图所示。

它可看作是一种周期信号,每个周期可以为四个状态。

显然,任何时刻步进电机都有两相绕组有电流。

每一状态,步进电机走一步。

四.设计内容1.程序流程图2. 源程序P8255_A EQU 9800HP8255_B EQU 9801HP8255_C EQU 9802HP8255_MODE EQU 9803HDELAY_SET EQU 07FH ;延时常数MY_STACK SEGMENT PARA 'STACK'DB 100 DUP(?)MY_STACK ENDSMY_DATA SEGMENT PARA 'DATA'BUF DB ?KVL DB 2 DUP(?) ;击键次数备份,键值PT DB ? ;显示缓冲区指针DSBUF DB 4 DUP(?) ;显示缓冲区KD DB ? ;数码管数据信号KH DB ? ;键盘行信号KL DB ? ;键盘列信号、数码管位选信号KV A DB ? ;键值备份KVB DB ? ;在闪烁子程序中保存显示器原有的数据COUNT2 DB ? ;击键次数COUNT4 DB ? ;连续击键次数KTB DB 48H ;0 键码DB 44H ;1DB 34H ;2DB 24H ;3DB 42H ;4DB 32H ;5DB 22H ;6DB 41H ;7DB 31H ;8DB 21H ;9DB 11H ;ADB 12H ;BDB 14H ;CDB 18H ;DDB 28H ;EDB 38H ;FDB 00H ;10SGTB DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82HDB 0F8H,80H,90H,88H,83H,0C6H,0A1HDB 86H,8EH,0FFH,8CH,89H,8EH,0BFH,0F7H; CHAR DB 'MY_DATA ENDsMY_CODE SEGMENT PARA 'CODE'MY_PROC PROC FARASSUME CS:MY_CODE, DS:MY_DATA, SS:MY_STACK START: MOV AX,MY_DATAMOV DS,AXSSS: MOV DX,P8255_MODEMOV AL,81H ;写8255控制字A、B输出,C输入OUT DX,ALSTART1: MOV BX,OFFSET DSBUFMOV PT,BLMOV DSBUF,15H ;_MOV DSBUF+1,10H ;空格MOV DSBUF+2,10HMOV DSBUF+3,10H;START2: CALL BLINK3 ;键盘扫描、显示子程序、光标闪动START3: CALL CHAG ;转数字键处理程序; CALL DELAYJMP START2 ;转下一轮处理程序MY_PROC ENDpCHAG PROC NEARMOV BH,00HMOV BL,PTMOV AL,COUNT4MOV [BX],AL ;键值送到显示缓冲区中CMP BL,OFFSET [DSBUF+3]JNZ CHAG2mov BL,OFFSET DSBUFMOV PT,BLCHAG1: RETCHAG ENDpCHAG2: INC BLMOV PT,BLJMP CHAG1BLINK PROC NEARMOV CX,100H ;熄灭显示器时间常数MOV BH,00HMOV BL,PTMOV Al,[BX]MOV KVB,AL;保存原显示器数据MOV AL,10H ;填入熄灭显示器的码MOV [BX],ALBLINK1: CALL DSKS ;键盘扫描BLINK2: CMP COUNT4,10HJNZ BLINK6 ;键按下返回LOOP BLINK1 ;没键按下继续循环MOV AL,KVBMOV BL,PTMOV [BX],ALBLINK3: MOV CX,150H ;点亮显示器时间常数BLINK4: CALL DSKSBLINK5: CMP COUNT4,10HJNZ BLINK7 ;键按下返回LOOP BLINK4 ;没键按下继续循环JMP BLINKBLINK6: MOV AL,KVB ;恢复原显示器中的数据MOV BL,PTMOV [BX],ALBLINK7: RETBLINK ENDpDSKS PROC NEAR ;键盘扫描处理程序PUSH CXCALL DSUP ;显示CALL KBS ;键盘扫描MOV AL,KVL+1 ;取上次按键键值CMP KV A,AL ;与本次键值相比MOV AL,KVL ;按键次数MOV COUNT2,ALMOV AL,KVLMOV COUNT4,ALJZ DSKS1MOV COUNT2,0FFH ;不相等,重新赋值MOV COUNT4,0FFHDSKS1: DEC COUNT4CMP COUNT4,0F8H ;为E0?JZ DSKS3CMP COUNT4,0EH ;为0E?JZ DSKS3CMP COUNT4,00H ;为00?JZ DSKS2MOV COUNT4,10H ;赋值DEC COUNT2JMP DSKS4DSKS2: MOV COUNT4,0fH ;按下键时间足够长则为连续击键DSKS3: MOV AL,COUNT4MOV COUNT2,ALMOV AL,KV AMOV COUNT4,ALDSKS4: MOV AL,COUNT2MOV KVL,ALMOV AL,KV AMOV KVL+1,AL ;备份键值MOV AL,COUNT4POP CXRETDSKS ENDpDSUP PROC NEARPUSH CXMOV CX,04H ;显示器个数MOV KL,01H ;选中的显示器MOV BX,OFFSET DSBUFDSUP2: MOV AL,00HMOV DX,P8255_B ;关闭显示器OUT DX,ALMOV AL,[BX] ;取显示缓冲区中的数据PUSH BXMOV AH,00HMOV DI,AXMOV BX,OFFSET SGTB ;编码MOV AX,[BX+DI]MOV AH,00HPOP BXMOV DX,P8255_A ;送显示器显示OUT DX,ALINC BXMOV AL,KLMOV DX,P8255_B ;送位选信号OUT DX,ALROL AL,1MOV KL,ALCALL DELAY ;下一位PUSH CXMOV CX,-1LOOP $POP CXLOOP DSUP2POP CXMOV AL,00HMOV DX,P8255_B ;关闭显示器OUT DX,ALRETDSUP ENDpKBS PROC NEAR ;键盘扫描程序MOV DX,P8255_A ;清显示器MOV AL,0FFHOUT DX,ALMOV CX,04H ;送列数MOV KL,0FEH ;扫描列初始值KBS1: MOV AL,KLMOV DX,P8255_B ;逐列清零OUT DX,ALSAL AL,1MOV KL,ALMOV DX,P8255_C ;读行信号IN AL,DXNOT ALAND AL,0FHCMP AL,00H ;是否有键按下JNZ KBS2LOOP KBS1 ;没键扫描下一列KBS2: CMP AL,0C0HJMP K0CMP AL, 0F9HJMP K1CMP AL, 0A4HJMP K2CMP AL ,0B0HJMP DSUP2K0:MOV BL,18HCALL DELAYMOV AL,BUFROR AL,1MOV BUF,ALJMP DSUP2K1:MOV BL,20HCALL DELAYMOV AL,BUFROL AL,1MOV BUF,ALJMP DSUP2K2:MOV BL,30HCALL DELAYMOV AL,BUFROR AL,1MOV BUF,ALJMP DSUP2MOV BX,CXMOV CX,04H ;拼装键号SAL BX,CLMOV CX,BXOR AL,CLMOV KV A,ALMOV DI,10H ;键盘个数MOV BX,OFFSET KTBKBS3: MOV AL,[BX+DI]CMP AL, KV A ;计算键值,无键按下返回00HJNZ KBS5KBS4: MOV AX,DIMOV KV A,AL ;保存键值CALL BREAKRETKBS5: DEC DIMOV AX,DICMP AL,00HJNZ KBS3JMP KBS4KBS ENDpDELAY PROC NEAR ;延时程序PUSHFPUSH DXPUSH CXMOV DX,DELAY_SETD1: MOV CX,-1D2: DEC BLDEC CXJNZ D2DEC DXJNZ D1POP CXPOP DXPOPFRETDELAY ENDpBREAK PROC NEAR ;按任意键退出PUSHFPUSH AXPUSH DXMOV AH,06HMOV DL,0FFHINT 21HJE RETURNMOV AX,4C00HINT 21HRETURN: POP DXPOP AXPOPFRETBREAK ENDPMY_CODE ENDSEND START五.运行结果当按下键盘上的0键时,电机开始转动,当按下键盘上的1键时,电机开始正向转动,当按下键盘上的2键时,电机开始反向转动,当按下键盘上的3键时,电机停止转动。

步进电机pwm调速原理

步进电机pwm调速原理

步进电机PWM调速原理概述步进电机是一种常见的电动机类型,它能够将电能转化为机械转动。

在许多应用中,需要对步进电机进行调速以满足不同的需求。

在本文中,我们将探讨步进电机PWM调速原理及其工作原理。

什么是步进电机PWM调速PWM(Pulse Width Modulation)调速是一种常用的电路调速技术,通过调节电源电压的占空比,控制驱动电机的平均功率,进而改变电机的转速。

步进电机工作原理步进电机是一种离散运动的电机,它通过不同相位电流的切换,使得电机转子按一定角度步进。

步进电机由定子和转子组成,定子上有若干组线圈。

步进电机驱动电路步进电机驱动电路主要由大功率开关管和弱驱动电路组成。

在驱动电路中,PWM调速是常见的一种方法。

电压调整方式步进电机的速度与输入电压成正比,因此通过调整输入电压的大小,可以实现步进电机的调速。

在步进电机驱动电路中,常用的方法是通过调整驱动电源的电压来控制步进电机的转速。

PWM调速原则PWM调速原则是通过改变电源电压的占空比来改变步进电机的转速。

占空比是指一个周期内,高电平的时间与周期的比值。

占空比越小,平均输出电压也越小,电机转速也越慢。

步进电机PWM调速的实现步骤步进电机PWM调速的实现步骤如下:1.设定目标转速2.根据目标转速计算占空比3.设置PWM调速电路4.运行步进电机步进电机PWM调速的优缺点步进电机PWM调速具有以下优点:•调速范围广:PWM调速可以实现步进电机在较宽范围内的调速,满足不同应用需求。

•响应速度快:PWM调速可以快速调节电机速度,满足实时性要求。

•控制精度高:由于PWM调速可以实现电机转速的精确控制,因此可以实现高精度的转速控制。

步进电机PWM调速的缺点包括: - 电路复杂:步进电机PWM调速需要专门的电路设计和控制,相对于简单的电压调整方式,电路复杂度较高。

- 对电机有一定要求:步进电机PWM调速对步进电机的特性参数有一定要求,不同的电机可能需要不同的调速电路。

什么是步进电机?怎样控制速度?

什么是步进电机?怎样控制速度?

什么是步进电机?怎样控制速度?什么是步进电机?怎样控制速度?1.什么是步进电机?步进电机是一种将电脉冲转化为角位移的执行机构。

通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。

您可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

2.步进电机分哪几种?步进电机分三种:永磁式(PM),反应式(VR)和混合式(HB)永磁式步进一般为两相,转矩和体积较小,步进角一般为7.5度或15度;反应式步进一般为三相,可实现大转矩输出,步进角一般为1.5度,但噪声和振动都很大。

在欧美等发达国家80年代已被淘汰;混合式步进是指混合了永磁式和反应式的优点。

它又分为两相和五相:两相步进角一般为1.8度而五相步进角一般为0.72度。

这种步进电机的应用最为广泛。

3.什么是保持转矩(HOLDING TORQUE)?保持转矩(HOLDING TORQUE)是指步进电机通电但没有转动时,定子锁住转子的力矩。

它是步进电机最重要的参数之一,通常步进电机在低速时的力矩接近保持转矩。

由于步进电机的输出力矩随速度的增大而不断衰减,输出功率也随速度的增大而变化,所以保持转矩就成为了衡量步进电机最重要的参数之一。

比如,当人们说2N.m 的步进电机,在没有特殊说明的情况下是指保持转矩为2N.m的步进电机。

4.什么是DETENT TORQUE?DETENT TORQUE 是指步进电机没有通电的情况下,定子锁住转子的力矩。

TORQUE 在国内没有统一的翻译方式,容易使大家产生误解;由于反应式步进电机的转子不是永磁材料,所以它没有DETENTTORQUE。

5.步进电机精度为多少?是否累积?一般步进电机的精度为步进角的3-5%,且不累积。

6.步进电机的外表温度允许达到多少?步进电机温度过高首先会使电机的磁性材料退磁,从而导致力矩下降乃至于失步,因此电机外表允许的最高温度应取决于不同电机磁性材料的退磁点;一般来讲,磁性材料的退磁点都在摄氏130度以上,有的甚至高达摄氏200度以上,所以步进电机外表温度在摄氏80-90度完全正常。

步进电机的控制原理是什么?如何实现步进电机的控制?

步进电机的控制原理是什么?如何实现步进电机的控制?

步进电机的控制原理是什么?如何实现步进电机的控制?实验原理先来看一下(硬件)原理图,可看到控制(步进电机)的管脚分别为:GPIO6[2]、GPIO6[3]、GPIO6[4]和GPIO1[15]。

使用的是一路四相五线步进(电机),使用的电机驱动(芯片)是L9110。

四相五线步进电机的控制方法有两种,四相四拍和四相八拍。

本实验中使用的是四相四拍,称为全步控制。

四相:步进电机中有四组线圈。

四拍:步进电机A,B,C,D四组线圈的通电时序,四拍的驱动正转通电顺序为A-B-C-D-A-B-C-D-……循环往复,-A-B-C-D-四拍为一个循环周期。

五线:步进电机引出的接线数量为五根。

步进电机(工作原理)步进电机是利用(电磁铁)原理,将脉冲(信号)转换成线位移或角位移的电机。

在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载信号的影响。

每给电机加一个脉冲信号,电机就转过一个步距角,带动(机械)移动一小段距离。

步进电机的速度控制:通过输入的脉冲频率快慢实现的。

当发生脉冲的频率减小时,步进电机的速度就下降;当频率增加时,速度就加快。

还可以通过频率的改变而提高步进电机的速度或位置精度。

步进电机的位置控制:靠给定的脉冲数量控制的。

给定一个脉冲,转过一个步距角,当停止的位置确定以后,也就决定了步进电机需要给定的脉冲数。

程序流程程序流程设计中首先要进行(UART)2初始化和(DSP)中断初始化,接着进行矩阵键盘初始化和外设使能配置,然后进行管脚复用配置和(定时器)初始化,接着初始化定时器中断,最后进行矩阵键盘扫描并控制步进电机的转动。

管脚复用源码管脚复用配置GPIO复用配置操作直接封装成了函数,使用时,相关函数通过“gpio.h”文件引用。

Star(te)rWare A(PI)(接口):GPIOBank0Pin0PinMuxSetup(); 方向配置源码第一个参数时GPIO的基地址,第二个参数是GPIO的编号,第三个参数设置GPIO的方向管脚方向配置使用StarterWare 的库将GPIO 口配置为输出或输入。

步进电机方向速度控制

步进电机方向速度控制

步进电机控制实验一、实验目的1、了解步进电机控制的基本原理。

2、掌握步进电机转动的编程方法。

二、实验内容通过程序改变正、反转命令,转速参数和转动步数,并在显示器上显示,转动步数减为零时停止转动。

三、实验预备知识步进电机驱动原理是切换每相线圈中的电流和顺序,来使电机作步进式旋转。

驱动电路由脉冲信号来控制,所以调节脉冲信号的频率便可改变步进电机的转速。

单片机控制步进电机最适合。

四、实验接线图显示部分参考键盘显示控制器8279应用实验图(8-1)五、实验程序框图六、实验步骤1、将P1.0~P1.3分别接到BA~BD插孔。

2、用8芯排线将8279区(a-h)连接到数码管显示区的DU(A-H),JB53(BIT0-BIT7)连接到数码管显示区的BIT0-BIT7。

3、用4芯排线将8279区的JB52(H1-H7)连到键盘区的KH(H1-H4)上,JB54(L4-L1)连到键盘区的KL(L4-L1)上。

4、8279区8279CS2连到系统译码的Y6上,8279CLK连接到固定脉冲的1MHz。

5、调试、运行程序test8中BJDJ.ASM。

6、在显示器上显示的数字第:第一位为“0”表示正转,为“1”表示反转,第二位“0~F”为转速等级,第三位到第六位设定步数,到0步进电机停止旋转。

ORG 0000HAJMP MONITORG 0030H ;?MONIT: MOV SP,#50HMOV 78H,#01H ; 0,1 电机旋转方向MOV 79H,#12H ; -MOV 7AH,#08H ; 0-f 电机转速MOV 7BH,#12H ; -MOV 7CH,#00H ; 0-9 电机步数MOV 7DH,#08H ; 0-9MOV 7EH,#08H ; 0-9MOV 7FH,#08H ; 0-9MONIT2: LCALL DISP8279MOV A,7EHANL A,#0FHSWAP AADD A,7FHMOV R6,AMOV A,7CHANL A,#0FHSWAP AADD A,7DHMOV R7,AMOV A,78HCJNE A,#00H,MONIT4 ;转动方向MONIT3: MOV P1,#03H ;顺时针LCALL DELAY0LCALL MONIT5MOV P1,#06HLCALL DELAY0LCALL MONIT5MOV P1,#0CHLCALL DELAY0LCALL MONIT5MOV P1,#09HLCALL DELAY0LCALL MONIT5SJMP MONIT3MONIT4: CJNE A,#01H,DISPERRMONIT41:MOV P1,#09H ;逆时针LCALL DELAY0LCALL MONIT5MOV P1,#0CHLCALL DELAY0LCALL MONIT5MOV P1,#06HLCALL DELAY0LCALL MONIT5MOV P1,#03HLCALL DELAY0LCALL MONIT5SJMP MONIT41MONIT5: LCALL BCDSUB2CJNE R6,#99H,MONIT6CJNE R7,#99H,MONIT6SJMP $;LJMP MONITMONIT6: LCALL MONIT7RETMONIT7: MOV R0,#7FHMOV A,R6LCALL MONIT8MOV A,R7LCALL MONIT8LCALL DISP8279RETMONIT8: MOV R1,AACALL MONIT9MOV A,R1SWAP AMONIT9: ANL A,#0FHMOV @R0,ADEC R0RETDELAY0: MOV R0,#7AHMOV A,@R0SWAP AMOV R4,ADELAY1: MOV R5,#0HDELAY2: DJNZ R5,DELAY2DJNZ R5,$;LCALL DISP8279DJNZ R4,DELAY1 ;***RETBCDSUB2: MOV 30H,R6MOV 31H,R7MOV 40H,#01MOV 41H,#00MOV R5,#02HMOV R1,#30HMOV R0,#40HBCDB: CLR CBCDB1: MOV A,#9AHSUBB A,@R0ADD A,@R1DA AMOV @R1,AINC R1INC R0CPL CDJNZ R5,BCDB1MOV R6,30HMOV R7,31HRETDISPERR:MOV 78H,#12HMOV 79H,#12HMOV 7AH,#12HMOV 7BH,#0EHMOV 7CH,#18HMOV 7DH,#18HMOV 7EH,#12HMOV 7FH,#12HLCALL DISP8279SJMP $DISP8279: ;显示子程序,缓冲区为78H-7FHC8279 EQU 0E001H ;)7fffHD8279 EQU 0E000H ;7FFEHMOV DPTR,#C8279MOV A,#0HMOVX @DPTR,A ; 写8279方式字MOV A,#2aHMOVX @DPTR,A ;写分频系数MOV A,#0D0HMOVX @DPTR,A ;清显示MOV A,#90HMOVX @DPTR,A ;设置从左边开始写入数据DISP1: MOVX A,@DPTRJB ACC.7,DISP1 ;读8279工作是否正常MOV R0,#78H ;显示缓冲首址MOV R1,#08HDISP2: MOV A,@R0MOV DPTR,#TABMOVC A,@A+DPTR ;查字型MOV DPTR,#D8279cpl aMOVX @DPTR,A ;送字型到8279显示INC R0DJNZ R1,DISP2RET;字型代码TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H ;0,1,2,3,4,5,6,7DB 80H,90H,88H,83H,0C6H,0A1H,86H,08EH ;8,9,A,B,C,D,E,FDB 08CH,0C1H,0BFH,91H,89H,0C7H,0FFH,07FH ,8FH ;P(10),U(11),-(12),Y(13),H(14),L(15),关(16) ,.(17),r(18)CLEAR8279:MOV DPTR,#C8279 ;清显示子程序MOV A,#0D0HMOVX @DPTR,ARETEND/*51实验11: 步进电机实验*/#include <reg51.h>#include <ABSACC.H>#include <8279.h>unsigned char code P1OUTB[4]={0x03,0x06,0x0C,0x09}; unsigned char speed,zfz;unsigned int step;void disperr(void);void zspeed(unsigned char i);void main(void){unsigned char tmp1;zfz=0;speed=0x08;step=8888;if (zfz>1)disperr();if (speed>0x0f)disperr();buffer[0]=zfz;buffer[1]=0x12;buffer[2]=speed;buffer[3]=0x12;buffer[4]=step/1000;buffer[5]=(step%1000)/100;buffer[6]=((step%1000)%100)/10;buffer[7]=((step%1000)%100)%10;init8279();disp8279();delay(5);disp8279();while(step!=0x00){for(tmp1=0;tmp1<4;tmp1++){if (zfz==0) P1=P1OUTB[tmp1];else { P1=P1OUTB[3-tmp1];}zspeed(speed);step--;buffer[4]=step/1000;buffer[5]=(step%1000)/100;buffer[6]=((step%1000)%100)/10;buffer[7]=((step%1000)%100)%10;disp8279();}}while(1);}void disperr(void){ buffer[0]=0x12;buffer[1]=0x12;buffer[2]=0x12;buffer[3]=0x0e;buffer[4]=0x0a;buffer[5]=0x0a;buffer[6]=0x12;buffer[7]=0x12;init8279();disp8279();delay(5);disp8279();while(1);}void zspeed(unsigned char i){unsigned char j;for(j=0;j<i+1;j++)delay(10);}(注:可编辑下载,若有不当之处,请指正,谢谢!)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

步进电机(键盘控制可调速)1.2.3转载专业文档 2008-04-04 22:52:35 阅读779 评论0 字号:大中小步进电机(键盘控制可调速)#include <reg51.h>#define uchar unsigned charstatic unsigned int count; //计数static int step_index; //步进索引数,值为0-7static bit turn; //步进电机转动方向static bit stop_flag; //步进电机停止标志static int speedlevel; //步进电机转速参数,数值越大速度越大,最小值为1,速度最慢static int spcount; //步进电机转速参数计数void ddelay(void); //键盘扫描延时函数void delay(unsigned int endcount); //延时函数,延时为endcount*1毫秒void gorun(); //步进电机控制步进函数sbit P10=P2^0 ; //电机端口定义sbit P11=P2^1 ;sbit P12=P2^2;sbit P13=P2^3 ;/* 键消抖延时函数 */void ddelay(void){uchar i;for (i=300;i>0;i--);}/* 键扫描函数*/uchar keyscan(void){uchar scancode;uchar tmpcode;P1 = 0xf8; // 发全0行扫描码if ((P1&0xf8)!=0xf8) // 若有键按下{ddelay(); // 延时去抖动if ((P1&0xf8)!=0xf8) // 延时后再判断一次,去除抖动影响{scancode = 0xfe;while((scancode&0x08)!=0) // 逐行扫描{P1 = scancode; // 输出行扫描码if ((P1&0xf8)!=0xf8) // 本行有键按下{tmpcode = (P1&0xf8)|0x07;return((~scancode)+(~tmpcode)); // 返回特征字节码,为1的位即对应于行和列 }else scancode = (scancode<<1)|0x01; // 行扫描码左移一位}}}return(0); // 无键按下,返回值为0}void main(void){uchar key;count = 0;step_index = 0;spcount = 0;P10 = 0;P11 = 0;P12 = 0;P13 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1ET0 = 1; //定时器0中断允许TH0 = 0xFc;TL0 = 0x18; //设定时每隔1ms中断一次TR0 = 1; //开始计数stop_flag = 0;turn=0;speedlevel = 20;while(1){key = keyscan();switch(key){case 0x09: //按键#,正转以speedlevel = 1的速度转1000*0.5MS=0.5Sstop_flag=0;turn = 0;speedlevel =10;gorun();delay(1000);break;case 0x0c: //按键*,停止 2000*0.5MS=0.5Sstop_flag=1;break;case 0x0a: //按键0,反转以speedlevel = 1的速度转1000*0.5MS=0.5S stop_flag=0;turn=1;speedlevel =10;gorun();delay(1000);break;case 0x11: // 按键9,以--speedlevel的加速转1000*0.5MS=0.5Sstop_flag=0;if (speedlevel==1){ speedlevel=1;}else { --speedlevel;}gorun();delay(1000);break;case 0x12: // 按键8,以++speedlevel的减速转1000*0.5MS=0.5Sstop_flag=0;++speedlevel;gorun();delay(1000);break;}}}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFc;TL0=0x18; //设定时每隔1ms中断一次count++;spcount--;if(spcount<=0) //速度调整,SPEEDLEVEL越大,延时越长(延时约为1MS*SPEEDLEVEL), { // 频率越小,速度越慢spcount = speedlevel;gorun();}}void delay(unsigned int endcount)//延时函数,延时为endcount*0.5毫秒{count=0;do{}while(count<endcount);}void gorun(){if (stop_flag==1){P10 = 0;P11 = 0;P12 = 0;P13 = 0;return;}switch(step_index) {case 0: //0P10 = 1;P11 = 0;P12 = 0;P13 = 0;break;case 1: //0、1P10 = 1;P11 = 1;P12 = 0;P13 = 0;break;case 2: //1P10 = 0;P11 = 1;P12 = 0;P13 = 0;break;case 3: //1、2P10 = 0;P11 = 1;P12 = 1;P13 = 0;break;case 4: //2P10 = 0;P11 = 0;P12 = 1;P13 = 0;break;case 5: //2、3P10 = 0;P11 = 0;P12 = 1;P13 = 1;break;case 6: //3P10 = 0;P11 = 0;P12 = 0;P13 = 1;break;case 7: //3、0P10 = 1;P11 = 0;P12 = 0;P13 = 1;}if (turn==0) //正转{step_index++;if (step_index>7)step_index=0;}else{ //反转step_index--;if (step_index<0)step_index=7;}}步进电机(键盘控制可调速加显示)#include <reg51.h>#define uchar unsigned charstatic unsigned int count; //计数static int step_index; //步进索引数,值为0-7static bit turn; //步进电机转动方向static bit stop_flag; //步进电机停止标志static int speedlevel; //步进电机转速参数,数值越大速度越大,最小值为1,速度最慢static int spcount; //步进电机转速参数计数void ddelay(void); //键盘扫描延时函数void delay(unsigned int endcount); //延时函数,延时为endcount*1毫秒void gorun(); //步进电机控制步进函数void Delay400Ms(void);void LCMInit(void); //LCM初始化void WriteCommandLCM(unsigned char WCLCM,BuysC); //BuysC为0时忽略忙检测void DisplayOneChar(uchar X, uchar Y, uchar DData);void DisplayListChar(uchar X, uchar Y,uchar ListLength, uchar *DData,uchar n);sbit P10=P3^0 ; //电机端口定义sbit P11=P3^1 ;sbit P12=P3^2;sbit P13=P3^3 ;uchar code speed[]={ 0x3a,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30}; uchar code stop[] = {"stop"};uchar code go[] = {"go:"};uchar code back[] = {"back:"};uchar code max[] = {"max:8"};/* 键消抖延时函数 */void ddelay(void){uchar i;for (i=300;i>0;i--);}/* 键扫描函数*/uchar keyscan(void){uchar scancode;uchar tmpcode;P1 = 0xf8; // 发全0行扫描码if ((P1&0xf8)!=0xf8) // 若有键按下{ddelay(); // 延时去抖动if ((P1&0xf8)!=0xf8) // 延时后再判断一次,去除抖动影响{scancode = 0xfe;while((scancode&0x08)!=0) // 逐行扫描{P1 = scancode; // 输出行扫描码if ((P1&0xf8)!=0xf8) // 本行有键按下{tmpcode = (P1&0xf8)|0x07;return((~scancode)+(~tmpcode)); // 返回特征字节码,为1的位即对应于行和列 }else scancode = (scancode<<1)|0x01; // 行扫描码左移一位}}}return(0); // 无键按下,返回值为0}void main(void){uchar key;count = 0;step_index = 0;spcount = 0;P10 = 0;P11 = 0;P12 = 0;P13 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1ET0 = 1; //定时器0中断允许TH0 = 0xFc;TL0 = 0x18; //设定时每隔1ms中断一次TR0 = 1; //开始计数P0=0XFF;P3 &=0XEF; //573片选LCMInit(); //LCM初始化Delay400Ms();stop_flag = 0;turn=0;speedlevel = 5;DisplayListChar(0,0,3,go,1); //每次扫描键盘显示更新一次uchar code go[] DisplayOneChar(0,1,0x35); //每次扫描键盘显示更新一次while(1){key = keyscan();switch(key){case 0x09: //按键#,正转以speedlevel = 1的速度转1000*0.5MS=0.5S stop_flag=0;turn = 0;speedlevel =5;gorun();WriteCommandLCM(0x01,1);//显示清屏,DisplayListChar(0,0,3,go,0); //每次扫描键盘显示更新一次uchar code go[] DisplayOneChar(0,1,0x35); //每次扫描键盘显示更新一次delay(1000);break;case 0x0c: //按键*,停止 2000*0.5MS=0.5Sstop_flag=1;WriteCommandLCM(0x01,1);//显示清屏,DisplayListChar(0,0,4,stop,0); //每次扫描键盘显示更新一次break;case 0x0a: //按键0,反转以speedlevel = 1的速度转1000*0.5MS=0.5S stop_flag=0;turn=1;speedlevel =5;gorun();WriteCommandLCM(0x01,1);//显示清屏,DisplayListChar(0,0,5,back,0); //每次扫描键盘显示更新一次DisplayOneChar(0,1,0x35); //每次扫描键盘显示更新一次delay(1000);break;case 0x11: // 按键9,以--speedlevel的加速转1000*0.5MS=0.5Sstop_flag=0;if (speedlevel==2){ speedlevel=2;}else { speedlevel--;}gorun();if(speedlevel==2){ DisplayListChar(0,1,5,max,0);}else {DisplayOneChar(0,1, speed[speedlevel]);} //每次扫描键盘显示更新一次 delay(1000);break;case 0x12: // 按键8,以++speedlevel的减速转1000*0.5MS=0.5Sstop_flag=0;speedlevel++;gorun();WriteCommandLCM(0x01,1);//显示清屏,if(turn==0){DisplayListChar(0,0,3,go,0); //每次扫描键盘显示更新一次uchar code go[] DisplayOneChar(0,1, speed[speedlevel]);} //每次扫描键盘显示更新一次else {DisplayListChar(0,0,5,back,0); //每次扫描键盘显示更新一次DisplayOneChar(0,1,speed[speedlevel]);} //每次扫描键盘显示更新一次 delay(1000);break;}}}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFc;TL0=0x18; //设定时每隔1ms中断一次count++;spcount--;if(spcount<=0) //速度调整,SPEEDLEVEL越大,延时越长(延时约为1MS*SPEEDLEVEL), { // 频率越小,速度越慢spcount = speedlevel;gorun();}}void delay(unsigned int endcount)//延时函数,延时为endcount*0.5毫秒{count=0;do{}while(count<endcount);}void gorun(){if (stop_flag==1){P10 = 0;P11 = 0;P12 = 0;P13 = 0;return;}switch(step_index) {case 0: //0P10 = 1;P11 = 0;P12 = 0;P13 = 0;break;case 1: //0、1P10 = 1;P11 = 1;P12 = 0;P13 = 0;break;case 2: //1P10 = 0;P11 = 1;P12 = 0;P13 = 0;break;case 3: //1、2P10 = 0;P11 = 1;P12 = 1;P13 = 0;break;case 4: //2P10 = 0;P11 = 0;P12 = 1;P13 = 0;break;case 5: //2、3P10 = 0;P11 = 0;P12 = 1;P13 = 1;break;case 6: //3P10 = 0;P11 = 0;P12 = 0;P13 = 1;break;case 7: //3、0P10 = 1;P11 = 0;P12 = 0;P13 = 1;}if (turn==0) //正转 {step_index++;if (step_index>7) step_index=0; }else{ //反转step_index--;if (step_index<0) step_index=7; }}步进电机(自动循环调速)#include <reg51.h>sbit P00=P2^0 ;sbit P01=P2^1 ;sbit P02=P2^2;sbit P03=P2^3 ;static unsigned int count; //计数static int step_index; //步进索引数,值为0-7static bit turn; //步进电机转动方向static bit stop_flag; //步进电机停止标志static int speedlevel; //步进电机转速参数,数值越大速度越快,最小值为1,速度最慢static int spcount; //步进电机转速参数计数void delay(unsigned int endcount); //延时函数,延时为endcount*0.5毫秒void gorun(); //步进电机控制步进函数void main(void){count = 0;step_index = 0;spcount = 0;stop_flag = 0;P00 = 0;P01 = 0;P02 = 0;P03 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1ET0 = 1; //定时器0中断允许TH0 = 0xFE;TL0 = 0x0C; //设定时每隔0.5ms中断一次TR0 = 1; //开始计数turn = 0;do{speedlevel =4;delay(10000); //以speedlevel = 4的速度转2000*0.5MS=1Sspeedlevel =4;delay(10000); //以speedlevel = 4的速度转2000*0.5MS=1Sstop_flag=1;delay(6000);//停止,2000*0.5MS=3S stop_flag=0;}while(1);}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFE;TL0=0x0C; //设定时每隔0.5ms中断一次 count++;spcount--;if(spcount<=0){spcount = speedlevel;gorun();}}void delay(unsigned int endcount) {count=0;do{}while(count<endcount);}void gorun(){if (stop_flag==1){P00 = 0;P01 = 0;P02 = 0;P03 = 0;return;}switch(step_index) {case 0: //0P00 = 1;P01 = 0;P02 = 0;P03 = 0;break;case 1: //0、1P00 = 1;P01 = 1;P02 = 0;P03 = 0;break;case 2: //1P00 = 0;P01 = 1;P02 = 0;P03 = 0;break;case 3: //1、2P00 = 0;P01 = 1;P02 = 1;P03 = 0;break;case 4: //2P00 = 0;P01 = 0;P02 = 1;P03 = 0;break;case 5: //2、3P00 = 0;P01 = 0;P02 = 1;P03 = 1;break;case 6: //3P00 = 0;P01 = 0;P02 = 0;P03 = 1;break;case 7: //3、0P00 = 1;P01 = 0;P02 = 0;P03 = 1;}if (turn==0){step_index++;if (step_index>7) step_index=0; }else{step_index--;if (step_index<0) step_index=7; }}。

相关文档
最新文档