步进电机的控制与测速

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

步进电机控制与测速姓名:竹玉书学号: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三、硬件接线图四、程序框图主函数:PA3PA2PA1PA0CS8255PBOPC7PC6PC5PC4PC3PC2PC1PC0OUT0GATE0CLKOCSOUT1GATE1CLK1OUT2GATE2CLK28253+5V1MHZ步进电机计数+5VBDBCBBBAK7K6K5K4K3K2K1K0280H290H开始显示提示信息8255初始化,A口输出,C口输入33H=BUFFBUFF内容从8255A口输出键盘有无键按下?读开关状态返回DOSYNK0=1?K1=1?K2=1?K3=1?K4=1?K5=1?K6=1?置停止信息置延时时间K7=1?测速控制信息循环右移控制信息循环右移YNNNNNNNNYYYYYYY延时8253初始化测速子函数:五、源程序程序源代码如下:(含注解)/******************//*步进电机*//******************/#includestdio.h#includeconio.h#includeApiEx.h#pragmacomment(lib,ApiEx.lib)#define8255A0x290开始PB0=1?读8253OUT0状态NYC++C=50000?读8253计数器1YN计算速度并显示#define8255B0x291#define8255C0x292#define8255CTL0x293#define825300x280#define825310x281#define825320x282#define8253CTL0x283staticunsignedintc=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;PortReadByte(82531,&z);//读8253计时器1记录的脉冲数高八位b=b+z*256;if(ba)printf(thespeedis:%fr/min\n,(-b+a)/2.0);//计算速度(初值未减完)elseprintf(thespeedis:%fr/min\n,(-b+a+1024)/2.0);//计算速度(初值已减完)a=b;c=0;}d--;}}voidmain(){BYTEdata,x;intbuf=0x33,d;//设置buff则表示线圈初始相为0011printf(--------------------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(Pressanykeytobegin!\n\n);getch();printf(K0-K6arespeedcontrol\n);printf(K0isthelowestspeed\n);printf(K6isthehighestspeed\n);printf(K7isthedirectcontrol\n);printf(pressanykeytoreturn!\n);if(!Startup())/*打开设备*/{printf(ERROR:OpenDeviceError!\n);return;}PortWriteByte(8255CTL,0x8b);/*设置8255工作方式,C口输入,A口输出*/PortWriteByte(8253CTL,0x16);//设置8253计数器0控制字00010110PortWriteByte(8253CTL,0x76);//设置8253计数器1控制字01110110PortWriteByte(82530,200);//设置8253计数器0初值为200PortWriteByte(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延时时间elseif(data&4)d=900;//设置K2延时时间elseif(data&8)d=800;//设置K3延时时间elseif(data&16)d=700;//设置K4延时时间elseif(data&32)d=500;//设置K5延时时间elseif(data&64)d=300;//设置K6延时时间elsed=0;if(d!=0){Payoff(d);//调用延时测速程序if(data&128)//判断K7状态buf=((buf&1)7)|(buf1);//线圈相位变为1001,顺时针转动elsebuf=((buf&128)7)|(buf1);//线圈相位变为0110,顺时针转动PortWriteByte(8255A,buf);//从8255A口输出}elsePortWriteByte(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++程序一部分由自己编写,一部分借鉴了网上程序,比如其中的速度计算公式的由来初步认为是60546ab,计算速度的时间为5s。当然借鉴的同时,大家也对其进行了仔细的分析,完全弄清程序逻辑,然后再对本次设计进行思想类似编写。2.同样的程序,同样的线路,电脑没有正常运行,换到别的电脑上就可以了,不知道问题出在哪里。

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功