选用的步进电机的型号为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模式)相关推荐

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

    选用的步进电机的型号为28BYJ-48(或MP28GA,5V,转速比1/64),驱动电路选用 uln2003芯片的驱动板,其控制时序图如下: 四相八拍:A->AB->B ->BC - ...

  2. 【STM32 .Net MF开发板学习-02】GPIO测试

    前段时间我借用市面上现成的Corex-M3开发板,打造了最低价的.Net Micro Framework开发板(参见<免费发放firmwave,打造史上最低价.Net MF开发板>),在此 ...

  3. 【STM32 Net MF开发板学习-27】GPRS通信实现

    GPRS是General Packet Radio Service(通用分组无线服务技术)的简称,它是GSM移动电话用户可用的一种移动数据业务.GPRS和以往连续在频道传输的方式不同,是以封包(Pac ...

  4. 【STM32 .Net MF开发板学习-17】Wifi遥控智能小车

    恰好以前购买的一个PDA含Wifi功能,所以与其用PC通过Zigbee控制智能小车,不如用PDA来控制,这样更为方便,不过由于目前.NET MF开发板不直接支持Wifi功能,所以我们也只好间接控制了, ...

  5. 【STM32 .NET MF开发板学习-29】摄像头蓝牙图像远程获取

    目前生产串口摄像头的厂家有很多,每家的通信协议也不同,所以针对不同的摄像头都必须编写相对应的摄像头驱动程序. 最早做医疗项目的时候,开发过一款串口摄像头的驱动,不过是配合TinyIOs而使用,并没有把 ...

  6. 【STM32 .Net MF开发板学习-28】中文显示(WPF方式)

    在<为Cortex-M3打造轻量级TinyGUI>中我们提到.NET MF的官方图形库为WPF,考虑到内存的限制和CPU的性能,所以我们开发了TinyGUI库,并在<TinyGUI绘 ...

  7. 【STM32 NET MF开发板学习-29】摄像头蓝牙图像远程获取

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 目前生产串口摄像头 ...

  8. 【STM32 Net MF开发板学习-19】DHT11温湿度传感器通信(上)

    前段时间开发远程医疗系统(Dr.Cloud)就曾用到过温湿度传感器,不过当时考虑到集成难度,选了一个RS485接口的传感器,该传感器实现了Modbus Rtu Slave的功能,只要客户程序实现Mod ...

  9. 【STM32 .Net MF开发板学习-19】DHT11温湿度传感器通信(上)

    前段时间开发远程医疗系统(Dr.Cloud)就曾用到过温湿度传感器,不过当时考虑到集成难度,选了一个RS485接口的传感器,该传感器实现了Modbus Rtu Slave的功能,只要客户程序实现Mod ...

最新文章

  1. VNX证书过期解决方案(2018-11-02)
  2. SpringMvc 事务的注解配置、实现、挂起
  3. Maven结合SonarQube的使用笔记
  4. idea提示,格式化代码,清除不使用的包快捷键,maven自动导jar包
  5. cxf客户端访问方式
  6. MySQL之长连接、短连接、连接池(转载:http://www.ywnds.com/?p=9801)
  7. php菲波那切数列,php如何实现菲波那切数列
  8. LeetCode 2138. 将字符串拆分为若干长度为 k 的组
  9. LeetCode 934. 最短的桥(2次BFS)
  10. 华为最新人事调整:余承东任智能汽车解决方案 BU CEO;美团悄悄更换抽佣规则,佣金不降反升;Scala 3 正式发布|极客头条...
  11. nginx(4、缓存)
  12. 面试准备(集合部分)
  13. 性能测试--jmeter中响应断言【9】
  14. 医学图像分割--U-Net: Convolutional Networks for Biomedical Image Segmentation
  15. Atitit mybatis 简化开发与提升开发效率法 目录 1.1. 使用注解模式代替xml模式 1 1.2. 使用通用mapper代替专用mapper 1 1.3. 使用js等脚本语言来输出sq
  16. mongodb安装及5安装studio 3t和studio3t破解
  17. 计算机毕业设计、课程设计之[含论文+源码等]S2SH+mysql的报刊订阅系统[包运行成功]
  18. Java开源文件病毒扫描_使用多种反病毒引擎扫描文件
  19. hdmi接口有什么用_VGA、DVI、HDMI、DP、TYPE-C接口都有什么区别?
  20. python 双精度浮点_Python双精度浮点数运算并分行显示操作示例

热门文章

  1. 国内外设计及素材站[转载]
  2. 我也是从寒门走出来的,程序员这个职业是我最好的选择!
  3. 兰伯特(Lambert)方程的求解算法1
  4. C++ 基础概念(二)
  5. 关于数据驱动消费金融业务的几点看法
  6. 点开计算机桌面选项怎么不见了,电脑桌面开始菜单不见了应该如何解决?_开始菜单不见了解决办法介绍...
  7. 用Defraggler打造自己的免费自动磁盘整理工具
  8. ArcGIS server如何将自己的小地图叠加到Google maps或者Virtual Earth上[转]
  9. mysql内存占用过高_mysql占用内存过高排查
  10. ECharts 地图绘制