怎么用51单片机控制TB6600驱动器的42两相步进电机,,程序下载了一个用键控制的,哪位大神可以帮忙修改

用51单片机控制TB6600驱动器的42两相步进电机,,程序下载了一个用键控制的,如下。本人初学单片机,做个东西,希望可用不用键控制,通过设定电机转的圈数或者角度让电机先正转一定圈数,再自动反转相同圈数,,
#include <ioCC2530.h>
#include <string.h>

typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;

//sensor port
#define J8_SENSOR_PORT P0_6
#define J9_SENSOR_PORT P0_5
#define J10_SENSOR_PORT P0_4
#define J11_SENSOR_PORT P0_7

#define DELAY_TIME 12 //转一个角度停留的时间,可调节转速
//调整转速,这个值太小电机会失步

void initSensorPort()
{
P0DIR |= 0xF0; //P0_4、P0_5、P0_6、P0_7定义为输出
J8_SENSOR_PORT=0;
J9_SENSOR_PORT=0;
J10_SENSOR_PORT=0;
J11_SENSOR_PORT=0;
}

///////////////////步进电机定义/////////////////////////////
//**********************正向旋转相序表*****************************
unsigned char FFW[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90};
//**********************反向旋转相序表*****************************
unsigned char REV[8]={0x90,0x10,0x30,0x20,0x60,0x40,0xc0,0x80};
/********以下是延时函数********/
void Delay_ms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}

//参数n:表示正转的圈数
void motor_up(float n)
{
unsigned char i;
unsigned int j;
int movie_count=(int)(8*64*n);
for (j=0; j<movie_count; j++)
{
for (i=0; i<8; i++)
{
P0 = FFW[i];
Delay_ms(DELAY_TIME);//转一个角度停留的时间,可调节转速
//调整转速,这个值太小电机会失步
}
}
P0 &=~0xF0;
}

//*********************步进电机反转********************************
//参数n:表示反转的圈数
void motor_down(float n)
{
unsigned char i;
unsigned int j;
int movie_count=(int)(8*64*n);
for (j=0; j<movie_count; j++)
{
for (i=0; i<8; i++)
{
P0 = REV[i];
Delay_ms(DELAY_TIME); //转一个角度停留的时间,可调节转速
//调整转速,这个值太小电机会失步
}
}

P0 &=~0xF0;
}

void main(void)
{
initSensorPort();

while(1)
{
motor_up(1.4); //电机正转1圈
P0=0xff; //电机停转
Delay_ms(2000); //换向延时为2s
motor_down(1.4); //电机反转1圈
P0=0xff; //电机停转
Delay_ms(2000); //换向延时为2s
}
}
重金悬赏,,

第1个回答  2018-04-01
单片机接驱动器要3个信号,
1、使能即EN
2、正反转控制即DIR
3、时钟即PUL
对于tb6600来说EN低电平有效。DIR低电平正转,高则反转。PUL上升沿有效。
如需要电机正转;EN=DIR=0,PUL加脉冲,电机就根据脉冲频率正转。如要反转将DIR=1即可。
如需要电机锁定,让EN=0而PUL=0而不加脉冲。此时电机保持定位且转不动。
如需要电机自由转动,让EN=1。此时电机可以用手转动,DIR和PUL对电机不起作用。
步进电机的控制也就是以上几种方式。
关于步距角,一般单相和2相电机是1.8度,该驱动器可以16细分。如果你设定了16细分那么每一个时钟脉冲的步距角=1.8/16=0.1125度。选择其他细分可按这种方法得出步距角。有了步距角转1圈要多少脉冲你用360除一下就可以了。本回答被网友采纳
相似回答