三菱PLC控制步进电机的最简单的程序

三菱PLC控制步进电机的最简单的程序,第1张

M206:正转

M207:反转

Y0:脉冲输出

Y1:反转信号

D4200:频率(用于控制速度,数据来源于触摸屏)

K99999999:脉冲数量

K100:加速时间

向左转|向右转

如图,这个就是一个步进电机的正反转的运行,Y0接步进驱动器的脉冲,Y1接步进驱动器的方向,M0为ON时正转,M1为ON时反转,D0是脉冲的频率,D1是脉冲的个数

移动速度和脉冲频率有关,在细分数一定的条件下,频率越高速度越快,行走的距离和脉冲个数有关,脉冲个数越多,行走距离越长,(在三菱这个指令中,脉冲个数为0时,是一直运行,相当于无限个数),具体的移动速度和行走距离得根据你的设置(频率,细分数,脉冲个数等)和硬件(包括步进电机的步距角,丝杆的丝距,齿轮组的齿轮比,齿轮带的传送比等)来调节。

1、有三个输入,分别是一个按钮、两个霍尔传感器(也就是接近开关),我用P0.0到P0.2来代替;输出2个或以上(这看接什么显示器,如果是PC的话,就不用数字量输出,直接串口就可以了)控制正反转的继电器管脚用P1.0、P1.1;需要与一个全局变量转动次数k连接起来,另外两个输入接近开关选用NPN传感器或用光电隔离,总之有效信号能把管脚电压拉低就可以。

2、例程:

#include <reg51.h>  //选用晶振11.0592MHz

unsigned char k=0  //k表示正反转次数

sbit X0=P3^2     //调节按钮

sbit X1=P1^1     //上限位接近开关信号

sbit X2=P1^2     //下限位接近开关信号

sbit Y1=P0^0     //电机上升(注意:我使用的是管脚输出为0时候,电机运动,这样可以避免启动时候,单片机自复位对电机点动的影响)

sbit Y2=P0^1     //电机下降

void delay50ms(unsigned int i)

  unsigned int j

  for (ii>0i--)

    for(j=46078j>0j--)

}

main()

{

   IT0=1       //下降沿触发

   EX0=1       //开P3.2外部中断

   EA=1        //总中断开  

   while(1)

   while(k)

   {

      Y1=0        //正转

      while(X1==1)       //等待正转接近开关反应

      Y1=1          //正转停

      delay50ms(1)     //停止时间50ms

      Y2=0     //反转

      while(X2==1)     //等待反转接近开关反应

      Y2=1    //反转停

      k--     //圈数减一   

   }

}

void  counter0(void) interrupt 0

{

   k++     //外部中断控制圈数加一

   //这个位置可以加你显示程序

}

C语言程序如下:

#include<reg 51.h>

#define uint unsigned int

Sbit k1=p3.4//启动开关

Sbit k2=p3.5//换向开关

Sbit s2=p3.2//加速按钮

Sbit s3=p3.3//减速按钮

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=0i<10i++)}

}

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=0i<10i++)}

}

Void isr_int1(void)interrupt2

{

If(speed>0)

Speed=speed-1

While(s3==0)

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

}

Void zd_t0ist(void)interrupt 1

{

Th0=0xd8

Tl0=0xf0

Switch(speed)

{

Case0p2=0xc0count=0break

Case1p2=0xf9count=60break

Case2p2=0xa4count=40break

Case3p2=0xb0count=35break

Case4p2=0x99count=30break

Case5p2=0x92count=28break

Case6p2=0x82count=25break

Case7p2=0xf8count=21break

Default:break

}

If(t==0)

T=count

If(t>0)

T=t-1

If(k2==0)

{

If(t==0)

{

Switch(k)

{

Case0p1=0x01break

Case1p1=0x02break

Case2p1=0x04break

Case3p1=0x08break

Default:break

}

k=k+1

if(k==4)

k=0

}

}

Else

{

If(t==0)

{

Switch(k)

{

Case0p1=0x08break

Case1p1=0x04break

Case2p1=0x02break

Case3p1=0x01break

Default:break

}

K=k+1

If(==4)

K=0

}

}

}


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

原文地址: http://outofmemory.cn/yw/11143406.html

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

发表评论

登录后才能评论

评论列表(0条)

保存