可以請問一下嘛 為何我照著上面的方法接線與寫程式 結果馬達只會震動而不是轉動 |
我想試試看 請問一下 小弟剛學 剛好碰到這方面 可以教一下如何做 有電路圖嗎 |
回復 11# pizg 像你這顆馬達, 只有四種step寫法: digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, HIGH); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, HIGH); delay(delayTime); 亂寫的話,很容易把馬達燒壞, 請參考: http://arduino.cc/hu/Tutorial/StepperUnipolar 我的四線馬達則如下: ======================
|
另外..... 不要被函數綁死了 函數也是人定義規劃出來的 瞭解基本原理才寫得出自己想要的東西~~~ 加油!! |
我沒用過Arduino 所以只能提供概念 至於何謂1步 其實有很多意見 有的規格會說當A相回到A相 這樣算一步(也就是我的1大步) 也有人說 當A變反相或B變反相就算一步 (這是標準步進馬達的步數定義) 但是因為有微步進的驅動法則 所以步數這種東西在定義上很亂 一般都以寫的程式所呈現的現象為主 詳細的寫法 可以Google一下步進驅動法則 祝你順利 |
本帖最後由 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); } } |
http://122.146.66.69/joomla/inde ... ing-motor/109--st28 我有試過這種馬達 規格應該是對的 只是有沒有失步得自己試了才知道 這裡的5.625 代表馬達本體是一圈 360/5.625 = 64步(換相64次) 再加上減速比是1/64 所以輸出軸一圈要送64*64=4096步才可以轉一圈 另外換相的啟動頻率不可以低於550pps 也就是啟動時的換相頻率每秒至少換相550次 不然應該連轉都轉不起來 啟動後可以把速度降下來 但要確定是連續運轉 一旦停下來就得再以550pps的方式送信號 之前我有在另一篇文章回覆 要降速 可以把8步當成1步用 也就是每8步的速度都是以550pps以上來送 但是8步後可以間隔半秒一秒再送下一個8步 (8小步為1大步) 這樣可以把速度降下來 還可以確定馬達一定會轉在定位上 只是這樣就降低瞭解析度 一圈剩下512個大步 提供您參考~~~~ |
本帖最後由 pizg 於 2012-1-31 19:22 編輯 我用的的確是如你所貼的步進馬達. 減速比:1/64 , 但我對它的步進角度=5.625存疑. 另外當我試您的程式 STEPS=200, stepper.step(100) 時, 它走不到半圈, 而 stepper.step(200)也走不到1圈, 大概只有1/2圈. 於是我試了又試, 當STEPS=64,stepper.step(512) 時, 它剛好走1圈, stepper.step(1024) 時, 它剛好走2圈,所以 步進角應該是 360/512=0.703度. (一二相磁激方式(8拍)乘上減速比64等於512). 另外, 當setSpeed=300時, 它也不是rpm=300. 真正的轉速有待再測定. 有一點讓我納悶的是, STEPS=128, Speed=200時的速度竟然比STEPS=64, Speed=200時快一倍,而兩者的 stepper.step(512)也都是走1圈. 試到最後只要STEPS的值乘上stepper.step(值)不大於25600就都可行, 也就是 STEPS=64, Speed=400; STEPS=128, Speed=200; STEPS=256, Speed=100; STEPS=512, Speed=50; 其速度都一樣, 而且stepper.step(512), 都剛好走1圈. 至此終於搞懂我的步進馬達的STEPS=512, Speed Max=50rpm. 由於步進馬達是相對角度轉動, 每次開始的角度都不一定, 在實際應用時應該搭配一個起始角度感測器(它可以是微動開關也可以是紅外線開關). 說到這兒, 我還是搞不懂函數STEPS和setSpeed的關係如何? |
回復 5# pizg 你用ULN2003 控制的 5線式步進馬達應該是這種: 步進角度:5.625 x 1/64 減速比:1/64 這顆步進馬達裡面有減速齒輪, 信號頻率越大,馬達轉速越快, 馬達的STEPS是由自己設定的,這句stepper.step(200);就是只走200 STEPS, stepper.setSpeed(30); 這一行設定轉速為30rpm, 我的馬達真的會是30rpm, 又如果設成stepper.setSpeed(30000); 它就不會動, 我的是四線馬達,跟你的不一樣,最多接近三轉一秒, code如下: #include <Stepper.h> // change this to the number of steps on your motor #define STEPS 200 //steps:代表馬達轉完一圈需要多少步數。如果馬達上有標示每步的度數, //將360除以這個角度,就可以得到所需要的步數(例如:360/3.6=100)。(int) // create an instance of the stepper class, specifying // the number of steps of the motor and the pins it's // attached to Stepper stepper(STEPS, 2, 3, 4, 5); //Stepper stepper(STEPS, 26, 28, 32, 34); void setup() { stepper.setSpeed(140);// 將馬達的速度設定成140RPM 最大 150~160 } void loop() { stepper.step(100);//正半圈 delay(1000); stepper.step(-100);//反半圈 delay(1000); stepper.step(200);//正1圈 delay(1000); stepper.step(-200);//反1圈 delay(1000); stepper.step(300);//正1圈半 delay(1000); stepper.step(-300);//反1圈半 delay(1000); stepper.step(1600);//正8圈 delay(1000); stepper.step(-1600);//反8圈 delay(1000); } |
本帖最後由 pizg 於 2012-1-29 14:35 編輯 回復 4# vegewell 1."步進馬達沒有額定轉速,是看信號的頻率" 那麼信號頻率跟馬達轉速是一個怎樣的關係? 齒輪減速比也應該要考慮進去吧? 2.底下是一個範例程式: #include <Stepper.h> // 把這個值改成馬達所對應的步數 #define STEPS 100 // 建立Stepper類別的新實例,並指定馬達的步數以及所連接的腳位 Stepper stepper(STEPS, 8, 9, 10, 11); // 用來儲存感測器讀入的數值 int previous = 0; void setup() { // 將馬達的速度設定成30RPM stepper.setSpeed(30); } void loop() { // 讀入可變電阻的值 int val = analogRead(0); // 根據變動的幅度來轉動馬達 stepper.step(val - previous); // 把目前的回傳值儲存起來 previous = val; } a.上述程式可以設定馬達的STEPS, 請問如何知道該顆步進馬達的STEPS是多少?(廠商未提供) b.stepper.setSpeed(30); 這一行設定轉速為30rpm, 請問馬達真的會是30rpm嗎? 又如果設成stepper.setSpeed(30000); 它真的會轉那麼快嗎? c.請問您的"三轉一秒"是怎麼做到的, 可否貼上程式碼分享一下? 我用的是ULN2003, 5線式步進馬達, 可以做到一相, 二相, 一二相磁激. |
另外要接電容比較好 |
小黑屋|手機版|Archiver|機器人論壇 from 2005.07
GMT+8, 2024-11-24 08:15 , Processed in 0.176485 second(s), 12 queries , Apc On.
Powered by Discuz! X3.2
© 2001-2013 Comsenz Inc.