




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、51单片机控制步进电机接触单片机快两年了,不过只是非常业余的兴趣,实践却不多,到现在还算是个初学者吧。这几天给自己的任务就是搞定步进电机的单片机控制。以前曾看过有关步进电机原理和控制的资料,毕竟自己没有做过,对其具体原理还不是很清楚。今天从淘宝上买了一个EPSON的UMX-1型步进电机,此步进电机为双极性四相(后来才知道,四相和两相步进没什么区别的!),接线共有六根,外形如下图所示:拿到步进电机,根据以前看书对四相步进电机的了解,我对它进行了初步的测试,就是将5伏电源的正端接上最边上两根褐色的线,然后用5伏电源的地线分别和另外四根线(红、兰、白、橙)依次接触,发现每接触一下,步进电机便转动一个
2、角度,来回五次,电机刚好转一圈,说明此步进电机的步进角度为360/(4×5)18度。地线与四线接触的顺序相反,电机的转向也相反。如果用单片机来控制此步进电机,则只需分别依次给四线一定时间的脉冲电流,电机便可连续转动起来。通过改变脉冲电流的时间间隔,就可以实现对转速的控制;通过改变给四线脉冲电流的顺序,则可实现对转向的控制。所以,设计了如下电路图:C51程序代码为:代码一#include <AT89X51.h>static unsigned int count;static unsigned int endcount;void del
3、ay();void main(void) count = 0;P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 0;EA = 1; /允许CPU中断 TMOD = 0x11; /设定时器0和1为16位模式1 ET0 = 1;
4、; /定时器0中断允许TH0 = 0xFC; TL0 = 0x18; /设定时每隔1ms中断一次 TR0 = 1; /开始计数startrun:P1_3 = 0;P1_0 = 1;delay();P1_0 = 0;P1_1 = 1;delay();P1_1 = 0;P1_2 = 1;delay();P1_2 = 0;P1_3 = 1;delay();goto star
5、trun;/定时器0中断处理 void timeint(void) interrupt 1 TH0=0xFC; TL0=0x18; /设定时每隔1ms中断一次count+;void delay()endcount=2;count=0;dowhile(count<endcount);将上面的程序编译,用ISP下载线下载至单片机运行,步进电机便转动起来了,初步告捷!不过,上面的程序还只是实现了步进电机的初步控制,速度和方向的控制还不够灵活,另外,由于没有利用步进电机内线圈之间的“中间状态”,步进电机的
6、步进角度为18度。 二手步进电机的要注意,有些退磁比较严重,这个店还是比较好的,加到12V,步进的力气很大,用手拧不住!呵呵,算是帮这个店做个广告了O(_)O所以,我将程序代码改进了一下,如下:代码二#include <AT89X51.h>static unsigned int count;static int step_index;void delay(unsigned int endcount);void gorun(bit turn, unsigned int speedlevel);v
7、oid 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;
8、160;/定时器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+
9、;void delay(unsigned int endcount)count=0;dowhile(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;
10、160;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;
11、 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;
12、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
13、= 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)
14、0; step_index=0;else step_index-; if (step_index<0) step_index=7; 改进的代码能实现速度和方向的控制,而且,通过step_index静态全局变量能“记住”步进电机的步进位置,下次调用 gorun()函数时则可直接从上次步进位置继续转动,从而实现精确步进;另外,由于利用了步进电机内线圈之间的“中间状态”,步进角度减小了一半,只为9度
15、,低速运转也相对稳定一些了。但是,在代码二中,步进电机的运转控制是在主函数中,如果程序还需执行其它任务,则有可能使步进电机的运转收到影响,另外还有其它方面的不便,总之不是很完美的控制。所以我又将代码再次改进:代码三#include <AT89X51.h>static unsigned int count; /计数static int step_index; /步进索引数,值为07static bit turn; /步进电机转动方向static bit stop_flag; /步进电机停止标志s
16、tatic int speedlevel; /步进电机转速参数,数值越大速度越慢,最小值为1,速度最快static int spcount; /步进电机转速参数计数void delay(unsigned int endcount); /延时函数,延时为endcount*0.5毫秒void gorun(); /步进电机控制步进函数void main(voi
17、d) count = 0;step_index = 0;spcount = 0;stop_flag = 0;P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 0;EA = 1; /允许CPU中断 TMOD = 0x11; /设定时器0和1为16位模式1 ET0 = 1;
18、;/定时器0中断允许TH0 = 0xFE;TL0 = 0x0C; /设定时每隔0.5ms中断一次TR0 = 1; /开始计数turn = 0;speedlevel = 2;delay(10000);speedlevel = 1;do speedlevel = 2; delay(10000); speedlevel = 1;
19、delay(10000); stop_flag=1; delay(10000); stop_flag=0;while(1);/定时器0中断处理 void timeint(void) interrupt 1 TH0=0xFE;TL0=0x0C; /设定时每隔0.5ms中断一次count+;spcount-;if(spcount<=0) spcount = speedlevel;
20、60; gorun();void delay(unsigned int endcount)count=0;dowhile(count<endcount);void gorun()if (stop_flag=1) P1_0 = 0; P1_1 = 0; P1_2 = 0; P1_3 = 0; return;switch(step_index)case 0
21、: /0 P1_0 = 1; P1_1 = 0; P1_2 = 0; P1_3 = 0; break;case 1: /0、1 P1_0 = 1; P1_1 = 1; P1_2 = 0; P1_3 = 0;
22、60; break;case 2: /1 P1_0 = 0; P1_1 = 1; P1_2 = 0; P1_3 = 0; break;case 3: /1、2 P1_0 = 0; P1_1 = 1; P1_2 = 1;
23、; P1_3 = 0; break;case 4: /2 P1_0 = 0; P1_1 = 0; P1_2 = 1; P1_3 = 0; break;case 5: /2、3 P1_0 = 0; P1_1 = 0;
24、P1_2 = 1; P1_3 = 1; break;case 6: /3 P1_0 = 0; P1_1 = 0; P1_2 = 0; P1_3 = 1; break;case 7: /3、0 P1_0 = 1; P1_1 = 0; P1_2 = 0; P1_3 = 1;if (turn=0) step_index+;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025甘肃金昌市人力资源和社会保障局招聘公益性岗位人员1人考前自测高频考点模拟试题附答案详解(突破训练)
- 2025年吉林省农业种植(玉米)买卖合同书
- 2025保健品销售合同范本参考
- 2025吉林白城市暨洮北区人才交流中心就业见习岗位和见习人员征集模拟试卷及完整答案详解1套
- 2025江苏省退役军人事务厅直属优抚医院招聘12人模拟试卷及答案详解(网校专用)
- 2025标准企业租赁合同范本:租赁协议模板
- 2025年三明市供电服务有限公司招聘61人考前自测高频考点模拟试题及答案详解(历年真题)
- 2025年湖南长沙天心区招聘32名勤务协助人员和体能测评的考前自测高频考点模拟试题及参考答案详解1套
- 衡阳初一考试题库及答案
- 安全教育培训会议通知课件
- 抚州市崇仁县乡镇街道社区行政村统计表
- 部编版道德与法治五年级上册2学会沟通交流课件
- 施工单位 专业分包单位安全管理体系报审表
- 小儿支气管哮喘-羽课件
- 新北师大版二年级上册数学 课桌有多长 教学课件
- 管道沟槽开挖安全安全技术交底
- 《组织学与胚胎学》课件02细胞
- 教师资格证-综合素质-学生观
- 3食品用纸包装容器等制品食品相关产品生产许可实施细则
- 故障录波器与故障波形分析PPT通用课件
- 《合理安排课余生活》(教案)综合实践活动三年级下册
评论
0/150
提交评论