步进电机原理图如下图:
步进电机控制系统的组成如下图所示:
步进电机的控制需要解决三个问题:
(1)首先确定电机的旋转方向;
(2)然后按顺序传送控制脉冲;
(3)最后检测实际的步进数。
以前一直觉得步进电机应该比较简单,就是不愿意动手调试一下,刚好现在手头有一个步进电机,放着也是放着,于是乎把控制程序写了一下,左改改右改改,最后基本可以按照自己的意思转了,但是改了几次之后,第二天发现我的步进电机“罢工”了,它不转了!我怀疑是驱动芯片出了毛病,或者直接给烧了,90%确定不是程序的原因。我用的的电机如下图,
它属于28BYJ48型四相八拍电机,工作电压为直流5~12V,当对步进电机施加一组连续不断的控制脉冲时,它可以连续不断地转动。每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度。
其相序表为:
下面把我修改好的代码搬上来,虽然功能不是很完全(没有写计数和显示模块程序),但还是留个纪念,告诉自己曾经调试过步进电机,嘿嘿。
#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
uchar code zhenzhuan[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //正转相序。
uchar code fanzhuan[] ={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //反转相序。
sbit K1 = P1^4;
sbit K2 = P1^5;
sbit K3 = P1^6;
sbit BEEP = P3^6;
uchar num,i;
//************************************************
void delay(uint z) //大概1ms。
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//************************************************
void beep() //蜂鸣器提示。
{
delay(1);
BEEP=0;
delay(100);
BEEP="1";
}
//************************************************
void foreward() //电动机正转。
{
for(i=0;i<255;i++)
{
for(num=0;num<8;num++)
{
if(K3==0)
{
break;
}
P1 = zhenzhuan[num];
delay(2);
}
}
}
//************************************************
void rollback() //电动机反转。
{
for(i=0;i<255;i++)
{
for(num=0;num<8;num++)
{
if(K3==0)
{
break;
}
P1 = fanzhuan[num];
delay(2);
}
}
}
//************************************************
int0() interrupt 0 //外中断0。
{
uchar i;
for(i=0;i<1;i++)
{
beep();
P1 = 0xff;
break; //外中断触发使得电机停转,以此达到定位的目的。
}
}
//************************************************
void main() //主程序。
{
IT0=1; //外中断跳变沿方式触发中断。
EX0=1; //打开外部中断0。
EA="1"; //打开总中断。
while(1)
{
if(K1==0) //K1键按下则电机正转。
{
beep();
foreward();
}
if(K2==0) //K2键按下则电机反转。
{
beep();
rollback();
}
else
P1 = 0xff;
}
}