步进电机概述.docx
《步进电机概述.docx》由会员分享,可在线阅读,更多相关《步进电机概述.docx(12页珍藏版)》请在冰点文库上搜索。
步进电机概述
步进电机概述
1.1步进电机的特点:
1)一般步进电机的精度为步进角的3-5%,且不累积。
2)步进电机外表允许的温度高。
步进电机温度过高首先会使电机的磁性材料退磁,从而导致力矩下降乃至于失步,因此电机外表允许的最高温度应取决于不同电机磁性材料的退磁点;一般来讲,磁性材料的退磁点都在摄氏130度以上,有的甚至高达摄氏200度以上,所以步进电机外表温度在摄氏80-90度完全正常。
3)步进电机的力矩会随转速的升高而下降。
当步进电机转动时,电机各相绕组的电感将形成一个反向电动势;频率越高,反向电动势越大。
在它的作用下,电机随频率(或速度)的增大而相电流减小,从而导致力矩下降。
4)步进电机低速时可以正常运转,但若高于一定速度就无法启动,并伴有啸叫声。
步进电机有一个技术参数:
空载启动频率,即步进电机在空载情况下能够正常启动的脉冲频率,如果脉冲频率高于该值,电机不能正常启动,可能发生丢步或堵转。
在有负载的情况下,启动频率应更低。
如果要使电机达到高速转动,脉冲频率应该有加速过程,即启动频率较低,然后按一定加速度升到所希望的高频(电机转速从低速升到高速)。
1.2步进电机的工作原理:
步进电机是一种用电脉冲进行控制,将电脉冲信号转换成相位移的电机,其机械位移和转速分别与输入电机绕组的脉冲个数和脉冲频率成正比,每一个脉冲信号可使步进电机旋转一个固定的角度.脉冲的数量决定了旋转的总角度,脉冲的频率决定了电机运转的速度.当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度一步一步运行的。
可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
本次设计所采用的电机型号:
28bjy-48四相五线微型步进电机
该步进电机为一四相步进电机,采用单极性直流电源供电。
只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。
图1是该四相反应式步进电机工作原理示意图。
图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方向转动。
四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。
单四拍与双四拍的步距角相等,但单四拍的转动力矩小。
八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。
单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图2.a、b、c所示:
a.单四拍 b.双四拍 c八拍
图2.步进电机工作时序波形图
第2章方案的论证
2.1控制方式的确定
步进电机控制虽然是一个比较精确的,步进电机开环控制系统具有成本低、简单、控制方便等优点,在采用单片机的步进电机开环系统中,控制系统送控制字的间隔和送控制字的顺序实际上就是控制步进电机的运行速度。
系统可用两种办法实现步进电机的速度控制。
一种是延时,一种是定时。
延时方法是在每次按键之后调用一个延时子程序,待延时结束后再次送控制字,这样周而复始就可发出一定频率的CP脉冲。
该方法简单,占用资源少,全部由软件实现,调用不同的子程序可以实现不同速度和不同方向的运行。
但占用CPU时间长,不能在运行时处理其他工作。
因此只适合较简单的控制过程。
定时方法是利用单片机系统中的定时器定时功能产生任意周期的定时信号,从而可方便的控制系统输出CP脉冲的周期。
当定时器启动后,定时器从装载的初值开始对系统及其周期进行加计数,当定时器溢出时,定时器产生中断,系统转去执行定时中断子程序将电机换向子程序放在定时中断服务程序中,定时中断一次,电机换向一次,从而实现电机的速度控制。
2.1.1脉冲序列的生成
脉冲幅值:
由数字元件电平决定。
TTL0~5V
CMOS0~10V
接通和断开时间可用延时的办法控制。
要求:
确保步进到位。
2.1.2方向控制
步进电机旋转方向与内部绕组的通电顺序相关。
四相八拍,通电顺序为:
正转:
A®AB®B®BC®C®CD®D®DA
反转:
A®AD®D®DC®C®CB®B®BA
改变通电顺序可以改变步进电机的转向
2.2脉冲分配
实现脉冲分配(也就是通电换相控制)的方法有两种:
软件法和硬件法。
本次设计采用软件法。
2.2.1通过软件实现脉冲分配
软件法是完全用软件的方式,按照给定的通电换相顺序,通过单片机的IO向驱动电路发出控制脉冲,下面以四相八拍为例
上面提到了三相六拍工作方式通电换相得正序为A-AB-B-BC-C-CD-D-DA-A,,反序为A-AD-D-DC-C-CB-B-BA-A
2.3驱动方式的确定
用于步进电机的驱动一般有两种方法,一种是通过CPU直接来驱动,这种方法一般不宜采用,因为CPU的输出电流脉冲是特别小的它不能足以让步进电机的转动;别一种是通过CPU来间接驱动,就是把从CPU输出的信号进行放大,然后直接驱动或是再通过光电隔离间接来驱动步进电机,这种方法比较安全可靠。
固本次设计应采用CPU间接驱动步进电机。
2.4驱动电路的选择
由于单片机接口信号不够大需要通过ULN2803放大再连接到相应的电机接口,ULN2803属于高电压大电流8达林顿晶体管系列,该阵列系列中的八NPN达林顿连接晶体管是低逻辑电平数字电路(如TTL,CMOS或PMOS/NMOS)和大电流高电压要求的灯、继电器、打印机锤和其他类似负载间的接口的理想器件。
广泛用于计算机,工业消费类产品中。
所用器件有集电极开路输出和用于瞬变抑制的续流钳位二极管。
2.5基本方案的确定
因本次设计的要求,选用四相八拍步进电机,单片机选用89C51作为控制器。
选取用4511来驱动LED段选,7406作为LED位选驱动以显示电机转速。
选用2803作为步进电机的驱动芯片。
系统原理框图如下所示:
第3章硬件电路的设计
3.1单片机的选择
本次设计以CPU选用89C5l作为步进电机的控制芯片.89C51的结构简单并可以在编程器上实现闪烁式的电擦写达几万次以上.使用方便等优点,而且完全兼容MCS5l系列单片机的所有功能。
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FAlshProgrAmmABleAndErAsABleReAdOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案
3.引脚介绍
VCC(40脚):
接+5V电源正端。
VSS(20脚):
接+5V电源地端。
XTAL1(19脚):
接外部石英晶体的一端。
在单片机内部,它是一个反相放大器的输入端,这个放大器构成了片内振荡器。
当采用外部时钟时,对于HMOS单片机,该引脚接地;对于CHMOS单片机,该引脚作为外部振荡信号的输入端。
P0口(39~32脚):
P0.0~P0.7统称为P0口。
在不接片外存储器与不扩展I/O口时,可作为准双向输入/输出口。
在接有片外存储器或扩展I/O口时,P0口分时复用为低8位地址总线和双向数据总线。
P1口(1~8脚):
P1.0~P1.7统称为P1口,可作为准双向I/O口使用。
对于52子系列,P1.0与P1.1还有第二功能:
P1.0可用作定时器/计数器2的计数脉冲输入端T2,P1.1可用作定时器/计数器2的外部控制端T2EX。
P2口(21~28脚):
P2.0~P2.7统称为P2口,一般可作为准双向I/O口使用;在接有片外存储器或扩展I/O口且寻址范围超过256字节时,P2口用作高8位地址总线。
P3口(10~17脚):
P3.0~P3.7统称为P3口。
除作为准双向I/O口使用外,还可以将每一位用于第二功能,而且P3口的每一条引脚均可独立定义为第一功能的输入输出或第二功能。
P3口的第二功能如表2.1所示。
3.2LED显示电路设计
LED使用4511驱动,CD4511是一个用于驱动共阴极LED(数码管)显示器的BCD码—七段码译码器,特点如下:
具有BCD转换、消隐和锁存控制、七段译码及驱动功能的CMOS电路能提供较大的拉电流。
可直接驱动LED显示器。
CD4511是一片CMOSBCD—锁存/7段译码/驱动器,引脚排列如图3—2所示。
其中abcd为BCD码输入,a为最低位。
LT为灯测试端,加高电平时,显示器正常显示,加低电平时,显示器一直显示数码“8”,各笔段都被点亮,以检查显示器是否有故障。
BI为消隐功能端,低电平时使所有笔段均消隐,正常显示时,B1端应加高电平。
另外CD4511有拒绝伪码的特点,当输入数据越过十进制数9(1001)时,显示字形也自行消隐。
LE是锁存控制端,高电平时锁存,低电平时传输数据。
a~g是7段输出,可驱动共阴LED数码管。
另外,CD4511显示数“6”时,a段消隐;显示数“9”时,d段消隐,所以显示6、9这两个数时,字形不太美观图3-1是CD4511和AT89C51配合而成一位计数显示电路,若要多位计数,只需将计数器级联,每级输出接一只CD4511和LED数码管即可。
所谓共阴LED数码管是指7段LED的阴极是连在一起的,在应用中应接地。
限流电阻要根据电源电压来选取,电源电压5V时可使用300Ω的限流电阻。
#include"STC12C5A60S2.H"
#include"uart_1.h"
#include"ds18b20.h"
#include"key_scan.h"
#include"steepmotor.h"
//弧度(角度)与频率的比例关系
#defineN_Value0.0061328125//0.61328125=5.625*(1/16)*3.1415926/180
//步进电机正反转相序表
unsignedcharcodeMoter_Z[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x0d};
//共阳极数码管编码表(0--9)
unsignedcharcodeLED_Dis[10]={0XC0,0XF9,
0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
//控制电机的启动与停止
unsignedcharStart_Flag=0;
//DS18B20温度
unsignedcharTemperture;
//速度计数器
signedintRPM_Conter=500;
//显示切换控制标志
unsignedcharDis_Flag=0;
//保存ADC转换的结果(10位AD)
externvolatileunsignedintADC_Value;
//软件延时函数(毫秒级延时)
voidDelay_ms(unsignedintt)//@11.0592MHz
{
unsignedinti,j;
for(i=t*8;i>0;i--)
for(j=110;j>0;j--);
}
//DS18B20温度检测显示
voidTemperture_Value_Display(unsignedintM_Value)
{
P0=LED_Dis[M_Value/100];
P2|=0x70;//P2.4/P2.5/P2.6清零
P2&=~0x10;//选通数码管1
Delay_ms(5);//延时5ms--消除重影
P0=LED_Dis[M_Value%100/10]&0x7F;//小数点
P2|=0x70;//P2.4/P2.5/P2.6清零
P2&=~0x20;//选通数码管2
Delay_ms(12);//延时12ms--消除重影
P0=LED_Dis[M_Value%10];
P2|=0x70;//P2.4/P2.5/P2.6清零
P2&=~0x40;//选通数码管3
//Delay_ms(5);//延时5ms--消除重影
}
//步进电机转角弧度显示
voidSteepMotor_Rad_Display(unsignedintM_Value)
{
floatRad_Value=0;
Rad_Value=M_Value*N_Value*100;
M_Value=(unsignedint)Rad_Value;
P0=LED_Dis[M_Value/100]&0x7F;
P2|=0x70;//P2.4/P2.5/P2.6清零
P2&=~0x10;//选通数码管1
Delay_ms(4);//延时5ms--消除重影
P0=LED_Dis[M_Value%100/10];//小数点
P2|=0x70;//P2.4/P2.5/P2.6清零
P2&=~0x20;//选通数码管2
Delay_ms(4);//延时12ms--消除重影
P0=LED_Dis[M_Value%10];
P2|=0x70;//P2.4/P2.5/P2.6清零
P2&=~0x40;//选通数码管3
//Delay_ms(5);//延时5ms--消除重影
}
voidmain()
{
Uart1_Init();//串口1初始化--9600bps
//Delay_Init();//精确延时初始化/定时器延时
//ADC_Init();//ADC转换初始化
init_ds18b20();
Key_Scan_Init();//按键扫描初始化
Steep_Motor_Init();//步进电机驱动初始化
while
(1)
{
//温度读取部分
Temperture=read_tempreature();
//按键扫描部分
if(!
S2)//按下按键S2
{
Start_Flag=!
Start_Flag;
if(Start_Flag)
{
Start_SteepMotor();//启动电机
}
else
{
Stop_SteepMotor();//停止电机
}
while(!
S2);//等待释放按键
}
elseif(!
S3)//按下按键S3
{
RPM_Conter+=100;//每次增加100Hz
if(RPM_Conter>=1000)
{
RPM_Conter=1000;
}
Set_Motor_RPM(RPM_Conter);//速度设定
while(!
S3);//等待释放按键
}
elseif(!
S4)//按下按键S4
{
RPM_Conter-=100;//每次减少100Hz
if(RPM_Conter<=100)
{
RPM_Conter=100;
}
Set_Motor_RPM(RPM_Conter);//速度设定
while(!
S4);//等待释放按键
}
elseif(!
S5)//按下按键S5
{
Dis_Flag=!
Dis_Flag;
while(!
S5);//等待释放按键
}
//温度与转速显示部分
if(Dis_Flag)
{
SteepMotor_Rad_Display(RPM_Conter);//转速显示
}
else
{
Temperture_Value_Display(Temperture);//温度显示
}
//Delay_ms(1000);//延时Xms
}
}