#includereg52.h //头文件
sbit A1=P1^0; //定义A线圈正端口
sbit A2=P1^1; //定义A线圈负端口
sbit B1=P1^2; //定义B线圈正端口
sbit B2=P1^3; //定义B线圈负端口
sbit en1=P2^0;
sbit en2=P2^1;
int t=0;
#define F1 {A1=1;B1=0;A2=0;B2=0;} //A线圈通正向电压
#define F2 {A1=0;B1=1;A2=0;B2=0;} //B线圈通正向电压
#define F3 {A1=0;B1=0;A2=1;B2=0;} //A线圈通反向电压
#define F4 {A1=0;B1=0;A2=0;B2=1;} //B线圈通反向电压
#define OFF {A1=0;B1=0;A2=0;B2=0;} //全部断电
unsigned int b=2000; //中断初值变量
void Init_Timer0(void) //初始化定时器0
{
TMOD=0x01; //定时器0,使用模式1,16位定时器
TH0=(65536-b)/256; //给定初值
TL0=(65536-b)%256;
EA=1; //打开总中断
ET0=1; //打开定时器中断
TR0=1; //开定时器
}
void main() //主函数
{
en1=1;
en2=1;
Init_Timer0(); //初始化定时器0
while(1);
}
298只能驱动一个二相四线的步进电机或者二个直流电机:你用的是四相步进电机要用ULN2003这类驱动芯片,四相电机是单极电机,二相四线电机是双极电机,驱动原理有不一样的地方因此用的驱动芯片也有区别
用单片机同时是不可能的,当然,时间间隔小到可以接受,跑几个任务,那也可以视为同时。要实现真正意义上的同时,用FPGA/CPLD是可以完成的。
话说回来,也许你的同时并不是说一定严格地同时工作,只是说一个单片机去控制四个步进电机,那就好办多了。
一个步进电机,比如4相5线那种,4个IO口可控制一个,四个步进电机就要16个,驱动芯片用ULN2003即可。
当然,如果你的IO口不允许使用这么多,那也可以通过串转并的方法,扩展IO口,比如用74HC595,三根IO口控制它,它可以级联,三根线可以控制很多片。一片为8位,两片就为16位,3片为24位 …… 只要加些三极管驱动那三根控制线,三个IO口可控制一串级联的74HC595,得到的扩展IO口,那是相当多的。我用三个IO口控制过5片74HC595,三个IO口一下子就扩展成了40个IO口!!!
#includereg52.h
#define uchar unsigned char
#define uint unsigned int
//--------------------------------
uchar step1[] = {0x05, 0x06, 0x0A, 0x09};
uchar stepx = 0;
//--------------------------------
void zs(uint a)
{
while(a--);
}
//--------------------------------
void zheng(void)
{
P0 = step1[stepx]; //走一步
stepx++;
if (stepx = 4) stepx = 0;
}
//--------------------------------
void fan(void)
{
P0 = step1[stepx]; //走一步
stepx--;
if (stepx == 255) stepx = 3;
}
//--------------------------------
void main ()
{
uint i;
while(1) {
for(i = 0; i 400; i++) {//正转400步
zheng(); //走一步
zs(90); //控制转速
}
for(i = 0; i 400; i++) {//反转400步
fan(); //走一步
zs(90); //控制转速
}
}
}
//--------------------------------
你修改后的程序,调用的程序永远只运行一次,也就是只调用P1=BYJ[6],可以在调试模式下断点观察
51单片机控制四线双极性步进电机的介绍就聊到这里吧,感谢您花时间阅读,谢谢。
本文标签:51单片机控制四线双极性步进电机