步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V。当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A。。。),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。。。),八拍(A-AB-B-BC-C-CD-D-DA-A。。。)
红线接电源5V,橙色电线接P1.6口,黄色电线接P1.5口,粉色电线接P4.4口,蓝色接P1.4口。
橙 黄 粉 蓝 十六制(数据)
1 0 0 0 0x08
1 1 0 0 0x0c
0 1 0 0 0x04
0 1 1 0 0x06
0 0 1 0 0x02
0 0 1 1 0x03
0 0 0 1 0x01
1 0 0 1 0x09
所以可以定义旋转相序
uchar code CCW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //逆时钟旋转相序表
uchar code CW[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; //正时钟旋转相序表
#include <stc8.h>
#define uchar unsigned char
#define uint unsigned int
// 逆时针旋转相序表
uchar code CCW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};
// 正时针旋转相序表
uchar code CW[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};
// 独立按键定义
sbit K1=P0^0; // 反转按键
sbit K2=P0^1; // 正转按键
sbit K3=P0^2; // 停止按键
// 四相的引脚定义
sbit A1 = P1^6;
sbit B1 = P1^5;
sbit C1 = P4^4;
sbit D1 = P1^4;
// 毫秒级延时 (根据自己的单片机修改)
void delaynms(uint aa)
{
uchar i, j;
while(aa--)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
// 给每个相赋值
void Give(unsigned char dat)
{
A1 = dat & 0x08;
B1 = dat & 0x04;
C1 = dat & 0x02;
D1 = dat & 0x01;
}
// 步进电机逆时针转赋值
void motor_ccw(void)
{
uchar i,j;
// 电机旋转一周,不是外面所看到的一周,是里面的传动轮转了一周
for(j=0;j<8;j++)
{
if(K3==0)
{
break; // 如果K3按下,退出此循环
}
for(i=0;i<8;i++) // 旋转45度
{
Give(CCW[i]);
delaynms(2); // 调节转速
}
}
}
// 步进电机顺时针转赋值
void motor_cw(void)
{
uchar i,j;
for(j=0;j<8;j++)
{
if(K3==0)
{
break; // 如果K3按下,退出此循环
}
for(i=0;i<8;i++) // 旋转45度
{
Give(CW[i]);
delaynms(2); // 调节转速
}
}
}
void main(void)
{
uchar r;
uchar N=64; //因为步进电机是减速步进电机,减速比的1/64 ,
//所以N=64时,步进电机主轴转一圈
P07 = 0; // 开独立按键总开关
while(1)
{
if(K1==0)
{
for(r=0;r<N;r++)
{
motor_ccw(); // 电机逆时针转
if(K3==0)
{
break;
}
}
}
else if(K2==0)
{
for(r=0;r<N;r++)
{
motor_cw(); // 电机顺时针转
if(K3==0)
{
break;
}
}
}
else
Give(0x00); // 电机停止
}
}