一:驱动原理:
28BYJ-48步进电机使用ULN2003驱动板
该步进电机每转一圈需要2048步,因此需要转动目标角度需要的步数=(目标角度/360)*2048
因此要想步进电机转动一圈需要给其2048个电平变化
ULN2003驱动板使用5~12v供电,需要4个单片机IO口,IO口的控制逻辑是依次通高电平,以下代码是步进电机驱动的核心部分
for(j=0;j<512;j++)// 512*4=2048步
{
for(i=0;i<4;i++) // 四相电机,电平变化=>0010, 0100, 1000, 0001
{
P2=F_Rotation[i];
Delay(200); //延时控制电机转动速度;参数越小转得越快,但力矩越小
}
}
其中F_Rotation[4]={0x02,0x04,0x08,0x01}=>0000 0010, 0000 0100, 0000 1000, 0000 0001
可以看见电平给到四个单片机IO口的电平为0010=>0100=>1000=>0001,四个电平状态控制步进电机不断旋转,配合外面的for循环一共执行512*4=2048步,刚好控制电机旋转一圈
二:线路连接:
单片机IO口P2^1~P2^4依次连接ULN2003驱动板的IN1~IN4,驱动板电源连接5v~12v,步进电机连接线直接插入驱动板的白色的端子中即可(有方向限制,不会插反)
二:存在的问题:
如果是5v的驱动,在第二个for语句中使用200的延时,扭矩有点不足,存在很多丢步的现象;使用12v时扭矩足够,但是其发热量较大;为了保证不丢步,适当降低电机转速或则在5v的基础上增加供电电压。
三:51代码实现:
#include <reg52.h>
#include <intrins.h>
unsigned char code F_Rotation[4]={0x02,0x04,0x08,0x01};
unsigned char code B_Rotation[4]={0x01,0x08,0x040,0x02};
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 43;
j = 6;
k = 203;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay(unsigned int i)
{
while(--i);
}
main()
{
unsigned long i,j;
while(1)
{
//Delay(600000);
Delay1000ms();
for(j=0;j<512;j++)
{
for(i=0;i<4;i++)
{
P2=F_Rotation[i];
Delay(200);
}
}
P2=0;
}
}