单片机实验报告 步进电机

2011301510064 杨闯

【实验目的】

   了解步进电机的工作原理,掌握它的转动控制方式和调速方法。

【实验设备及器件】

IBM PC 机 一台
DP-51PROC 单片机综合仿真实验仪 一台

【实验内容】

1. 编写程序,通过单片机的P1 口控制步进电机的控制端,使其按一定的控制方式进行转动。
    2. 分别采用双四拍(AB→BC→CD→DA→AB)方式、单四拍(A→B→C→D→A)方式和单双八拍(A→AB→B→BC→C→CD→D→DA→A)方式编程,控制步进电机的转动方向和转速。
    3. 观察不同控制方式下,步进电机转动时的振动情况和步进角的大小,比较这几种控制方式的优缺点。


【实验要求】

学会步进电机的工作原理和控制方法,掌握一些简单的控制电路和基本的电机基础知识。

http://www.elecfans.com/article/UploadPic/20##-9/200892217574631972.jpg

【实验步骤】

1.安装C10 区JP6 接口上的短路帽,将C10 区BA、BB、BC、BD与A2 区的P10~P13对应相连。
    2. 打开程序调试软件,下载运行编写好的软件程序,观察步进电机的转动情况。
    3. 修改步进电机的控制程序,再次运行程序,比较它们的不同控制效果。

实验代码】

汇编程序:

BA EQU P1.0

 BB EQU P1.1

 BC EQU P1.2

 BD EQU P1.3

 ORG 0000H

 LJMP MAIN

 ORG 0100H

MAIN:

 MOV SP,#60H

 ACALL DELAY

SMRUN:

 MOV P1,#08H

 ACALL DELAY

 MOV P1,#0CH

 ACALL DELAY

 MOV P1,#04H

 ACALL DELAY

 MOV P1,#06H

 ACALL DELAY

 MOV P1,#02H

 ACALL DELAY

 MOV P1,#03H

 ACALL DELAY

 MOV P1,#01H

 ACALL DELAY

 MOV P1,#09H

 ACALL DELAY

 SJMP SMRUN

DELAY:

 MOV R4,#100

DELAY1:

 MOV R5,#100

 DJNZ R5,$

 DJNZ R4,DELAY1

 RET

 END

C语言程序:

#include <reg51.h>

void delay();

main()

{

while(1)

{

  P1=0x08;

  delay();

  P1=0x0c;

  delay();

  P1=0x04;

  delay();

  P1=0x06;

  delay();

  P1=0x02;

  delay();

  P1=0x03;

  delay();

  P1=0x01;

  delay();

  P1=0x09;

  delay();

}

}

void delay()

{

  unsigned char i,j;

  for(i=0;i<100;i++)

     for(j=0;j<100;j++);

}

【实验结果】

如图所示接线,并且在完成程序的编译和烧录后,单片机上的步进电机开始转动,改变相应的延时和完成的方式,步进电机的转动情况会发生一定的改变,也可以通过P口将步进电机的输入反映到LED灯上,这样就可以观察步进电机的工作原理。

【实验分析】

步进电机是通过给每个端口输入不同的位置,让电机在每个时刻所在的位置不同,然后通过循环实现转动的。如果将循环的次数加以控制,或者将延时边长,就可以看出或者是计算出不同的方式,步进电机每一拍的转动情况,例如单双八拍的步进电机,每一怕所转动的角度就是9度。通过这次实验,掌握了单片机步进电机的工作原理和他的几种不同的工作方式,并且对他的不同工作方式的差异有了自己的想法。

 

第二篇:单片机步进电机驱动程序

这是上次上传的程序的改进版:

#include <AT89X51.h>

static unsigned int count;

static int step_index;

void delay(unsigned int endcount);

void gorun(bit turn, unsigned int speedlevel);

void main(void)

{

count = 0;

step_index = 0;

P1_0 = 0;

P1_1 = 0;

P1_2 = 0;

P1_3 = 0;

EA = 1; //允许CPU中断

TMOD = 0x11; //设定时器0和1为16位模式1 ET0 = 1; //定时器0中断允许

TH0 = 0xFE;

TL0 = 0x0C; //设定时每隔0.5ms中断一次 TR0 = 1; //开始计数

do{

gorun(1,60);

}while(1);

}

//定时器0中断处理

void timeint(void) interrupt 1

{

TH0=0xFE;

TL0=0x0C; //设定时每隔0.5ms中断一次 count++;

}

void delay(unsigned int endcount) {

count=0;

do{}while(count<endcount); }

void gorun(bit turn,unsigned int speedlevel) {

switch(step_index)

{

case 0:

P1_0 = 1;

P1_1 = 0;

P1_2 = 0;

P1_3 = 0;

break;

case 1:

P1_0 = 1;

P1_1 = 1;

P1_2 = 0;

P1_3 = 0;

break;

case 2:

P1_0 = 0;

P1_1 = 1;

P1_2 = 0;

P1_3 = 0;

break;

case 3:

P1_0 = 0;

P1_1 = 1;

P1_2 = 1;

P1_3 = 0;

break;

case 4:

P1_0 = 0;

P1_1 = 0;

P1_2 = 1;

P1_3 = 0;

break;

case 5:

P1_0 = 0;

P1_1 = 0;

P1_2 = 1;

P1_3 = 1;

break;

case 6:

P1_0 = 0;

P1_1 = 0;

P1_2 = 0;

P1_3 = 1;

break;

case 7:

P1_0 = 1;

P1_1 = 0;

P1_2 = 0;

P1_3 = 1;

}

delay(speedlevel);

if (turn==0)

{

step_index++;

if (step_index>7)

step_index=0;

}

else

{

step_index--;

if (step_index<0)

step_index=7;

}

}

改进的代码能实现速度和方向的控制,而且,通过step_index静态全局变量能“记住”步进电机的步进位置,下次调用 gorun()函数时则可直接从上次步进位置继续转动,从而实现精确步进;另外,由于利用了步进电机内线圈之间的“中间状态”,步进角度减小了一半,只为9度,低速运转也相对稳定一些了。程序中还有些不足,还需要继续改进

相关推荐