用STC89c54RD+ 控制步进电机抖动很大,驱动器TB6560AHQ

2019-07-15 20:36发布

控制:STC89c54RD+   驱动器:TB6560AHQ    步进电机:三洋2相6线 42步,接驱动器4线
用网上找到的程序


/*************************************************************************************************************
* 测试说明
*1、MCU:STC89C52RC
*2、测试频率:12Mhz
*2、编程语言:C51
*2、编译环境:Keil C
*2、功能:全速正转、全速反转、停止、调速运行
*************************************************************************************************************/ #include <reg52.h> //TB6560输入控制端定义
sbit CLK = P1^0;
sbit ENA = P1^1;
sbit DIR = P1^2; sbit CW = P3^0; //正转运行按键
sbit STOP = P3^1; //停止运行按键
sbit CCW = P3^2; //反转运行按键
sbit ADJ1 = P3^3; //调速运行按键
sbit ADJ2 = P3^4; //调速运行按键
bit Run_Status; //运行状态位标志,
//=0表示电机在停止状态,可以按键正转、反转均可
//=1表示电机在运行状态,不支持正反转按键,只有先停止。防止强行换向带来的电流过大。
unsigned char Run_Dir; //电机运行方向
#define F_DIR 0 //正转
#define B_DIR 1 //反转
unsigned int CYCLE; //周期变量
/************************************************************************************************
** 函数名称: void Delay(unsigned int cnt)
** 功能描述: 简单的延时函数
** 输  入: cnt:0-65535之间的任意整数
** 输  出: 无
*************************************************************************************************/
void Delay(unsigned int cnt)
{
while(--cnt);
}
/************************************************************************************************
** 函数名称: void main(void)
** 功能描述: 主函数
** 输  入: 无
** 输  出: 无
*************************************************************************************************/
void main(void)
{
Run_Status=0; //=0表示电机在停止状态,可以按键正转、反转均可
CLK = 0;
ENA = 0;
while(1)
{
if(!STOP) //任何时候按停止键,电机停止运行
{
Delay(1000); //延时去抖动
if(!STOP)
{
Run_Status=0; //电机正在停止的状态标志
CLK = 0;
ENA = 0;
TR0=0;
}
}
if(!CW&&!Run_Status) //按正转键同时电机不是正在运行时,电机正转运行
{
Delay(1000); //按下延时去抖动
if(!CW&&!Run_Status)
{
Run_Status=1; //电机正在运行的状态标志
DIR = 0; //正转
ENA = 1;
CYCLE=2500; //脉冲频率 定时器设置 10ms in 12M crystal 即100Hz
TMOD |=0x01;
TH0=(65536-CYCLE)/256;
TL0=(65536-CYCLE)%256;
IE= 0x82; //打开中断
TR0=1;
Run_Dir=F_DIR; //电机运行方向正转
}
}
if(!CCW&&!Run_Status) //按反转键同时电机不是正在运行时,电机反转运行
{
Delay(1000); //延时去抖动
if(!CCW&&!Run_Status)
{
Run_Status=1; //电机正在运行的状态标志
DIR = 1; //反转
ENA = 1;
CYCLE=2500; //脉冲频率 定时器设置 10ms in 12M crystal 即100Hz
TMOD |=0x01;
TH0=(65536-CYCLE)/256;
TL0=(65536-CYCLE)%256;
IE= 0x82; //打开中断
TR0=1;
Run_Dir=B_DIR; //电机运行方向反转
}
}
if(!ADJ1)
{
Delay(5000); //延时去抖动
if(!ADJ1)
{
if(CYCLE<20000) CYCLE+=2000;
else CYCLE=1000;
Run_Status=1;
TR0=1;
}
}
// if(!ADJ2)
// {
// Delay(5000); //延时去抖动
// if(!ADJ2)
// {
// if(CYCLE>2000) CYCLE-=2000;
// Run_Status=1;
// TR0=1;
// }
// }
}
}
/************************************************************************************************
** 函数名称: timer0_ISR
** 功能描述: 定时器0中断处理函数
** 输  入: 无
** 输  出: 无
*************************************************************************************************/
void Timer0_ISR(void) interrupt 1 using 1
{
TH0=(65536-CYCLE)/256;
TL0=(65536-CYCLE)%256;

CLK = ~CLK;
}

用网上找的程序,怎么改定时器初值,改细分,都会抖动的很厉害,如果用高低电平延时模拟脉冲,就没有抖动,不知道为啥

自己写的延时程序:
#include <reg52.h>
sbit ENA=P1^1;
sbit CLK=P1^0;
sbit DIR=P1^2;
sbit ENA1=P1^6;
sbit DIR1=P1^4;
sbit CLK1=P1^5;
sbit ENA2=P0^0;
sbit CLK2=P0^1;
sbit DIR2=P0^2;
sbit ZHENG=P3^0;
sbit FAN=P3^1;
sbit STOP=P3^2;
bit DATE1;
unsigned int quan;//圈数
unsigned int abc;
/*void delay(unsigned int x)
{
unsigned int y;
for(;x>0;x--)
{
  for(y=0;y<10;y++);  
}
}
*/
void delay(void) //延时1ms子程序
{
unsigned char i,j;
for(i=5;i>0;i--)
for(j=98;j>0;j--);
}
/*void Delay(unsigned time)

{

unsigned char a,b,c; //

for(a=0;a<time;a++)

for(b=0;b<1;b++)

for(c=0;c<63;c++);

}*/
/*void delay1(unsigned ms)           //延时
{
  unsigned j;
  while(ms--)
  {
    for(j=0;j<60;j++)
    {;}
  }
}*/

/************************************************电机1**********************************/
void zhengzhuan()//正转
{
quan=1;//转的圈数,1就是一圈,转几圈,改成相应的数字
abc=800*quan;
while(abc--)
{
ENA=1;
DIR=1;
  
  delay();
  CLK=!CLK;
  if (!STOP)
{
break;
}
}
}
void fanzhuan()//反转
{
quan=1;
abc=800*quan;
while(abc--)
{
DIR=0;
ENA=1;
  
  delay();
  CLK=!CLK;
  if (!STOP)
{
break;
}
  
  }
  }
/*void tingzhi()
{
CLK = 0;
ENA = 0;

}
/*******************************************电机2*********************************************/
/*void zhengzhuan1()//正转
{
quan=1;//转的圈数,1就是一圈,转几圈,改成相应的数字
abc=800*quan;
while(abc--)
{
ENA1=1;
DIR1=1;
  
  delay();
  CLK1=!CLK1;
  if (!STOP)
{
break;
}
}
}
void fanzhuan1()//反转
{
quan=1;
abc=800*quan;
while(abc--)
{
DIR1=0;
ENA1=1;
  
  delay();
  CLK1=!CLK1;
  if (!STOP)
{
break;
}
  
  }
  }
void tingzhi1()
{
CLK1 = 0;
ENA1 = 0;

}
/****************************************************************************/
/*******************************************电机3*********************************************/
/*void zhengzhuan2()//正转
{
quan=1;//转的圈数,1就是一圈,转几圈,改成相应的数字
abc=800*quan;
while(abc--)
{
ENA2=1;
DIR2=1;
  
  delay();
  CLK2=!CLK2;
  if (!STOP)
{
break;
}
}
}
void fanzhuan2()//反转
{
quan=1;
abc=800*quan;
while(abc--)
{
DIR2=0;
ENA2=1;
  
  delay();
  CLK2=!CLK2;
  if (!STOP)
{
break;
}
  
  }
  }
/*void tingzhi2()
{
CLK2 = 0;
ENA2 = 0;

}
/****************************************************************************/

void main()
{
while(1)
{
if (!ZHENG)
{
//tingzhi();
//delay1(100);
zhengzhuan();
//zhengzhuan1();
//zhengzhuan2();
}
if (!FAN)
{
//tingzhi1();
//delay1(100);
fanzhuan();
//fanzhuan1();
//fanzhuan2();
}
}
}
小弟第一次接触单片机,不怎么懂,求大神帮助!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
1009062828
1楼-- · 2019-07-17 00:23
求大神搭救
1043442014
2楼-- · 2019-07-17 01:22
表示也看不懂  我也刚刚接触 慢慢琢磨吧
1009062828
3楼-- · 2019-07-17 07:06
1043442014 发表于 2014-3-15 22:03
表示也看不懂  我也刚刚接触 慢慢琢磨吧

实在不行,,明天去找导师去了
sillyboy001
4楼-- · 2019-07-17 12:50
你好,为什么我用这个程序时总是改变不了方向,但是方向端口直接加一5V电压便可变方向。还有就是把使能端口断开之后电机还是正常转。求赐教!接
sillyboy001
5楼-- · 2019-07-17 17:47
 精彩回答 2  元偷偷看……
chiroudetuzi
6楼-- · 2019-07-17 23:36
步进电机抖的很厉害,一般是频率太高了 ,还有如果使用的是51单片机,是12分频,周期10毫秒,CYCLE好像是5000,怎么会是2500呢

一周热门 更多>