【STM32 Net MF开发板学习-11】步进电机控制(非PWM模式)
選用的步進(jìn)電機(jī)的型號(hào)為28BYJ-48(或MP28GA,5V,轉(zhuǎn)速比1/64),驅(qū)動(dòng)電路選用uln2003芯片的驅(qū)動(dòng)板,其控制時(shí)序圖如下:
?
四相八拍:A->AB->B ->BC ->C ->CD ->D ->DA
其A、B、C、D指的是uln2003芯片驅(qū)動(dòng)板的1N1、1N2、1N3、1N4,波形在上表示有輸入信號(hào),波形在下表示無輸入信號(hào)。
我們采用紅牛開發(fā)板進(jìn)行步進(jìn)電機(jī)控制,為了便于接線,我們需要在紅牛開發(fā)板上焊接兩條30腳雙排排陣,焊接后的紅外板如下:
?
此外至少需要4根杜邦線,還需提供一個(gè)5V的直流電源,接線方式如下:
PC4接IN1
PC5接IN2
PC6接IN3
PC7接IN4
5V電源連接
網(wǎng)友fangyuan和奮斗中寫了一個(gè)純.NET MF C#的控制代碼,比較容易理解,但是由于是托管代碼,需要虛擬機(jī)解釋執(zhí)行,所以運(yùn)行效率較低,部分代碼如下:
?? //四相八拍:A->AB->B->BC->C->CD->D->DA??
??? while (true)??
??? {??
??????? //A相輸出高電平,BCD低??
??????? pios[0].Write(high);??
??????? pios[1].Write(low);??
??????? pios[2].Write(low);??
??????? pios[3].Write(low);??
??????? Thread.Sleep(sleepTime);??
? ??????//AB相輸出高電平,CD低??
??????? pios[0].Write(high);??
??????? pios[1].Write(high);??
??????? pios[2].Write(low);??
??????? pios[3].Write(low);??
??????? Thread.Sleep(sleepTime);??
????? ??… …
????? }
詳細(xì)內(nèi)容請(qǐng)參見fangyuan的博客文章《【.NET MF 學(xué)習(xí)筆記系列(一)】MF控制步進(jìn)電機(jī)》。
??? 由于步進(jìn)電機(jī)一般都采用PWM控制,我最初也打算這么做,STM32系列的芯片的時(shí)鐘控制器是可以輸出4路PWM的,但是研究后我覺得采用uln2003芯片的驅(qū)動(dòng)板是無法實(shí)現(xiàn)PWM控制的。如果硬要采用PWM控制,其中一路的PWM(占空比)是可以實(shí)現(xiàn)的,但是其它三路,無法調(diào)整相位,所以目前我無法輸出占空比相同,但是相位不同的波形。
我調(diào)整了一下思路,實(shí)現(xiàn)了所謂的IO Timer功能,就是采用Timer定時(shí)中斷,定時(shí)處理C#上層的IO輸出要求,底層代碼暫且不說了,先說一下封裝后的上層接口。
??? public sealed class IOTimer
??? {
??????? public static bool Initialize(byte timer, int Compare, int psc, byte[] pins, byte[] states);
??????? public static bool SetPSC(byte timer, int psc);
??????? public static bool Start(byte timer);
??????? public static bool Stop(byte timer);
??????? public static bool Uninitialize(byte timer);
??? }
?? STM32F103芯片有8個(gè)定時(shí)器,其中timer1和timer8暫且不要用,timer的取值為1~6。timer1和timer8連接APB2總線,其它定時(shí)器連接APB1總線,APB1操作速度限于36MHz,APB2操作于全速(最高72MHz)。Compare是計(jì)數(shù)器數(shù)值,16位最大65535,psc預(yù)分頻器數(shù)值,也是16位的,最大為65535,計(jì)數(shù)器的時(shí)鐘頻率CK_CNT是fCK_PSC/(PSC[15:1]+1)。
?? ?Psc可以實(shí)時(shí)動(dòng)態(tài)調(diào)整。
?? ?Pins數(shù)組存放要設(shè)置的IO的pin腳號(hào),一次最多可以控制8路,states數(shù)組存放IO的輸出狀態(tài),最多可以有32個(gè)狀態(tài)值,一個(gè)字節(jié)的每一位控制每一路。
?? ?Start就是計(jì)時(shí)器開始工作,IO此時(shí)輸出,Stop就是定時(shí)器停止工作,IO停止輸出。
好了,在實(shí)際控制步進(jìn)電機(jī)之前,我們先控制一下LED燈,讓它亮一秒,滅3秒(紅牛開發(fā)板,輸出0燈亮),相關(guān)代碼如下:
??? //LED燈控制(定時(shí)器timer6)
??? byte[] pins = new byte[] { (byte)GPIO_NAMES.PF7 };
??? //亮一秒,滅3秒(紅牛開發(fā)板,輸出0燈亮)
??? byte[] control_Data = new byte[] { 0x0, 0x1, 0x1, 0x1};
??? //時(shí)鐘頻率36M? 計(jì)數(shù)60000次,在分頻(599+1)次大概一秒觸發(fā)一次
??? IOTimer.Initialize(5, 60000, 599, pins, control_Data);
IOTimer.Start(5);?
?? 至于控制步進(jìn)電機(jī),其代碼也是非常簡(jiǎn)單,核心代碼如下:
?? ?//順時(shí)針旋轉(zhuǎn)
??? static void Run()
??? {
??????? IOTimer.Uninitialize(5);
??????? byte[] pins = new byte[] { (byte)GPIO_NAMES.PC4, (byte)GPIO_NAMES.PC5, (byte)GPIO_NAMES.PC6, (byte)GPIO_NAMES.PC7 };
??????? byte[] control_Data = new byte[] { 0x1, 0x3, 0x2, 0x6, 0x4, 0xC, 0x8, 0x9 };
??????? IOTimer.Initialize(5, 60000, 1, pins, control_Data);
??????? IOTimer.Start(5);??
??? }
??? //逆時(shí)針旋轉(zhuǎn)
??? static void AntiRun()
??? {
??????? IOTimer.Uninitialize(5);
??????? byte[] pins = new byte[] { (byte)GPIO_NAMES.PC4, (byte)GPIO_NAMES.PC5, (byte)GPIO_NAMES.PC6, (byte)GPIO_NAMES.PC7 };
??????? byte[] control_Data = new byte[] { 0x9, 0x8, 0xc, 0x4, 0x6, 0x2, 0x3, 0x1 };
??????? IOTimer.Initialize(5, 60000, 1, pins, control_Data);
??????? IOTimer.Start(5);
??? }
??? //速度級(jí)別
??? static void SetV(int value)
??? {
??????? switch(value)
??????? {
??????????? case 1:
??????????????? IOTimer.SetPSC(5,1); break;
??????????? case 2:
??????????????? IOTimer.SetPSC(5,5); break;
??????????? case 3:
??????????????? IOTimer.SetPSC(5,10); break;
??????? }????????????
??? }
?? 完整代碼請(qǐng)從下面的連接進(jìn)行下載,最終的運(yùn)行效果圖如下:
?
? 至于PWM方式控制步進(jìn)電機(jī)的示例,需要等我采購(gòu)好相關(guān)驅(qū)動(dòng)板后,再做探究。
? 注:該示例程序,紅牛開發(fā)板需要部署最新的V0.9.7固件。
-----------------------------------------------------------------------------------------
【低價(jià)開發(fā)板】http://item.taobao.com/item.htm?id=7117999726?
源碼下載:http://www.sky-walker.com.cn/yefan/MFV40/SourceCode/IOTimerTest.rar
文章參考: 《.Net Micro Framework 快速入門》
中文討論組:http://space.cnblogs.com/group/MFSoft/
總結(jié)
以上是生活随笔為你收集整理的【STM32 Net MF开发板学习-11】步进电机控制(非PWM模式)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php pusher,php – Pus
- 下一篇: 第三部分 :简单句的补充(复合句/定语从