【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
,波形在上表示有输入信号,波形在下表示无输入信号。

我们采用红牛开发板进行步进电机控制,为了便于接线,我们需要在红牛开发板上焊接两?
?0脚双排排阵,焊接后的红外板如下:

此外至少需要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固件。

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







本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/365944,如需转载请自行联系原作者
相关文章
|
安全
.Net MF V4.0开源前的代码整理
已经有好长一段时间没有更新博客了,一是去美国总部和台湾出差用了不少时间,二是做.Net MF代码整理又花了近一个月的时间。不过令人欣慰的是,目前.Net MF V4.0的相关代码整理已经告一段落,就等着下一步的开源了
628 0
|
内存技术
【玩转.Net MF – 01】Flash远程读写
目前在PC远程访问设备Flash,也就是部署TinyCLR和下载应用程序
537 0
|
内存技术
【玩转.Net MF – 02】让PC成为MF的鼠标键盘
通过扩展我以前为.Net MF开发的WinForm库(参见我以前的文章《开源System.Windows.Forms库,让.Net Micro Framework界面开发和上位机一样简单》),增加一个输入代理层,就可以实现虚拟鼠标和键盘输入。
562 0
|
网络协议
【玩转.Net MF – 03】远程文件查看器
做过WinCE或Windows Mobile开发的人都知道,VS2008开发工具提供了些远程工具,诸如远程文件查看器、远程注册表编辑器、远程堆查看器和远程放大等等。受此启发,所以才有了MF的远程文件查看器。
604 0
【玩转.Net MF – 04】远程屏幕截图
实现远程屏幕截图的思路很简单,就是直接获取设备的显存数据,由PC再现画面。由于我们已经实现了Custom信道,所以我们在原有程序基础上,增添一个Custom_Command_Screenshots命令,就可以完成数据的获取。
472 0
|
芯片 物联网 内存技术
WG7310(WLAN+Bluetooth+FM)芯片在.Net MF中的应用
WG7310芯片是Ti推出的一款芯片,集成了WLAN、Bluetooth、FM等功能(最近又推出了四合一的芯片,把GPS功能也集成了进去),由于以前在.Net MF上的一些工作是基于Ti DM335开发板上的,所以开发.Net MF系统的WiFi功能就选用了WG7310芯片。
696 0
|
芯片
免费发放firmwave,打造史上最低价.Net MF开发板
很久以前就曾多方位思考限制.Net Micro Framework发展的原因是什么?在物联网和Cortex-M3大行其道的今天,应该有更大的发展空间才对,为什么现在还是关注者甚少?我想主要原因有三,一、源码代码是否开源;二、是否有低价开发板;三、TinyCLR是否够小。
737 0
【STM32 .Net MF开发板学习-03】TinyGUI绘图示例
.Net Micro Framework官方图形库是WPF,由于目前ST Cortex-M3开发板RAM太小,最大才512K(常见是128K或256k),并且Cortex-M3的CPU主频也不太高,运行WPF图形框架显得过于重了,所以我这边推出了轻量级图形库TinyGUI
575 0
|
内存技术
【STM32 .Net MF开发板学习-04】TinyGUI位图显示
由于Cortex-M3开发板的RAM比较小,比如EM-STM3210E仅128K,所以显示位图是个比较棘手的事,如320*240 16位的位图大小就为150K,由于官方的WPF以一个BMP位图为本底进行绘图,所以RAM内存需求至少大于150K。
606 0
【STM32 .Net MF开发板学习-06】蜂鸣器和LED数码管显示
无论是蜂鸣器还是LED数码管显示,其实这二者对代码编写来说没有太大区别,都是GPIO的一个典型应用。红牛开发板有一个蜂鸣器,而EM-STM3210E有一个四位LED数码管,代码都相对简单,不值的为二者单独写一篇博文,所以二者合一以一篇文章来说明,不过两个示例代码是独立的。
625 0