单片机驱动28byj48步进电机为什么我用8拍电机不转附程序

#include<stc15.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
bit End;
//uchar code Motor_Left[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};
uchar code Motor_Left[4]={0x08,0x04,0x02,0x01};
int speed,count;
void Motor_Left_Run()
{
uchar i;
for(i=0;i<4;i++)
{
P0=Motor_Left[i];
P21=1;
count=speed;
TR0=1;
while(End);
TR0=0;
End=1;
}
}
void UartInit(void) //[email protected]
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xE8; //设定定时初值
TH1 = 0xFF; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
TI=1;
}
void Timer0Init(void) //[email protected]
{
EA=1;
ET0=1;
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}

void main()
{
End=1;
speed=3;
UartInit();
Timer0Init();
while(1)
{
Motor_Left_Run();
}
}
void Time0() interrupt 1
{
count--;
if(count==0)
{
TR0=0;
End=0;
P21=0;
}
}
这里用4拍,定时器3MS,电机最快速度起转,2MS会起动失败,然后单片机就像死机一样,
如何改成8拍模式,电机起动的时候抖一下,单片机也像死机一样,几个输出口的LED随机亮两个

步进电机承受不了太高的运行和启动频率,特别是启动特性很差,所以,频率太高是无法启动电机的,你将频率降低,也即是将定时器的时间调整为5毫秒试试。应该就可以正常转动了。追问

4拍5毫秒可以转动的,就是改成12相励磁8拍,无论怎么调时间都无法启动

追答

void Motor_Left_Run()
{
uchar i;
for(i=0;i<8;i++) //是不是这里没改,应该将4改为8
{
P0=Motor_Left[i];
P21=1;
count=speed;
TR0=1;
while(End);
TR0=0;
End=1;
}
}

追问

改了的,启动马达抖一下单片机就死机了,把节拍改成两相4拍励磁也会失败,我很奇怪

追答

你的定时器为什么设置成模式0?而中断服务程序中又没有重新赋值?所以你的定时时间是不对的。

追问

设置的是16位自动重载模式的,不用赋值,STC15系列的单片机

温馨提示:答案为网友推荐,仅供参考