一、实验目的:
了解步进电机工作原理,掌握用单片机的步进电机控制系统的硬件设计方法,熟悉步进电机驱动程序的设计与调试,提高单片机应用系统设计和调试水平。
二、实验内容:
步进电机加减速及其正反转控制,转速显示。
三、工作原理
步进电机是工业过程控制及仪表中常用的控制元件之一,例如在机械装置中可以用丝杠把角度变为直线位移,也可以用步进电机带螺旋电位器,调节电压或电流,从而实现对执行机构的控制。步进电机可以直接接收数字信号,不必进行数模转换,用起来非常方便。步进电机还具有快速启停、精确步进和定位等特点,因而在数控机床、绘图仪、打印机以及光学仪器中得到广泛的应用。
步进电机实际上是一个数字/角度转换器,三相步进电机的结构原理如图所示。从图中可以看出,电机的定子上有六个等分磁极,A、A′、B、B′、C、C ′,相邻的两个磁极之间夹角为60°,相对的两个磁极组成一相(A-A′,B-B′,C-C′),当某一绕组有电流通过时,该绕组相应的两个磁极形成N极和S极,每个磁极上各有五个均匀分布矩形小齿,电机的转子上有40个矩形小齿均匀地分布的圆周上,相邻两个齿之间夹角为9°。
当某一相绕组通电时,对应的磁极就产生磁场,并与转子形成磁路,如果这时定子的小齿和转子的小齿没有对齐,则在磁场的作用下,转子将转动一定的角度,使转子和定子的齿相互对齐。由此可见,错齿是促使步进电机旋转的原因。
三相步进电机结构示意图
例如在三相三拍控制方式中,若A相通电,B、C相都不通电,在磁场作用下使转子齿和A相的定子齿对齐,我们以此作为初始状态。设与A相磁极中心线对齐的转子的齿为0号齿,由于B相磁极与A相磁极相差120°,不是9°的整数倍(120÷9=40/3),所以此时转子齿没有与B相定子的齿对应,只是第13号小齿靠近B相磁极的中心线,与中心线相差3°,如果此时突然变为B相通电,A、C相不通电,则B相磁极迫使13号转子齿与之对齐,转子就转动3°,这样使电机转了一步。如果按照A→B→C的顺序轮流通电一周,则转子将动9°。
步进电机的运转是由脉冲信号控制的,传统方法是采用数字逻辑电路——环形脉冲分配器控制步进电机的步进。 下图为环形脉搏冲分配器的简化框图。
三相六拍环形脉搏冲分配器
①运转方向控制。如图所示,步进电机以三相六拍方式工作,若按A→AB→B→BC→C→CA→A次序通电为正转,则当按A→AC→C→CB→B→BA→A次序通电为反转。
②运转速度的控制。图中可以看出,当改变CP脉冲的周期时,ABC三相绕组高低电平的宽度将发生变化,这就导至通电和断电的变化的速率发生了变化,使电机转速改变,
所以调节CP脉冲的周期就可以控制步进电机的运转速度。
③旋转的角度控制。因为每输入一个CP脉冲使步进电机三相绕组状态变化一次,并相应地旋转一个角度,所以步进电机旋转的角度由输入的CP脉冲数确定。
G2010实验仪选用的是20BY-0型4相步进电机,其工作电压为4.5V,在双四拍运行方式时,其步距角为18O ,相直流电阻为55Ω,最大静电流为80Ma。采用8031单片机控制步进电机的运转,按四相四拍方式在P1口输出控制代码,令其正转或反转。因此P1口输出代码的变化周期T控制了电机的运转速度:
n=60/T.N
式中:n —— 步进电机的转速(转/分);
N —— 步进电机旋转一周需输出的字节数;
T —— 代码字节的输出变化周期。
设N=360°/ 18°=20,T=1.43ms,则步进电机的转速为2100转/分。
控制P1口输出的代码字节个数即控制了步进电机的旋转角度。
四、实验器材:
51单片机最小系统板一个,G2010实验仪中的20BY-0型4相步进电机一个,四位一体共阴极数码管一个,独立按键三个。
五、实验过程:
硬件电路图:
最小系统与独立按键、数码管显示电路图
步进电机电路图
按键:K1为正反转切换键 k2为转速加按键 k3为转速减键
显示:共阴极数码管三位整数显示转速,顺时针为正转,首位灭零;逆时针为反转,首位为负
理论调速范围:1~100r/min
六、实验总结
程序清单:
/*本程序为步进电机控制程序
步进电机步距角18°P1口低四位输出控制
数码管共阴极 P0为数据口 P20~P22 为位选 个位~百位 p23为正反转位 反转为负号
三个独立按键P24~26减加正反转切换键*/
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit sum=P2^4; //加
sbit inc=P2^5; //减
sbit change=P2^6; //正反转
uchar code sled[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40};//共阴极数码表
uchar code xx[4]={0x01,0x02,0x04,0x08}; //正时钟旋转相序表
uchar speed[4]={0}; //转速显示数据 个十百千位 正反转标志
uchar speeder=5; //转速标志位 用于转速的改变和计算
uchar jj_speed; //电机转动转速控制位
uchar jj; //电机脉冲给定计数位
uchar ii; //数码管显示控制
uchar ledwx=0x7f; //数码管位选端
bit floag=1;//电机正反转标志,1正转0反转
/*******************************/
void delay() //延时电路 10ms
{
uint i,j;
for(i=10;i>0;i--)
for(j=114;j>0;j--);
}
/*******************************/
void init() //程序初始化 开定时器中断
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-4608)/256; //定时5ms中断
TL0=(65536-4608)%256;
TR0=1;
}
/*******************************/
void t0_time() interrupt 1
{
TH0=(65536-4608)/256; //定时5ms中断
TL0=(65536-4608)%256;
jj_speed++;
ledwx=_crol_(ledwx,1);
P2=0xff; //数码管全灭
P0=sled[speed[ii++]]; //送数据
P2=ledwx; //点亮一个数码管
if(ledwx==0xf7)
{
ledwx=0x7f;
ii=0;
}
if((jj_speed/2)==speeder)
{
if(floag) //电机正转
{
if(jj==4)
jj=0;
P1=xx[jj++];
}
else //电机反转
{
if(jj==0)
jj=4;
P1=xx[--jj];
}
jj_speed=0;
}
}
/*******************************/
void count() //转速显示各数位的计算
{
uint n=0;
n=300/speeder; //转速
speed[0]=n%10;
speed[1]=(n/10)%10;
speed[2]=n/100;
if(floag)
speed[3]=10;
else
speed[3]=11;
}
/*******************************/
void main()
{
init(); //初始化
count();
while(1)
{
sum=1;
if(sum==0) //是否为加键按下
{
delay();
if((sum==0)&&(speeder<300))
{
speeder++;
count(); //修改参数
}
while(sum==0); //等键释放
}
inc=1;
if(inc==0) //是否为减键按下
{
delay();
if((inc==0)&&(speeder>3))
{
speeder--;
count();
}
while(inc==0); //等键释放
}
change=1; if(change==0) //是否为正反转键按下
{
delay();
if(change==0)
floag=~floag;
count();
while(change==0);
}
}
}