用的是小型,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来细分,该怎么做?请教大家。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
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}; //正时钟旋转相序表
这里不是四相八拍?
一周热门 更多>