步进电机正反转程序

合集下载

机电一体化设计 步进电机正反转及加减速设计 程序

机电一体化设计 步进电机正反转及加减速设计 程序

单片机课机电一体化课程设计题目:步进电机正反转及加减速设计专业:机械工程及自动化班级:机械092姓名:QCR学号:********指导教师:ZZY2012年6月23日目录1.设计目的 (1)2.题目及要求功能分析 (1)3.三相单、双六拍步进电机的结构和工作原理 (1)4. 步进电机的驱动电源 (2)5.设计方案 (3)5.1 整体方案 (3)5.2 具体方案 (4)6.硬件电路的设计 (4)6.1 硬件线路 (5)6.2 工作原理 (5)6.3 操作时序 (6)7. 软件设计 (6)7.1 软件结构 (6)7.2 程序流程 (6)7.3 源程序清单 (6)8. 系统仿真 (6)9. 设计总结 (7)参考文献 (8)附录 (一) (9)附录 (二) (10)附录 (三) (11)步进电机的正反转控制1.设计目的(1)熟练掌握机电一体化原理。

(2)综合运用51单片机的控制电路和最小系统。

(3)步进电机的正反转驱动负载。

2.设计题目及要求功能分析步进电机:步进电机是一种将电脉冲转化为角位移的执行机构。

当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度一步一步运行的。

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

步进电机可以作为一种控制用的特种电机,利用其精度高等特点,广泛应用于各种工业控制系统中。

3. 三相单、双六拍步进电机的结构和工作原理:三相单、双六拍步进电机通电方式:这种方式的通电顺序是:U -U V-V-VW-W-WU-U或为U-UW-W-WV-V-VU-U。

按前一种顺序通电,即先接通U相定子绕组;接着是U、V两相定子绕组同时通电;断开U相,使V相绕组单独通电;再使V、W两相定子绕组同时通电;W相单独通电;W、U两相同时通电,并依次循环。

PLC实现步进电机的正反转及调整控制

PLC实现步进电机的正反转及调整控制

PLC实现步进电机的正反转及调整控制PLC是专门用于控制工程自动化系统的一种可编程逻辑控制器,其可以通过编程来实现对各种电气设备的控制。

在实际工程中,步进电机广泛应用于自动化设备中,如数控机床、包装机械、印刷设备等。

步进电机具有分辨率高、精度高、响应速度快等优点,因此被广泛应用于各种自动化控制系统中。

在PLC实现步进电机的正反转及调整控制中,需要考虑以下几个方面:1.步进电机驱动模块选型:步进电机需要配合驱动模块进行控制,通常采用的是脉冲信号驱动方式。

在PLC控制系统中,可以选择适合的驱动模块,如常见的2相、4相步进电机驱动模块。

2.步进电机控制程序设计:通过PLC软件编程,编写程序实现步进电机的正转、反转及调整控制功能。

在程序设计中,需要考虑步进电机的控制方式、驱动模块的接口信号、脉冲信号的频率等参数。

3.步进电机正反转控制:在程序设计中,通过PLC输出脉冲信号控制步进电机的正反转运动。

具体步骤包括设置脉冲信号的频率和方向,控制步进电机按设定的脉冲信号实现正反转运动。

4.步进电机调整控制:步进电机的位置调整控制通常通过调整脉冲信号的频率和数目来实现。

通过PLC编程,实现步进电机的位置调整功能,从而实现对步进电机位置的精准控制。

5.总体控制设计:在PLC控制系统中,可以将步进电机的正反转及调整控制与其它控制功能相结合,实现对整个自动化系统的精确控制。

通过PLC编程,可以灵活设计多种控制逻辑,满足不同工程项目的需求。

综上所述,通过PLC实现步进电机的正反转及调整控制主要涉及步进电机驱动模块选型、控制程序设计、正反转控制、调整控制和总体控制设计等方面。

通过精心设计和编程,可以实现对步进电机的精确控制,满足各种自动化控制系统的要求。

PLC技术的应用将有助于提高自动化生产设备的生产效率和稳定性,推动工业自动化技术的发展。

单片机数码管显示+步进电机正反加速转动C语言程序

单片机数码管显示+步进电机正反加速转动C语言程序
void key ()
{
if(jia_key == 0)
{
delay(5);
if(jia_key == 0)
{
num++; //速度标识位
feng_ming_qi();
while(jia_key == 0) ;
for(k=125;k>0;k--);
}
/***************************************************************************************************/
void xianshi ( )//显示程序
{
delay(50);
if(zf_key ==0)
{
flag=~flag;
feng_ming_qi();
while(zf_key == 0);
}
}
if(stop_key == 0)
{
{
uchar j;
uint i;
for(j=0+table_begin;j<4+table_begin;j++)
{
P1 = code_table[j];
for(i=0;i<maichong;i++)
{
xianshi();
}
{
tong = 0xff;
tong = on[0];//位选为0;
liang = table[show_num];
delay(3);
liang = 0xff;
}
/***************************************************************************************************/

步进电机正反转控制实现

步进电机正反转控制实现

任务(课题)名称任务1 步进电机的基本运行授课班级课型理实一体化课时 4 授课时间任务(教学内容)描述本任务主要学习步进电机的结构及工作过程;反向器ULN2003的应用等内容。

教学目标知识目标理解四相六线步进电机的工作过程;理解反向器ULN2003的应用。

能力目标会编写步进电机的基本运行程序;会绘制步进电机的控制电路图;会调试仿真步进电机的基本运行程序及电路。

情感态度与价值观目标培养学生自主讨论学习的能力;教学重难点重点四相六线步进电机的基本运行程序编写;难点四相六线步进电机的工作过程;教学方法讲授法、分组讨论教学资源多媒体教学设备、PPT、EDA仿真机房教学过程教学环节教学内容知识点与技能点一、布置任务任务描述单片机控制四相六线步进电机,先正转5圈,再反转5圈,然后停止。

二、新课讲解1.步进电机的分类进电动机的种类很多,从广义上讲,步进电机的类型分为机械式、电磁式和组合式三大类型。

电磁式步进电机可分为反应式(VR)、永磁式(PM)和混合式(HB)三大类;按相数分则可分为单相、两相和多相三种。

目前使用最为广泛的为反应式和混合式步进电机。

ADD C来选通一路。

2.步进电机的结构及工作原理开始时,开关 SB 接通电源,SA、SC、SD断开,B 相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和 D、A 相绕组磁极产生错齿。

当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。

而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。

依次类推,A、B、C、D 四相绕组轮流供电,则转子会沿着 A、B、C、D 方向转动。

3.七路反向器ULN2003AULN2003A是一个7路反向器,当输入端为高电平时ULN2003A输出端为低电平,当输入端为低电平时ULN2003A输出端为高电平。

plc控制步进电机正反转

plc控制步进电机正反转

plc控制步进电机正反转实验名称:步进电机正反转的PLC控制一、实验目的了解步进电机运转的基本原理和步进电机控制系统的基本组成,熟练运用梯形图语言进行编程,掌握用PLC控制系统控制步进电机正反转的方法。

二、实验要求1) 通过查找相关资料和教师讲解了解步进电机运转的基本原理和步进电机控制系统的基本组成;2) 以实验室西门子SIMATIC S7-200为硬件设备,认识掌握用PLC控制系统控制步进电机正反转的方法;3) 学习STEP7-Micro/WIN4.0软件,运用梯形图语言进行编程。

三、实验设备1) 西门子SIMATIC S7-200 PLC硬件系统2) 西门子SIMATIC S7-200 PLC编程软件STEP7-Micro/WIN4.03) SH全系列步进电机驱动器SH-3F075四、实验原理1、PLC控制系统I/O分配表1 I0.0 停止2 I0.1 正转3 I0.2 反转4 Q0.1 高速脉冲输出12、PLC电气接线图7-200步进电步机进电机驱动器24伏电源图1 PLC电气接线图3、程序代码(梯形图)图2 电机停止梯形图(1) 按下停止键,I0.0接通,脉冲输出功能关闭,电机停止。

2图3 电机正转梯形图(2) 按下正转键,I0.1接通,方向电平复位,脉冲输出功能PWM输出脉冲周期为2000um,脉宽为1000um的脉冲,电机正转。

注:寄存器说明SM77.0 PWM update cycle time value 0 = no update; 1 = update cycle time SM77.1 PWM update pulse width time value 0 = no update; 1=update pulse widthSM77.3 PWM time base select 0 = 1 us/tick; 1 = 1ms/tick SM77.4 PWM update method: 0 = asynchronous update, 1 = synchronous update SM77.6 PWM mode select 0 = selects PTO; 1 = selects PWMSM77.7 PWM enable0 = disables PWM; 1 = enables PWMSMW78 :PWM cycle time value (range: 2 to 65535)SMW80 :PWM pulse width value (range: 0 to 65535)3图4 电机反转梯形图(3) 按下反转键,I0.2接通,方向电平置位,脉冲输出功能PWM输出脉冲周期为2000um,脉宽为1000um的脉冲,电机反转。

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一定要串联电阻,否则可能会烧坏驱动器控制接口电路。

步进电机启动停止正反转控制程序的汇编语言的实现

步进电机启动停止正反转控制程序的汇编语言的实现

DELAY 1MS MACRO TIME ;延时宏命令LOCAL AALOCAL BBPUSH CXMOV CX,TIMEAA: PUSH CXMOV CX,1000BB: NOPLOOP BBPOP CXLOOP AAPOP CXENDMDA TA SEGMENTTABA DB 01H,03H,02H,06H,04H,05H;正转的模型TABB DB 05H,04H,06H,02H,03H,01H;反转的模型DA TA ENDSCODE SEGMENTZZ PROC NEARPUSH DSMOV AX,DA TAMOV DS,AXMOV AX,0PUSH AXMOV DX,203HMOV AL,80HOUT DX,AL ;8255的控制字设定MOV DX,200HMOV AL,0OUT DX,AL ;先输出制动命令MOV CX,360 ;设定正转步数DD:MOV BL,6 ;六拍MOV DX,200HLEA DI,TABA ;指针指向正转的数字模型CC: MOV AL,[DI]OUT DX,ALDELAY 1MS 10INC DI ;指针加1,指向下一步的数字模型DEC BL ;拍数减1JNZ CC ;六拍未结束,则继续循环LOOP DD;360个周期的六拍未结束,继续循环ZZ ENDPFZ PROC NEARMOV CX,400 ;设定反转步数FF: MOV BL,6MOV DX,200HLEA DI,TABB ;指针指向反转的数字模型EE: MOV AL,[DI]OUT DX,ALDELAY 1MS 10DEC DI ;指针减1,指向反转下一步数字模型DEC BLJNZ EELOOP FFFZ ENDPMOV DX,200HMOV AL,0OUT DX,AL ;结束后,输出制动命令RETMAIN ENDPCODE ENDSEND START。

PLC实现步进电机的正反转及调整控制

PLC实现步进电机的正反转及调整控制

实训课题三 PLC实现步进电机正反转和调速控制一、实验目的1、掌握步进电机的工作原理2、掌握带驱动电源的步进电机的控制方法3、掌握DECO指令实现步进电机正反转和调速控制的程序二、实训仪器和设备-48MR PLC一台1、FX2N2、两相四拍带驱动电源的步进电机一套3、正反切换开关、起停开关、增减速开关各一个三、步进电机工作原理步进电机是纯粹的数字控制电动机,它将电脉冲信号转换成角位移,即给一个脉冲信号,步进电机就转动一个角度,图3-1是一个三相反应式步进电机结图。

从图中可以看出,它分成转子和定子两部分。

定子是由硅钢片叠成,定子上有六个磁极(大极),每两个相对的磁极(N、S极)组成一对。

共有3对。

每对磁极都绕有同一绕组,也即形成1相,这样三对磁极有3个绕组,形成三相。

可以得出,三相步进电机有3对磁极、3相绕组;四相步进电机有4对磁极、四相绕组,依此类推。

反应式步进电动机的动力来自于电磁力。

在电磁力的作用下,转子被强行推动到最大磁导率(或者最小磁阻)的位置,如图3-1(a)所示,定子小齿与转子小齿对齐的位置,并处于平衡状态。

对三相异步电动机来说,当某一相的磁极处于最大导磁位置时,另外两相相必处于非最大导磁位置,如图3-1(b)所示,即定子小齿与转子小齿不对齐的位置。

把定子小齿与转子小齿对齐的状态称为对齿,把定子小齿与转子小齿不对齐的状态称为错齿。

错齿的存在是步进电机能够旋转的前提条件,所以,在步进电机的结构中必须保证有错齿的存在,也就是说,当某一相处于对齿状态时,其它绕组必须处于错齿状态。

本实验的电机采用两相混合式步进电机,其内部上下是两个磁铁,中间是线圈,通了直流电以后,就成了电磁铁,被上下的磁铁吸引后就产生了偏转。

因为中间连接的电磁铁的两根线不是直接连接的,是采用在转轴的位置用一根滑动的接触片。

这样如果电磁铁转过了头,原先连接电磁铁的两根线刚好就相反了,所以电磁铁的N极S极就和以前相反了。

但是电机上下的磁铁是不变的,所以又可以继续吸引中间的电磁铁。

PLC实现步进电机的正反转和调整控制

PLC实现步进电机的正反转和调整控制

PLC实现步进电机的正反转和调整控制PLC(可编程逻辑控制器)是一种用于自动化控制系统的可编程电子设备。

在工业领域,PLC被广泛应用于各种自动化设备和机器的控制。

步进电机是一种非塔式电机,其运动是以固定的步长进行的,适用于需要精确定位的应用,如印刷机、数控机床等。

本文将介绍如何使用PLC实现步进电机的正反转和调整控制。

步进电机的正反转控制可以通过改变电机的运行顺序来实现。

一种常见的方法是使用四相步进电机,通过改变电机的相序来实现正反转。

一般来说,步进电机有两种驱动方式:全步进和半步进。

全步进驱动方式是指每次脉冲信号到达时,电机转动一个步进角度。

全步进驱动方式可以通过控制PLC输出的脉冲信号来实现。

例如,当需要电机正转时,在PLC程序中输出连续的脉冲信号,电机将按照一定的步进角度顺时针旋转。

当需要反转时,输出连续的反向脉冲信号,电机将逆时针旋转。

半步进驱动方式是指每次脉冲信号到达时,电机转动半个步进角度。

半步进驱动方式可以通过改变输出的脉冲信号序列来实现。

例如,正转时输出连续的脉冲信号序列:1000、1100、0100、0110、0010、0011、0001、1001,电机将按照半个步进角度顺时针旋转;反转时输出反向脉冲信号序列:1001、0001、0011、0010、0110、0100、1100、1000,电机将逆时针旋转。

调整控制是指通过PLC来调整步进电机的运行速度和位置。

调速控制可以通过改变输出脉冲信号的频率来实现。

例如,可以定义一个计时器来控制输出脉冲信号的频率,通过改变计时器的时间参数来改变电机的速度。

较小的时间参数将导致更快的脉冲频率,从而使电机加快转速。

位置控制可以通过记录步进电机当前的位置来实现。

可以使用PLC的存储和控制功能来记录和更新电机的位置信息。

例如,可以使用一个变量来保存电机当前的位置,并在转动过程中不断更新该变量的值。

通过读取该变量的值,可以获得电机当前的位置信息。

总结起来,使用PLC实现步进电机的正反转和调整控制可以通过控制输出的脉冲信号序列和频率来实现。

单片机控制步进电机正反转的实际应用程序

单片机控制步进电机正反转的实际应用程序

单片机控制步进电机正反转的实际应用程序/*这是一个控制步进电机正反转的实际应用程序*//*选用的是三相步进电机驱动器,p14口线用做步进电机的脉冲控制*//*p13口线用做步进电机的方向控制。

p15,p16,p17是光耦开关量输入*//*信号端,p20,p21,p22,p23与x25045看门狗存储器相连*//*k7,k8键是设定步进电机转动速度参数的加减键*//*k9是启动运行键,按一下k9,步进电机开始运行,直到p17口线有信号输入才停止*/ /*k10是停止键,任何时候按下k10都将停止步进电机当前的运行*//*k11是步进运行键,按一下,步进电机动一下*//*k12键是反向运行键,按一下,步进电机开始反向运行,知道p15口线有信号才停止*/ /*如果p16口线有信号输入,则只有k12键才起作用,其它键都没反应。

*/START:do;$INCLUDE(REG51.DCL)DECLARE (addrl,n,I,j,ok,ds) byte; /*定义变量*/declare l(5) byte;declare (dat,data) byte at (30h);declare delay word;DECLARE ACO(11) BYTE CONSTANT (05h,9fh,23h,0bh,99h,49h,/*定义LED段码表*/ 41h,1fh,01h,09h,00h);declare si literally 'p21',sck literally 'p20'; /*X25045囗线定义*/declare so literally 'p22',cs literally 'p23';dog:procedure; /* 初始化看门狗x25045 */cs=1;call time(1);cs=0;call time(1);cs=1;end dog;run:procedure; /*步进电机运行脉冲输出程序*/if ok=1 thencall dog;do;p14=0;call time(1);p14=1;call time(1);end;end run;DISPLAY:PROCEDURE(L0,L10); /*显示子程序*/DECLARE (L0,L10) BYTE; /*定义显示二位*/n=L10;n=aco(n); /*十位数BCD码译成段码*/sbuf=n; /*十位数送164显示*/do while ti=0; /*等待发送结束*/call dog; /*看门狗定时器复位*/end;n=L0;n=aco(n);sbuf=n; /*个位数送164显示*/do while ti=0;call dog;end;end display;outbyt: procedure(da); /*向看门狗存储器写入一字节*/ declare (i,da) byte;j=da; /*将要写入的字节赋给临时变量J */do i=0 to 7; /*左移8位,送到口线si */sck=0;j=scl(j,1);si=cy;sck=1; /*每移一位数据,跟一个时钟信号*/end;end outbyt;inbyt: procedure; /* 从看门狗存储器读出一字节*/ declare (i,di) byte;j=0;do i=0 to 7;sck=1;sck=0;cy=so;j=scl(j,1); /*从看门狗存储器读出一字节送入临时变量j*/ end;dat=j;end inbyt;wrenable: procedure; /* 置看门狗写使能*/sck=0;cs=0;; /* write enable command */call outbyt(06h); /* x25045 写使能指令06h */cs=1;sck=0;end wrenable;wrdisable: procedure; /* 置看门狗写禁止*/sck=0;cs=0;; /* write disable command */call outbyt(04h);sck=0;cs=1;end wrdisable;wrregister: procedure; /* 写状态寄存器*/sck=0;cs=0;dat=01h; /* write register command */call outbyt(dat);; /* 00h--1.4S, 20h--200MS, 10h--600MS, 30h--disable Wdog */ call outbyt(00h); /* 设定看门狗定时时间*/;sck=0;cs=1;call time(200); /* wait to complete writting cycle */end wrregister;rdregister:procedure; /* 读看门狗状态寄存器*/sck=0;cs=0;; /* register read command */call outbyt(05h);call inbyt; /* status register read in <DAT> */sck=0;cs=1;end rdregister;wbyte:procedure; /* 看门狗存储器字节写入子程序*/ declare comm byte;sck=0;cs=0;comm=02h; /* 写指令02h */call outbyt(comm);call outbyt(addrl);call outbyt(dat); /* send one byte data to X25043 */cs=1;sck=0;call time(150);end wbyte;rbyte:procedure; /*看门狗存储器字节读出子程序*/declare comm byte;sck=0;cs=0;comm=03h; /* read command */call outbyt(comm);call outbyt(addrl);call inbyt; /* read one byte to <DAT> */sck=0;cs=1;end rbyte;incdata: procedure; /* 参数修改--"加"键处理子程序+ */if p10=0 then /* 如果K7键按下*/do;do while p10=0; /* 等待键松开有效*/call dog; /* 此处必需调用看门狗复位子程序("喂狗"),否则程序将被看门狗复位*/ end;data=data+1; /* 设定值+1 */if data>99 then data=1; /* 规定设定值的上限*/L(1)=data MOD 10; /*将设定值的十位数拆出来送给十位数显示变量L(1) */L(2)=data/10; /*将设定值的个位数拆出来送给个位数显示变量L(2) */call display(L(1),L(2)); /* 将改变后的设定值送164显示出来*/call time(200); /* 延时*/call dog;call time(200);call dog;call wrenable; /* 置存储器写使能*/addrl=00h; /* 置存储器地址*/dat=l(1);call wbyte; /* 将变量L(1)的值写入存储器00h位置*/call wrenable;addrl=01h;dat=l(2);call wbyte; /* 将变量L(2)的值写入存储器01h位置*/end;end incdata;decdata: PROCEDURE; /* 参数修改---"减"键处理子程序- */IF p11=0 THEN /* k8 键处理子程序*/do;do while p11=0;call dog;end;DATA=DATA-1; /* 设定值-1 */if data=0 then data=99;L(1)=data MOD 10;L(2)=data/10;call display(l(1),l(2));call dog;call time(200);call dog;call time(200);call dog;call wrenable;addrl=00h;dat=l(1);call wbyte;call wrenable;addrl=01h;dat=l(2);call wbyte;end;END decdata;starton: PROCEDURE; /* start */declare sd byte;if p12=0 THEN /* K9键处理子程序*/do;do while p12=0;call dog;end;if p17=0 then ok=0; /* 如果p17 口线上有信号输入,则运行标志置0 (停止运行)*/ p13=1; /* 置步进电机正向运转*/call time(200);call dog;do while ok=1; /* 当运行标志为1时,执行速度延时操作*/do sd= 0 to data; /* 根据设定值data的数值延时来确定步进电机运行时的脉冲给定速度*/call dog;end;end;END starton;step: PROCEDURE; /* step */declare sd byte;p13=1; /* 置步进电机正向运转*/call time(200);IF p33=0 THEN /* k11键处理子程序*/do;if p17=0 then ok=0; /* 如果p17上有信号输入,则停止运行*/do while p33=0;do sd= 0 to data; /* 调用延时,调整步进电机的运行速度*/call dog;call time(2);end;call run;call dog;end;end;ok=0;END step;back: PROCEDURE; /* 反向运行处理子程序*/declare sd byte;IF p34=0 THENdo;do while p34=0;call dog;end;if p15=0 then ok=0; /* 反向运行时,如果遇到p15上有信号输入,则停止步进电机运行*/ p13=0; /* 置步进电机反向运行*/call time(200);call dog;do while ok=1;do sd=0 to data; /*根据设定值调节步进电机的运行速度*/call dog;call time(2);end;call run;if (p15=0 or p32=0 ) then ok=0; /* p15 或p32 口线任意一个有信号输入,停止运行*/ end;end;END back;MAIN$PROGRAM: /* 初始化主程序*/ea=0; /* 关中断*/SCON=00h; /*置串口方式0 ,串行数据输出模式*/PCON=00h;tmod=11h;enable; /* 开中断(ea=1) */SCK=0;cs=1; /* 定义存储器口线初始状态*/call wrenable;call wrregister; /* 看门狗存储器初始化*/call wrenable;call dog;p2=0ffh; /* 初始化各个口线的状态*/p1=0ffh;ok=0;p14=1;p32=1;p33=1;p34=1;p13=1;ADDRL=00h; /* 上电复位后从存储器中读出设定的速度值*/CALL rbyte;l(1)=dat;addrl=01h;call rbyte;l(2)=dat;DATA=L(1)+L(2)*10; /*将读出的值合并成十进制,存入变量data中*/ /* 以下是主循环程序*/LOOP:IF p10=0 THEN CALL incdata; /* 检测各个按键是否有按下*/IF p11=0 THEN CALL decdata;if p12=0 thendo;ok=1;call starton;end;if p34=0 thendo;ok=1;call back;end;if p33=0 thendo;ok=1;call step;end;call dog;CALL DISPLAY(L(1),L(2)); /* 将设定值送164显示*/call dog;CALL TIME(100);call dog;GOTO LOOP;END START;。

步进电机调速,正转反转程序

步进电机调速,正转反转程序

ORG 0000STOP: ORL P1, #00H ;步进电机停止LOOP: MOV P1, #00HJNB P2.0,FOR2 ;如果p2.0 按下正转JNB P2.1,REV2 ;如果p2.1 按下反转JNB P2.2,STOP1 ;如果p2.2 按下停止JMP LOOP ;反复监测键盘FOR: MOV R0, #00H ;正转到tab 取码指针初值FOR1: MOV A,R0 ;取码MOV DPTR,#TABLEMOVC A,@A+DPTRJZ FOR ;是否到了结束码00hCPL A ;把acc 反向MOV P1,A ;输出到p1 开始正转JNB P2.2,STOP1 ;如果p2.2 按下停止JNB P2.1,REV2 ;如果p2.1 按下正转JNB P2.0,FOR2 ;如果p2.0 按下反转CALL DELAY ;转动的速度INC R0 ;取下一个码JMP FOR1 ;继续正转REV: MOV R0,#05H ;反转到tab 取码指针初值REV1: MOV A,R0MOV DPTR,#TABLE ;取码MOVC A,@A+DPTRJZ REV ;是否到了结束码00hCPL A ;把acc 反向MOV P1,A ;输出到p1 开始反转JNB P2.2,STOP1 ;如果p2.2 按下停止JNB P2.1,REV2 ;如果p2.1 按下正转JNB P2.0,FOR2 ;如果p2.0 按下反转CALL DELAY ;转动的速度INC R0 ;取下一个码JMP REV1 ;继续反转STOP1: CALL DELAY ;按p3.4 的消除抖动JNB P2.2,$ ;p2.2 放开否?MOV P1,#00HTHDPJ-1/2 型单片机开发综合实验箱CALL DELAY ;放开消除抖动JMP STOP FOR2: CALL DELAY ;按p2.0 的消除抖动JNB P2.0,$ ;p2.0 放开否?CALL DELAY ;放开消除抖动JMP FORREV2: CALL DELAY ;按p2.1 的消除抖动JNB P2.1,$ ;p3.3 放开否?CALL DELAY ;放开消除抖动JMP REVDELAY: MOV R1,#150 ;步进电机的转速20ms D1: MOV R2,#248DJNZ R2,$DJNZ R1,D1RETTABLE: DB 01H,02H,04H,08H ;正转表DB 00 ;正转结束DB 01H,08H,04H,02H ;反转DB 00 ;反转结束END。

PLC实现步进电机正反转和调速控制

PLC实现步进电机正反转和调速控制

PLC实现步进电机正反转和调速控制PLC(可编程逻辑控制器)是一种专门用于工业自动化控制系统的计算机控制设备。

它可以实现对多种设备和机器的控制,包括步进电机。

步进电机是一种通过步进角度来控制转动的电机,其转动可以精确地控制在每个步进角度停留一段时间。

步进电机的正反转和调速控制是实现工业自动化过程中常用的功能,PLC可以很好地实现这些控制。

一、步进电机的正反转控制步进电机的正反转控制是通过控制步进电机的相序来实现的。

步进电机有多种相序方式,常见的包括正向旋转、逆向旋转、双向旋转等。

PLC 可以通过控制步进电机的相序开关来实现步进电机的正反转。

在PLC中,可以使用PLC的输出口来控制步进电机的相序开关。

通过将输出口与步进电机的控制线路连接,可以控制相序开关的状态,从而控制步进电机的正反转。

例如,将PLC的一个输出口连接到步进电机的CW (Clockwise)输入线路,另一个输出口连接到步进电机的CCW(Counter Clockwise)输入线路,可以通过控制这两个输出口的状态来实现步进电机的正反转。

二、步进电机的调速控制步进电机的调速控制是通过控制步进电机的脉冲频率来实现的。

步进电机的转速与脉冲频率成正比,脉冲频率越高,步进电机的转速越快。

因此,通过控制PLC输出口给步进电机发送的脉冲频率,可以实现步进电机的调速控制。

在PLC中,可以使用定时器模块来控制步进电机的脉冲频率。

定时器模块可以通过设定计时器的定时时间和周期,来控制输出口的脉冲频率。

通过控制定时器的定时时间,可以控制步进电机每个步进角度的停留时间,从而控制步进电机的转速。

除了定时器模块,PLC还可以使用计数器模块来实现步进电机的调速控制。

计数器模块可以通过设定计数器的初始值和计数步长,来控制输出口的脉冲频率。

通过控制计数器的初始值和计数步长,可以控制步进电机每个步进角度的停留时间,从而实现步进电机的转速控制。

三、步进电机正反转和调速控制实例以下是一个使用PLC实现步进电机正反转和调速控制的实例。

PLC控制步进电机的正反转和速度

PLC控制步进电机的正反转和速度

PLC控制步进电机的正反转和速度
1.控制要求
对定时器进行不同的时间定时控制其速度。

通过定时器定时通、断电使步进电机实现正反转。

本文以五相十拍步进电机用西门子S7-200plc来进行举例。

2.五相十拍步进电机的控制要求
1)五相步进电动机有五个绕组:A、B、C、D、E,控制五相十拍电动机的时序图如下:
2)用五个开关控制步进电动机工作:
1 号开关控制其运行(启/停)
2 号开关控制其低速运行(转过一个步距角需0.5S)
3 号开关控制其中速运行(转过一个步距角需0.1S)
4 号开关控制其低速运行(转过一个步距角需0.03S)
5 号开关控制其转向(ON为正转,OFF为反转)
3.PLC外部接线图
PLC外部接线图的输入输出设备、负载电源的类型等设计就结合系统的控制要求来设定。

其控制接线图如下图所示:
4.I/O地址分配
根据PLC外部接线图可以写出各电气元件符号、功能说明表及I/O 地址分配表如下:
5.五相十拍步进电动机的拍数实现梯形图如下:。

自动门控制的步进电机正反转和加速减速C程序

自动门控制的步进电机正反转和加速减速C程序

自动门控制的步进电机正反转和加速减速C程序步进电机的正反转和加速减速是实现自动门控制的关键功能。

通过编写C程序,我们可以实现对步进电机的控制,使其按照设定的方向旋转,并可以进行加速和减速操作。

步进电机正反转步进电机的正反转是通过控制电机的相序来实现的。

下面是一个简单的C程序示例,用于控制步进电机的正反转:include <stdio.h>int main() {// 定义电机的相序int sequence[] = {1, 2, 4, 8};int direction = 1; // 1表示正转,-1表示反转// 正转if (direction == 1) {for (int i = 0; i < 4; i++) {printf("Phase: %d\n", sequence[i]);// 在这里控制步进电机的相序输出}}// 反转else if (direction == -1) {for (int i = 3; i >= 0; i--) {printf("Phase: %d\n", sequence[i]);// 在这里控制步进电机的相序输出}}return 0;}在以上示例代码中,我们通过设置`sequence`数组来表示电机的相序,其中`sequence[0]`表示第一相,`sequence[1]`表示第二相,以此类推。

通过循环遍历数组中的元素,并控制步进电机相序的输出,从而实现步进电机的正反转。

步进电机加速减速步进电机的加速减速是通过逐渐改变电机的驱动信号频率来实现的。

下面是一个简单的C程序示例,用于控制步进电机的加速减速:include <stdio.h>include <unistd.h>int main() {// 定义电机的相序int sequence[] = {1, 2, 4, 8};int delay = 1000; // 初始延时时间,单位为毫秒int minDelay = 100; // 最小延时时间,单位为毫秒// 加速for (int i = 0; i < 4; i++) {printf("Phase: %d\n", sequence[i]);// 在这里控制步进电机的相序输出usleep(delay); // 延时if (delay > minDelay) {delay -= 100; // 减小延时时间,实现加速}}// 延时一段时间// 减速for (int i = 3; i >= 0; i--) {printf("Phase: %d\n", sequence[i]);// 在这里控制步进电机的相序输出usleep(delay); // 延时if (delay < 1000) {delay += 100; // 增加延时时间,实现减速}}return 0;}在以上示例代码中,我们通过循环遍历数组中的元素,并控制步进电机相序的输出,并通过调用`usleep`函数来实现延时,从而控制步进电机的转速。

s7-200控制步进电机正转和反转程序

s7-200控制步进电机正转和反转程序

块:主程序作者:创建时间:2014.07.20 10:45:11 修改时间:2014.08.27 14:23:42符号变量类型数据类型注释 TEMP TEMP TEMPTEMP程序注释步进电机正转和反转控制程序网络 1正转(清零) 脉冲周期1msR MOV_WENOENOUT IN SM0.0脉冲口:Q0.012SMW68符号地址注释脉冲口Q0.0网络 2从Q0.0口发脉冲PMOV_BENOENOUT IN MOV_DW ENOENOUT IN PLSENOENQ0.X正转:I0.016#8D SMB67+400SMD720符号地址注释正转I0.0R 正转:I0.0方向:Q0.11符号地址注释方向Q0.1ON时反转,OFF时正转正转I0.0网络 4PMOV_BENOENOUT IN MOV_DW ENOENOUT IN PLSENOENQ0.X反转:I0.116#8D SMB67+400SMD720符号地址注释反转I0.1网络 5S 反转:I0.1方向:Q0.11符号地址注释反转I0.1方向Q0.1ON时反转,OFF时正转PMOV_BENO ENOUT INMOV_DWENO ENOUT INPLSENO ENQ0.X停止:I0.216#0SMB670SMD72符号地址注释停止I0.2创建时间:2014.07.20 10:45:11修改时间:2014.07.20 10:45:11符号变量类型数据类型注释EN IN BOOLININ_OUTOUTTEMP子程序注释网络标题网络 1网络注释创建时间:2014.07.20 10:45:11修改时间:2014.07.20 10:45:11符号变量类型数据类型注释TEMPTEMPTEMPTEMP中断程序注释网络 1网络标题网络注释。

控制步进电机正反转的加减速程序程序

控制步进电机正反转的加减速程序程序

控制步进电机正反转的加减速程序程序#include#define KeyPort P1#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换sbit LATCH1=P2^4;//定义锁存使能端口段锁存sbit LATCH2=P0^0;// 位锁存unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]; //存储显示值的全局变量sbit A1=P2^0; //定义步进电机连接端口sbit B1=P2^1;sbit C1=P2^2;sbit D1=P2^3;#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//DA相通电,其他相断电#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电unsigned char Speed=1;bit StopFlag;void Display(unsigned char FirstBit,unsigned char Num);void Init_Timer0(void);unsigned char KeyScan(void);/*------------------------------------------------uS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------主函数------------------------------------------------*/main(){unsigned int i=512;//旋转一周时间unsigned int n=0;unsigned char num,vo,v;Init_Timer0();Coil_OFF;while(1) //正向{num=KeyScan(); //循环调用按键扫描if(num==1)//第一个按键,速度等级增加{if(Speed<15)Speed=Speed+2;//+8}if(num==2)//第二个按键,速度等级减小{if(Speed>1)Speed=Speed-2;//-8}if(num==3)//第三个按键,电机停转{Coil_OFFStopFlag=1;}if(num==4)//第四个按键,电机启动{StopFlag=0;TR0=1;}if(num==5)//第五个按键,电机反转{TR0=0;TR1=1;}if(num==6)//第六个按键,电机正传{TR0=1;TR1=0;}vo=(0.25*(20-Speed)*64*32)/1000;v=60/vo;TempData[0]=dofly_DuanMa[v/10]; //分解显示信息,如要显示68,则68/10=6 68%10=8TempData[1]=dofly_DuanMa[v%10];}}/*------------------------------------------------显示函数,用于动态扫描数码管输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
uchar i;
uint j;
for (j=0; j<8; j++) //转1*n圈
{
if(K3==0)
{break;} //退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
* 主程序
*
*********************************************************/
}
/********************************************************/
/*
/*步进电机正转
/*
/********************************************************/
void motor_ffw()
if(K3==0)
{beep();break;} //退出此循环程序
}
}
else
P1 = 0xf0;
}
}
/********************************************************/
sbit BEEP = P3^6; //蜂鸣器
/********************************************************/
/*
/* 延时t毫秒
main()
{
uchar r,N=64; //N 步进电机运转圈数
while(1)
{
if(K1==0)
{
beep();
for(r=0;r<N;r++)
{
motor_ffw(); //电机正转
/*
/*步进电机反转
/*
/********************************************************/
void motoint j;
for (j=0; j<8; j++) //转1×n圈
void beep()
{
uchar i;
for (i=0;i<100;i++)
{
delayB(4);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
/* 11.0592MHz时钟,延时约1ms
/*
/********************************************************/
void delayB(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i=0; i<13; i++)
{ }
}
}
/**********************************************************/
uchar code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; ////四相八拍反转编码
sbit K1 = P3^2; //正转
sbit K2 = P3^3; //反转
sbit K3 = P3^4; //停止
{
if(K3==0)
{break;} //退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P1 = REV[i]; //取数据
if(K3==0)
{beep();break;} //退出此循环程序
}
}
else if(K2==0)
{
beep();
for(r=0;r<N;r++)
{
motor_rev(); //电机反转
delay(2); //调节转速
}
}
}
/********************************************************
*
#include <reg51.h> //51芯片管脚定义头文件
#include <intrins.h> //内部包含延时函数 _nop_();
#define uchar unsigned char
#define uint unsigned int
uchar code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //四相八拍正转编码
void delay(uint t)
{
uint k;
while(t--)
{
for(k=0; k<125; k++)
{ }
}
}
/**********************************************************/
{
P1 = FFW[i]; //取数据
delay(2); //调节转速
}
}
}
/********************************************************/
相关文档
最新文档