再重新看一下上面的步進電機外觀圖和內(nèi)部結(jié)構(gòu)圖:步進電機一共有5根引線,其中紅色的是公共端,連接到 5 V 電源,接下來的橙、黃、粉、藍就對應(yīng)了 A、B、C、D 相;那么如果要導通 A 相繞組,就只需將橙色線接地即可,B 相則黃色接地,依此類推;再根據(jù)上述單四拍和八拍工作過程的講解,可以得出下面的繞組控制順序表,如表9-1所示:
http://wiki.jikexueyuan.com/project/mcu-tutorial-two/images/28.png" alt="" />
我們板子上控制步進電機部分是和板子上的顯示控制的 74HC138 譯碼器部分復用的 P1.0~P1.3,關(guān)于跳線我們在第3章已經(jīng)講過了,通過調(diào)整跳線帽的位置可以讓 P1.0~P1.3控制步進電機的四個繞組,如圖9-5所示。
http://wiki.jikexueyuan.com/project/mcu-tutorial-two/images/29.png" alt="" />
圖9-5 顯示譯碼與步進電機的選擇跳線
如果要使用電機的話,需要把4個跳線帽都調(diào)到跳線組的左側(cè)(開發(fā)板上的實際位置),即左側(cè)針和中間針連通(對應(yīng)原理圖中的中間和下邊的針),就可以使用 P1.0 到 P1.3 控制步進電機了,如要再使用顯示部分的話,就要再換回到右側(cè)了。那如果大家既想讓顯示部分正常工作,又想讓電機工作該怎么辦呢?跳線帽保持在右側(cè),用杜邦線把步進電機的控制引腳(即左側(cè)的排針)連接到其它的暫不使用的單片機 IO 上即可。
再來看一下我們步進電機的原理圖,步進電機的控制電路如圖9-6所示。
http://wiki.jikexueyuan.com/project/mcu-tutorial-two/images/30.png" alt="" />
圖9-6 步進電機控制電路
誠然,單片機的 IO 口可以直接輸出 0 V 和 5 V 的電壓,但是電流驅(qū)動能力,也就是帶載能力非常有限,所以我們在每相的控制線上都增加一個三極管來提高驅(qū)動能力。由圖中可以看出,若要使 A 相導通,則必須是 Q2 導通,此時 A 相也就是橙色線就相當于接地了,于是A 相繞組導通,此時單片機 P1 口低4位應(yīng)輸出 0b1110,即 0xE;如要 A、B 相同時導通,那么就是 Q2、Q3 導通,P1 口低4位應(yīng)輸出 0b1100,即 0xC,依此類推,我們可以得到下面的八拍節(jié)拍的 IO 控制代碼數(shù)組:
unsigned char code BeatCode[8] = { 0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6 };
到這里,似乎所有的邏輯問題都解決了,循環(huán)將這個數(shù)組內(nèi)的值送到 P1 口就行了。但是,只要再深入想一下就會發(fā)現(xiàn)還有個問題:多長時間送一次數(shù)據(jù),也就是說一個節(jié)拍要持續(xù)多長時間合適呢?是隨意的嗎?當然不是了,這個時間是由步進電機的啟動頻率決定的。啟動頻率,就是步進電機在空載情況下能夠正常啟動的最高脈沖頻率,如果脈沖頻率高于該值,電機就不能正常啟動。表9-2就是由廠家提供的步進電機參數(shù)表,我們來看一下。
表9-2 28BYJ-48 步進電機參數(shù)表
供電電壓 | 相數(shù) | 相電阻Ω | 步進角度 | 減速比 | 啟動頻率P.P.S | 轉(zhuǎn)矩g.cm | 噪聲dB | 絕緣介電強度 |
---|---|---|---|---|---|---|---|---|
5V | 4 | 50±10% | 5.625/64 | 1:64 | ≥550 | ≥300 | ≤35 | 600VAC |
表中給出的參數(shù)是≥550,單位是 P.P.S,即每秒脈沖數(shù),這里的意思就是說:電機保證在你每秒給出550個步進脈沖的情況下,可以正常啟動。那么換算成單節(jié)拍持續(xù)時間就是 1 s/550=1.8 ms,為了讓電機能夠啟動,我們控制節(jié)拍刷新時間大于 1.8 ms 就可以了。有了這個參數(shù),我們就可以動手寫出最簡單的電機轉(zhuǎn)動程序了,如下:
#include <reg52.h>
unsigned char code BeatCode[8] = { //步進電機節(jié)拍對應(yīng)的 IO 控制代碼
0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6
};
void delay();
void main(){
unsigned char tmp; //定義一個臨時變量
unsigned char index = 0; //定義節(jié)拍輸出索引
while (1){
tmp = P1; //用 tmp 把 P1 口當前值暫存
tmp = tmp & 0xF0; //用&操作清零低4位
//用|操作把節(jié)拍代碼寫到低4位
tmp = tmp | BeatCode[index];
//把低4位的節(jié)拍代碼和高4位的原值送回 P1
P1 = tmp;
index++; //節(jié)拍輸出索引遞增
index = index & 0x07; //用&操作實現(xiàn)到8歸零
delay(); //延時 2 ms,即 2 ms 執(zhí)行一拍
}
}
/* 軟件延時函數(shù),延時約 2ms */
void delay(){
unsigned int i = 200;
while (i--);
}
把程序編譯下載到板子上試試吧!看看電機轉(zhuǎn)了沒有?要記得換跳線哦!