跳转到主要内容

edison控制步进电机

editor 提交于

控制电机 DC 5V 4相5线步进电机 28YBJ-48

减速步进电机 直径:28mm 电压:5V 步进角度:5.625 x 1/64 减速比:1/64

1、步进电机原理


图1 四相步进电机步进示意图

开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。

当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。、

四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。单四拍与双四拍的步距角相等,但单四拍的转动力矩小。八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。

单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图2.a、b、c所示:

a. 单四拍 b. 双四拍 c八拍

图2.步进电机工作时序波形图

2、连接方式

主要控制四个phase,根据上面的工作时序可以得到:

(1)单四拍

反转:A->B->C->D->A
{1000,0100,0010,0001},每一拍2个脉冲转动角度:5.625*2/64,4 拍就是5.265*2/64*4=45/64;要转一圈需要:360/(45/64)=512

正转: D->C->B-A-D
{0001,0010,0100,1000}

(2)双四拍

反转:AB->BC->CD->AD
{1100,0110,0011,1001} 每一拍2个脉冲转动角度:5.625*2/64, 4 拍就是5.265*2/64*4=45/64;要转一圈需要:360/(45/64)=512

正转:DA->DC->CB->BA
{1001,0011,0110,1100}

(3)八拍工作模式

反转:A->AB->B->BC->C->CD->D->DA 每一拍1个脉冲转动角度:5.625*1/64;8拍就是5.625*1/64*8;要转一圈要:512
{1000,1100,0100,0110,0010,0011,0001,1001}

正转:AD->D->DC->C->CB->B->BA->A
{1000,1100,0100,0110,0010,0011,0001,1001}

3、Edison 代码:

/*
*/
#include
#include
#include
#include

#include "mraa.hpp"

static int N=512;

static int PhaseNumber = 4;
static int Apin = 2;
static int Bpin = 3;
static int Cpin = 4;
static int Dpin = 5;

int single_pos[4] = {0x01,0x02,0x04,0x08};
int single_rev[4] = {0x08,0x04,0x02,0x01};
int double_pos[4] = {0x09,0x03,0x06,0x0c};
int double_rev[4] = {0x0c,0x06,0x03,0x09};
int eight_pos[8] = {0x08,0x0c,0x4,0x06,0x02,0x03,0x01,0x09};
int eight_rev[8] = {0x09,0x01,0x3,0x02,0x06,0x04,0x0c,0x08};

mraa::Gpio* gpioA = NULL;
mraa::Gpio* gpioB = NULL;
mraa::Gpio* gpioC = NULL;
mraa::Gpio* gpioD = NULL;
mraa::Gpio* gpioArray[4];

void four_tap(int * fourtaparray)
{
int i,j;
for(i=0;i4;i++)
{
/*
gpioA->write((fourtaparray[i]>>3)&0x01);
gpioB->write((fourtaparray[i]>>2)&0x01);
gpioC->write((fourtaparray[i]>>1)&0x01);
gpioD->write((fourtaparray[i]>>0)&0x01);*/
for(j=0;j {
gpioArray[j]->write((fourtaparray[i]>>(3-j))&0x01);
}
usleep(10000);
}
}

void eight_tap(int * eighttaparray)
{
int i,j;
for(i=0;i8;i++)
{
/*gpioArray[0]->write((eighttaparray[i]>>3)&0x01);
gpioArray[1]->write((eighttaparray[i]>>2)&0x01);
gpioArray[2]->write((eighttaparray[i]>>1)&0x01);
gpioArray[3]->write((eighttaparray[i]>>0)&0x01);*/
for(j=0;j {
gpioArray[j]->write((eighttaparray[i]>>(3-j))&0x01);
}
usleep(10000);
}
}

int running = 0;

void
sig_handler(int signo)
{
if (signo == SIGINT) {
running = -1;
}
}

int main (int argc, char **argv)
{
int i;
signal(SIGINT, sig_handler);

gpioA = new mraa::Gpio(Apin,true,false);
gpioB = new mraa::Gpio(Bpin,true,false);
gpioC = new mraa::Gpio(Cpin,true,false);
gpioD = new mraa::Gpio(Dpin,true,false);
gpioArray[0]= gpioA;
gpioArray[1]= gpioB;
gpioArray[2]= gpioC;
gpioArray[3]= gpioD;

for(i=0;i {
gpioArray[i]->dir(mraa::DIR_OUT);
}

while (running == 0) {
for(i=0;i {
four_tap(single_pos);
}
sleep(10);
for(i=0;i {
four_tap(single_rev);
}
sleep(10);

for(i=0;i {
four_tap(double_pos);
}
sleep(10);
for(i=0;i {
four_tap(double_rev);
}
sleep(10);

for(i=0;i {
eight_tap(eight_pos);
}
sleep(10);
for(i=0;i {
eight_tap(eight_rev);
}
sleep(10);
}
for(i=0;i {
delete gpioArray[i];
}
return 0;
//! [Interesting]
}

文章来源:Arduino中文社区