本帖最後由 pizg 於 2012-2-1 00:08 編輯  
 
回復 8# nichal  
 
首先要感謝兩位大大的詳細解說. 
 
我的馬達是五線四相,減速比1/64,  額定電壓是5V, 其餘不詳. 
網頁 http://122.146.66.69/joomla/inde ... ing-motor/109--st28 上的是12V, 我的可以用到12V嗎? 
 
"這裡的5.625代表馬達本體是一圈 360/5.625 = 64步(換相64次), 再加上減速比是1/64 
所以輸出軸一圈要送64*64=4096步才可以轉一圈..." 
您的意思是不是STEPS應該設成4096才對? 
如果STEPS=4096, setSpeed只能設到7, 大於7就無法轉動了. 此時的setSpeed會變成無意義的指令, 因為它無法反應馬達的實際轉速, 
所以我的STEPS還是設成512, 如此setSpeed才能做到我要的實際轉速. 
 
"另外換相的啟動頻率不可以低於550pps, 也就是啟動時的換相頻率每秒至少換相550次, 不然應該連轉都轉不起來" 
請問這550pps要如何做, 程式碼怎麼寫? 
 
"啟動後可以把速度降下來, 但要確定是連續運轉, 一旦停下來就得再以550pps的方式送信號, 
要降速可以把8步當成1步用, 也就是每8步的速度都是以550pps以上來送, 但是8步後可以間隔半秒一秒再送下一個8步(8小步為1大步), 這樣可以把速度降下來, 還可以確定馬達一定會轉在定位上" 
請問降速的程式碼該怎麼寫, Stepper.h所提供的函數無法做到吧? 
 
"只是這樣就降低瞭解析度, 一圈剩下512個大步" 
如果要達到最高解析度 360度 / 4096步 = 0.088 度/步, 真的可以做到嗎? 需要自己寫一相/二相/一二相磁激驅動嗎? 
另外, 以這個馬達而言, 如果不管它的解析度如何, 請問它的最高轉速可以達到多少? 
 
底下是我自訂的驅動函數, 竟然跟前面分析的結果不同, 1024步才走1圈, 步進角度=360/1024=0.3516, 
步數若小於8不會轉動, 所以步進角度還需乘上8, 得到2.8125, 這是為什麼? 
//自訂的步進函數 by PizG 2012-01-31 
//一二相磁激, 逆時針轉動 
//每轉1圈停0.5秒  
int Pin0 = 6; //A 
int Pin1 = 10;  //B 
int Pin2 = 9;  //A_ 
int Pin3 = 11;  //B_ 
 
void setup() 
{ 
  pinMode(Pin0, OUTPUT); 
  pinMode(Pin1, OUTPUT); 
  pinMode(Pin2, OUTPUT); 
  pinMode(Pin3, OUTPUT); 
} 
 
 
void loop() 
{ 
  myStep(1024); //1024步=轉1圈 
  delay(500); 
} 
 
//一二相磁激, 逆時針轉動 
void myStep(int _step) 
{ 
  for(int i=0; i<_step; i++) { 
 
  int n = i % 8; 
  switch(n){ 
    case 0: 
      digitalWrite(Pin0, LOW); 
      digitalWrite(Pin1, LOW); 
      digitalWrite(Pin2, LOW); 
      digitalWrite(Pin3, HIGH); 
      break; 
    case 1: 
      digitalWrite(Pin0, LOW); 
      digitalWrite(Pin1, LOW); 
      digitalWrite(Pin2, HIGH); 
      digitalWrite(Pin3, HIGH); 
      break; 
      
 
    case 2: 
      digitalWrite(Pin0, LOW); 
      digitalWrite(Pin1, LOW); 
      digitalWrite(Pin2, HIGH); 
      digitalWrite(Pin3, LOW); 
      break; 
      
 
    case 3: 
      digitalWrite(Pin0, LOW); 
      digitalWrite(Pin1, HIGH); 
      digitalWrite(Pin2, HIGH); 
      digitalWrite(Pin3, LOW); 
      break; 
      
 
    case 4: 
      digitalWrite(Pin0, LOW); 
      digitalWrite(Pin1, HIGH); 
      digitalWrite(Pin2, LOW); 
      digitalWrite(Pin3, LOW); 
      break; 
      
 
    case 5: 
      digitalWrite(Pin0, HIGH); 
      digitalWrite(Pin1, HIGH); 
      digitalWrite(Pin2, LOW); 
      digitalWrite(Pin3, LOW); 
      break; 
      case 6: 
      
 
      digitalWrite(Pin0, HIGH); 
      digitalWrite(Pin1, LOW); 
      digitalWrite(Pin2, LOW); 
      digitalWrite(Pin3, LOW); 
      break; 
      
 
    case 7: 
      digitalWrite(Pin0, HIGH); 
      digitalWrite(Pin1, LOW); 
      digitalWrite(Pin2, LOW); 
      digitalWrite(Pin3, HIGH); 
      break; 
      
 
    default: 
      digitalWrite(Pin0, LOW); 
      digitalWrite(Pin1, LOW); 
      digitalWrite(Pin2, LOW); 
      digitalWrite(Pin3, LOW); 
      break; 
  } 
  delay(1); 
  } 
 
} |