51可调速步进电机

一、步进电机

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。使得在速度、位置等控制领域用步进电机来控制变的非常的简单。
正常情况下,步进电机转过的总角度和输入的脉冲数成正比;连续输入一定频率的脉冲时,电动机的转速与输入脉冲的频率保持严格的对应关系,不受电压波动和负载变化的影响。由于步进电动机能直接接收数字量的输入,所以特别适合于微机控制。

二、步进电机的工作原理

步进电机的工作就是步进转动,其功用是将脉冲电信号变换为相应的角位移或是直线位移,就是给一个脉冲信号,电动机转动一个角度或是前进一步。步进电机的角位移量与脉冲数成正比,它的转速与脉冲频率成正比,在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。
如下所示的步进电机为一四相步进电机,采用单极性直流电源供电。只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。
51可调速步进电机_第1张图片
开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。
当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。依次类推,A、B、C、D
四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。
51可调速步进电机_第2张图片
当电机绕组通电时序为A-AB-B-BC-C-CD-D-DA时为正转,通电时序为DA-D-CD-C-BC-B-AB-A时为反转。

三、步进电机的指标理解

步进电机有分静态指标和动态指标,其中最让我懵逼的是齿距角和步距角的关系,网上对齿距角和步距角的解释有点混乱。我个人的理解是,齿距角是转子上的小齿之间的间距角,步距角(步进角)是转子走过一步(一拍)的间距角,一个齿距角分几步走完就叫几拍。
关于转子齿数,一般情况下,三相为40齿,四相为50齿,五相为48/50齿。

四、硬件设计

51可调速步进电机_第3张图片
12V电压给步进电机供电,5V电压则给单片机供电。利用P1口作步进电机的控制端口,通过达林顿阵列ULN2003A驱动步进电机。画图有些匆忙,ULN2003A的COM端悬空,没有保护输出,应该接电源正。
P3.0-P3.2分别接按键K1-K3,其中K1为加速按键,K2为减速按键,K3为正反转控制按键,要求速度7档(1-7)可调,加减速各设3档,开机及复位时位于4档,要求每档速度变化明显。

五、软件设计

#include 

#define  uint unsigned int
#define  uchar unsigned char

sbit inc_key=P3^0;//加键
sbit dec_key=P3^1;//减键
sbit chg_key=P3^2;//转向控制键

//A→AB→B→BC→C→CD→D→DA
uchar code eightStep[] = {0x0d, 0x09, 0x0b, 0x03, 0x07, 0x06,0x0e,0x0c};

uchar k=0;//第几档

//正反转标志位,1正转,0反转
bit rotaFlag = 1; 

//*********************************延时函数*********************************
void delay_ms(uint x)
{
 uint a,b;
 for(a=x;a>0;a--)
for(b=110;b>0;b--);
}

//*********************************加函数*********************************

void checkInc(void)
{
if(inc_key==0)//检测加按键
{
delay_ms(1);//消抖
if(inc_key==0)
{
while(!inc_key);//检测松手
k++;
if(k>6)k=0;
}
}
}

//*********************************减函数*********************************

void checkDec(void)
{
if(dec_key==0)//检测减按键
{
delay_ms(1);
if(dec_key==0)
{
while(!dec_key);
k--;
if(k<0)k=6;
}
}
}

//*********************************主函数********************************* 
void main(void)
{
char i=0;//第几拍

IT0 = 1; //外部中断0,边沿触发
EX0 = 1;
EA = 1;

while(1)
{ 
//检测档位是否改变
checkInc();
checkDec();

switch(k)
{
case 0:P1 = eightStep[i];delay_ms(800);break;//1挡 慢
case 1:P1 = eightStep[i];delay_ms(500);break;//2挡
case 2:P1 = eightStep[i];delay_ms(200);break;//3挡
case 3:P1=0x00;break;//4挡 停止
case 4:P1=eightStep[i];delay_ms(100);break;//5挡
case 5:P1=eightStep[i];delay_ms(50);break;//6挡
case 6:P1=eightStep[i];delay_ms(5);break;//7挡 快
}

if(k!=3)
{
if (rotaFlag)//正
{
i++; 
if(i>7)i=0;
}
else//反
{
i--;
if(i<0)i=7;
}
}

}
}

void Int0(void) interrupt 0
{   
if(chg_key==0)//检测转向控制按键
{
rotaFlag = !rotaFlag;//改变转向
}
}

六、实验小结

本设计作为实验作业,正反转的控制只设置成了人为触发的状态切换;5V供单片机,12V驱动步进电机;通过简单的延时长短改变转速大小,调速效果不太明显,可以通过设置定时器与转速相关参数进一步完善。其中有个小坑,unsigned char变量影响了反转,会减到为负值,改成char变量就没问题了。

你可能感兴趣的:(51单片机)