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.0592MHzunsigned 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
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)