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(){}
詳細拆解內部參考它網
沒有留言:
張貼留言