单片机控制步进电机正反转
两相六线步进电机,步进角7.5度,额定工作电压12V,完全可以使用5V做实验。
以下是引用 gguoqing 在2006-6-11 15:10:02的发言: 使用伟纳定做的20CM杜邦头实验连接线,可以很方便的将ME300与步进电机模块连接起来。 http://www.willar.com/shop_view.asp?id=47 在ME300B上使用时,可从J7上引出5V电源到步进电机模块J1上。 将J1(ICE)上的P1.0-P1.3用杜邦头实验连接线连接到步进电机模块J2上。 |
产品详情:
http://www.willar.com/shop_view.asp?id=48。
以下是本站管理员gguoqing专门编写的演示程序。
C语言范例:
/*******************************************************************
/*
/* ME300系列单片机开发系统演示程序-步进电机键控正反转实验
/*
/* 邮箱: gguoqing@willar.com
/* 网站:http://www.willar.com;
/* 作者: gguoqing
/* 时间: 2006/05/30
/*
/*【版权】COPYRIGHT(C)伟纳电子www.willar.comALL RIGHTS RESERVED
/*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
/*
/******************************************************************/
#include
#include
#define uchar unsigned char
#define uintunsigned int
uchar co
uchar co
sbitK1 = P1^4; //正转
sbitK2 = P1^5; //反转
sbitK3 = P1^6;
sbitK4 = P1^7; //停止
sbitBEEP = P3^7; //蜂鸣器
/********************************************************/
/*
/* 延时t毫秒
/* 11.0592MHz时钟,延时约1ms
/*
/********************************************************/
void delay(uint t)
{
uint k;
while(t--)
{
for(k=0; k<125; k++)
{ }
}
}
/**********************************************************/
void delayB(uchar x)//x*0.14MS
{
uchar i;
while(x--)
{
for (i=0; i<13; i++)
{ }
}
}
/**********************************************************/
void beep()
{
uchar i;
for (i=0;i<100;i++)
{
delayB(4);
BEEP=!BEEP; //BEEP取反
}
BEEP=1;//关闭蜂鸣器
}
/********************************************************/
/*
/*步进电机正转
/*
/********************************************************/
voidmotor_ffw()
{
uchar i;
uintj;
for (j=0; j<12; j++)//转1*n圈
{
if(K4==0)
{break;}//退出此循环程序
for (i=0; i<8; i++) //一个周期转30度
{
P1 = FFW[ i ];//取数据
delay(15); //调节转速
}
}
}
/********************************************************/
/*
/*步进电机反转
/*
/********************************************************/
voidmotor_rev()
{
uchar i;
uintj;
for (j=0; j<12; j++) //转1×n圈
{
if(K4==0)
{break;} //退出此循环程序
for (i=0; i<8; i++)//一个周期转30度
{
P1 = REV[ i ];//取数据
delay(15); //调节转速
}
}
}
/********************************************************
*
*主程序
*
*********************************************************/
main()
{
uchar r,N=5; //N 步进电机运转圈数
while(1)
{
if(K1==0)
{
beep();
for(r=0;r
{
motor_ffw(); //电机正转
if(K4==0)
{beep();break;}//退出此循环程序
}
}
else if(K2==0)
{
beep();
for(r=0;r
{
motor_rev(); //电机反转
if(K4==0)
{beep();break;}//退出此循环程序
}
}
else
P1 = 0xf0;
}
}
汇编语言范例
;/*****************************************************************
;/*
;/* ME300系列单片机开发系统演示程序 - 步进电机键控正反转实验
;/*
;/*
;/* 邮箱:gguoqing@willar.com
;/* 网站:http://www.willar.com;
;/* 作者: gguoqing
;/* 时间: 2006/05/30
;/*
;/*【版权】Copyright(C)伟纳电子www.willar.comAll Rights Reserved
;/*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
;/*
;/******************************************************************
; 步进电机步进角为 7.5度,一圈 360 度。
; 双四拍工作方式:
; AB-BC-CD-DA (即一个脉冲,转 7.5 度)
; 单双八拍工作方式:
; A-AB-B-BC-C-CD-D-DA (即一个脉冲,转 3.75 度)
; 一个取数工作周期,步进电机转30度
; 步进电机转一圈需要12个取数工作周期
;-------------------------------------------------------
; A组线圈对应 P1.0(桔色)
; B组线圈对应 P1.1(棕色)
; C组线圈对应 P1.2(黄色)
; D组线圈对应 P1.3(黑色)
;-------------------------------------------------------
K1BITP1.4 ;步进电机正转
K2BITP1.5 ;步进电机反转
K3BITP1.6
K4BITP1.7 ;步进电机停止转动
BEEPBITP3.7
;-------------------------------------------------------
ORG 0000H
LJMP MAIN
ORG 0030H
;-------------------------------------------------------
MAIN:
MOVSP,#60H
MOVP1,#0F0H ;关闭步进电机,键输入线置高
MAIN1:
JBK1,MAIN2
ACALLBEEP_BL ;步进电机正转
ACALLFFW
MAIN2:
JBK2,MAIN1
ACALLBEEP_BL ;步进电机反转
ACALLREV
JMPMAIN1
;------------------------正转-------------------------
FFW:
;MOV R3,#12 ;7.5度电机正转1圈共12个周期
MOVR3,#60 ;转5圈
FFW1:
MOV R0,#00H
FFW2:
JBK4,FFW3 ;终止步进电机运行
ACALLBEEP_BL
JMPFFW4
FFW3:
MOV P1,#0F0H
MOV A,R0
;MOV DPTR,#TABLE_F;选择工作方式
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV P1,A
LCALL DELAY
INC R0
CJNEA,#0FFH,FFW2
DJNZ R3,FFW1
FFW4:
MOV P1,#0F0H
RET
;---------------------------反转--------------------------
REV:
;MOV R3,#12 ;7.5度电机反转1圈共12个周期
MOVR3,#60 ;转5圈
REV1:
MOV R0,#00H
REV2:
JBK4,REV3;终止步进电机运行
ACALLBEEP_BL
JMPREV4
REV3:
MOV P1,#0F0H
MOV A,R0
; MOV DPTR,#TABLE_R ;选择工作方式
MOV DPTR,#TABLE2
MOVC A,@A+DPTR
MOV P1,A
CALL DELAY
INC R0
CJNEA,#0FFH,REV2
DJNZ R3,REV1
REV4:
MOV P1,#0F0H
RET
;-------------------------------------------------------
DELAY:
MOV R7,#40 ;步进电机的转速
DEL1:MOV R6,#248
DJNZ R6,$
DJNZ R7,DEL1
RET
;-------------------------------------------------------
DELAY1:
MOV R5,#20 ;2S 延时子程序
DEL2:
MOV R7,#200
DEL3:
MOV R6,#250
DJNZR6,$
DJNZR7,DEL3
DJNZR5,DEL2
RET
;-------------------------------------------------------
; 单双八拍工作方式
TABLE_F:;正转表
DB0F1H,0F3H,0F2H,0F6H,0F4H,0FCH,0F8H,0F9H
DB0FFH
TABLE_R:;反转表
DB0F9H,0F8H,0FCH,0F4H,0F6H,0F2H,0F3H,0F1H
DB0FFH
;-------------------------------------------------------
; 双四拍工作方式:
TABLE1:
DB 0F3H,0F6H,0FcH,0F9H;正转表
DB 0FFH;正转结束
TABLE2:
DB 0F9H,0FCH,0F6H,0F3H;反转表
DB 0FFH;反转结束
;--------------------------------------------------------
;蜂鸣器响一声子程序
;--------------------------------------------------------
BEEP_BL:
MOVR6,#100
BL1:
CALLDEX1
CPLBEEP
DJNZR6,BL1
RET
DEX1:
MOVR7,#180
DEX2:
NOP
DJNZR7,DEX2
RET
;---------------------------------------------------------
END
四相步进电机:
齿距角: Qz = 2π/ Z Z --- 转子的齿数
步距角---转子走一步所转过的角度
步距角: Qn = Qz/N = 2π/NZN --- 步进电机工作拍数
步进电机转速:
n = 60×f / N×Z (转/分); f =脉冲频率(Hz)
对于步距角为7.5度的步进电机而言:
Qn = 7.5度
Qz = Qn×N = 7.5×4=30度 (齿距角)
Z=2π/Qz = 360/30 = 12 (转子的齿数)
四相步进电机有三种运行状态:
1、步进电机为四相单四拍运行状态:
当电机绕组通电时序为A-B-C-D时为正转,通电时序为D-C-B-A时为反转。
N = 4
步距角: Qn = Qz/N = 2π/NZ =360/4*12=7.5°
则步进电机转一圈所需步进数: 360°/7.5°=48 (步进数)
2、步进电机为四相双四拍运行状态:
当电机绕组通电时序为AB-BC-CD-DA时为正转,通电时序为DA-CD-BC-AB时为反转。
N = 4
步距角: Qn = Qz/N = 2π/NZ =360/4*12=7.5°
则步进电机转一圈所需步进数: 360°/7.5°=48 (步进数)
3、步进电机为四相八拍运行状态。
当电机绕组通电时序为A-AB-B-BC-C-CD-D-DA时为正转,通电时序为DA-D-CD-C-BC-B-BA-A时为反转。
N = 8
步距角: Qn = Qz/N = 2π/NZ =360/8*12=3.75°
则步进电机转一圈所需步进数: 360°/3.75°=96 (步进数)
评论