步进电机的控制与测速

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

步进电机控制与测速

姓名:竹玉书

学号:02008513

指导老师:李超彪

一、实践环节任务与要求

选题:步进电机控制与测速

设备:可编程并行接口8255,可编程定时计数器8253,控制开关,步进电机,光耦合器

要求:1.通过开关K0~K6设置不同的转速,开关K7设置电机的转向。

2.利用定时器8253计数,测速。

二、实验原理

1.步进电机的控制原理:

步进电机驱动原理是通过对每相线圈中的电流的顺序切换使电机作

步进式旋转驱动电路由脉冲信号来控制,所以调节脉冲信号频率便可

改变步进电机的转速。

如图所示:

本实验使用的步进电机用直流+5V电压,电机线圈由四相成:

φ1(BA);φ2(BB);φ3(BC);φ4(BD)

8253定时器0确定脉冲改变的频率(工作方式3,控制字00110110,CLK0=1MHZ,初值=200则OUT0输出周期为200μs的脉冲),由8255(工作方式0,控制字 10001011)查询定时时间是否到,输出相应的脉冲,以实现转速控制。

2.步进电机的测速原理:

在电机转动时,光电传感器每转输出6个脉冲,8253的定时器1负责计数,以测速。设计程序当OUT0出现高电平则计数一次,当计数达到50000次则计算并显示一次速度。显示间隔时间=100μs 50000=5s

三、硬件接线图

四、程序框图

主函数:

测速子函数:

五、源程序

程序源代码如下:

(含注解)

/******************/

/* 步进电机*/

/******************/

#include

#include

#include "ApiEx.h"

#pragma comment(lib,"ApiEx.lib") #define 8255A 0x290

#define 8255B 0x291

#define 8255C 0x292

#define 8255CTL 0x293

#define 82530 0x280

#define 82531 0x281

#define 82532 0x282

#define 8253CTL 0x283

static unsigned int c=0;

static unsigned int a=0,b;

void Payoff(int d) // 延时测速

{

static BYTE x=0,y=0;

static BYTE z;

while(d)

{

do

{

PortReadByte(8255B,&y); //读OUT0输出状态即PB0状态

y &= 0x01;

} while((x^y)==0);

x=y;

c++; // 每当出现高电平则计数一次

if(c==50000)

{

PortReadByte(82531,&z); //读8253计时器1记录的脉冲数低八位

b=z;

PortReadByte(82531,&z); //读8253计时器1记录的脉冲数高八位

b=b+z*256;

if(b

// 计算速度(初值未减完)else printf("the speed is :%fr/min\n",(-b+a+1024)/2.0);

// 计算速度(初值已减完)a=b;

c=0;

}

d--;

}

}

void main()

{

BYTE data,x;

int buf = 0x33,d; // 设置buff则表示线圈初始相为0011

printf("--------------------EXP27_19_BJDJ---------------------\n");

printf("1. 8255 (PA0-PA3) === BJDJ (BA-BD)\n");

printf("2. I/O (288-28F) === 8255 (CS)\n");

printf("3. 8255 (PC0-PC7) === TPC (K0-K7)\n");

printf("4. BJDJ (J5) === (BJDJ)\n");

printf("Press any key to begin!\n\n");

getch();

printf("K0-K6 are speed control \n");

printf("K0 is the lowest speed \n");

printf("K6 is the highest speed \n");

printf("K7 is the direct control \n");

printf("press any key to return! \n");

if(!Startup()) /*打开设备*/

{

printf("ERROR: Open Device Error!\n");

return;

}

PortWriteByte(8255CTL,0x8b); /*设置8255工作方式,C口输入, A口输出*/ PortWriteByte(8253CTL,0x16); //设置8253计数器0控制字00010110 PortWriteByte(8253CTL,0x76); //设置8253计数器1控制字01110110 PortWriteByte(82530,200); //设置8253计数器0初值为200

PortWriteByte(82531,00); //设置8253计数器1初值低八位

PortWriteByte(82531,0x04); //设置8253计数器1初值高八位

while(!kbhit())

{

PortReadByte(8255C,&data); //判断8255C口状态

if (data & 1) d =1200; //设置K0延时时间

else if (data & 2) d = 100; //设置K1延时时间

else if (data & 4) d = 900; //设置K2延时时间

else if (data & 8) d =800; //设置K3延时时间

else if (data & 16) d = 700; //设置K4延时时间

else if (data & 32) d = 500; //设置K5延时时间

else if (data & 64) d = 300; //设置K6延时时间

else d = 0;

if (d != 0)

{

Payoff(d); // 调用延时测速程序

if (data & 128) // 判断K7状态

buf = ((buf&1)<<7)|(buf>>1); //线圈相位变为1001,顺时针转动else

buf = ((buf&128)>>7)|(buf<<1);//线圈相位变为0110,顺时针转动PortWriteByte(8255A,buf); //从8255A口输出

}

else

PortWriteByte(8255A,0xff);

相关文档
最新文档