void runTo(long x,long y,long z,int speed){ //xyz为脉冲数,speed单位是mm/s if(x > 0) digitalWrite(X_DIR_PIN,HIGH); if(x <= 0) digitalWrite(X_DIR_PIN,LOW); if(y > 0) digitalWrite(Y_DIR_PIN,HIGH); if(y <= 0) digitalWrite(Y_DIR_PIN,LOW); if(z > 0) digitalWrite(Z_DIR_PIN,HIGH); if(z <= 0) digitalWrite(Z_DIR_PIN,LOW); long a = abs(x); long b = abs(y); long c = abs(z); long MAX = max(max(a,b),c);//MAX为轴的最大脉冲数,既最远距离的脉冲数。 unsigned long time_t = (1000000/(speed*100))*MAX;//微妙,如果写成1000000*MAX/(speed*100)就数据越界了 unsigned long X_interval = time_t/a; unsigned long X_inter = X_interval; unsigned long Y_interval = time_t/b; unsigned long Y_inter = Y_interval; unsigned long Z_interval = time_t/c; unsigned long Z_inter = Z_interval; unsigned long time_last = micros(); while(a >0 || b>0 || c>0){ unsigned long time_now = micros(); if ( ((time_now - time_last) > X_interval) && (a > 0)) { digitalWrite(X_STEP_PIN,HIGH); digitalWrite(X_STEP_PIN,LOW); X_interval += X_inter; a--; } if (((time_now - time_last) > Y_interval) && (b > 0)) { digitalWrite(Y_STEP_PIN,HIGH); digitalWrite(Y_STEP_PIN,LOW); Y_interval += Y_inter; b--; } if ( ((time_now - time_last) > Z_interval) && (c > 0)) { digitalWrite(Z_STEP_PIN,HIGH); digitalWrite(Z_STEP_PIN,LOW); Z_interval += Z_inter; c--; } }