独立式键盘控制步进电动机实验
一、实验目的
1、了解步进电机的工作原理。
2、学会控制步进电机的速度。
二、实验内容
编写并调试一个程序,按下S1键时,步进电动机正转;按下S2键时,步进电动机反转;按下S3键时,步进电动机停转;
三、实验原理及说明
步进电机是工业过程控制及仪表中常用的控制元件之一,例如在机械装置中可以用丝杆把角度变为直线位移,也可以用步进电机带动螺旋电位器,调节电压或电流,从而实现对执行机械的控制。步进电机可以直接接纯数字信号,不必进行数模转换,用起来非常方便。步进电机还具有快速启停、精确步进和定位等特点,因而在数控机床、绘图仪、打印机以及光学仪器中得到广泛的应用。
步进电机通过控制输入电流形成一个旋转磁场而工作,旋转磁场可以由1相励磁,2相励磁,3相励磁和5相励磁等方式产生。本实验采用的是小型2相励磁步进电动机,有两组励磁线圈是AA、和BB,,应用时,只需要在两组线圈的4个端口分别输入规定的环形脉冲信号,也就是通过控制单片机的P0.0引脚,P0.1引脚,P0.2引脚和P0.3引脚这4个端口的高低电平,就可以指定步进电动机的转动方向。根据下表给出的2相励磁步进电动机正,反转的环形脉冲分配表,让步进电动机正转或反转时,只需将正,反环形脉冲信号送给步进电动机即可;要让电动机停转,只需不给步进电动机输送脉冲信号即可。
表1 2相励磁步进电动机正转的环形脉冲分配表
步数 |
P0.0 |
P0.1 |
P0.2 |
P0.3 |
P0 |
A |
A, |
B |
B, |
1 |
1 |
1 |
0 |
0 |
Oxfc |
2 |
0 |
1 |
1 |
0 |
0xf6 |
3 |
0 |
0 |
1 |
1 |
0xf3 |
4 |
1 |
0 |
0 |
1 |
0xf9 |
表2 2相励磁步进电动机反转的环形脉冲分配表
步数 |
P0.0 |
P0.1 |
P0.2 |
P0.3 |
P0 |
A |
A, |
B |
B, |
1 |
1 |
1 |
0 |
0 |
Oxfc |
2 |
0 |
0 |
0 |
1 |
0xf9 |
3 |
0 |
0 |
1 |
1 |
0xf3 |
4 |
0 |
1 |
1 |
0 |
0xf6 |
四、实验设备
PC机
五、实验方法
1.在Proteus ISIS工作环境中绘制好图1仿真电路图。

图1 仿真电路图
图中步进电动机选用:MOTOR-STEPPER”;功率放大集成电路选用“ULN2003A”;逻辑部件选用“74LS04”
2..在keil软件中编写下列程序。
#include<reg51.h> //包含51单片机寄存器定义的头文件
sbit S1=P1^4; //将S1位定义为P1.4引脚
sbit S2=P1^5; //将S2位定义为P1.5引脚
sbit S3=P1^6; //将S3位定义为P1.6引脚
unsigned char keyval; //储存按键值
unsigned char ID; //储存功能标号
/*************************************************
函数功能:软件消抖延时(约50ms)
**************************************************/
void delay(void){
unsigned char i,j;
for(i=0;i<150;i++)
for(j=0;j<100;j++);
}
/************************************************
函数功能:步进电机转动延时,延时越长,转速越慢
*************************************************/
void motor_delay(void) {
unsigned int i;
for(i=0;i<2000;i++);
}
/************************************************
函数功能:步进电机正转
*************************************************/
void forward( ){
P0=0xfc; //P0口低四位脉冲1100
motor_delay();
P0=0xf6; //P0口低四位脉冲0110
motor_delay();
P0=0xf3; //P0口低四位脉冲0011
motor_delay();
P0=0xf9; //P0口低四位脉冲1001
motor_delay();
}
/************************************************
函数功能:步进电机反转
*************************************************/
void backward(){
P0=0xfc; //P0口低四位脉冲1100
motor_delay();
P0=0xf9; //P0口低四位脉冲1001
motor_delay();
P0=0xf3; //P0口低四位脉冲0011
motor_delay();
P0=0xf6; //P0口低四位脉冲0110
motor_delay();
}
/************************************************
函数功能:步进电机停转
*************************************************/
void stop(void){
P0=0xff ; //停止输出脉冲
}
/*************************************************
函数功能:主函数
**************************************************/
void main(void) {
TMOD=0x01; //使用定时器T0的模式1
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TR0=1; //启动定时器T0
TH0=(65536-500)/256; //定时器T0赋初值,每计数200次(217微秒)发送一次中断请求
TL0=(65536-500)%256; //定时器T0赋初值
keyval=0; //按键值初始化为0,什么也不做
ID=0;
while(1){
switch(keyval) //根据按键值keyval选择待执行的功能
{
case 1:forward(); //按键S1按下,正转
break;
case 2:backward(); //按键S2按下 ,反转
break;
case 3:stop(); //按键S3按下,停转
break;
}
}
}
/*************************************************
函数功能:定时器T0的中断服务子程序
**************************************************/
void Time0_serve(void) interrupt 1 using 1{
TR0=0; //关闭定时器T0
if((P1&0xf0)!=0xf0) //第一次检测到有键按下{
delay(); //延时一段时间再去检测
if((P1&0xf0)!=0xf0) //确实有键按下
{
if(S1==0) //按键S1被按下
keyval=1;
if(S2==0) //按键S2被按下
keyval=2;
if(S3==0) //按键S3被按下
keyval=3;
}
}
TH0=(65536-200)/256; //定时器T0的高8位赋初值
TL0=(65536-200)%256; //定时器T0的低8位赋初值
TR0=1; //启动定时器T0
}
3.程序经Keil软件编译通过后,就可以利用Proteus软件进行仿真了。