用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
}
}
重金悬赏,,