时间短可以按照我的运动模式转动,时间一长程序就跑飞了,电机只能往一个方向跑,另外,请教下大神们,正反转的间隙电机会抖动,加多长时间延时比较好呢?
/*******************************************************
基于51
单片机和TB6560AHQ驱动器的57步进电机的驱动程序
********************************************************/
#include <REGX52.H>
#define uint unsigned int;
#define uchar unsigned char;
sbit Pulse=P1^0; //脉冲端
sbit Dir=P3^0; //方向端 0:正转 1:反转
sbit En=P1^2; //使能端 0:工作 1:脱机
//sbit F_led=P1^3; //正转指示灯
//sbit R_led=P1^4; //反转指示灯
bit State_flag = 0; //0为运动状态,1为停止状态
bit Ac
tion_flag = 0; //0为上次动作结束,1为上次动作未结束
uchar Step_number = 0; //电机运行到第1步
uint clock, num;
//uchar a,b;
//void Delay10ms(void)//误差0us
//{
//
//// for(c=1;c>0;c--)
// for(b=19;b>0;b--)
// for(a=130;a>0;a--);
//}
void Forward(void) //电机正转
{
// F_led=1;
TR0=1; //开定时器1中断
TH0=(65536-clock)/256; //初值大小由clock值决定
TL0=(65536-clock)%256; //clock增大,speed减小;clock减小,speed增大
Dir=0;
En=0;
}
void Reversal(void) //电机反转
{
// R_led=1;
TR0=1;
TH0=(65536-clock)/256;
TL0=(65536-clock)%256;
Dir=1;
En=0;
}
void Timer_Init(void)
{
TMOD=0X01;
EA=1;
ET0=1;
}
void main()
{
Timer_Init();
clock=75; //改变clock,可以改变电机速度。。调频
while(1)
{
if(Step_number == 0 && State_flag ==0 && Action_flag == 0) //电机第一步动作
{
// Delay5ms();
Action_flag=1;
num=96*10; //正转90度*10
Forward();
Step_number++;
}
else if(Step_number == 1 && State_flag ==0 && Action_flag == 0) //电机第二部动作
{
// Delay5ms();
Action_flag=1;
num=96*10; //反转90度*10
Reversal();
Step_number++;
}
else if(Step_number == 2 && State_flag ==0 && Action_flag == 0) //电机第三部动作
{
// Delay5ms();
Action_flag=1;
num=96*20; //正转180度*10
Forward();
Step_number++;
}
else if(Step_number == 3 && State_flag ==0 && Action_flag == 0) //电机第四部动作
{
// Delay5ms();
Action_flag=1;
Step_number=0;
num=96*20; //反转180度*10
Reversal();
}
}
}
void T0_time(void) interrupt 1
{
TH0=(65536-clock)/256;
TL0=(65536-clock)%256;
Pulse=~Pulse;
num--;
if(num == 0) //脉冲计数到了,关闭T0,电机脱机,运动标志位置0
{
TR0=0;
En=0;
Action_flag=0;
}
}
正、反转间隙电机抖动的原因可能是因为每次换向你都关闭后再打开,造成每次EN有效时做一次初始化,初始化需要给电机的一个线圈驱动,以保证转子在确定的位置,如果转子上次停转时不是在初始化驱动的位置,电机就会产生你说的抖动
谢谢您的提醒,我加以改进
谢谢您的提醒,我会改进的
一周热门 更多>