实验课程

THIS NAME

实验课程

当前位置: 首页 >> 实验课程 >> 正文

单片机原理及应用-独立式键盘控制步进电动机实验

发布日期:2024-03-04    作者:王娟     来源:     点击:

独立式键盘控制步进电动机实验

一、实验目的

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软件进行仿真了。

 

上一条:单片机原理及应用-流水灯实验 下一条:单片机原理及应用-定时器实验

关闭