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

选用的步进电机的型号为28BYJ-48(或MP28GA5V,转速比1/64),驱动电路选用uln2003芯片的驱动板,其控制时序图如下:

 

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

ABCD指的是uln2003芯片驱动板的1N11N21N31N4,波形在上表示有输入信号,波形在下表示无输入信号。

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

 

此外至少需要4根杜邦线,还需提供一个5V的直流电源,接线方式如下:

PC4IN1

PC5IN2

PC6IN3

PC7IN4

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系列的芯片的时钟控制器是可以输出4PWM的,但是研究后我觉得采用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个定时器,其中timer1timer8暂且不要用,timer的取值为1~6timer1timer8连接APB2总线,其它定时器连接APB1总线,APB1操作速度限于36MHzAPB2操作于全速(最高72MHz)Compare是计数器数值,16位最大65535psc预分频器数值,也是16位的,最大为65535,计数器的时钟频率CK_CNTfCK_PSC/(PSC[15:1]+1)

    Psc可以实时动态调整。

    Pins数组存放要设置的IOpin脚号,一次最多可以控制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/

相关文章
|
5月前
|
SQL 开发框架 数据可视化
企业应用开发中.NET EF常用哪种模式?
企业应用开发中.NET EF常用哪种模式?
|
5月前
|
SQL 开发框架 数据可视化
企业应用开发中.NET EF常用哪种模式?
企业应用开发中.NET EF常用哪种模式?
|
2月前
|
数据库 开发者
.NET 异步编程之谜:async/await 模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第28天】在当今注重效率和响应性的软件开发领域,.NET 的 async/await 模式如同得力助手,简化异步代码编写,使代码更易理解和维护。通过后台执行耗时操作,如网络请求和数据库查询,避免阻塞主线程,显著提升系统响应性。此模式不仅适用于网络请求,还广泛应用于数据库操作和文件读写。合理使用 async/await 可大幅优化性能,但需注意避免过度使用、正确处理调用链及异常,以确保系统稳定性和高效性。深入探索 async/await,助您构建更出色的应用程序。
42 0
|
5月前
|
开发框架 .NET 中间件
C#/.NET快速上手学习资料集(让现在的自己不再迷茫)
C#/.NET快速上手学习资料集(让现在的自己不再迷茫)
164 8
学习计算机组成原理(王道考研)------第十一天https://zhengyz.blog.csdn.net/article/details/121706379?spm=1001.2014.3001.5502
这篇文章是关于计算机组成原理的王道考研学习笔记,主要介绍了半导体存储器RAM和ROM的相关知识。
学习计算机组成原理(王道考研)------第十一天https://zhengyz.blog.csdn.net/article/details/121706379?spm=1001.2014.3001.5502
|
2月前
|
敏捷开发 设计模式 开发者
【揭秘终极利器】AgileEAS.NET:服务定位器模式的魔法,如何让企业级软件开发瞬间提速?揭秘背后的技术奥秘与实战指南!
【8月更文挑战第16天】AgileEAS.NET是基于DotNet的企业级敏捷开发平台,其服务定位器模式助力构建高度解耦系统。通过全局服务目录动态查找服务,避免硬编码依赖。在AgileEAS.NET中,服务定位器以静态类形式封装服务注册与检索功能。示例展示了如何注册与获取服务实例,如在`UserController`中通过服务定位器使用`IUserService`。此模式整合到框架生命周期管理,便于各处获取服务实例,提升开发效率。然而,应适度使用并考虑依赖注入容器以增强代码可维护性和可测试性。
60 4
|
2月前
|
开发框架 监控 .NET
|
2月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【文献学习】Phase-Aware Speech Enhancement with Deep Complex U-Net
文章介绍了Deep Complex U-Net模型,用于复数值的语音增强,提出了新的极坐标掩码方法和wSDR损失函数,并通过多种评估指标验证了其性能。
36 1
|
2月前
|
开发框架 .NET API
C#/.NET/.NET Core推荐学习书籍(24年8月更新)
C#/.NET/.NET Core推荐学习书籍(24年8月更新)
|
4月前
|
开发框架 JSON .NET
学习ASP.NET 中的 默认应用程序配置源
默认主机配置源 使用命令行配置提供程序的命令行参数
32 2
下一篇
无影云桌面