第六章 总 结
经过老师耐心细致的指导,经过近两个月的努力,本次毕业设计课题步进电机控制系统告一段落。步进电机控制系统主要分为硬件设计和软件设计两个部分:
硬件设计主要是把单片机最小系统、键盘控制模块、步进电机驱动模块、数码显示模块、红外模块、测速模块各个硬件功能模块及其它元件合理搭配并连接起来使其能够为软件运行提供一个硬件平台。
软件设计主要是通过编写程序代码,实现对整个系统的控制。在系统上电复位后程序自动运行,通过接受外部的键盘操作修改系统参数值,控制步进电机的启停,以及转速的增减和转动方向的改变;定时器T0根据系统参数控制步进电机的转动;实现步进电机转动速度的动态显示。
本系统具有相当的实用功能,两片单片机分别实现步进电机控制和测速,能基本符合实际应用需求,本次设计由于设计时间较短,个人能力以及精力等因素的限制,加之设计经验的不足,该系统还有许多不尽如人意的地方。该系统未能完全的实现设计的所有功能。如:利用键盘输入转速值实现转速的控制,动态设置最低转速和最高转速等。
在把理论设计转换成实物的整个过程,如:电路设计、分析计算、画电路图、焊接电路、检查调试、软件流程控制设计分析、编写调试软件、烧写软件到整个软硬件系统的调试,最后直到系统完成。其中整个系统的前期准备是首先必须做到位的,如控制什么、用什么控制、得到什么结果,进而对各部分应选择具体的芯片作进一步的考虑,以使系统得到最优的表现。
通过本课题,一方面我在查阅资料的基础上,了解STC89C51单片机控制的一些基本技术,掌握其控制系统的分析方法与实现方法,能对单片机外围电路设计进行系统学习与掌握;另一方面,在设计步进电机控制系统的硬件电路,控制程序和相应的电路图时,应充分运用说学知识,善于思考,琢磨,分析。
我们的学习不但要立足于书本,以解决理论和实际教学中的实际问题为目的,还要以实践相结合,理论问题即实践课题,解决问题即课程研究,学生自己就是一个专家,通过自己的手来解决问题比用脑子解决问题更加深刻。学习就应该采取理论与实践结合的方式,理论的问题,也就是实践性的课题。这种做法既有助于完成理论知识的巩固,又有助于带动实践,解决实际问题,加强我们的动手能力和解决问题的能力。
参考文献
[1]朱清慧 编著,《基于Proteus显示控制系统设计与实例》北京:清华大学出版社,2011.
[2]清华大学电子学教研组编 , 杨素行主编,《模拟电子技术基础简明教程》 3版,北京:高等教育出版社,2005. [3]张亚华,《电子电路计算机辅助分析与辅助设计》, 北京 航空工业出版社,2004. [4]莫正康,《电力电子应用技术》, 北京:机械工业出版社,2009. [5]曾晓宏,《 数字电子技术》, 北京:机械工业出版社,2008. [6]江晓安,《 模拟电子技术》, 陕西:西安电子科技大学出版社,2007. [7]蒋辉平 周国雄,《基于Proteus的单片机系统设计与仿真实例》 北京:机械工业出版社,2009. [8]王宗培,《步进电动机及其控制系统》,哈尔滨:哈尔滨工业大学出版社,2009. [9]余永权,《单片机应用系统的功率接口技术》,北京:北京航空航天大学出版社,2006.
[10]陈理壁,《步进电机及其应用》,上海:上海科学技术出版社,2009. [11] 王晓明, 胡晓柏,《电动机的单片机控制》,北京航空航天大学出版社,2002年5月第1版:181-208. [12] 刘宝延、 程树康,《步进电动机及其驱动控制系统》,2007年11月第一版:134-167. [13] 史敬灼,《步进电动机伺服控制技术》,2007年3月第2版:23-35. [14]刘国永, 陈杰平,《单片机控制步进电机系统设计》, 安徽: 安徽技术师范学院学报, 2012, 16 (4) : 61-63. [15]孙笑辉,韩曾晋,《减少感应电动机直接转矩控制系统转矩脉动的方法》, 电气传动, 2011 (1) : 8-11.
附录 A
R10100+C4100uf321VCCJ31H1Haaf2Hf2H3H3HD121POWER7LED135bC51045VP1VCCb21SMG红外一体R1130kHW3S1VCC246135....eddp246正转反转加速减速S4S1S2S3P30P3112345678HWVCC13121514VCC12MC3311918RST9171620U1P10P11P12P13P14P15P16P17INT1/P33INT0/P32T1/P35T0/P34EA/VPX1X2RESETVCCVCCP00P01P02P03P04P05P06P07P27P26P25P24P23P22P21P20RXDTXD403938373635343332282726252423222110113029abcdefgdpJ212345678910KU2R181K1HQ1D5LED2HQ2ccgg4H4Hedp3HQ34HQ4VCCR62.2kR72.2kR82.2kR92.2kP23P22P21C110UFC2RST30PFR110KP20P23P22P21P20P30P3130PFRDWR/P36ALE/PGNDPSENSTC89C52RC12345678161514131211109abcdVCCVCC12345J1蓝粉黄橙红ULN2003D1D2D3D4R21KR31KR41KR51KVCC
图A1 系统总体电路图
附录 B
源程序:
//数码管位 高位-----低位
//四个按键控制步进电机:正转,反转,加1,减1
//上电时电机启动,数码管上显示速度最小档1,加减档位均能通过数码管显示出来 //电机采用单双八拍方式
//电机转速一共10档,通过按键调节转速
//电机正转时最高位数码管显示0,反转时显示1 #include
#define uchar unsigned char #define uint unsigned int #define led P0//数码管段选 #define haha P2
sbit s1 = P1^0;sbit s2 = P1^1;sbit s3 = P3^0;sbit s4 = P3^1;
//按键定义,s1正转,s2反转,s3加1,s4减1 sbit 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 tab[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; int jishu;
//时间计算
#define Imax 14000 //此处为晶振为11.0592时的取值, #define Imin 8000 //如用其它频率的晶振时, #define Inum1 1450 //要改变相应的取值。 #define Inum2 700 #define Inum3 3000 //解码变量
unsigned char Im[4]={0x00,0x00,0x00,0x00};
//全局变量 uchar f;
unsigned long m,Tc; unsigned char IrOK;
char k=0;//加减档位控制,1为最小档
bit flag1 = 0,start=0,mode=0;//初始正转,正反转标志
uchar buf[4]={0,10,0,0};//数码管显示缓存,正转,不显示,不显示,显示0档位,高----低 //====================定时器0/1初始化函数===================== void T0_T1_init() { TMOD = 0x11;//定时器0/1均工作于方式1,16位计时方式 TH0 =0; TL0 =0;//定时器0
TH1 = time_counter[k-1][0]; TL1 = time_counter[k-1][1];//定时器1,定时10ms用于步进电机转速控制 TR0 = 0; TR1 = 1; ET0 = 1; IT1=1;//下降沿有效
EX1=1;//外部中断1开 ET1= 1;//开定时器中断 EA = 1;//开总中断 }
//====================ms级延时函数=================== void delay1m(uint x) {
uint i,j;
for(i=0;i void display() { wei3=1;wei2=1;wei1=1;wei0=0;led = tab[buf[3]];delay1m(1);led=0xff; wei3=1;wei2=1;wei1=0;wei0=1;led = tab[buf[2]];delay1m(1);led=0xff; wei3=1;wei2=0;wei1=1;wei0=1;led = tab[buf[1]];delay1m(1);led=0xff; wei3=0;wei2=1;wei1=1;wei0=1;led = tab[buf[0]];delay1m(1);led=0xff; } //============主函数==================================== void main() { T0_T1_init(); buf[1] = 10;//不显示 while(1) { display(); if(IrOK==1) { if(Im[2]==0x40) //+ { k++; if(k > 10 ) { start=0; k = 0; } if(k!=0&&mode==0) start=1; buf[2]= k/10; buf[3]= k;// mode=0; } else if(Im[2]==0x19) //-