日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【STM32 Net MF开发板学习-11】步进电机控制(非PWM模式)

發(fā)布時(shí)間:2023/12/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【STM32 Net MF开发板学习-11】步进电机控制(非PWM模式) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

選用的步進(jìn)電機(jī)的型號(hào)為28BYJ-48(或MP28GA5V,轉(zhuǎn)速比1/64),驅(qū)動(dòng)電路選用uln2003芯片的驅(qū)動(dòng)板,其控制時(shí)序圖如下:

?

四相八拍:A->AB->B ->BC ->C ->CD ->D ->DA

A、B、CD指的是uln2003芯片驅(qū)動(dòng)板的1N11N2、1N3、1N4,波形在上表示有輸入信號(hào),波形在下表示無(wú)輸入信號(hào)。

我們采用紅牛開(kāi)發(fā)板進(jìn)行步進(jìn)電機(jī)控制,為了便于接線,我們需要在紅牛開(kāi)發(fā)板上焊接兩條30腳雙排排陣,焊接后的紅外板如下:

?

此外至少需要4根杜邦線,還需提供一個(gè)5V的直流電源,接線方式如下:

PC4IN1

PC5IN2

PC6IN3

PC7IN4

5V電源連接

網(wǎng)友fangyuan和奮斗中寫(xiě)了一個(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)參見(jiàn)fangyuan的博客文章《.NET MF 學(xué)習(xí)筆記系列(一)】MF控制步進(jìn)電機(jī)》。

??? 由于步進(jìn)電機(jī)一般都采用PWM控制,我最初也打算這么做,STM32系列的芯片的時(shí)鐘控制器是可以輸出4PWM的,但是研究后我覺(jué)得采用uln2003芯片的驅(qū)動(dòng)板是無(wú)法實(shí)現(xiàn)PWM控制的。如果硬要采用PWM控制,其中一路的PWM(占空比)是可以實(shí)現(xiàn)的,但是其它三路,無(wú)法調(diào)整相位,所以目前我無(wú)法輸出占空比相同,但是相位不同的波形。

我調(diào)整了一下思路,實(shí)現(xiàn)了所謂的IO Timer功能,就是采用Timer定時(shí)中斷,定時(shí)處理C#上層的IO輸出要求,底層代碼暫且不說(shuō)了,先說(shuō)一下封裝后的上層接口。

??? 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í)器,其中timer1timer8暫且不要用,timer的取值為1~6。timer1timer8連接APB2總線,其它定時(shí)器連接APB1總線,APB1操作速度限于36MHzAPB2操作于全速(最高72MHz)。Compare是計(jì)數(shù)器數(shù)值,16位最大65535psc預(yù)分頻器數(shù)值,也是16位的,最大為65535,計(jì)數(shù)器的時(shí)鐘頻率CK_CNTfCK_PSC/(PSC[15:1]+1)。

?? ?Psc可以實(shí)時(shí)動(dòng)態(tài)調(diào)整。

?? ?Pins數(shù)組存放要設(shè)置的IOpin腳號(hào),一次最多可以控制8路,states數(shù)組存放IO的輸出狀態(tài),最多可以有32個(gè)狀態(tài)值,一個(gè)字節(jié)的每一位控制每一路。

?? ?Start就是計(jì)時(shí)器開(kāi)始工作,IO此時(shí)輸出,Stop就是定時(shí)器停止工作,IO停止輸出。

好了,在實(shí)際控制步進(jìn)電機(jī)之前,我們先控制一下LED燈,讓它亮一秒,滅3(紅牛開(kāi)發(fā)板,輸出0燈亮),相關(guān)代碼如下:

??? //LED燈控制(定時(shí)器timer6

??? byte[] pins = new byte[] { (byte)GPIO_NAMES.PF7 };

??? //亮一秒,滅3(紅牛開(kāi)發(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)板后,再做探究。

? 注:該示例程序,紅牛開(kāi)發(fā)板需要部署最新的V0.9.7固件。

-----------------------------------------------------------------------------------------

【低價(jià)開(kāi)發(fā)板】http://item.taobao.com/item.htm?id=7117999726?

源碼下載:http://www.sky-walker.com.cn/yefan/MFV40/SourceCode/IOTimerTest.rar

文章參考: 《.Net Micro Framework 快速入門(mén)

中文討論組:http://space.cnblogs.com/group/MFSoft/

總結(jié)

以上是生活随笔為你收集整理的【STM32 Net MF开发板学习-11】步进电机控制(非PWM模式)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。