TB6600驱动STP-42D4040型步进电机无法反转的问题
时间:10-02
整理:3721RD
点击:
c语言程序如下:#include <AT89x52.h> //调用51单片机的头文件
#define uint unsigned int
#define uchar unsigned char
uchar time=0,count=200;//低电平的占空比
sbit EN=P2^0;//EN 电机使能
sbit CW=P2^1;//CW 正反转控制
sbit CLK=P2^2;//CLK 调速脉冲
sbit key_p1=P1^4; //电机正反转
sbit key_p2=P1^5; //电机减速
sbit key_p3=P1^6; //电机增速
sbit key_p4=P1^7; //电机使能
/************函数声明**************/
void delayxms(uint z);
void Motor_turn();
void Motor_add();
void Motor_dec();
void Motor_EN();
void timer0_init();
void timer0_int();
/*********主函数********************/
void main()
{
timer0_init();
while(1)
{
Motor_EN();
Motor_turn();
Motor_add();
Motor_dec();
}
}
/****************延时处理**********************/
void delayxms(uint z)//延时xms程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=220;y>0;y--);
}
/************电机启动控制**************/
void Motor_EN()
{
if(key_p4==0)
{
delayxms(2);//此处时间不能太长,否者会的中断产生冲突
if(key_p4==0)
{
EN=~EN;
}
while(!key_p4);
}
}
/************电机正反向控制**************/
void Motor_turn()
{
if(key_p1==0)
{
delayxms(2);//此处时间不能太长,否者会的中断产生冲突
if(key_p1==0)
{
CW=~CW;
}
while(!key_p1);
}
}
void Motor_dec()//电机减速
{
if(key_p2==0)
{
delayxms(2);//此处时间不能太长,否者会的中断产生冲突
if(key_p2==0)
{
count+=10;
if(count>=400)
{
count=400;
}
}
while(!key_p2);
}
}
void Motor_add()//电机加速
{
if(key_p3==0)
{
delayxms(2);//此处时间不能太长,否者会的中断产生冲突
if(key_p3==0)
{
count-=10;
if(count<=0)
{
count=0;
}
}
while(!key_p3);
}
}
/***********定时器0初始化***********/
void timer0_init()
{
TMOD=0x01; //定时器0工作于方式1
TH0=(65536-10)/256;
TL0=(65536-10)%256;
EA=1;
ET0=1;
TR0=1;
}
/**************定时0中断处理******************/
void timer0_int() interrupt 1
{
TR0=0;//设置定时器初值期间,关闭定时器
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1;
{
time++;
if(time>count)
{
CLK=1;
}
else
{
CLK=0;
}
if(time>=400)
{
time=0;
}
}
}
程序编译没有任何问题,硬件都是新的,但是就是无法改变电机的转向,求大神们帮助。
#define uint unsigned int
#define uchar unsigned char
uchar time=0,count=200;//低电平的占空比
sbit EN=P2^0;//EN 电机使能
sbit CW=P2^1;//CW 正反转控制
sbit CLK=P2^2;//CLK 调速脉冲
sbit key_p1=P1^4; //电机正反转
sbit key_p2=P1^5; //电机减速
sbit key_p3=P1^6; //电机增速
sbit key_p4=P1^7; //电机使能
/************函数声明**************/
void delayxms(uint z);
void Motor_turn();
void Motor_add();
void Motor_dec();
void Motor_EN();
void timer0_init();
void timer0_int();
/*********主函数********************/
void main()
{
timer0_init();
while(1)
{
Motor_EN();
Motor_turn();
Motor_add();
Motor_dec();
}
}
/****************延时处理**********************/
void delayxms(uint z)//延时xms程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=220;y>0;y--);
}
/************电机启动控制**************/
void Motor_EN()
{
if(key_p4==0)
{
delayxms(2);//此处时间不能太长,否者会的中断产生冲突
if(key_p4==0)
{
EN=~EN;
}
while(!key_p4);
}
}
/************电机正反向控制**************/
void Motor_turn()
{
if(key_p1==0)
{
delayxms(2);//此处时间不能太长,否者会的中断产生冲突
if(key_p1==0)
{
CW=~CW;
}
while(!key_p1);
}
}
void Motor_dec()//电机减速
{
if(key_p2==0)
{
delayxms(2);//此处时间不能太长,否者会的中断产生冲突
if(key_p2==0)
{
count+=10;
if(count>=400)
{
count=400;
}
}
while(!key_p2);
}
}
void Motor_add()//电机加速
{
if(key_p3==0)
{
delayxms(2);//此处时间不能太长,否者会的中断产生冲突
if(key_p3==0)
{
count-=10;
if(count<=0)
{
count=0;
}
}
while(!key_p3);
}
}
/***********定时器0初始化***********/
void timer0_init()
{
TMOD=0x01; //定时器0工作于方式1
TH0=(65536-10)/256;
TL0=(65536-10)%256;
EA=1;
ET0=1;
TR0=1;
}
/**************定时0中断处理******************/
void timer0_int() interrupt 1
{
TR0=0;//设置定时器初值期间,关闭定时器
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1;
{
time++;
if(time>count)
{
CLK=1;
}
else
{
CLK=0;
}
if(time>=400)
{
time=0;
}
}
}
程序编译没有任何问题,硬件都是新的,但是就是无法改变电机的转向,求大神们帮助。
问题已解决,在于驱动器单独供电的问题。多谢各位来访的读友
问题已解决,问题出在驱动器单独供电上,我以为单片机引脚足够提供电压了
请问小编,驱动器单独供电问题具体是啥意思,我也遇到了只能正转,改变方向信号还是无法实现反转的问题。
你这是直流电机吧,程序里没看到步进电机的驱动时序
是这样的,我用的是TB6600的驱动器,这个驱动器所需要的电源电压要另外提供,不能使用单片机的引脚端提供。当时我直接用单片机的引脚提供,发现电压不足。
这个驱动器控制的,没有编写驱动时序