本帖最後由 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);
}
} |