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