鍍金池/ 教程/ 數(shù)據(jù)庫/ 9.5 讓 28BYJ-48 步進電機轉(zhuǎn)起來
8.3 C 語言函數(shù)的形參和實參
12.2 C 語言指針變量的聲明
12.5 ?C 語言字符數(shù)組和字符指針
7.3 單片機 LED 點陣的介紹
11.5 UART 串口通信的基本應(yīng)用
9.9 單片機蜂鳴器控制程序和驅(qū)動電路
10. 單片機實例練習與經(jīng)驗積累
10.3 單片機交通燈控制程序和設(shè)計原理
9.8 實用的 28BYJ-48 步進電機控制程序
8.2 C 語言函數(shù)的調(diào)用
12.4 C 語言指向數(shù)組元素的指針
7.1 C 語言變量的作用域
11.2 RS232 通信接口
12.7 1602 液晶的讀寫時序介紹
7.2 C 語言變量的存儲類別
8. C 語言函數(shù)進階與單片機按鍵
10.4 51單片機 RAM 區(qū)域的劃分
12.1 C 語言變量的地址
11. UART 串口通信
7. 變量進階與點陣 LED
8.4 單片機按鍵介紹
9.3 電機的分類
9.1 單片機 IO 口的結(jié)構(gòu)
單片機通信實例與 ASCII 碼
8.1 單片機最小系統(tǒng)解析(電源、晶振和復位電路)
9.2 單片機上下拉電阻
11.4 單片機 IO 口模擬 UART 串口通信
9.5 讓 28BYJ-48 步進電機轉(zhuǎn)起來
9.7 28BYJ-48 步進電機控制程序基礎(chǔ)
12.8 1602 液晶指令介紹
12.3 C 語言指針的簡單示例
8.7 單片機矩陣按鍵的掃描
7.4 單片機 LED 點陣的圖形顯示
8.6 單片機按鍵消抖程序
10.2 單片機中 PWM 的原理與控制程序
7.6 單片機 LED 點陣的橫向移動(動態(tài)顯示)
11.3 USB 轉(zhuǎn)串口通信
12.9 1602 液晶簡單顯示程序
9.4 28BYJ-48 步進電機原理
8.5 ?單片機獨立按鍵掃描程序
12. C 語言指針基礎(chǔ)與1602液晶的初步認識
9. 單片機中的步進電機與蜂鳴器
10.1 單片機數(shù)字秒表程序
7.5 單片機 LED 點陣的縱向移動(動態(tài)顯示)
8.8 單片機簡易加法計算器程序
11.1 單片機串行通信介紹
10.5 單片機長短按鍵的應(yīng)用
12.6 1602 液晶介紹(電路和引腳圖)
9.6 28BYJ-48 步進電機轉(zhuǎn)動精度與深入分析

9.5 讓 28BYJ-48 步進電機轉(zhuǎn)起來

再重新看一下上面的步進電機外觀圖和內(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)了沒有?要記得換跳線哦!