5线4相步进电机用2003直接驱动,怎么细分?

2020-01-23 14:49发布

用的是小型,24BYJ48A型减速步进电机,减速比为1:64,步进角为5.625/64度。如果转一圈需要360/5.625*64=4096个脉冲。
电路图如下:

通电方式采用4相八拍:A-AB-B-BC-C-CD-D-DA.为什么我走64步,才半圈?
看到别人做的,走了128步才半半圈,是不是用了细分:
驱动程序如下,没有做细分的。

BYTE code reveral[8] = {0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};   //逆时钟旋转相序表
BYTE code forward[8] = {0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};    //正时钟旋转相序表

//frequency:调节步进电机速度,n调节步进电机步数
void motor_forward( Byte frequency, Byte n )//正向
{
        BYTE i,j;
       
        for(j=0;j<n;j++)                 //电机旋转一周,不是外面所看到的一周,是里面的传动轮转了一周
        {
                for(i=0;i<8;i++)  
                {
                        OUT_A = (bit) (foreword[i] & 0x08);
                        OUT_B = (bit) (foreword[i] & 0x04);
                        OUT_C = (bit) (foreword[i] & 0x02);
                        OUT_D = (bit) (foreword[i] & 0x01);

                        Delay_1ms(frequency);   //调节转速
                }
        }
       
        OUT_A = 0;                        //切断所有通电
        OUT_B = 0;
        OUT_C = 0;
        OUT_D = 0;       
}

//frequency:调节步进电机速度,n调节步进电机步数
void motor_reveral( Byte frequency, Byte n )//反向
{
        BYTE i,j;
       
        for(j=0;j<n;j++)
        {
                for(i=0;i<8;i++)  //旋转45度
                {
                        OUT_A = (bit) (reveral[i] & 0x08);
                        OUT_B = (bit) (reveral[i] & 0x04);
                        OUT_C = (bit) (reveral[i] & 0x02);
                        OUT_D = (bit) (reveral[i] & 0x01);

                        Delay_1ms(frequency);   //调节转速
                }
        }
       
        OUT_A = 0;                        //切断所有通电
        OUT_B = 0;
        OUT_C = 0;
        OUT_D = 0;       
}

我用按键测试步进,.为什么我走64步,才半圈?
看到别人做的,走了128步才半半圈,是不是用了细分?

如果用PWM来细分,该怎么做?请教大家。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
wenking99
1楼-- · 2020-01-23 17:11
 精彩回答 2  元偷偷看……
NJ8888
2楼-- · 2020-01-23 17:45
驱动应当是各个管脚同时输出,你应当用个中间变量先把四个输出准备好,一次性更替
i_kkyu
3楼-- · 2020-01-23 21:27
估计是4相4拍吧? 别人的是8拍 ?
wenking99
4楼-- · 2020-01-24 01:35
OUT_A = (bit) (foreword[i] & 0x08);
OUT_B = (bit) (foreword[i] & 0x04);
OUT_C = (bit) (foreword[i] & 0x02);
OUT_D = (bit) (foreword[i] & 0x01);

我这里是同时输出吧?

BYTE code reveral[8] = {0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};   //逆时钟旋转相序表
BYTE code forward[8] = {0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};    //正时钟旋转相序表
这里不是四相八拍?
wenking99
5楼-- · 2020-01-24 05:12
没人关注
wenking99
6楼-- · 2020-01-24 10:09
 精彩回答 2  元偷偷看……

一周热门 更多>