2016年1月24日 星期日

Arduino UNO學習420.控制步進馬達


Arduino UNO學習420.控制步進馬達

步進馬達有分電壓及線腳數及步角,內有減速齒輪,
在此不說明步進馬達的運作原理,注意馬達高功率,
如長時連續使用建議外接電源,以免過載燒板,
在此以5線步進馬達28BYJ-48為例
 

一般步進馬達會搭配ULN2003晶片來作訊號放大,以免馬達功率大而無法轉動,
可直接搭配步進馬達驅動板使用↓

馬達+驅動板+UNO板硬體連接,為了使馬達轉動明顯,可貼上膠布或紙片↓
 



在此不介紹步進馬達運作原理,只需知道4條訊號線依序給電即可使馬達轉動,
因是5線馬達,除了紅色為電源之外,需讓其他4線各一次高電位,以轉動馬達,
其轉動依序如下列表,在此為簡化程式,故省去了列表中第2.4.6.8的電磁配置↓

上圖示為half step共4條線的第4條Orange高位其他3腳低位,
再來是第4和第3的Yellow高位其他3腳低位,依序共8步驟為1個步角循環,
每步驟中可加入時間來控制轉速,若要反向就反著調整高位順序,
以下縮減作full step即省去半個電位變成4步驟,
注意作full step馬達反應時間過短會有漏步現像,以及建議加上外部電源提供電力↓
 
void setup()
{
        pinMode( 4 , OUTPUT);
        pinMode( 5 , OUTPUT);
        pinMode( 6 , OUTPUT);
        pinMode( 7 , OUTPUT);
}

void loop()
{
        digitalWrite( 4 , HIGH );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , HIGH );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , HIGH );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , HIGH );
        delay( 10 );
}

28BYJ-48步進馬達規格,步腳5.625度角,360度/5.625=64,
齒輪減速比為1/64=0.015625,額定半步模式,
(360度/5.625)/(齒輪比1/64)=4096/8步=512,
可把上面程式4位一循環打包成副程式
去控制值行次數以達指定角度,如512次則可繞360度一圈↓

void setup()
{
        pinMode( 4 , OUTPUT);
        pinMode( 5 , OUTPUT);
        pinMode( 6 , OUTPUT);
        pinMode( 7 , OUTPUT);
  for (int i = 0 ; i < 512  ; ++i )
    {
        digitalWrite( 4 , HIGH );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , HIGH );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , HIGH );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , HIGH );
        delay( 10 );
    }
  }
void loop(){}


若是half step作更精密的控制來轉動180度則為
void setup()
{
        pinMode( 4 , OUTPUT);
        pinMode( 5 , OUTPUT);
        pinMode( 6 , OUTPUT);
        pinMode( 7 , OUTPUT);
  for (int i = 0 ; i < 256  ; ++i )  //256轉180度
    {
        digitalWrite( 4 , HIGH );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , HIGH );
        digitalWrite( 5 , HIGH );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , HIGH );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , HIGH );
        digitalWrite( 6 , HIGH );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , HIGH );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , HIGH );
        digitalWrite( 7 , HIGH );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , HIGH );
        delay( 10 );
        digitalWrite( 4 , HIGH );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , HIGH );
        delay( 10 );
    }
  }
void loop(){}



詳細拆解內部參考它網

沒有留言:

張貼留言