单片机控制步进电机系统可用于电梯开发.docx
《单片机控制步进电机系统可用于电梯开发.docx》由会员分享,可在线阅读,更多相关《单片机控制步进电机系统可用于电梯开发.docx(14页珍藏版)》请在冰豆网上搜索。
![单片机控制步进电机系统可用于电梯开发.docx](https://file1.bdocx.com/fileroot1/2022-11/15/2da383b7-391e-4980-ac53-8153c73c50be/2da383b7-391e-4980-ac53-8153c73c50be1.gif)
单片机控制步进电机系统可用于电梯开发
班级:
09级应电1班日期:
2012-04-26
组员:
李金桥、黎青所、兰俊杰、赖智源
实验板上的步进电机型号为28BYJ48,它是四相八拍的电机,电压为DC5V。
先给你解释一下步进电机28BYJ48-5V这个型号的具体含义:
28——表示此步进电机的有效最大外径为28毫米。
B——表示表示是步进电机,“步”字的汉语拼音(Bu)开头字母。
Y——表示永磁式,“永”汉语拼音(Yong)开头字母。
J——表示减速型,“减”汉语拼音(Jian)开头字母。
那么,BYJ合起来就表示——永磁式减速步进电机。
48——表示四相八拍,这个步进电机是四相八拍的步进电机。
5V——表示这个步进电机的额定电压为5V,且是直流电压。
当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。
每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。
当通电状态的改变完成一个循环时,转子转过一个齿距。
四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A。
。
。
),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。
。
。
),八拍(A-AB-B-BC-C-CD-D-DA-A。
。
。
)。
注意:
这款电机的减速比是1:
64,也就是说电机每次的步进角度为5.625/64度,步进角度很小,也使得电机转速很精准,非常适合细微控制。
通过控制单片机P1.0-P1.3来操作步进电机了,我们为了快速操作IO口,直接对P1进行赋值,而不是每位单独赋值。
参看上面的电机驱动表格,我们列出电机操作方法:
橙(P1.0)
黄(P1.1)
粉(P1.2)
蓝(P1.3)
十六制(P1口)
1
0
0
0
0xF1
1
1
0
0
0xF3
0
1
0
0
0xF2
0
1
1
0
0xF6
0
0
1
0
0xF4
0
0
1
1
0xFC
0
0
0
1
0xF8
1
0
0
1
0xF9
实验代码:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitMC0=P3^0;
sbitMC1=P3^1;
sbitMC2=P3^2;
sbitMC3=P3^3;
sbitKeyIn1=P2^4;
sbitKeyIn2=P2^5;
sbitKeyIn3=P2^6;
sbitKeyIn4=P2^7;
sbitKeyOut1=P2^3;
sbitKeyOut2=P2^2;
sbitKeyOut3=P2^1;
sbitKeyOut4=P2^0;
sbitADDR0=P1^0;
sbitADDR1=P1^1;
sbitADDR2=P1^2;
sbitADDR3=P1^3;
sbitENLED=P1^4;
sbitENLCD=P1^5;
sbitBUZZ=P1^6;
ucharcodeCCW[8]={0xF9,0xF8,0xFc,0xF4,0xF6,0xF2,0xF3,0xF1};//顺时钟旋转相序表
ucharcodeCW[8]={0xF1,0xF3,0xF2,0xF6,0xF4,0xFc,0xF8,0xF9};//逆时钟旋转相序表
ucharQ[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0x86};
uintLed_n=0;
voiddelaynms(uintaa)
{
ucharbb;
while(aa--)
{
for(bb=0;bb<115;bb++)//1ms基准延时程序
{
;
}
}
}
voidmotor_ccw(uintx)
{
uchari,j;
for(j=0;j<8;j++)//电机旋转一周,不是外面所看到的一周,是里面的传动轮转了一周
{
for(i=0;i<8;i++)//旋转45度
{
P3=CCW[i];
delaynms(x);//调节转速
}
}
}
voidmotor_cw(uinty)
{
uchari,j;
for(j=0;j<8;j++)
{
for(i=0;i<8;i++)//旋转45度
{
P3=CW[i];
delaynms(y);//调节转速
}
}
}
n(uinta,uintb)
{
ucharr;
for(r=0;r<(22*a);r++)
{
motor_cw(b);//电机逆转a/3圈以b速度,因为减速比为1/64,64/3=22
}
}
s(uinta,uintb)
{
ucharr;
for(r=0;r<(22*a);r++)
{
motor_ccw(b);//电机顺转a/3圈以b速度
}
}
voidmain(void)//假设8层楼,现在这系统装在四楼的电梯,电梯转一圈就升或降一层楼
{
uintz=1000;
ENLED=0;
ADDR0=0;
ADDR1=0;
ADDR2=0;
ADDR3=1;
P0=Q[4];
while
(1)
{KeyOut1=1;
KeyOut2=1;
KeyOut3=1;
KeyOut4=0;
if(KeyIn1==1)
{
KeyOut1=0;
KeyOut2=1;
KeyOut3=1;
KeyOut4=1;
if(KeyIn1==0)
{
delaynms(5);
if(KeyIn1==0)
{P0=Q[4];s(1,6);s(1,3);s(1,1);P0=Q[3];s(3,1);P0=Q[2];s(1,1);s(1,3);s(1,6);}//按1楼,9/3=3圈,即下降3层
P0=Q[1];
while(z--)
{BUZZ=0;delaynms
(1);BUZZ=1;}
z=1000;
}
if(KeyIn2==0)
{
delaynms(5);
if(KeyIn2==0)
{P0=Q[4];s(1,6);s(1,3);s(1,1);P0=Q[3];s(1,1);s(1,3);s(1,6);};//按2楼,6/3=2圈,下降2层
P0=Q[2];
while(z--)
{BUZZ=0;delaynms
(1);BUZZ=1;}
z=1000;
}
if(KeyIn3==0)
{
delaynms(5);
if(KeyIn3==0)
{P0=Q[4];s(1,4);s(1,1);s(1,4);}//按3楼,3/3=1圈,下降1层
P0=Q[3];
while(z--)
{BUZZ=0;delaynms
(1);BUZZ=1;}
z=1000;
}
if(KeyIn4==0)
{
delaynms(5);
if(KeyIn4==0)//按4楼,电梯不动,蜂鸣器报警
{
while(z--)
{BUZZ=0;delaynms
(1);BUZZ=1;}
z=1000;
}
P0=Q[4];
}
while((KeyIn1==0)||(KeyIn2==0)||
(KeyIn3==0)||(KeyIn4==0));
KeyOut1=1;
KeyOut2=0;
KeyOut3=1;
KeyOut4=1;
if(KeyIn1==0)
{
delaynms(5);
if(KeyIn1==0)
{P0=Q[4];n(1,4);n(1,1);n(1,4);}//按5楼,3/3=1圈,上升1层
P0=Q[5];
while(z--)
{BUZZ=0;delaynms
(1);BUZZ=1;}
z=1000;
}
if(KeyIn2==0)
{
delaynms(5);
if(KeyIn2==0)
{P0=Q[4];n(1,6);n(1,3);n(1,1);P0=Q[5];n(1,1);n(1,3);n(1,6);};//按6楼,6/3=2圈,上升2层
P0=Q[6];
while(z--)
{BUZZ=0;delaynms
(1);BUZZ=1;}
z=1000;
}
if(KeyIn3==0)
{
delaynms(5);
if(KeyIn3==0)
{P0=Q[4];n(1,6);n(1,3);n(1,1);P0=Q[5];n(3,1);P0=Q[6];n(1,1);n(1,3);n(1,6);}//按7楼,9/3=3圈,上升3层
P0=Q[7];
while(z--)
{BUZZ=0;delaynms
(1);BUZZ=1;}
z=1000;
}
if(KeyIn4==0)
{
delaynms(5);
if(KeyIn4==0)
{P0=Q[4];n(1,6);n(1,3);n(1,1);P0=Q[5];n(3,1);P0=Q[6];n(3,1);P0=Q[7];n(1,1);n(1,3);n(1,6);}//按8楼,12/3=4圈,上升4层
P0=Q[8];
while(z--)
{BUZZ=0;delaynms
(1);BUZZ=1;}
z=1000;
}
while((KeyIn1==0)||(KeyIn2==0)||
(KeyIn3==0)||(KeyIn4==0));
}
if(KeyIn1==0)
{
delaynms(5);
if(KeyIn1==0)
{
KeyOut1=0;
KeyOut2=1;
KeyOut3=1;
KeyOut4=1;
if(KeyIn1==0)
{
delaynms(5);
if(KeyIn1==0)
{P0=Q[1];s(3,1);}
}
if(KeyIn2==0)
{
delaynms(5);
if(KeyIn2==0)
{P0=Q[2];s(6,1);}
}
if(KeyIn3==0)
{
delaynms(5);
if(KeyIn3==0)
{P0=Q[3];s(9,1);}
}
while((KeyIn