【STM32 Net MF开发板学习-11】步进电机控制(非PWM模式)
選用的步進電機的型號為28BYJ-48(或MP28GA,5V,轉速比1/64),驅動電路選用uln2003芯片的驅動板,其控制時序圖如下:
?
四相八拍:A->AB->B ->BC ->C ->CD ->D ->DA
其A、B、C、D指的是uln2003芯片驅動板的1N1、1N2、1N3、1N4,波形在上表示有輸入信號,波形在下表示無輸入信號。
我們采用紅牛開發板進行步進電機控制,為了便于接線,我們需要在紅牛開發板上焊接兩條30腳雙排排陣,焊接后的紅外板如下:
?
此外至少需要4根杜邦線,還需提供一個5V的直流電源,接線方式如下:
PC4接IN1
PC5接IN2
PC6接IN3
PC7接IN4
5V電源連接
網友fangyuan和奮斗中寫了一個純.NET MF C#的控制代碼,比較容易理解,但是由于是托管代碼,需要虛擬機解釋執行,所以運行效率較低,部分代碼如下:
?? //四相八拍: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);??
????? ??… …
????? }
詳細內容請參見fangyuan的博客文章《【.NET MF 學習筆記系列(一)】MF控制步進電機》。
??? 由于步進電機一般都采用PWM控制,我最初也打算這么做,STM32系列的芯片的時鐘控制器是可以輸出4路PWM的,但是研究后我覺得采用uln2003芯片的驅動板是無法實現PWM控制的。如果硬要采用PWM控制,其中一路的PWM(占空比)是可以實現的,但是其它三路,無法調整相位,所以目前我無法輸出占空比相同,但是相位不同的波形。
我調整了一下思路,實現了所謂的IO Timer功能,就是采用Timer定時中斷,定時處理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個定時器,其中timer1和timer8暫且不要用,timer的取值為1~6。timer1和timer8連接APB2總線,其它定時器連接APB1總線,APB1操作速度限于36MHz,APB2操作于全速(最高72MHz)。Compare是計數器數值,16位最大65535,psc預分頻器數值,也是16位的,最大為65535,計數器的時鐘頻率CK_CNT是fCK_PSC/(PSC[15:1]+1)。
?? ?Psc可以實時動態調整。
?? ?Pins數組存放要設置的IO的pin腳號,一次最多可以控制8路,states數組存放IO的輸出狀態,最多可以有32個狀態值,一個字節的每一位控制每一路。
?? ?Start就是計時器開始工作,IO此時輸出,Stop就是定時器停止工作,IO停止輸出。
好了,在實際控制步進電機之前,我們先控制一下LED燈,讓它亮一秒,滅3秒(紅牛開發板,輸出0燈亮),相關代碼如下:
??? //LED燈控制(定時器timer6)
??? byte[] pins = new byte[] { (byte)GPIO_NAMES.PF7 };
??? //亮一秒,滅3秒(紅牛開發板,輸出0燈亮)
??? byte[] control_Data = new byte[] { 0x0, 0x1, 0x1, 0x1};
??? //時鐘頻率36M? 計數60000次,在分頻(599+1)次大概一秒觸發一次
??? IOTimer.Initialize(5, 60000, 599, pins, control_Data);
IOTimer.Start(5);?
?? 至于控制步進電機,其代碼也是非常簡單,核心代碼如下:
?? ?//順時針旋轉
??? 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);??
??? }
??? //逆時針旋轉
??? 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);
??? }
??? //速度級別
??? 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;
??????? }????????????
??? }
?? 完整代碼請從下面的連接進行下載,最終的運行效果圖如下:
?
? 至于PWM方式控制步進電機的示例,需要等我采購好相關驅動板后,再做探究。
? 注:該示例程序,紅牛開發板需要部署最新的V0.9.7固件。
-----------------------------------------------------------------------------------------
【低價開發板】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/
總結
以上是生活随笔為你收集整理的【STM32 Net MF开发板学习-11】步进电机控制(非PWM模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php pusher,php – Pus
- 下一篇: 第三部分 :简单句的补充(复合句/定语从