标题:
51四个按键控制42/57步进电机启停正反,但速度一直加不上去
[打印本页]
作者:
lemaden520
时间:
2018-4-14 14:02
标题:
51四个按键控制42/57步进电机启停正反,但速度一直加不上去
代码在下面,是我参考的网上代码改写的,但是步进电机的速度一直很慢,提不上去,求大神能改下,让步进电机运动快点,驱动器采用的是tb6600,脉冲加方向控制。
代码:
#include <reg52.h>
sbit Clk = P2^0;
sbit En = P2^1;
sbit Dir = P2^2;
sbit CW = P2^4; //正转运行按键
sbit STOP = P2^5; //停止运行按键
sbit CCW = P2^6; //反转运行按键
sbit ADJ = P2^7; //调速运行按键
bit Run_Status; //运行状态位标志,
//=0表示电机在停止状态,可以按键正转、反转均可
//=1表示电机在运行状态,不支持正反转按键,只有先停止。防止强行换向带来的电流过大。
unsigned char Run_Dir,t; //电机运行方向
unsigned char timer1;
#define F_DIR 0 //正转
#define R_DIR 1 //反转
unsigned int clock; //周期变量
void Delayms(unsigned int xms) //延时函数
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=9;j>0;j--);
}
void Forward(void) //电机正转
{
TH0=(65536-clock)/256; //初值大小由clock值决定
TL0=(65536-clock)%256; //clock增大,speed减小;clock减小,speed增大
Dir=0;
En=1;
TR0=1; //开定时器1中断
}
void system_Ini()
{
TMOD|= 0x11;
TH1 = 0xfe; //11.0592MHz 0.5ms定时
TL1 = 0x33;
TR1 = 1; //启动T1定时
EA=1;
ET1=1; //开T0,T1中断,开总中断
}
void Reversal(void) //电机反转
{
TH0=(65536-clock)/256;
TL0=(65536-clock)%256;
Dir=1;
En=1;
TR0=1;
}
char flag1 =0x00;
bit flagstop=0;
void Keyscan()
{
if(STOP==0 && flagstop==0) //任何时候按停止键,电机停止运行
{
Delayms(1); //延时去抖动
if(STOP==0)
{
TR0=0;
Clk=0;
TR1=0;
En=0;
flag1=0;
flagstop=1;
Run_Status=0; //电机正在停止的状态标志
}
}
else if(!CW && !Run_Status && (flag1&0xf0)==0x00) //按正转键同时电机不是正在运行时,电机正转运行
{
Delayms(1); //按下延时去抖动
if(!CW && !Run_Status)
{
{ flag1 =0x10;
Run_Status=1;
if(t<1)
{
Forward();
}
Run_Dir = F_DIR; //电机运行方向正转
flagstop=0;
if(timer1>100)
{
timer1=0; //输出占空比0.7的PWM脉冲
}
if(timer1<30)
{
Clk=0;
}
else
{
Clk=1;
}
}
}
}
else if(!CCW && !Run_Status && (flag1&0x0f)==0) //按反转键同时电机不是正在运行时,电机反转运行
{
Delayms(1); //延时去抖动
if(!CCW && !Run_Status)
{
if(t<1)
{
Reversal();
}
Run_Dir=R_DIR; //电机运行方向反转
flagstop=0;
flag1 = 1;
Run_Status=1; //电机正在运行的状态标志
if(timer1>100)
{
timer1=0; //输出占空比0.7的PWM脉冲
}
if(timer1<50)
{
Clk=0;
}
else
{
Clk=1;
}
}
}
if(!ADJ)
{
Delayms(1); //延时去抖动
if(!ADJ)
{
if(clock>201) clock-=200;
else clock=1000;
Run_Status=1;
TR0=1;
}
}
}
void Init(void)
{
Run_Status=0; //=0表示电机在停止状态,可以按键正转、反转均可
Clk = 0;
En = 0;
TH0=(65536-clock)/256;
TL0=(65536-clock)%256;
TMOD=0X01;
EA=1;
ET0=1;
TR0 =0;
}
void main(void)
{
t=0;
timer1=0;
Init();
system_Ini();
clock=500;
P1=0xff;
P3 =0XFF;
while(1)
{
Keyscan();
}
}
void Timer0_ISR(void) interrupt 1
{
TH0=(65536-clock)/256;
TL0=(65536-clock)%256;
Clk = ~Clk;
t++;
}
/*************************************
[ t1 (0.5ms)中断] 中断中做 PWM 输出
------------1000/(0.02ms*250)=200Hz
*************************************/
void T1zd(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断
{
// TH1 = 0xfe; //11.0592MHz 0.5ms定时
// TL1 = 0x33;
TH0=(65536-200)/256;
TL0=(65536-200)%256;
timer1++; //计数+1
}
复制代码
我想的是先低速启动,然后再加速运行,如果能够直接快速启动也行。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1