讓28BYJ-48步進電機轉起來

再從新看一下下面的步進電機外不雅圖和外部構造圖:步進電機一共有 5 根引線,箇中白色的是公共端,銜接到 5V 電源,接下來的橙、黃、粉、藍就對應了 A、B、C、D 相;那麼假如要導通 A 相繞組,就只需將橙色線接地即可,B 相則黃色接地,依此類推;再依據上述單四拍和八拍任務進程的解說,可以得出下面的繞組掌握次序表,如表 9-1 所示:
表 9-1 八拍形式繞組掌握次序表


12345678
P1-紅VCCVCCVCCVCCVCCVCCVCCVCC
P2-橙GNDGND




GND
P3-黃
GNDGNDGND



P4-粉


GNDGNDGND

P5-藍




GNDGNDGND


我們板子上掌握步進電機局部是和板子上的顯示掌握的 74HC138 譯碼器局部複用的P1.0~P1.3,關於跳線我們在第 3 章曾經講過了,經過調劑跳線帽的地位可以讓 P1.0~P1.3掌握步進電機的四個繞組,如圖 9-5 所示。

圖 9-5 顯示譯碼與步進電機的選擇跳線
圖 9-5  顯示譯碼與步進電機的選擇跳線


假如要運用電機的話,需求把 4 個跳線帽都調到跳線組的左側(開闢板上的實踐地位),即左側針和兩頭針連通(對應道理圖中的兩頭和下邊的針),就可以運用 P1.0 到 P1.3 掌握步進電機了,如要再運用顯示局部的話,就要再換回到右側了。那假如人人既想讓顯示局部正常任務,又想讓電機任務該怎樣辦呢?跳線帽堅持在右側,用杜邦線把步進電機的掌握引腳(即左側的排針)銜接到其它的暫不運用的單片機 IO 上即可。
再來看一下我們步進電機的道理圖,步進電機的掌握電路如圖 9-6 所示。

圖 9-6 步進電機掌握電路
圖 9-6  步進電機掌握電路


固然,單片機的 IO 口可以直接輸入 0V 和 5V 的電壓,然則電流驅動才能,也就是帶載才能十分無限,所以我們在每相的掌握線上都添加一個三極管來進步驅動才能。由圖中可以看出,若要使 A 相導通,則必需是 Q2 導通,此時 A 相也就是橙色線就相當於接地了,於是A 相繞組導通,此時單片機 P1 口低 4 位應輸入 0b1110,即 0xE;如要 A、B 相反時導通,那麼就是 Q2、Q3 導通,P1 口低 4 位應輸入 0b1100,即 0xC,依此類推,我們可以失掉下面的八拍節奏的 IO 掌握代碼數組:
    unsigned char code BeatCode[8] = { 0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6 };
到這裏,似乎一切的邏輯成績都處理了,輪迴將這個數組內的值送到 P1 口就行了。然則,只需再深化想一下就會發現還有個成績:多長工夫送一次數據,也就是說一個節奏要繼續多長工夫適宜呢?是隨便的嗎?當然不是了,這個工夫是由步進電機的啓動頻率決議的。啓動頻率,就是步進電機在空載狀況下可以正常啓動的最高脈衝頻率,假如脈衝頻率高於該值,電機就不克不及正常啓動。表 9-2 就是由廠家供給的步進電機參數表,我們來看一下。
表 9-2 28BYJ-48 步進電機參數表

供電
電壓
相數相電阻
Ω
步進角度加速比啓動頻率
P.P.S
轉矩
g.cm
噪聲
dB
絕緣介
電強度
5V450±10%5.625/641:64≥550≥300≤35600VAC


表中給出的參數是≥550,單元是 P.P.S,即每秒脈衝數,這裏的意思就是說:電機包管在你每秒給出 550 個步進脈衝的狀況下,可以正常啓動。那麼換算成單節奏繼續工夫就是1s/550=1.8ms,爲了讓電機可以啓動,我們掌握節奏刷新工夫大於 1.8ms 就可以了。有了這個參數,我們就可以入手寫出最複雜的電機遷移轉變程序了,如下:

			#include <reg52.h> unsigned char code BeatCode[8] = { //步進電機節奏對應的 IO 掌握代碼 0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6 }; void delay(); void main(){ unsigned char tmp; //界說一個暫時變量 unsigned char index = 0; //界說節奏輸入索引 while (1){ tmp = P1; //用 tmp 把 P1 口以後值暫存 tmp = tmp & 0xF0; //用&操作清零低 4 位 //用|操作把節奏代碼寫到低 4 位 tmp = tmp | BeatCode[index]; //把低 4 位的節奏代碼和高 4 位的原值送回 P1 P1 = tmp; index++; //節奏輸入索引遞增 index = index & 0x07; //用&操作完成到 8 歸零 delay(); //延時 2ms,即 2ms 履行一拍 } } /* 軟件延時函數,延時約 2ms */ void delay(){ unsigned int i = 200; while (i--); }

把程序編譯下載到板子上嚐嚐吧!看看電機轉了沒有?要記得換跳線哦!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章