二軸導軌系統的labview控制和單片機代碼
1.jpg (40.06 KB, 下載次數: 45)
下載附件
2018-7-7 04:22 上傳
0.png (43.3 KB, 下載次數: 53)
下載附件
2018-7-7 04:23 上傳
arduino源程序如下:
- #define DirX 22
- #define StepX 24
- #define EnableX 26
- #define ms1X 28
- #define ms2X 30
- #define ms3X 32
- #define sleepX 34
- #define resetX 36
- #define DirY 23
- #define StepY 25
- #define EnableY 27
- #define ms1Y 29
- #define ms2Y 31
- #define ms3Y 33
- #define sleepY 35
- #define resetY 37
- int i; //循環計數用
- int X; //當前橫坐標
- int Y; //當前縱坐標
- int Xe; //起點橫坐標
- int Ye; //起點縱坐標
- int Xm; //終點橫坐標
- int Ym; //終點縱坐標
- int N; //要走的步數
- int Fm; //偏差計算
- int du; //畫圓弧的度數
- int R; //半徑
- byte comdata[100]={0};//定義數組數據,存放串口接收數據
- int mode; //選擇要畫直線還是畫圓弧
- int highx=0; //橫軸脈沖高電平寬度
- int lowx=0; //橫軸脈沖低電平寬度
- int highy=0; //縱軸脈沖高電平寬度
- int lowy=0; //縱軸脈沖低電平寬度
- int fenliang=0; //用來計算通信時發送的字符串里的數值
-
- void receive_data(void); //接受串口數據
- void count(byte *data); //對串口數據進行處理
- void qudong(void); //對驅動進行設置
- void directrun(int p,int q); //先X軸后Y軸運動到指定坐標
- void circle(void); //插補法圓弧運動到指定坐標(Xm,Ym一開始為絕對起點坐標,Xe,Ye一開始為圓心坐標)
- void Npan(void); //判斷圓弧運動的N值
- void xiangxian1(void); //第一象限圓弧運動(當步數大于0時執行,點在Y軸或步數為0時停止)
- void xiangxian2(void); //第二象限圓弧運動(當步數大于0時執行,點在X軸或步數為0時停止)
- void xiangxian3(void); //第三象限圓弧運動(當步數大于0時執行,點在Y軸或步數為0時停止)
- void xiangxian4(void); //第四象限圓弧運動(當步數大于0時執行,點在X軸或步數為0時停止)
- void stringrun(void); //插補法直線運動到指定坐標
- void runx1(void); //X軸正方向前進一步
- void runx2(void); //X軸負方向前進一步
- void runy1(void); //Y軸正方向前進一步
- void runy2(void); //Y軸負方向前進一步
- void setup()
- {
- Serial.begin(9600);//Serial.begin(9600)開啟串口,通常置于設置()函數中。
- //X軸
- pinMode(DirX,OUTPUT); // Dir
- pinMode(StepX,OUTPUT); // Step
- pinMode(EnableX,OUTPUT); // Enable
- pinMode(ms1X,OUTPUT); // ms1
- pinMode(ms2X,OUTPUT); // ms2
- pinMode(ms3X,OUTPUT); // ms3
- pinMode(sleepX,OUTPUT); // sleep
- pinMode(resetX,OUTPUT); // reset
- digitalWrite(DirX,HIGH); // Set Dir high
- digitalWrite(EnableX,LOW); // Set Enable low
- digitalWrite(ms1X,LOW); // Set ms1 low
- digitalWrite(ms2X,LOW); // Set ms2 high
- digitalWrite(ms3X,LOW); // Set ms3 low
- digitalWrite(sleepX,HIGH); // Set sleep low
- digitalWrite(resetX,HIGH); // Set reset low
-
- //Y軸
- pinMode(DirY,OUTPUT); // Dir
- pinMode(StepY,OUTPUT); // Step
- pinMode(EnableY,OUTPUT); // Enable
- pinMode(ms1Y,OUTPUT); // ms1
- pinMode(ms2Y,OUTPUT); // ms2
- pinMode(ms3Y,OUTPUT); // ms3
- pinMode(sleepY,OUTPUT); // sleep
- pinMode(resetY,OUTPUT); // reset
- digitalWrite(DirY,HIGH); // Set Dir high
- digitalWrite(EnableY,LOW); // Set Enable low
- digitalWrite(ms1Y,LOW); // Set ms1 low
- digitalWrite(ms2Y,LOW); // Set ms2 high
- digitalWrite(ms3Y,LOW); // Set ms3 low
- digitalWrite(sleepY,HIGH); // Set sleep low
- digitalWrite(resetY,HIGH); // Set reset low
- }
-
- void loop()
- {
- if(Serial.available()) //Serial.available判斷串口緩沖器的狀態函數,用以判斷數據是否送達串口
- {
- receive_data(); //接受數據
- qudong(); //驅動設置
- count(comdata); //數據處理
- if(mode==0) //直線模式
- stringrun();
- if(mode==1) //圓弧模式
- circle();
- Fm=0;
- highx=0;
- highy=0;
- lowx=0;
- lowy=0;
- X=0;
- Y=0;
- Xm=0;
- Ym=0;
- Xe=0;
- Ye=0;
- du=0;
- }
- }
-
- void circle(void) //插補法圓弧運動到指定坐標(Xm,Ym一開始為絕對起點坐標,Xe,Ye一開始為圓心坐標)
- {
- digitalWrite(DirX,HIGH); // Set Dir high
- digitalWrite(DirY,HIGH); // Set Dir high
- directrun(Xm,Ym); //運行到起點處
- X=Xm; //記錄絕對橫坐標
- Y=Ym; //記錄絕對縱坐標
- Xm=Xm-Xe; //將Xm設成相對橫坐標
- Ym=Ym-Ye; //將Ym設成相對縱坐標
- Xe=Xm*cos(du); //將Xe設成相對終點橫坐標
- Ye=Ym*sin(du); //將Ye設成相對終點縱坐標
- R=sqrt(Xm^2+Ym^2); //計算半徑
- Npan(); //計算步數N
- if(Xm>=0&&Ym>=0) //起點在第一象限
- {
- xiangxian1();
- xiangxian2();
- xiangxian3();
- xiangxian4();
- }
- if(Xm<=0&&Ym>=0) //起點在第二象限
- {
- xiangxian2();
- xiangxian3();
- xiangxian4();
- xiangxian1();
- }
- if(Xm<=0&&Ym<=0) //起點在第三象限
- {
- xiangxian3();
- xiangxian4();
- xiangxian1();
- xiangxian2();
- }
- if(Xm>=0&&Ym<=0) //起點在第四象限
- {
- xiangxian4();
- xiangxian1();
- xiangxian2();
- xiangxian3();
- }
- digitalWrite(DirX,LOW); // Set Dir high
- digitalWrite(DirY,LOW); // Set Dir high
- directrun(X,Y); //回到原點
- }
- void xiangxian1(void) //第一象限(當步數大于0時執行,點在Y軸或步數為0時停止)
- {
- if(N>0)
- {
- while(1)
- {
- if(Fm>=0)
- {
- runx2();
- Fm=Fm-2*Xm+1;
- Xm=Xm-1;
- X=X-1;
- N=N-1;
- }
- if(Fm<0)
- {
- runy1();
- Fm=Fm+2*Ym+1;
- Ym=Ym+1;
- Y=Y+1;
- N=N-1;
- }
- if(Xm==0||N==0)
- break;
- }
- Fm=0;
- }
- }
- void xiangxian2(void) //第二象限(當步數大于0時執行,點在X軸或步數為0時停止)
- {
- if(N>0)
- {
- while(1)
- {
- if(Fm>=0)
- {
- runy2();
- Fm=Fm-2*Ym+1;
- Ym=Ym-1;
- Y=Y-1;
- N=N-1;
- }
- if(Fm<0)
- {
- runx2();
- Fm=Fm-2*Xm+1;
- Xm=Xm-1;
- X=X-1;
- N=N-1;
- }
- if(Ym==0||N==0)
- break;
- }
- Fm=0;
- }
- }
- void xiangxian3(void) //第三象限(當步數大于0時執行,點在Y軸或步數為0時停止)
- {
- if(N>0)
- {
- while(1)
- {
- if(Fm>=0)
- {
- runx1();
- Fm=Fm+2*Xm+1;
- Xm=Xm+1;
- X=X+1;
- N=N-1;
- }
- if(Fm<0)
- {
- runy2();
- Fm=Fm-2*Ym+1;
- Ym=Ym-1;
- Y=Y-1;
- N=N-1;
- }
- if(Xm==0||N==0)
- break;
- }
- Fm=0;
- }
- }
- void xiangxian4(void) //第四象限(當步數大于0時執行,點在X軸或步數為0時停止)
- {
- if(N>0)
- {
- while(1)
- {
- if(Fm>=0)
- {
- runy1();
- Fm=Fm+2*Ym+1;
- Ym=Ym+1;
- Y=Y+1;
- N=N-1;
- }
- if(Fm<0)
- {
- runx1();
- Fm=Fm+2*Xm+1;
- Xm=Xm+1;
- X=X+1;
- N=N-1;
- }
- if(Ym==0||N==0)
- break;
- }
- Fm=0;
- }
- }
- void Npan(void) //判斷圓弧運動的N值
- {
- if(Xm>=0&&Ym>=0) //起點在第一象限
- {
- if(Xe>=0&&Ye>=0) //終點在第一象限
- {
- if(Xe>Xm)
- N=Xm+R-Ym+6*R+R-Xe+Ye;
- if(Xe<=Xm)
- N=Xm-Xe+Ye-Ym;
- }
- if(Xe<=0&&Ye>=0) //終點在第二象限
- N=Xm-Xe+2*R-Ye-Ym;
- if(Xe<=0&&Ye<=0) //終點在第三象限
- N=Xm+R-Ym+2*R+R-abs(Xe)+abs(Ye);
- if(Xe>=0&&Ye<=0) //終點在第四象限
- N=Xm+R-Ym+4*R+Xe+R-abs(Ye);
- }
-
- if(Xm<=0&&Ym>=0) //起點在第二象限
- {
- if(Xe>=0&&Ye>=0) //終點在第一象限
- N=R-abs(Xm)+Ym+4*R+R-Xe+Ye;
- if(Xe<=0&&Ye>=0) //終點在第二象限
- {
- if(Xe>Xm)
- N=R-abs(Xm)+Ym+6*R+abs(Xe)+R-Ye;
- if(Xe<Xm)
- N=Xm-Xe+Ym-Ye;
- }
- if(Xe<=0&&Ye<=0) //終點在第三象限
- N=R-abs(Xm)+R-abs(Xe)+Ym+abs(Ye);
- if(Xe>=0&&Ye<=0) //終點在第四象限
- N=R-abs(Xm)+Ym+2*R+Xe+R-abs(Ye);
- }
-
- if(Xm<=0&&Ym<=0) //起點在第三象限
- {
- if(Xe>=0&&Ye>=0) //終點在第一象限
- N=abs(Xm)+R-abs(Ym)+2*R+R-Xe+Ye;
- if(Xe<=0&&Ye>=0) //終點在第二象限
- N=abs(Xm)+R-abs(Ym)+4*R+abs(Xe)+R-Ye;
- if(Xe<=0&&Ye<=0) //終點在第三象限
- {
- if(Xe>Xm)
- N=Xe-Xm+Ym-Ye;
- if(Xe<Xm)
- N=abs(Xm)+R-abs(Ym)+6*R+R-abs(Xe)+abs(Ye);
- }
- if(Xe>=0&&Ye<=0) //終點在第四象限
- N=abs(Xm)+R-abs(Ym)+Xe+R-abs(Ye);
- }
-
- if(Xm>=0&&Ym<=0) //起點在第四象限
- {
- if(Xe>=0&&Ye>=0) //終點在第一象限
- N=R-Xm+abs(Ym)+R-Xe+Ye;
- if(Xe<=0&&Ye>=0) //終點在第二象限
- N=R-Xm+abs(Ym)+2*R+abs(Xe)+R-Ye;
- if(Xe<=0&&Ye<=0) //終點在第三象限
- N=R-Xm+abs(Ym)+4*R+R-abs(Xe)+abs(Ye);
- if(Xe>=0&&Ye<=0) //終點在第四象限
- {
- if(Xe>Xm)
- N=Xe-Xm+Ye-Ym;
- if(Xe<Xm)
- N=R-Xm+abs(Ym)+6*R+R-abs(Ye)+Xe;
- }
- }
- if(Xm==Xe&&Ym==Ye) //起點和終點重合
- N=8*R;
- }
- void stringrun(void) //插補法直線運動到指定坐標
- {
- N=abs(Xe-Xm)+abs(Ye-Ym);
- digitalWrite(DirX,HIGH); // Set Dir high
- digitalWrite(DirY,HIGH); // Set Dir high
- directrun(Xm,Ym); //到起點位置
- X=Xm;
- Y=Ym;
- while(N>0) //運行到終點位置
- {
- if(Fm>=0)
- {
- runx1();
- X=X+1;
- N=N-1;
- Fm=Fm-Ye;
- }
- if(Fm<0)
- {
- runy1();
- Y=Y+1;
- N=N-1;
- Fm=Fm+Xe;
- }
- }
- digitalWrite(DirX,LOW); // Set Dir low
- digitalWrite(DirY,LOW); // Set Dir low
- directrun(X,Y); //回歸到原點位置
- }
- void directrun(int p,int q) //先X軸后Y軸運動到指定坐標
- {
- for(i=0;i<p;i++)
- {
- digitalWrite(StepX,HIGH); // Step high
- delayMicroseconds(highx); // Wait 1/2 a ms
- digitalWrite(StepX,LOW); // Step low
- delayMicroseconds(lowx); // Wait 1/2 a ms
- }
- delay(1000); // pause one second
- for(i=0;i<q;i++)
- {
- digitalWrite(StepY,HIGH); // Step high
- delayMicroseconds(highy); // Wait 1/2 a ms
- digitalWrite(StepY,LOW); // Step low
- delayMicroseconds(lowy); // Wait 1/2 a ms
- }
- delay(1000); // pause one second
- }
- void runx1(void) //X軸正方向前進一步
- {
- digitalWrite(DirX,HIGH); // Set Dir low
- digitalWrite(StepX,HIGH); // Step high
- delayMicroseconds(highx); // Wait 1/2 a ms
- digitalWrite(StepX,LOW); // Step low
- delayMicroseconds(lowx); // Wait 1/2 a ms
- }
- void runx2(void) //X軸負方向前進一步
- {
- digitalWrite(DirX,LOW); // Set Dir low
- digitalWrite(StepX,HIGH); // Step high
- delayMicroseconds(highx); // Wait 1/2 a ms
- digitalWrite(StepX,LOW); // Step low
- delayMicroseconds(lowx); // Wait 1/2 a ms
- }
-
- void runy1(void) //Y軸正方向前進一步
- {
- digitalWrite(DirY,HIGH); // Set Dir high
- digitalWrite(StepY,HIGH); // Step high
- delayMicroseconds(highy); // Wait 1/2 a ms
- digitalWrite(StepY,LOW); // Step low
- delayMicroseconds(lowy); // Wait 1/2 a ms
- }
- void runy2(void) //Y軸負方向前進一步
- {
- digitalWrite(DirY,LOW); // Set Dir high
- digitalWrite(StepY,HIGH); // Step high
- delayMicroseconds(highy); // Wait 1/2 a ms
- digitalWrite(StepY,LOW); // Step low
- delayMicroseconds(lowy); // Wait 1/2 a ms
- }
-
- void receive_data(void)
- {
- for(i=0;i<100; )
- {
- comdata[i]=Serial.read();
- delay(2);//延時一會,讓串口緩存準備好下一個字節,不延時可能會導致數據丟失
- i++;
- if(comdata[0]==0)
- {
- if(i==15+comdata[4]+comdata[5]+comdata[6]+comdata[7]+comdata[11]+comdata[12]+comdata[13]+comdata[14])
- break;
- }
- else
- {
- if(i==18+comdata[4]+comdata[5]+comdata[6]+comdata[7]+comdata[11]+comdata[12]+comdata[13]+comdata[14])
- break;
- }
- }
- }
- void count(byte *data)
- {
- //x軸
- for(i=0;i<data[4];i++) //計算高電平寬度
- {
- fenliang=data[15+i]*pow(10,data[4]-i-1);
- highx=highx+fenliang;
- }
- for(i=0;i<data[5];i++) //計算低電平寬度
- {
- fenliang=data[15+data[4]+i]*pow(10,data[5]-i-1);
- lowx=lowx+fenliang;
- }
- for(i=0;i<data[6];i++) //計算橫坐標起點位置
- {
- fenliang=data[15+data[4]+data[5]+i]*pow(10,data[6]-i-1);
- Xm =Xm+ fenliang;
- }
- for(i=0;i<data[7];i++) //計算橫坐標終點位置
- {
- fenliang=data[15+data[4]+data[5]+data[6]+i]*pow(10,data[7]-i-1);
- Xe =Xe+ fenliang;
- }
-
- //y軸
- for(i=0;i<data[11];i++) //計算高電平寬度
- {
- fenliang=data[15+data[4]+data[5]+data[6]+data[7]+i]*pow(10,data[11]-i-1);
- highy=highy+fenliang;
- }
- for(i=0;i<data[12];i++) //計算低電平寬度
- {
- fenliang=data[15+data[4]+data[5]+data[6]+data[7]+data[11]+i]*pow(10,data[12]-i-1);
- lowy=lowy+fenliang;
- }
- for(i=0;i<data[13];i++) //計算縱坐標起點位置
- {
- fenliang=data[15+data[4]+data[5]+data[6]+data[7]+data[11]+data[12]+i]*pow(10,data[13]-i-1);
- Ym =Ym+ fenliang;
- }
- for(i=0;i<data[14];i++) //計算縱坐標終點位置
- {
- fenliang=data[15+data[4]+data[5]+data[6]+data[7]+data[11]+data[12]+data[13]+i]*pow(10,data[14]-i-1);
- Ye =Ye+ fenliang;
- }
- for(i=0;i<data[15+data[4]+data[5]+data[6]+data[7]+data[11]+data[12]+data[13]+data[14]];i++) //計算度數
- {
- fenliang=data[16+data[4]+data[5]+data[6]+data[7]+data[11]+data[12]+data[13]+data[14]+i]*pow(10,data[15+data[4]+data[5]+data[6]+data[7]+data[11]+data[12]+data[13]+data[14]]-i-1);
- du =du+ fenliang;
- }
- }
-
-
- void qudong(void)
- {
- if(comdata[0]==0)
- mode=0; // 直線模式
- else
- mode=1; // 圓弧模式
- if(comdata[1]==0) // 全步進
- {
- digitalWrite(ms1X,LOW);
- digitalWrite(ms2X,LOW);
- digitalWrite(ms3X,LOW);
- }
- if(comdata[1]==1) // 半步進
- {
- digitalWrite(ms1X,HIGH);
- digitalWrite(ms2X,LOW);
- digitalWrite(ms3X,LOW);
- }
- if(comdata[1]==2) // 四分之一步進
- {
- digitalWrite(ms1X,LOW);
- digitalWrite(ms2X,HIGH);
- digitalWrite(ms3X,LOW);
- }
- if(comdata[1]==3) // 八分之一步進
- {
- digitalWrite(ms1X,HIGH);
- digitalWrite(ms2X,HIGH);
- digitalWrite(ms3X,LOW);
- }
- if(comdata[1]==4) // 十六分之一步進
- {
- digitalWrite(ms1X,HIGH);
- digitalWrite(ms2X,HIGH);
- digitalWrite(ms3X,HIGH);
- }
- if(comdata[2]==1)
- digitalWrite(sleepX,HIGH); // Set sleep high
- else
- digitalWrite(sleepX,LOW); // Set sleep low
- if(comdata[3]==1)
- digitalWrite(resetX,HIGH); // Set reset high
- else
- digitalWrite(resetX,LOW); // Set reset low
- //y軸
- if(comdata[8]==0) // 全步進
- {
- digitalWrite(ms1Y,LOW);
- digitalWrite(ms2Y,LOW);
- digitalWrite(ms3Y,LOW);
- }
- if(comdata[8]==1) // 半步進
- {
- digitalWrite(ms1Y,HIGH);
- digitalWrite(ms2Y,LOW);
- digitalWrite(ms3Y,LOW);
- }
- if(comdata[8]==2) // 四分之一步進
- {
- digitalWrite(ms1Y,LOW);
- digitalWrite(ms2Y,HIGH);
- digitalWrite(ms3Y,LOW);
- }
- if(comdata[8]==3) // 八分之一步進
- {
- digitalWrite(ms1Y,HIGH);
- digitalWrite(ms2Y,HIGH);
- digitalWrite(ms3Y,LOW);
- }
- if(comdata[8]==4) // 十六分之一步進
- {
- digitalWrite(ms1Y,HIGH);
- digitalWrite(ms2Y,HIGH);
- digitalWrite(ms3Y,HIGH);
- }
- if(comdata[9]==1)
- digitalWrite(sleepY,HIGH); // Set sleep high
- else
- digitalWrite(sleepY,LOW); // Set sleep low
- if(comdata[10]==1)
- digitalWrite(resetY,HIGH); // Set reset high
- else
- digitalWrite(resetY,LOW); // Set reset low
- }
復制代碼
所有資料51hei提供下載:
test 0405.rar
(103.78 KB, 下載次數: 23)
2018-7-6 09:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|