步进电机的控制与测速Word文档下载推荐.docx
- 文档编号:20315249
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:9
- 大小:127.48KB
步进电机的控制与测速Word文档下载推荐.docx
《步进电机的控制与测速Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《步进电机的控制与测速Word文档下载推荐.docx(9页珍藏版)》请在冰豆网上搜索。
本实验使用的步进电机用直流+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<
stdio.h>
conio.h>
#include"
ApiEx.h"
#pragmacomment(lib,"
ApiEx.lib"
)
#define8255A0x290
#define8255B0x291
#define8255C0x292
#define8255CTL0x293
#define825300x280
#define825310x281
#define825320x282
#define8253CTL0x283
staticunsignedintc=0;
staticunsignedinta=0,b;
voidPayoff(intd)//延时测速
{
staticBYTEx=0,y=0;
staticBYTEz;
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;
//读8253计时器1记录的脉冲数高八位
b=b+z*256;
if(b<
a)printf("
thespeedis:
%fr/min\n"
(-b+a)/2.0);
//计算速度(初值未减完)
elseprintf("
(-b+a+1024)/2.0);
//计算速度(初值已减完)
a=b;
c=0;
}
d--;
}
voidmain()
BYTEdata,x;
intbuf=0x33,d;
//设置buff则表示线圈初始相为0011
printf("
--------------------EXP27_19_BJDJ---------------------\n"
);
1.8255(PA0-PA3)===BJDJ(BA-BD)\n"
2.I/O(288-28F)===8255(CS)\n"
3.8255(PC0-PC7)===TPC(K0-K7)\n"
4.BJDJ(J5)===(BJDJ)\n"
Pressanykeytobegin!
\n\n"
getch();
K0-K6arespeedcontrol\n"
K0isthelowestspeed\n"
K6isthehighestspeed\n"
K7isthedirectcontrol\n"
pressanykeytoreturn!
\n"
if(!
Startup())/*打开设备*/
printf("
ERROR:
OpenDeviceError!
\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延时时间
elseif(data&
2)d=100;
//设置K1延时时间
4)d=900;
//设置K2延时时间
8)d=800;
//设置K3延时时间
16)d=700;
//设置K4延时时间
32)d=500;
//设置K5延时时间
64)d=300;
//设置K6延时时间
elsed=0;
if(d!
=0)
{
Payoff(d);
//调用延时测速程序
if(data&
128)//判断K7状态
buf=((buf&
1)<
<
7)|(buf>
>
1);
//线圈相位变为1001,顺时针转动
else
128)>
7)|(buf<
//线圈相位变为0110,顺时针转动
PortWriteByte(8255A,buf);
//从8255A口输出
}
else
PortWriteByte(8255A,0xff);
Cleanup();
/*关闭设备*/
六、结论
实验实现了步进电机的控制和测速,通过开关k0-k5设置不同的转速,K7设置电机的转向,8253定时器0确定脉冲改变的频率,由8255查询定时时间是否到,输出相应的脉冲,以实现转速控制。
在电机转动时,光电传感器每转输出6个脉冲,8253的定时器1,2负责计数,以测速。
通过8255的C口输入不同的延时从而得到不同的脉冲频率,从8255A口输出来实现步进电机的转速。
初始的的脉冲频率由8253的计数器0来决定,其输入的时钟脉冲为1MHZ。
同时实验中的测速部分由光耦合器来输出脉冲(每转输出6个脉冲),8253的计数器1来计数。
由速度计算公式来计算速度。
七、心得体会
经过一个星期的实验,小组很成功地把课程设计完成,让我对C++语言更深入的了解,以及对可编程并行接口8255,可编程定时计数器8253在实际应用中的作用有了一定的认识,在程序的编写、电路的搭接方面得到了很大的锻炼。
团队的协作能力也有了很大的提高,但是在C++跟汇编语言的转换上还有很大的缺陷,希望以后更进一步。
八、意见与建议
以后可以多进行类似的实验型课程的学习这样更有利于我们将理论与实践结合起来,对知识的理解可能会更加深刻。
九、存在的问题
1.实验中的遇到的困难莫过于程序的编写,初次调试使用的是汇编语言,然而对于汇编语言的掌握程度还不够熟练,所以当整合控制和测速程序时,没有成功。
于是小组决定改成C++语言进行编写,这次的C++程序一部分由自己编写,一部分借鉴了网上程序,比如其中的速度计算公式的由来初步认为是
,计算速度的时间为5s。
当然借鉴的同时,大家也对其进行了仔细的分析,完全弄清程序逻辑,然后再对本次设计进行思想类似编写。
2.同样的程序,同样的线路,电脑没有正常运行,换到别的电脑上就可以了,不知道问题出在哪里。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 步进 电机 控制 测速
![提示](https://static.bdocx.com/images/bang_tan.gif)