当前位置:文档之家› 基于单片机的步进电机转速控制

基于单片机的步进电机转速控制

电子器件市场调研与系统设计实践专 业: *** 班 级: 姓 名: 学 号: 指导教师: ****大学****学院**** 年 **月**日基于单片机的步进电机调速与正反转控制系统1 系统要求步进电动机是用电脉冲信号进行控制,将电脉冲信号转换成相应的角位移或线位移的微电动机,它最突出的优点是可以在宽广的频率围通过改变脉冲频率来实现调速,快速起停、正反转控制及制动等,并且用其组成的开环系统既简单、廉价,又非常可行,因此在打印机等办公自动化设备以及各种控制装置等众多领域有着极其广泛的应用。

随着微电子和计算机技术的发展,步进电动机的需求量与日俱增,研制步进电机驱动器及其控制系统具有十分重要的意义。

本设计基于单片机控制的步进电机设计课题是以单片机为主控制模块,从而实现电机的启停、正反转和调速的目的的一个设计课题。

在课题设计之前,通过互联网了解到了当前步进电机的发展状况及发展前景。

同时也了解了当今最先进的步进电机所具备的功能,方便为课题设计提供参考和借鉴;最后,通过画原理框图的形式,以最直观的方式为整个课题设计制定了流程及要求。

1.1 设计目的《电子器件市场调研与系统设计实践》是本专业的重要实践教学环节,强调实际应用技能训练。

结合自动化专业系列课程的学习,培养我们对电子器件的认知,锻炼我们的市场调研能力,加深我们对自动化专业系列课程知识的掌握。

通过课程设计环节培养学生与人交往、独立思考和处理问题的能力。

1.2 设计容及要求本次课程设计所选的步进电机是四相步进电机,采用的方法是利用单片机控制步进电机的驱动。

步进电机是一种将电脉冲转化为角位移的执行机构。

当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度一步一步运行的。

可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

本次课程设计就是通过改变脉冲频率来调节步进电机的速度的,并且通过数码管显示其转速的级别。

另外通过单片机实现它的正反转,步进电机可以作为一种控制用的特种电机,利用其没有积累误差(精度为100%)的特点,广泛应用于各种开环控制。

2 系统方案及原理2.1 系统设计方案该步进电机调速系统主要具有电机启停、调速、正反转控制和显示功能,现将该步进电机调速控制系统实现的所有功能的具体步骤整理如下:(1)步进电机启停功能。

单片机预设初值,预设初值脉冲发送给驱动器,驱动步进电机按预设的最低速运行。

(2)步进电机调速功能。

将产生的不同频率和脉宽的脉冲信号输入到驱动器中,驱动电机在单位时间转动若干个步角距。

(3)步进电机转向控制。

通过改变步进电机绕组的通电相序,改变转子的转向,从而实现步进电机的正反转控制功能。

(4)复位功能。

通过复位单片机,使单片机输出的脉冲复位为预设初值,从而使步进电机复位为预设最低速度运行。

(5)显示功能。

通过在四位一体数码管中显示设定步进电机目前的转速和转向。

2.2 自动浇花系统原理步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。

在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。

这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。

使得在速度、位置等控制领域用步进电机来控制变的非常的简单。

正常情况下,步进电机转过的总角度和输入的脉冲数成正比;连续输入一定频率的脉冲时,电动机的转速与输入脉冲的频率保持严格的对应关系,不受电压波动和负载变化的影响。

系统是单片机控制,整个设计的电压是5v,所以电机的电压也要选择5v可以驱动的,所以本实验选择28BYJ-48步进电机作为设计对象,步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V。

当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。

每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。

当通电状态的改变完成一个循环时,转子转过一个齿距。

原理框图如图1。

图1步进电机控制系统原理框图3 市场调研及硬件设计3.1市场调研认真分析了题目所要求的功能后,进行了系统设计。

对方案进行了仿真实验,并对所需的器件进行了市场调研,通过不同的途径,包括淘宝店、天猫购物、实体店,对比分析后,最优方案是通过淘宝店购买元器件。

主要的元器件罗列如表1。

通过硬件电路搭建后,完成实物电路板的焊接过程,实物图见附录A。

3.2电路原理图从控制系统的大小和复杂度出发,必须考虑单片机的基本参数和增强功能。

前者往往需要考虑芯片的速度,ROM容量,I/O引脚数量和工作电压(1.8V/3V/5V)等,后者则包括是否拥有看门狗,双指针,双串口,实时时钟,CAN接口,SPI接口,USB接口等附加模块。

本设计中受控对象只有超声波、声光报警,复杂度低,采用低端的通用的单片机芯片就能够满足要求。

P0口为四位一体数码管的段选。

P1.0为步进电机启停按键定义,P1.1为步进电机正反转按键定义,P3.0为步进电机加速按键定义,P3.1为步进电机减速按键定义,P2.0、P2.1、P2.2、P2.3为四位一体数码管的位选。

P2.7、P2.6、P2.5、P2.4为脉冲信号输入端定义,原理图如图2。

图2 系统原理图4 硬件调试及分析4.1 Proteus软件仿真在实物制作前,需要首先在Proteus仿真软件中对电路进行设计(即对硬件电路图进行合理的搭配,如图2),通过仿真软件测试电路与编译的程序相配合,检查外围电路设计是否合理,程序编译是否正确,以及软件和硬件是否能够正常配合工作,实现设计中的要求,若仿真电路没有问题,就可以在实际电路中对实物进行焊接制作。

我选择单片机仿真软件Proteus8.2仿真以及Keil4 编译。

源程序见附录B。

4.2 按键电路按键操作在四位一体数码管上显示步进电机的转速和转向,有启停按键,正反转按键以及加减速按键,如图3。

图3 按键电路图4.3 显示电路检测到土壤湿度湿度和预先设置的上下限值,显示在液晶显示屏上,如图4。

图4 步进电机一档速正转4.4 驱动电路STC89C51RC的P2口作为驱动电路的控制引脚,P2输入高电平时,对应的输出为0,LED灯亮,步进电机转动,水泵工作;P2口输入低电平时,对应输出为1,LED灯熄灭,步进电机停止转动,如图5。

图5 驱动电路5 总结在把理论设计转换成实物的整个过程,如:电路设计、分析计算、画电路图、焊接电路、检查调试、软件流程控制设计分析、编写调试软件、烧写软件到整个软硬件系统的调试,最后直到系统完成。

其中整个系统的前期准备是首先必须做到位的,如控制什么、用什么控制、得到什么结果,进而对各部分应选择具体的芯片作进一步的考虑,以使系统得到最优的表现。

通过本课题,一方面我在查阅资料的基础上,了解STC89C51单片机控制的一些基本技术,掌握其控制系统的分析方法与实现方法,能对单片机外围电路设计进行系统学习与掌握;另一方面,在设计步进电机控制系统的硬件电路,控制程序和相应的电路图时,应充分运用说学知识,善于思考,琢磨,分析。

我们的学习不但要立足于书本,以解决理论和实际教学中的实际问题为目的,还要以实践相结合,理论问题即实践课题,解决问题即课程研究,学生自己就是一个专家,通过自己的手来解决问题比用脑子解决问题更加深刻。

学习就应该采取理论与实践结合的方式,理论的问题,也就是实践性的课题。

这种做法既有助于完成理论知识的巩固,又有助于带动实践,解决实际问题,加强我们的动手能力和解决问题的能力。

参考文献[1] 王思明,金敏,苟军年.单片机原理及应用系统设计[M].:科学,2012.[2] 周润景,晓霞.基于PROYEUS的电路设计、仿真与制板[M]. :电子工业,2013.8.[3] 潭浩强.C 语言程序设计.清华大学[M].2005.07.[4] 毅刚,MCS-51单片机应用设计[M].工业大学.2004.[5] 乐喜.微机计算机接口技术及应用[M].华中科技大学.2005.08.[6] 博琴.微型计算机原理与接口技术[M].清华大学.2004.附录A 实物图附录B 源程序#include<reg51.h>#define uchar unsigned char#define uint unsigned int#define led P0//数码管段选#define haha P2sbit s1 = P1^0;sbit s2 = P1^1;sbit s3 = P3^0;sbit s4 = P3^1;//按键定义,s1正转,s2反转,s3加1,s4减1sbit wei3 = P2^3;sbit wei2 = P2^2;sbit wei1 = P2^1;sbit wei0 = P2^0;//数码管位选定义sbit a = P2^7;sbit b = P2^6;sbit c = P2^5;sbit d = P2^4;//脉冲信号输入端定义uchar code display[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阳数码管驱动信号0---9,不显示uchar code time_counter[10][2]={{0xda,0x1c},{0xde,0xe4},{0xe1,0xec},{0xe5,0xd4},{0xe9,0xbc}, //9.7 ----1ms{0xed,0xa4},{0xf1,0x8c},{0xf5,0x74},{0xf9,0x5c},{0xfc,0x18}};uchar code qudong[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90};uchar num1 = 0;//控制取励磁信号变量uchar num2 = 8;uchar k=1;//加减档位控制,1为最小档bit flag1 = 0;//初始正转,正反转标志uchar buf[4]={0,10,10,1};//数码管显示缓存,正转,不显示,不显示,显示1档位,高----低//================================定时器0/1初始化函数================================void T0_T1_init(){TMOD = 0x11;//定时器0/1均工作于方式1,16位计时方式TH0 = (65536 - 4000)/256;TL0 = (65536 - 4000)%256;//定时器0,定时4ms用于数码管扫描显示TH1 = time_counter[k-1][0];TL1 = time_counter[k-1][1];//定时器1,定时10ms用于步进电机转速控制TR0 = 1;TR1 = 1;ET0 = 1;ET1= 1;//开定时器中断EA = 1;//开总中断}//================================ms级延时函数=======================================void delay1m(uint x){uint i,j;for(i=0;i<x;i++) //连数x次,约 x msfor(j=0;j<120;j++); //数120 次,约1 ms}//================================主函数=============================================void main(){T0_T1_init();buf[1] = 10;//不显示while(1){if(s1 == 0){delay1m(3);if(s1 == 0){flag1 = 0;//正转buf[0] = 0;//最高位显示0haha = 0x00;//停止{k--;if(k == 0){k = 10;}buf[2]= k/10;buf[3]= k%10;}flag1 = 1;//反转buf[0] = 1;//最高位显示1haha = 0x00;//停止}while(!s2);}if(s3 == 0) //速度加1档{delay1m(3);if(s3 == 0){k++;if(k > 10 ){k = 1;}buf[2]= k/10;buf[3]= k%10;}while(!s3);}if(s4 == 0) //速度减1档{delay1m(3);if(s4 == 0){k--;if(k == 0){k = 10;}buf[2]= k/10;buf[3]= k%10;}while(!s4);}}}//==================================定时器0中断函数,用于数码管扫描显示====================================void time0_interrupt()interrupt 1{static num = 0;TH0 = (65536 - 4000)/256;TL0 = (65536 - 4000)%256;//定时器0,定时4ms用于数码管扫描显示switch(num){case 0:wei3=1;wei2=1;wei1=1;wei0=0;led = display[buf[3]];break;case 1:wei3=1;wei2=1;wei1=0;wei0=1;led = display[buf[2]];break;case 2:wei3=1;wei2=0;wei1=1;wei0=1;led = display[buf[1]];break;case 3:wei3=0;wei2=1;wei1=1;wei0=1;led = display[buf[0]];break;}num++;if(num == 4)num = 0;}//==================================定时器1中断函数,用于脉冲频率控制=====================================void time1_interrupt()interrupt 3{static num1 = 0;static num2 = 0;TH1 = time_counter[k-1][0];TL1 = time_counter[k-1][1];//定时器1,定时1 用于步进电机转速控制if(flag1 == 0)//正转{switch(num1){case 0:a = 1;b = 0;c = 0;d = 0;break;case 1:a = 1;b = 1;c = 0;d = 0;break;case 2:a = 0;b = 1;c = 0;d = 0;break;case 3:a = 0;b = 1;c = 1;d = 0;break;case 4:a = 0;b = 0;c = 1;d = 0;break;case 5:a = 0;b = 0;c = 1;d = 1;break;case 6:a = 0;b = 0;c = 0;d = 1;break;case 7:a = 1;b = 0;c = 0;d = 1;break;}num1++;if(num1 == 8)num1 = 0;}else //反转{switch(num2){case 0:a = 1;b = 0;c = 0;d = 1;break;case 1:a = 0;b = 0;c = 0;d = 1;break;case 2:a = 0;b = 0;c = 1;d = 1;break;case 3:a = 0;b = 0;c = 1;d = 0;break;case 4:a = 0;b = 1;c = 1;d = 0;break;case 5:a = 0;b = 1;c = 0;d = 0;break;case 6:a = 1;b = 1;c = 0;d = 0;break;case 7:a = 1;b = 0;c = 0;d = 0;break;}num2++;if(num2 == 8)num2 = 0;}}。

相关主题