plc怎么控制步进电机驱动器,怎么编程序

plc怎么控制步进电机驱动器,怎么编程序,第1张

内容:1、本程序用于测试4相步进电机常规驱动

2、需要用跳帽或者杜邦线把信号输出端和对应的步进电机信号输入端连接起来

3、速度不可以调节的过快,不然就没有力矩转动了

4、按s4(设置成独立按键模式)可以控制正反转

------------------------------------------------/

#include

bit Flag;//定义正反转标志位

unsigned char code F_Rotation[4]={0xf1,0xf2,0xf4,0xf8}; //正转表格

unsigned char code B_Rotation[4]={0xf8,0xf4,0xf2,0xf1}; //反转表格

//

/ 延时函数 /

//

void Delay(unsigned int i)//延时

{

while(--i);

}

//

/ 主函数 /

//

main()

{

unsigned char i;

EX1=1; //外部中断0开

IT1=1; //边沿触发

EA=1; //全局中断开

while(!Flag)

{

P0=0x71;//显示 F 标示正转

for(i=0;i<4;i++) //4相

{

P1=F_Rotation[i]; //输出对应的相 可以自行换成反转表格

Delay(500); //改变这个参数可以调整电机转速 ,数字越小,转速越大

}

}

while(Flag)

{

P0=0x7C;//显示 b 标示反转

for(i=0;i<4;i++) //4相

{

P1=B_Rotation[i]; //输出对应的相

Delay(500); //改变这个参数可以调整电机转速 ,数字越小,转速越大

}

}

}

//

/ 中断入口函数 /

//

void ISR_Key(void) interrupt 2 using 1

{

Delay(300);

Flag=!Flag; //s3按下触发一次,标志位取反

}

k60和k50线性马达不完全一样,它们有一些显著的不同之处。

K60线性马达采用最新的技术,具有更高的功率密度、更低的噪声水平和更高的精度。K60线性马达的最大载荷和最大运动速度也比K50线性马达更高。K60线性马达拥有更多的功能,可以支持更复杂的应用。

AT89C51单片机,步进电机驱动器L298N驱动,实现单片机识别并输出显示键盘输入的数据信息(转角)并产生连续脉冲控制步进电机转动,电机型号是两相步进电动机42BYG121,其步进角为18度,通过半步驱动方式进行细分可获得09度的步进角;环形分配器和电机驱动器

控制器接收到上位机的命令后,首先获取需要转动的步数,然后根据相应命令打开相应定时器的计数功能。控制程序中用定时器1控制二路脉冲输出,定时器2控制一路脉冲输出,从而完成3路电机的控制。    定时器2使用CTC模式,匹配中断使能。通过匹配中断,在OCR2端口可以输出脉冲,通过设定寄存器OCR2寄存器的值可以改变输山脉冲频率。定时器1使用相位与频率修正模式

键则反向转1~9圈;左键固定正转90度,右键固定反转90;Esc 键终止转动。通过这个程序,我们也可以进一步体会到如何用按键来控制程序完成复杂的功能,以及控制和执行模块之间如何协调工作,而你的编程水平也可以在这样的实践练习中得到锻炼和提升。#include <reg52h> sbit KEY_IN_1 = P2

接好线,编好驱动电机的程序,但是电机不运行?应该怎么查?非汽车

在运动控制系统,经常遇见,线接完了,驱动电机运动的程序也写好了,但是电机就是不动,这是什么原因呢,该如何查呢?

其可能存在原因为:

线未接对

相关器件设置不对

相关器件有故障

以下是相关排查手段,不全,但是可以排查一些问题。

在排查之前,先说一下运动控制器系统的配置(其运动控制系统可能为配置1、配置2、配置3,见本文图:下拉就可以看到图了)

确定控制系统后,想办法进行对比测试,如 可以运行的系统和目前存在问题的系统比对,其详细步骤如下。

步骤1:线路是否正常

检查线路,是否有错接、漏接,如24V电源,5V电源,共地等,仔细核查和电气接线图是否一致

测试通断,线缆1、线缆2 、端子板无问题,

测试线路的电阻,如果需要加限流电阻而未加,请加上,如果不需要加限流电阻,而加了,请除去限流电流

如果步骤1,已经测试完成,并且无问题,则进入步骤2

步骤2:检查驱动器和电机本身,保证其无问题

驱动器驱动电机试运转(如果可以的话),则进行此部分 *** 作,试运转成功,进行下一步 *** 作,否则更换电机或驱动器重新测试。

确定驱动器设置无问题,有些驱动器可以设置是内部触发脉冲、外部触发脉冲,请多留意

如果是步进驱动器,检查细分、电流设定是否准确无误。

步骤3:控制器设置

1使能,如果您可以听到驱动器有响应,则代表使能成功

2设置好脉冲输出方式 DIR PLUSE 或 CW CCW ,确定其输出方式与驱动器接收脉冲方式一致

步骤4开始测试其运转过程,如无法运转,跳到步骤6

1点动。判断防线是否对

2点位运行。

3持续运动。

3看编码器是否有反馈值,其进给距离是否和设定的一致,如设定1000个脉冲走1mm。不一致,则重新设置。

步骤5 :测试完成,开始准备编写所有程序或系统调试

步骤6:做完返回步骤4

1用示波器连接端子板的输出,确定其有输出,并判断和想要的是否一致。

2如果不一致,则更换对应的器件,进行测试 *** 作。

配置1

配置2

配置3

控制器:硬PLC 、运动控制卡 、软PLC。

驱动器:步进驱动器、伺服驱动器或其它驱动器。

电机:步进电机、伺服电机或其它电机。

线缆1:为了延长设备可接入距离的一些物理电缆。

线缆2:为了延长设备可接入距离的一些物理电缆。

端子板:为了配线 接线方便,而设计的端子。

阅读原文

四相电机.驱动如下: 图1是35BY型永磁步进电机的外形图,图2是该电机的接线图,从图中可以看出,电机共有四组线圈,四组线圈的一个端点连在一起引出,这样一共有5根引出线。要使用步进电机转动,只要轮流给各引出端通电即可。将COM端标识为C,只要AC、 C、BC、 C,轮流加电就能驱动步进电机运转,加电的方式可以有多种,如果将COM端接正电源,那么只要用开关元件(如三极管),将A、 、B、 轮流接地。

下表列出了该电机的一些典型参数:

表1 35BY48S03型步机电机参数

型号 步距角 相数 电压 电流 电阻 最大静转距 定位转距 转动惯量

35BY48S03 75 4 12 026 47 180 65 25

有了这些参数,不难设计出控制电路,因其工作电压为12V,最大电流为026A,因此用一块开路输出达林顿驱动器(ULN2003)来作为驱动,通过P14~P17来控制各线圈的接通与切断,电路如图3所示。开机时,P14~P17均为高电平,依次将P14~P17切换为低电平即可驱动步进电机运行,注意在切换之前将前一个输出引脚变为高电平。如果要改变电机的转动速度只要改变两次接通之间的时间,而要改变电机的转动方向,只要改变各线圈接通的顺序。

图1 35BY48S03型步进电机外形图

图2 35BY48S03型步进电机的接线图

图3 单片机控制35BY48S03型步进电机的电路原理图

三、步进电机的驱动实例

要求:控制电路如图3所示,开机后,电机不转,按下启动键,电机旋转,速度为25转/分,按下加1键,速度增加,按下减1键,速度降低,最高速度为100转/分,最低转带为25转/分,按下停止键,电机停转。速度值要求在数码管上显示出来。

1.要求分析

按上面的分析,改变转速,只要改变P10~P13轮流变低电平的时间即可达到要求,这个时间不应采用延时来实现,因为会影响到其他功能的实现。这里以定时的方式来实现。下面首先计算一下定时时间。

按要求,最低转速为25转/分,而上述步进电机的步距角为75,即每48个脉冲为1周,即在最低转速时,要求为1200脉冲/分,相当于50ms/脉冲。而在最高转速时,要求为100转/分,即48000脉冲/分,相当于125ms/脉冲。可以列出下表

表1 步进电机转速与定时器定时常数关系

速度 单步时间(us) TH1 TL1 实际定时(us)

25 50000 76 0 499968

26 48077 82 236 4807418

27 46296 89 86 4629261

28 44643 95 73 44640155

… … … … …

100 12500 211 0 124992

表中不仅计算出了TH1和TL1,而且还计算出了在这个定时常数下,真实的定时时间,可以根据这个计算值来估算真实速度与理论速度的误差值。

表中TH1和TL1是根据定时时间算出来的定时初值,这里用到的晶振是110592M。有了上述表格,程序就不难实现了,使用定时/计数器T1为定时器,定时时间到后切换输出脚即可。

2.程序实现

定义DSB-1A实验板的S1为启动键,S2为停止键,S3为加1键,S4为减1键,程序如下:

StartEnd bit 01H ;起动及停止标志

MinSpd EQU 25 ;起始转动速度

MaxSpd EQU 100 ;最高转动速度

Speed DATA 23H ;流动速度计数

DjCount DATA 24H ;控制电机输出的一个值,初始为11110 111

Hidden EQU 10H ;消隐码

Counter DATA 57H ;显示计数器

DISPBUF DATA 58H ;显示缓冲区

ORG 0000H

AJMP MAIN

ORG 000BH

JMP DISP

ORG 001BH

JMP DJZD

ORG 30H

MAIN:

MOV SP,#5FH

MOV P1,#0FFH

MOV A,#Hidden

MOV DispBuf,A

MOV DispBuf+1,A

MOV DispBuf+2,A

MOV DjCount,#11110111B

MOV SPEED,#MinSpd ;起始转动速度送入计数器

CLR StartEnd ;停转状态

MOV TMOD,#00010001B ;

MOV TH0,#HIGH(65536-3000)

MOV TL0,#LOW(65536-3000)

MOV TH1,#0FFH;

MOV TL1,#0FFH

SETB TR0

SETB EA

SETB ET0

SETB ET1

LOOP: ACALL KEY ;键盘程序

JNB F0,m_NEXT1 ;无键继续

ACALL KEYPROC ;否则调用键盘处理程序

m_NEXT1:

MOV A,Speed

MOV B,#10

DIV AB

MOV DispBuf+5,B ;最低位

MOV B,#10

DIV AB

MOV DispBuf+4,B

MOV DispBuf+3,A

JB StartEnd,m_Next2

CLR TR1 ;关闭电机

JMP LOOP

ORL P1,#11110000B

m_Next2:

SETB TR1 ;启动电机

AJMP LOOP ;主程序结束

;---------------------------------------

D10ms:

……

;---------延时程序,键盘处理中调用

KEYPROC:

MOV A,B ;获取键值

JB ACC2,StartStop ;分析键的代码,某位被按下,则该位为1

JB ACC3,KeySty

JB ACC4,UpSpd

JB ACC5,DowSpd

AJMP KEY_RET

StartStop:

SETB StartEnd ;启动

AJMP KEY_RET

KeySty:

CLR StartEnd; ;停止

AJMP KEY_RET

UpSpd:

INC SPEED;

MOV A,SPEED

CJNE A,#MaxSpd,K1 ;到了最多的次数?

DEC SPEED ;是则减去1,保证下次仍为该值

K1:

AJMP KEY_RET

DowSpd:

DEC SPEED

MOV A,SPEED

CJNE A,#MAXSPD,KEY_RET ;不等(未到最大值),返回

MOV SPEED,#MinSpd;

KEY_RET:

RET

KEY:

……获取键值的程序

RET

DjZd: ;定时器T1用于电机转速控制

PUSH ACC

PUSH PSW

MOV A,Speed

SUBB A,#MinSpd ;减基准数

MOV DPTR,#DjH

MOVC A,@A+DPTR

MOV TH1,A

MOV A,Speed

SUBB A,#MinSpd

MOV DPTR,#DjL

MOVC A,@A+DPTR

MOV TL1,A

MOV A,DjCount

CPL A

ORL P1,A

MOV A,DjCount

JNB ACC7,d_Next1

JMP d_Next2

d_Next1:

MOV DjCount,#11110111B

d_Next2:

MOV A,DjCount

RL A

MOV DjCount,A ;回存

ANL P1,A

POP PSW

POP ACC

RETI

DjH: DB 76,82,89,95,100,106,110,115,119,123,12……

DjL: DB 0,236,86,73,212,0,214,96,163,165

……

DISP: ;显示程序

POP PSW

POP ACC

……

RETI

BitTab: DB 7Fh,0BFH,0DFH,0EFH,0F7H,0FBH

DISPTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH

END

3.程序分析

本程序主要由键盘程序、显示器程序、步进电机驱动程序三部份组成,主程序首先初始化各变量,将显示器的高3位消隐,步进电机驱动的各引脚均输出高电平,然后调用键盘程序,并作判断,如果有键按下,则调用键盘处理程序,否则直接转下一步。下一步是将当前的转速值转换为BCD码,送入显示缓冲区;接着判断StartEnd这个位变量,是“1”还是“0”,如果是“1”,则开启定时器T1,否则关闭定时器T1,为防止关闭时某一相线圈长期通电,因此,在关闭定时器T1时,将P10~P13均置高。至此,主程序的工作即结束。这里为简便起见,这里没有做高位“0”消隐的工作,即如果速度为10转/分,则显示值“010”,读者可以自行加入相关的代码来处理这一工作。

步进电机的驱动工作是在定时器T1的中断服务程序中实现的,由前述分析,每次的定时时间到达以后,需要将P10~P13依次接通,程度中用了一个变量DjCntr来实现这一功能,在主程序初始化时,该变量被赋予初值11110111B,进入到定时中断以后,将该变量取出送ACC累加器,并在累加器中进行左移,这样,该数值就变为1110 1111,然后将该数与P1相“与”,此时,P14即输出低电平,第二次进入中断时,先将该数取反,成为 0001 0000,然后将该数与P1相“或”,这样,P14即输出高电平,关断了相应的线圈,然后将该数重新取出,并作左移,即 1110,1111右移成为1101 1111,将该数与P1相“与”,这样P15即输出低电平,依次类推,P17~P14即循环输出低电平。当这一数据变为0111 1111后,需要作适当的改动,将数据重新变回 1111 0111,进行第二次循环,相关代码,请读者自行分析。

定时时间又是如何确定的呢?这里用的是查表的方法,首先用Excel计算得出在每一种转速下的TH值和TL值,然后,分别放入DjH和DjL表中,在进入T1中断程序之后,将速度值变量Speed送入累加器ACC,然后减去基数25,使其基数从0开始计数,然后分别查表,送入TH1和TL1,实现重置定时初值的目的。

看完这一部份内容以后,请读者自行完成以下工作:

1. 更改程序,将S1定义为“启动/停止”,而S2定义为“方向”,按下S2,切换电机旋转方向。

2. 更改程序,要求转速从1到100。

3. 更改程序,实现首位无效零消隐。

电机高低速的配盘是指将电机转速切换到高速或低速时,需要更换不同的配盘。具体的步骤和需要的工具如下:

步骤:

1 关闭电机电源,等待电机完全停止转动。

2 使用扳手或者扭力扳手拆下原有的配盘。

3 选择需要更换的配盘,将其安装在电机轴承上。

4 使用扳手或者扭力扳手将配盘紧固固定。

5 打开电机电源,启动电机,检查电机转速是否符合要求。

需要的工具:

1 扳手或扭力扳手:用于拆卸和紧固配盘。

2 新的配盘:根据需要更换高速或低速配盘。

需要注意的是,在更换配盘时,应该选择与电机配套的原厂配件,以确保电机的性能和安全。另外,在更换配盘前,应该先检查电机的电源和控制系统是否正常运行,以避免更换配盘时对电机造成损坏。

看下图:

程序解释:

SPD为速度检测指令。X0脉冲检测输入,K60检测周期(秒),D0速度数据寄存器。

当X010接通时,SPD指令将X0输入的速度脉冲信号每60秒取样一次,结果存入数据寄存器D0中。D0内寄存的数据就是检测到的速度数据,单位转/分。

C语言程序如下:

#include<reg 51h>

#define uint unsigned int

Sbit k1=p34;//启动开关

Sbit k2=p35;//换向开关

Sbit s2=p32;//加速按钮

Sbit s3=p33;//减速按钮

Void idr_int0(void);//外部中断0中断服务函数声明

Void idr_int1(void);

Void zd_t0ist(void);

Uint speed,count,r1,I,t,k;

Main()

{k=0;

T=0;

r1=0x11;

speed=0;

count=1;

tmod=0x01;

et0=1;

ea=1;

ex0=1;

ex1=1;

if(k2==0)

p0=0xbf;

else p0=0xf9;

if (speed==0)

{p2=0xc0;

Tr0=0;

}

Else tr0=1;

}

}

}

Void isr_int0(void)interrupt();

{

If(speed<7)

Speed=speed+1;

While(s2==0)

{For(i=0;i<10;i++);}

}

Void isr_int0(void)interrupt2;

Th0=0xcf;

Tl0=0x2c;

For(;;)

{

If (k1==0)

{p0=0xff;

P2=0xff;

Speed=0;

Tr0=0}

Else

{

If(k2==0)

P0=0xbf;

Else p0=0xf9;

If(speed==0)

{p2=0xc0;

Tr0=0;

}

Else tr0=1;

}

}

}

Void isr_int0(void)interrupt()

{

If(speed<7)

Speed=speed+1;

While(s2==0)

{for(i=0;i<10;i++);}

}

Void isr_int1(void)interrupt2

{

If(speed>0)

Speed=speed-1;

While(s3==0)

{for(i=0;;i<10;i++);}

}

Void zd_t0ist(void)interrupt 1

{

Th0=0xd8;

Tl0=0xf0;

Switch(speed)

{

Case0;p2=0xc0;count=0;break;

Case1;p2=0xf9;count=60;break;

Case2;p2=0xa4;count=40;break;

Case3;p2=0xb0;count=35break;

Case4;p2=0x99;count=30;break;

Case5;p2=0x92;count=28;break;

Case6;p2=0x82;count=25;break;

Case7;p2=0xf8;count=21;break;

Default:break;

}

If(t==0)

T=count;

If(t>0)

T=t-1;

If(k2==0)

{

If(t==0)

{

Switch(k)

{

Case0;p1=0x01;break;

Case1;p1=0x02;break;

Case2;p1=0x04;break;

Case3;p1=0x08;break;

Default:break;

}

k=k+1;

if(k==4)

k=0;

}

}

Else

{

If(t==0)

{

Switch(k)

{

Case0;p1=0x08;break;

Case1;p1=0x04;break;

Case2;p1=0x02;break;

Case3;p1=0x01;break;

Default:break;

}

K=k+1;

If(==4)

K=0;

}

}

}

以上就是关于plc怎么控制步进电机驱动器,怎么编程序全部的内容,包括:plc怎么控制步进电机驱动器,怎么编程序、k60和k50线性马达一样吗、步进电机控制程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10069921.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存