OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13798|回复: 7

stm32 开发板驱动U2003驱动的28BYJ-48-5V 的接线及控制问题

[复制链接]

13

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2011-7-2
在线时间
3 小时
发表于 2011-7-5 11:58:40 | 显示全部楼层 |阅读模式
 最近想用STM32 控制步进电机运作,已经购买带U2003驱动的28BYJ-48-5V,驱动板要求输入PUL+ UL- DIR+ DIR-,两组差分信号!但参考了论坛的雕刻机IO接口板发现PUL-及DIR-直接接地,请高手解惑如何此电路能否控制电机反转?


PUL- DIR- 直接接地 (原文件名:IO接口板步进电机信号.jpg) 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-7-5 12:34:17 | 显示全部楼层
回复【楼主位】hpy6666:
---------------------------------
这个要看你的驱动板了.
做好了的驱动板,一般只需要3跟信号线IR,CLK和EN.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2011-7-2
在线时间
3 小时
 楼主| 发表于 2011-7-11 18:05:12 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
自己顶下。。。。
找到如下资料,正在尝试修改验证!!!
选用的步进电机的型号为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)。

    sc可以实时动态调整。

    ins数组存放要设置的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固件。

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-7-11 18:25:16 | 显示全部楼层
 
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2011-7-13
在线时间
2 小时
发表于 2011-7-27 14:48:47 | 显示全部楼层
回复【3楼】hpy6666:
---------------------------------
太牛了,想学习,在哪里下载呀?
回复 支持 反对

使用道具 举报

13

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2011-7-2
在线时间
3 小时
 楼主| 发表于 2011-7-27 18:38:55 | 显示全部楼层
http://archive.cnblogs.com/a/1790871/
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2014-7-18
在线时间
0 小时
发表于 2014-7-28 15:34:37 | 显示全部楼层
回复【6楼】hpy6666:
---------------------------------
太牛了,想下载下来学习下,可链接是错的,下载不了、、、
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-5-9
在线时间
0 小时
发表于 2015-5-9 16:28:02 | 显示全部楼层
zuot用奋斗板子实现转动,但是不知道怎么变速度,正好学习下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 19:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表