LGY910 发表于 2012-9-10 11:01:50

有图有真相 ULN2003A驱动 24BYJ48步进电机 失步的问题

本帖最后由 LGY910 于 2012-9-10 16:28 编辑

主控芯片 STC12C5A08-AD    1T      贴片
驱动芯片 ULN2003A                   贴片
步进电机 24BYJ48 - 12V

问题如下
       1.驱动步进电机时有失步现象,造成角度错误。
已考虑过问题
       1.启动频率过高               (频率减速启动也还是有失步现象,说明书说500PPS,减速到250PPS启动依然失步)
       2.负载过重                   (负载基本可以不考虑,无负载)
       3.电压电流不够               (额定电压12V,实际电压15V,电流测试过ULN2003双通道驱动一相,依然失步)
       4.相序,拍数不对             (相序再三测试过没问题用的 4相4拍 )
       5.IO口设置不对               (设置的是强上拉,无上拉电阻)



示波器观察步进电机波形如下,这个是正确的



波形图最后有缺口,这个波形有点不对,最后有缺口




原理图如下

感觉问题就出在波形缺口上
请各位老大看一看怎么解决,谢谢各位。

驱动程序如下
#include "stc5a08ad.h"
#include <intrins.h>
#define uchar unsigned char
#define uintunsigned int

code uchar   tab= {0x06,0x03,0x09,0x0c};
code uchartab1 = {0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
uchar angle1 = 0;

/*--------------步进电机参数-----------------*/

uint cnt5;
uchar sl;

sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;


void Io_Init(void)
{
        P0M0 = 0xf0;
        P0M1 = 0x00;

        P0 &= 0x0f;                  
}


void dj_delay(void)   // 2ms
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
      for(b=222;b>0;b--)
            for(a=12;a>0;a--);
}
void dj_run(void)
{
        if((sl == 1) && cnt5)
        {
                cnt5--;
                if(angle1 < 3)angle1++;
                else            angle1=0;               
                P0 = 0x0f;
                _nop_();
                _nop_();
                P0 |= tab<<4;
        }

        else if((sl == 0) && cnt5)
        {                                                                                                                                                                                                                                                 
                cnt5--;
                if(angle1 > 0)angle1--;
                else            angle1=3;       
                P0 = 0x0f;        
                _nop_();
                _nop_();
                P0 |= tab<<4;
        }

        if(cnt5 == 0)
        {
                P0 &= 0x0f;                
        }       
        dj_delay();                                       
}

void delay(void)   //误差 -0.000000000111us
{
    unsigned char a,b,c;
    for(c=71;c>0;c--)
      for(b=168;b>0;b--)
            for(a=250;a>0;a--);
}


/*------------------------------------*/               
void main(void)
{               
Io_Init();
while(1){
           cnt5 = 160;
        sl = 0;
        while(cnt5)dj_run();
        delay();

        cnt5 = 160;
        sl = 1;
        while(cnt5)dj_run();
        delay();
             }
}










LGY910 发表于 2012-9-10 11:19:25

本帖最后由 LGY910 于 2012-9-10 14:38 编辑

饿希望有高手路过指导一下。。上面那个图发错了,有缺口的是反转,无缺口的是正转。。。十分不解为何正反转波形却不一样。。{:dizzy:}
只有看的没有回的???是不是觉得太低级了??

LGY910 发表于 2012-9-10 20:20:53

算了。。今天下午仔细对比了波形,发现其实缺口不是主要因素,现在能做的是,尽量做曲线加速。。但是效果不明显,暂时没想出很好的办法,只有做换向补偿,以及其他补偿一点。。
那天有高手路过了告诉我终极办法。。。谢谢了我QQ 506472517

ychuang 发表于 2013-12-12 15:13:32

我也在学步进电机 ,正好可以参考一下,谢谢分享!{:smile:}

大哥年 发表于 2016-1-19 16:02:13

大哥你好!我问下你的那个驱动电路输出要上拉12v电阻了吗?怎么我输入高输出电压估计也就0.3v输入低也是低?

bccuje_love 发表于 2016-1-19 16:17:24

const unsigned char Motor1Table={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; 用这个表



取消 P0 = 0x0f;这个试一试,,,,,,上次用来调PID控制都没有出现丢步的现象,
页: [1]
查看完整版本: 有图有真相 ULN2003A驱动 24BYJ48步进电机 失步的问题