amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 2345|回复: 22

刚买了个兼容M542的步进电机驱动器,请教单片机驱动思路

[复制链接]
发表于 2013-2-21 21:37:56 | 显示全部楼层 |阅读模式
用驱动器的话 还需要PWM驱动吗 是不是就不需要了?
直接IO口驱动吗?
本人电机这块是小白, 请教各位控制这个驱动器的一般编程思路是?

看驱动器说明是通过脉冲数来控制电机转角。 如果设定1600步细分,最高假设500转, 那就是800K脉冲频率,将近1MHz, 用单片机的话,几乎就直接while循环了。

 楼主| 发表于 2013-2-22 00:32:29 | 显示全部楼层
郁闷 电机不转。 程序如下:
        while(1)
        {
                GPIO_SetBits(GPIOC, GPIO_Pin_6);        //enable
                for(i=0;i<1000; i ++)//wait enable stable
                {
                        b++;
                }
                if(flag == TRUE)
                {
                        GPIO_SetBits(GPIOC, GPIO_Pin_7);        //dir +
                        flag = FALSE;
                }
                else
                {
                        GPIO_ResetBits(GPIOC, GPIO_Pin_7);
                        flag = TRUE;
                }
               
                for(i=0;i<1000; i ++)//wait dir stable
                {
                        b++;
                }       
                for(t_high_max = 72*10000;t_high_max>72;t_high_max-=1)
                {
                        GPIO_ResetBits(GPIOC, GPIO_Pin_10);         //pulse state low
                        for(t_low=100;t_low>0; t_low--)//pulse low time
                        {
                                b++;
                        }
                        GPIO_SetBits(GPIOC, GPIO_Pin_10);         //pulse state high
                        for(t_high=2000;t_high>0; t_high--)//pulse low time
                        {
                                b++;
                        }
                }
                for(t_high_max = 72*10;t_high_max<72*10000;t_high_max+=1)
                {
                        GPIO_ResetBits(GPIOC, GPIO_Pin_10);         //pulse state low
                        for(t_low=100;t_low>0; t_low--)//pulse low time
                        {
                                b++;
                        }
                        GPIO_SetBits(GPIOC, GPIO_Pin_10);         //pulse state high
                        for(t_high=2000;t_high>0; t_high--)//pulse low time
                        {
                                b++;
                        }
                }
                OSTimeDly(3000);// hold 3 second.

        }

本来是想正反转来回切 有变快和变慢,结果根本就不动。

现在电机的现象是:
  先上24V电机和驱动器供电, 然后再单片机板上电。 这个是我的上电顺序。
发现无论单片机板上不上电, 电机都不转,用手也转不动。
单片机上电后手摸电机轴上的塑料片有微弱震感。
无论接不接单片机,贴上去听,电机能听到哗啦哗啦类似电视模拟时代没台时候的噪音,非常小的噪音。
加电半天, 电机摸上去微温。
 楼主| 发表于 2013-2-22 00:33:25 | 显示全部楼层
本帖最后由 DashMBO 于 2013-2-22 00:36 编辑

上图:
不太会贴图操作,害得我还得编辑帖子。 这个是单片机控制板。 干别的用的STM32 的板子, 光藕隔离控制358.  358侧的供电电压是4.8V,用的USB充电器。 实际测试 358 高电平输出为3.58V。
连了ena  dr 和pul

单片机板

单片机板
 楼主| 发表于 2013-2-22 00:38:49 | 显示全部楼层
控制器,型号是CWD556, 看淘宝上店家说是替代M542. 按那个上面设定成800的话 就是800个脉冲转一周对吧? 我没理解错吧?
IMG000005.jpg
 楼主| 发表于 2013-2-22 00:39:21 | 显示全部楼层
连一块合个影
IMG000006.jpg
 楼主| 发表于 2013-2-22 00:40:21 | 显示全部楼层
这个是电机, 用卡尺量 长宽都是56mm, 是传说中的57电机吧?
IMG000001.jpg
 楼主| 发表于 2013-2-22 00:46:46 | 显示全部楼层
shit , 上面这张图是昨天拍的。 本来想问怎么接线来着。哈哈
这个是驱动器的设置:
我看它这个拨码开关箭头指向是向下为on, 我这个从左到右SW1~SW8 应该是01000111. SW1~3控制电流,我根据我用的开关电源设定成RMS 1.9A
SW4 半流,我置成0,即使能half current。
SW5~8 设定pause/rev, 我设成0111, 800.
板子连好加电后,绿灯亮,应该是正常工作中。
shit 忘贴图了,修改。
IMG000006.jpg
 楼主| 发表于 2013-2-22 01:01:37 | 显示全部楼层
晕死,重新修改了7楼,结果发现图发重了。
再发示波器图,只照了个pul的波形。 Low 是20us, High是250?us。 从示波器上看,连上以后高电平是1V多一点。 难不成是电压太低了么?
我看M542 说明书   输入端内部是光耦+300左右的电阻。 那这个1V的话应该小吧? 我量181 输入端正常时候是1.1V,说明书上说最低电流8ma? 找不到了说明书, 算8ma的话,电阻上压降应该有2V多? 额。。。。 单片机板上也有一个330电阻。 shit 明天再测下去掉电阻的情况。

现在就是这么个情况了, 大家帮忙看看还有什么可疑的地方不了。

哦 对了 我这个脉冲低电平宽度是20us, 181应该能工作在50khz吧?
IMG000009.jpg
发表于 2013-2-22 08:48:35 | 显示全部楼层
DashMBO 发表于 2013-2-22 01:01
晕死,重新修改了7楼,结果发现图发重了。
再发示波器图,只照了个pul的波形。 Low 是20us, High是250?us ...

可怜的贴,我不会看程序,但知道思路。

首先接线:我不知道你驱动器面板的丝印是什么样,国产应该都差不多,   
CP+和DIR+   接个电源正5V
CP-和DIR-     接你的单片机IO口,隔离一下比较好。     CP- 是脉冲个数,   DIR-  是方向
电机的A, A非  B,B非怎么区分,有一个最简单的办法,先悬空4跟线,用手拧电机轴,感觉一下力度,然后随便将两根线短接,再用手拧电机轴,
如果力度明显变大,则短接的两根线是一个绕组,  这方法是在没有电机资料的时候试一下的,别 有事没事老是去弄它,容易坏电机。

然后是设置:
电流的设置应该是根据你的电机额定电流来设置的,不是根据开关电源大小,当然开关电源的功率也要满足电机需要消耗的功率。
半电流设置:  这个大部分会设置为保持,尤其是电机垂直朝下安装,防止因重力导致产品掉落
细分的设置:根据你自己需要,算出精确度,2相1.8度的电机,不带细分的时候走一步是1.8度,
设置最后提醒一下,这些拨码开关很容易混淆0和1的位置,就是分不清到底哪边是1,哪边是0,我第一次用的时候被这个问题折腾了3天。

程序:
讲程序前先提醒你一下,你这个电机不转,你不知道是程序还是接线的话,你可以先做下试验,把细分拨到0000,就是不带细分的意思,然后
用一个5V电源,正接CP+,  手拿电源负线,点到CP-上,电机跟驱动没坏的话,应该会点一下,电机走一步。

用中断操作CP-  的IO口,给高低电平就行。 要方波,你那个波形明显跟我们上次做的程序的波形不一样。
DIR- 方向的操作,0朝一个方向,1则为反方向。

还有个小窍门:改变任意一组绕组的方向,也可以改变电机方向。  要么把A,A-换过来,要么把B,B-换过来。  只要换一组!
              这个适合在程序写好了,到现场发现方向反了的情况。



我知道的都跟你说了,花了半小时。
发表于 2013-2-22 08:52:09 | 显示全部楼层
你是24V供电,那脉冲跟方向那边要串个2K电阻
发表于 2013-2-22 08:57:01 | 显示全部楼层
你把你那个波形图的波谷那里改成跟上面一样宽就可以了   频率不要太高
步进电机的最佳速度一般是300-400转,这个时候扭矩接近额定扭矩,再加速,扭矩下降太快了
发表于 2013-2-22 09:15:23 | 显示全部楼层
有一种芯片来驱动步进的!好像叫什么31的!
 楼主| 发表于 2013-2-22 11:13:23 | 显示全部楼层
szciy1 发表于 2013-2-22 08:48
可怜的贴,我不会看程序,但知道思路。

首先接线:我不知道你驱动器面板的丝印是什么样,国产应该都差不 ...

非常非常感谢!
电源方面:
我是把电机的供电接的24V。
控制端是5V供电, 前面已经在单片机板上有隔离,用TLP181,TLP181后面接的LM358,为的就是能提供大电流。接驱动器的是358的输出。 那样的话,应该直接连PUL、DIR、ENA的正极就可以了吧?也不用接电阻了吧,我看M542说明书上写的如果是5V驱动,图纸上的电阻短接。我那个是充电器电源,好像不到5V,回头得换一个。

A和B的区分,我用万用表量电阻的方法量的。这个应该没问题。 兼容M542的话,应该也有错接报警吧,而且上电后能锁死,说明应该连线是正常的。

那个电机的额定电流的话,我把外面那个不锈钢壳子拆下来过,电机上也没标额定电流。 我是从别人那拿的,工厂,机器拆下来的, 丢在角落里吃灰。

那个驱动器的拨码开关 最左边有一个向下的箭头和on的标记

回头按你说的 把细分设成default试试。

请问你所说的要方波,是指边沿要陡峭 还是说得占空比一样才能驱动?

用中断控制IO口吗? 这个会不会CPU反应不过来啊? 你说300~400转是指RPM对吧?   假设800细分的话,如果是800脉冲转一圈,按每秒钟5转 是4KHz。 额。。。。。 我好想写程序的时候以每秒几百转设计的。。。。 RPM上万,晕死。

又在网上搜了下。 总结下回去该做的事:
1.测量电机内阻和尺寸,查查大概应该是额定电压电流多少
2. 短掉单片机板上的输出端电阻,换个5V电源。
3. 细分设成default 试下能不能转。
4. 改程序, 现在的脉冲简直晕死了,算错了数量级。 汗~~~~~~
发表于 2013-2-22 11:52:35 | 显示全部楼层
DashMBO 发表于 2013-2-22 11:13
非常非常感谢!
电源方面:
我是把电机的供电接的24V。

你写个很简单的程序先动起来。  就是占空比一样的5V脉冲信号给到 你的PUL-             DIR先别管

发表于 2013-2-22 11:53:30 | 显示全部楼层
PUL+ 接电源5V 不用串电阻。   使能端先别接线
 楼主| 发表于 2013-2-22 22:37:33 | 显示全部楼层
szciy1 发表于 2013-2-22 11:53
PUL+ 接电源5V 不用串电阻。   使能端先别接线

再请教一下关于步进电机的额定电压、额定电流、相电压、相电流。 淘宝上卖的步进电机都只标了相电压、相电流、扭矩。  那请问这个工作电压和工作电流怎么决定呢?

一般的57电机标的都是相电压2点几伏,相电流1~3A。 迷惑了 不知道该给电机多大供电电压。 搜百度也没搜出个所以然。
发表于 2013-2-23 08:18:54 | 显示全部楼层
DashMBO 发表于 2013-2-22 22:37
再请教一下关于步进电机的额定电压、额定电流、相电压、相电流。 淘宝上卖的步进电机都只标了相电压、相 ...

你自己不做驱动板,供电电压就不要你考虑。你在驱动器上管好电流就行了

步进电机不同余普通的电机,步进电机的参数最重要的是:角度(精确度),几相,额定电流,跟扭矩。

记住:买步进电机的时候千万别说功率多大,也别问这个电机是多大功率,这样只有被宰的份!你懂的。
发表于 2014-10-13 00:12:02 | 显示全部楼层
步进电机。科普
发表于 2014-10-13 00:31:34 | 显示全部楼层
慢慢研究, 步进电机哪有那么容易搞。
开始速度不要太快了。 让他慢慢转了再说。
步进电机要做加减速处理的!
发表于 2018-5-18 21:23:32 | 显示全部楼层
>步进电机要做加减速处理的!
You cannot input high frequency immediately, it needs acceleration and deceleration to get the RPM you preferred.
发表于 2018-5-18 21:53:10 | 显示全部楼层
单片机发个低速脉冲试一下,如1KHz,占空比为50%,步进电机要有加减速控制的,一下子上高速会堵转的。
发表于 2018-5-23 09:35:12 | 显示全部楼层
这个真的很有用呀
发表于 2018-5-23 17:03:40 | 显示全部楼层
用驱动模块的话,和控制LED一样简单

#include <iostm8s003f3.h>
#include <intrinsics.h>

static void delay(unsigned long nCount)
{
  while (nCount != 0) {
    nCount--;
  }
}

int main( void )
{
  unsigned int i = 2000;
  
  // setup clock
  CLK_CKDIVR &= (unsigned char)(~0x18);  // 16MHz high speed internal clock
  

  // PC3: DIR
  // PC4: STEP/PULSE
  PC_DDR |= 0x18;  // output
  PC_CR1 |= 0x18;  // push pull
  PC_CR2 |= 0x18;  // 10MHz output speed
  PC_ODR &= 0xE7;  // dir = step = 0

  while (1) {
    i--;
    if (i <= 500)
      i = 500;
   
    PC_ODR |= 0x10;  // Step HIGH
    __no_operation();
    __no_operation();
    __no_operation();
    __no_operation();
    __no_operation();
    __no_operation();
    __no_operation();
    __no_operation();
    __no_operation();
    __no_operation();
    __no_operation();
    __no_operation();
    __no_operation();
    __no_operation();
    __no_operation();
    __no_operation();
    PC_ODR &= 0xEF;  // Step LOW
    delay(i);  // i should be larger than 100
  }
}

友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2018-10-24 01:17

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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