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