實驗目的
了解步進電機的工作原理
學習步進電機的驅(qū)動方法
實驗器材
TPYBoard v102 1塊
微型步進電機(28BYJ-48) 1個
步進電機驅(qū)動板(ULN2003APG) 1塊
micro USB數(shù)據(jù)線 1條
杜邦線 若干
步進電機的介紹
本次實驗采用的是28BYJ-48 四相八拍電機,電壓DC5V~12V。
24BYJ48名稱的含義:
24:電機外徑24mm
B:步進電機中步字的拼音首字母
Y:永磁中永字的拼音首字母
J:減速的減字拼音首字母
48:四相8步
實物圖
1.jpg (26.59 KB, 下載次數(shù): 31)
下載附件
2018-7-27 16:56 上傳
工作原理
步進電機是將電脈沖信號轉(zhuǎn)變?yōu)榻俏灰苹蚓位移的開環(huán)控制電機,是現(xiàn)代數(shù)字程序控制系統(tǒng)中的主要執(zhí)行元件,應用極為廣泛。在非超載的情況下,電機的轉(zhuǎn)速、停止的位置只取決于脈沖信號的頻率和脈沖數(shù),而不受負載變化的影響,當步進驅(qū)動器接收到一個脈沖信號,它就驅(qū)動步進電機按設定的方向轉(zhuǎn)動一個固定的角度,稱為“步距角”,它的旋轉(zhuǎn)是以固定的角度一步一步運行的。可以通過控制脈沖個數(shù)來控制角位移量,從而達到準確定位的目的;同時可以通過控制脈沖頻率來控制電機轉(zhuǎn)動的速度和加速度,從而達到調(diào)速的目的。
28BYJ-48 步進電機參數(shù)表
2.png (9.05 KB, 下載次數(shù): 42)
下載附件
2018-7-27 16:56 上傳
上表中啟動頻率≥550 P.P.S(每秒脈沖數(shù)),意思是要想正常啟動,需要單片機每秒至少給出550個步進脈沖。那么每一節(jié)拍需要持續(xù)的時間就是1S/550≈1.8ms,所以控制節(jié)拍刷新的速率應大約1.8ms。
驅(qū)動原理
當連續(xù)不斷的給電機發(fā)送控制脈沖時,電機就會不斷的轉(zhuǎn)動。每一個脈沖信號對應步進電機的某一相或兩相繞組的通電狀態(tài)改變一次,對應轉(zhuǎn)子就會轉(zhuǎn)過一定的角度(步距角)。當通電狀態(tài)的改變完成一個循環(huán)時,轉(zhuǎn)子轉(zhuǎn)過一個齒距。
四相步進電機可以在不同的通電方式下運行,常見的通電方式:
四拍(單相繞組通電):A-B-C-D-A…
雙四拍(雙相繞組通電):AB-BC-CD-DA-AB-...
八拍: A-AB-B-BC-C-CD-D-DA-A…
模擬效果圖
3.gif (16.44 KB, 下載次數(shù): 32)
下載附件
2018-7-27 16:56 上傳
硬件連接
將步進電機白色接頭插到驅(qū)動板對應的座子上即可。
TPYBoard v102驅(qū)動板與驅(qū)動板的接線圖,如下:
4.png (8.04 KB, 下載次數(shù): 39)
下載附件
2018-7-27 16:56 上傳
5.png (178.34 KB, 下載次數(shù): 51)
下載附件
2018-7-27 16:56 上傳
程序源碼如下:
- # main.py -- put your code here!
- import pyb
- from pyb import Pin
-
- Pin_All=[Pin(p,Pin.OUT_PP) for p in ['X1','X2','X3','X4']]
-
- #轉(zhuǎn)速(ms) 數(shù)值越大轉(zhuǎn)速越慢 最小值1.8ms
- speed=2
-
- STEPER_ROUND=512 #轉(zhuǎn)動一圈(360度)的周期
- ANGLE_PER_ROUND=STEPER_ROUND/360 #轉(zhuǎn)動1度的周期
- print('ANGLE_PER_ROUND:',ANGLE_PER_ROUND)
-
- def SteperWriteData(data):
- count=0
- for i in data:
- Pin_All[count].value(i)
- count+=1
- def SteperFrontTurn():
- global speed
-
- SteperWriteData([1,1,0,0])
- pyb.delay(speed)
-
- SteperWriteData([0,1,1,0])
- pyb.delay(speed)
-
- SteperWriteData([0,0,1,1])
- pyb.delay(speed)
-
- SteperWriteData([1,0,0,1])
- pyb.delay(speed)
-
- def SteperBackTurn():
- global speed
-
- SteperWriteData([1,1,0,0])
- pyb.delay(speed)
-
- SteperWriteData([1,0,0,1])
- pyb.delay(speed)
-
- SteperWriteData([0,0,1,1])
- pyb.delay(speed)
-
- SteperWriteData([0,1,1,0])
- pyb.delay(speed)
-
-
- def SteperStop():
- SteperWriteData([0,0,0,0])
-
- def SteperRun(angle):
- global ANGLE_PER_ROUND
-
- val=ANGLE_PER_ROUND*abs(angle)
- if(angle>0):
- for i in range(0,val):
- SteperFrontTurn()
- else:
- for i in range(0,val):
- SteperBackTurn()
- angle = 0
- SteperStop()
-
- if __name__=='__main__':
- SteperRun(180)
- SteperRun(-180)
復制代碼
|