用STC89c54RD+ 控制步进电机抖动很大,驱动器TB6560AHQ
用网上找到的程序:
/*************************************************************************************************************
* 测试说明
*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();
}
}
}
小弟第一次接触单片机,不怎么懂,求大神帮助!
第一次就弄那么难的。
第一次做东西,要用到单片机和步进电机,一个人在寝室搞了快1个星期了,,,但是一直卡在这个抖动的问题上,快烦死了
表示也看不懂 我也刚刚接触 慢慢琢磨吧
怎么办啊,各种查找解决办法,就是不行。
别急 像咱们实习生不懂就要等大神 我也想知道
还没有大神来啊。
求大神搭救
表示也看不懂 我也刚刚接触 慢慢琢磨吧
实在不行,,明天去找导师去了
你好,为什么我用这个程序时总是改变不了方向,但是方向端口直接加一5V电压便可变方向。还有就是把使能端口断开之后电机还是正常转。求赐教!接
你好,为什么我用这个程序时总是改变不了方向,但是方向端口直接加一5V电压便可变方向。还有就是把使能端口断开之后电机还是正常转。求赐教!接
步进电机抖的很厉害,一般是频率太高了 ,还有如果使用的是51单片机,是12分频,周期10毫秒,CYCLE好像是5000,怎么会是2500呢
频率高抖动吧!
你写的程序有什么问题?
这个是刚学单片机可以做的吗
抖动有边转边抖,不转干抖。你的怎么抖。抖抖更健康。刚学单片机,就做这个我不反对。关键是你了解了这里面语句的含义了吗,驱动是几细分的,电流怎么设置的,很多因素啊。
你好!最近我也在用TB6560驱动步进电机,也是用的你发的那个程序 可是我的电机只能一个方向转,不能正反转。请问你的可以正反转吗、还有抖动问题解决没有?希望能够指导下!不胜感激
基本确定你用的是89C52一类的芯片,勇哥500欧姆的电阻上拉到5V即可,因为此芯片没有强输出,能力太渣
基本确定你用的是89C52一类的芯片,勇哥500欧姆的电阻上拉到5V即可,因为此芯片没有强输出,能力太渣