1. 程式人生 > >Arduino 控制步進電機的轉速隨時間按正弦規律變化

Arduino 控制步進電機的轉速隨時間按正弦規律變化

下面這段Arduino程式碼可以用的前提條件是,你用的步進電機的驅動器只需要你給定速度(脈衝時間間隔)和方向即可(推薦用這種驅動器),不需要你具體地指定A+,A-,B+,B-四根線分別是高電平還是低電平(這種驅動器真TM難用)。

//轉角θ=-ANcos(wt),轉速V=ANwsin(wt)  
float w=3;  
int N=100; //N是半個週期的脈衝數,正比於正弦函式的振幅  
           //如果乘積Nw太大,步進電機就會丟步  
float dt[400]={0}; //脈衝的時間間隔  
int k;  
const byte pinSPEED=5;
const byte pinDIREC=6;
  
void setup() {  
pinMode(pinSPEED,OUTPUT);  // 5號引腳傳送PULSE(控制速度)  
pinMode(pinDIREC,OUTPUT);  // 6號引腳指定SIGN (控制方向)   
int dtMAX=30;  
float t=0;  
  for(k=1;k<=N;k++)  
  {dt[k]=(1.0F/sin(k*PI/(N+1))> dtMAX ? dtMAX : 1.0F/sin(k*PI/(N+1)));  
//如果兩個脈衝的時間間隔超過預設的dtMAX,就認為它是dtMAX  
//dtMAX的值可以根據需要自行修改  
  t=t+dt[k];}  
//for迴圈結束後,t代表陣列dt的前N項的和    
  for(k=1;k<=N;k++)  
  {dt[k]=PI*dt[k]/(w*t);}  
}  
  
void loop() {  
digitalWrite(pinDIREC,HIGH); //一個方向運動  
for(k=1;k<=N;k++)  
{digitalWrite(pinSPEED,HIGH);   
 digitalWrite(pinSPEED,LOW);  
 delayMicroseconds(1E6*dt[k]);}  
  
digitalWrite(pinDIREC,LOW);  //反方向運動  
for(k=1;k<=N;k++)  
{digitalWrite(pinSPEED,HIGH);  
 digitalWrite(pinSPEED,LOW);  
 delayMicroseconds(1E6*dt[k]);}  
}