⑴ 西門子s7-200plc控制步進電機速度與正反轉怎麼編程
1、主程序先正轉,等到正轉完了就中斷,中斷中接通個輔助觸點(M0.X),當M.0X閉合,住程序中的反轉開始運做。這樣子就OK了。
2、用PTO指令讓Q0.0 OR Q0.1高速脈沖,另一個點如Q0.2做方向信號,就可以控制正反轉了,速度快慢就要控制輸出脈沖周期了,周期越短速度越快,如果你速度很快的話請考慮緩慢加速,不然它是啟動不了的,如果方向也變的快的話就要還做一個緩慢減速,不然它振動會蠻厲害,而且也會失步。
⑵ 請大俠們幫忙編一個步進電機控製程序。
#include <REGX52.H>
bit aj = 0;
sbit clk1=P1^0; //定義X脈沖輸出位
sbit dir1=P1^1; //定義X正反轉控制位
sbit ena1=P1^2; //定義Y使能控制位
sbit x1 =P1^6;
unsigned int k=0,x11,y11,cycle=2000,yk,xk,xk1;//定義開始控制位
unsigned char x = 1;
unsigned int kx;
void delay(unsigned int i)
{
unsigned int j,k;
for(j=i;j>0;j--)
for(k=300;k>0;k--);
}
void inistartx(void) //X初始化函數
{
xk=0;
dir1=1;
cycle=9600;
kx=300;
TR0=1;
P2_0=0;
while(xk1<400);
TR0=0;
kx=0;
delay(500);
xk=0;
cycle=9600;
dir1=0;
xk1=0;
kx=700;
TR0=1;
while(x==1&&xk1<801); //
TR0=0;
delay(500);
cycle=9600;
xk1=0;
dir1=1;
kx=300;
TR0=1;
while(xk1<400);
TR0=0;
kx=0;
clk1=0;
xk1=0;
}
void exint0_init( )
{
IT0 =1; //下降沿產生中斷
EX0 =1; //使能外部中斷
EA =1; //使能全局中斷
}
void initime0(void) //初始化定時器0
{
TH0=0xf8;
TL0=0x30;
}
void time0() interrupt 1 //定時器0中斷函數
{
if(xk1<100){cycle=cycle-80;}
if(xk1>=100&&xk1<=kx){cycle=1600;}
if(xk1>kx) {cycle=cycle+80;}
TH0=(65536-cycle)/256; //定時5000次= 5000us = 5 ms 65536-5000=60536=0xec78
TL0=(65536-cycle)%256;
//TH0=0xf8; //定時器1為X或者Y提供脈沖數
//TL0=0x30; //頻率500cycle=2000 ; cycle=2500=》頻率=400
xk1++;
clk1=~clk1;
k++;
}
void exint0() interrupt 0 //接近開關接P3.2,發生中斷停止
{
TR0=0;
x=0;
ena1=0;
}
void main (void)
{
x1=1;
TMOD = 0x01;
IE=0xAF; //EA - ET2 - ES - ET1 - EX1- ET0 - EX0 允許(總中斷EA) ET2 ET1 ET0中斷
initime0();
exint0_init();
inistartx();
TR2=1;
while(aj ==0);
inistartx();
TR1=1;
//IP= 0x00; //- - PT2 PS PT1 PX1 PT0 PX0
////TCON =0x00; //TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
//T2CON =0x00; //TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T CP/RL2
while(1){
}
}
⑶ 51單片機C語言程序按鍵控制步進電機轉速
sbit K1=P1^0;
sbit K2=P1^1;
char y=0;
while(1)
{
pangan();
for(i=0;i<4;i++) //4相來
{
/*P1=F_Rotation[i]; //輸出對應的相 可以自自行換成反轉表格
Delay(500); //改變這個參數可以調整電機轉速
Delay(5000);*/
P1=B_Rotation[i];
Delay(265+y);
P1=F_Rotation[i];
Delay(265+y);
}
}
void pangan()
{
if(K1==0)
{ y++; //加
while(~k1)
}
if(K2==0)
{ y--;
while(~k2); //減
}
}
}
沒有下上限 要是調的話 需要判斷顯示延時時間