|
額,不知道為啥寫(xiě)的代碼沒(méi)有脈沖輸出過(guò)去,求大佬 寫(xiě)一個(gè)可以輸出脈沖的 主要就是stepCW和StepCCw那塊函數(shù) 如何實(shí)現(xiàn) ,謝謝了 如果能對(duì)框架優(yōu)化就更好了
#include <reg52.h>
#include <stdio.h>
#include <math.h>
///////硬件設(shè)置////////
sbit FLASH = P3 ^ 4;
sbit kk=P1^4;
sbit PUL1 = P1 ^ 0;
sbit DIR1 = P1 ^ 1;
sbit ENA1 = P1 ^ 2;
sbit PUL2 = P1 ^ 5;
sbit DIR2 = P1 ^ 6;
sbit ENA2 = P1 ^ 7;
sbit PUL3 = P2 ^ 0;
sbit DIR3 = P2 ^ 1;
sbit ENA3 = P2 ^ 2;
sbit IN0 = P0 ^ 0;
sbit IN1 = P0 ^ 1;
sbit IN2 = P0 ^ 2;
sbit IN3 = P0 ^ 3;//輸入口 gpios
#define IN P0
sbit OUT0 = P0 ^ 4;
sbit OUT1 = P0 ^ 5;
sbit OUT2 = P0 ^ 6;
sbit OUT3 = P0 ^ 7;
////////////基本函數(shù)////////////
void Delay(unsigned int m)//延時(shí)
{
unsigned int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < 100; j++);
}
void Flash(unsigned int m)//閃爍測(cè)試
{
FLASH = 0;
Delay(m);
FLASH = 1;
}
////軟件數(shù)據(jù)存儲(chǔ)/////
#define HMAX 20
code unsigned int mStep[20]= { 100,90,80,70,60,50,40,38,35,33,30,28,25,23,20,18,16,14,10,8 };
char SPM[9][1];
//////////軟件架構(gòu)函數(shù)///////
void InitTask()//電機(jī)初始化/////////////test ok
{
kk=1;
PUL1 = 1;
ENA1 = 1;
PUL2 = 1;
ENA2 = 1;
PUL3 = 1;
ENA3 = 1;
}
void StepCW(unsigned int m,char p)//正傳1.8///test ok
{
unsigned int mm = m >> 1;
//switch (p)
//{
//case 0x1:
DIR1 = 1;
PUL1 = 0;
Delay(mm);
PUL1 = 1;
Delay(mm);
//break;
/*case 0x2:
DIR2 = 1;
PUL2 = 0;
Delay(mm);
PUL2 = 1;
Delay(mm);
break;
case 0x3:
DIR3 = 1;
PUL3 = 0;
Delay(mm);
PUL3 = 1;
Delay(mm);
break;*/
//}
}
void StepCCW(unsigned int m, char p)//反轉(zhuǎn)1.8//test ok
{
unsigned int mm = m >> 1;
switch (p)
{
case 0x1:
DIR1 = 0;
PUL1 = 0;
Delay(mm);
PUL1 = 1;
Delay(mm);
break;
case 0x2:
DIR2 = 0;
PUL2 = 0;
Delay(mm);
PUL2 = 1;
Delay(mm);
break;
case 0x3:
DIR3 = 0;
PUL3 = 0;
Delay(mm);
PUL3 = 1;
Delay(mm);
break;
}
}
void USP2P(int n, unsigned int m,char p) /////test ok
{
int i;
if (n >= 0)
for (i = 0; i < n; i++) StepCW(m,p);
else
for (i = 0; i < -n; i++) StepCCW(m,p);
}
/*void UDP2P1(unsigned int n,unsigned int n1,char p)//啟動(dòng)減速運(yùn)行函數(shù)
{
int i;
unsigned int n01,n02,n03;
if (n < n1)for (i = 0; i < n; i++) StepCW(mStep[0],p);
else if (n < 2 * n1)
{
if (n % 2 == 0) n01 = n02 = n / 2;
else{n01 = n / 2 + 1; n02 = n / 2;}
for (i = 0; i < n01;i++)StepCW(mStep[i],p);
for (i = n02 - 1; i >= 0; i--)StepCW(mStep[i],p);
}
else
{
n03 = n - 2 * n1;
for (i = 0; i < n1; i++)StepCW(mStep[i],p);
for (i = 0; i < n03; i++)StepCW(mStep[n1-1],p);
for (i = n1-1; i >=0; i--)StepCW(mStep[i],p);
}
}
void UDP2P2(unsigned int n, unsigned int n1, char p)//啟動(dòng)減速運(yùn)行函數(shù)
{
int i;
unsigned int n01, n02, n03;
if (n < n1)
{
for (i = 0; i < n; i++)
StepCCW(mStep[0], p);
}
else if (n < 2 * n1)
{
if (n % 2 == 0) n01 = n02 = n / 2;
else {n01 = n / 2 + 1; n02 = n / 2;}
for (i = 0; i < n01;i++) StepCCW(mStep[i], p);
for (i = n02 - 1; i >= 0; i--)StepCCW(mStep[i], p);
}
else
{
n03 = n - 2 * n1;
for (i = 0; i < n1; i++)StepCCW(mStep[i], p);
for (i = 0; i < n03; i++)StepCCW(mStep[n1 - 1], p);
for (i = n1 - 1; i >= 0; i--)StepCCW(mStep[i], p);
}
}
void XuanZhe(int n, unsigned int m, char p) /////////////正反判斷函數(shù)
{
unsigned int nn = abs(n);
if (n >= 0)
UDP2P1(nn, m, p);
else
{
UDP2P2(nn, m, p);
}
}*/
void SAVE2(int n,int m) /////test ok ////////儲(chǔ)存坐標(biāo)2函數(shù)
{
int xx;
SPM[xx][0] = n;
SPM[xx][1] = m;
xx++;
if(xx>=9){xx=0;}
}
void Line1(int x,int y,int m)////左上運(yùn)動(dòng)
{
int N;
int i=0,F=0;
N=abs(x)+abs(y);
for(i=0;i<N;i++)
{
if(F>=0)
{
StepCW(m,0x1);
F=F-x;
}
else
{
StepCW(m,0x2);
F=F+x;
}
}
}
void Line2(int x,int y,int m)////右上運(yùn)動(dòng)
{
int N;
int i=0,F=0;
N=abs(x)+abs(y);
for(i=0;i<N;i++)
{
if(F<0)
{
StepCCW(m,0x1);
F=F+y;
}
else
{
StepCW(m,0x2);
F=F+x;
}
}
}
void Line3(int x,int y,int m)/////右下運(yùn)動(dòng)
{
int N;
int i=0,F=0;
N=abs(x)+abs(y);
for(i=0;i<N;i++)
{
if(F>0)
{
StepCCW(m,0x1);
F=F+y;
}
else
{
StepCCW(m,0x2);
F=F-x;
}
}
}
void Line4(int x,int y,int m)////左下運(yùn)動(dòng)
{
int N;
int i=0,F=0;
N=abs(x)+abs(y);
for(i=0;i<N;i++)
{
if(F<0)
{
StepCW(m,0x1);
F=F-y;
}
else
{
StepCCW(m,0x2);
F=F-x;
}
}
}
void Line(int x,int y,int m)////直線插補(bǔ)
{
int k;
if(x==0)
{
if(y>0) for(k=0;k<y;k++) StepCW(m,0x2);
else for(k=0;k<-y;k++) StepCCW(m,0x2);
return;
}
if(y==0)
{
if(x>0) for(k=0;k<x;k++) StepCW(m,0x1);
else for(k=0;k<-x;k++) StepCCW(m,0x1);
return;
}
if(x>0)
{
if(y>0) Line1(x,y,m);
else Line4(x,y,m);
}
else
{
if(y>0) Line2(x,y,m);
else Line3(x,y,m);
}
}
void Resetre()/////復(fù)位函數(shù)/////
{
int i;
int res[1];
for(i=0;i<9;i++)
{
res[0]=res[0]+SPM[i][0];
res[1]=res[1]+SPM[i][1];
}
USP2P(res[0], 200,0x1);
USP2P(res[1], 200,0x2);
}
/////串口構(gòu)架
sbit ENTXD = P3^6;
#define ENABLETXD {ENTXD=0;}
#define DISABLETXD {ENTXD=1;}
void InitCom(void)/////////////////tesk ok
{
//EA=1;
//ES=1;
//ET1=1;
TMOD = 0x20;//定時(shí)器1中斷允許
PCON = 0x00;//smod=0
SCON = 0x50;//方式1 ,定時(shí)器控制
TH1 = 0Xfd;//波特率9600
TL1 = 0Xfd;
TR1 = 1; //開(kāi)定時(shí)器T1運(yùn)行控制位
}
void comSendByte(unsigned char ch)///////tesk ok
{
TI = 0;
SBUF = ch;
while (!TI);
}
void comSendCMD(unsigned char node, unsigned char cmd, unsigned char low, unsigned char hi)
{
ENABLETXD
comSendByte(0xff);
comSendByte(0xff);
comSendByte(node);
comSendByte(cmd);
comSendByte(02);
comSendByte(low);
comSendByte(hi);
DISABLETXD
}
unsigned char cmdBuFF[10];
unsigned char iCmdByte = 0;
////////////////////////////////////////
void main()
{
unsigned char ch;
unsigned char nodeID, cmdID, nParaBytes, ParaLow, ParaHi;
unsigned int para;
unsigned int ii;
InitCom();
InitTask();
while (1)
{
if (RI)
{
ch = SBUF;
RI = 0;
comSendByte(ch);
cmdBuFF[iCmdByte] = ch;
iCmdByte++;
if (iCmdByte >= 7)
{
iCmdByte = 0;
if (cmdBuFF[0] != 0xff || cmdBuFF[1] != 0xff)
{
continue;
}
else
{
// byte0 1 2 3 4 5 6
// 0xFF 0xFF NODE# CMDID PARALEN PARALOW PARAHI
nodeID = cmdBuFF[2];
cmdID = cmdBuFF[3];
nParaBytes = cmdBuFF[4];
ParaLow = cmdBuFF[5];
ParaHi = cmdBuFF[6];
para = ParaHi;
para <<= 8;
para |= ParaLow;
switch (cmdID)
{
case 0x0:
Flash(200);
ENABLETXD
break;
case 0x2:
StepCW((char)ParaLow,nodeID);
break;
case 0x3:
USP2P(500, 100, 0x1);
break;
case 0x4:
SAVE2((int)ParaLow, (int)ParaHi);
break;
case 0x5:
for(ii=0;ii<9;ii++)
{
Line(SPM[ii][0],SPM[ii][1],(int)ParaHi);
}
break;
case 0x6:
break;
case 0x80:
break;
case 0x82:
break;
case 0x84:
break;
}
}
}
}
}
}
|
|