重庆邮电大学研究生堂下考试答卷2012-2013学年第1学期考试科目机电系统控制理论姓名年级专业2012年12 月31 日目录1 设计任务书------------------------------------------------------------------------------------11.1功能介绍--------------------------------------------------------------------------------11.2技术指标--------------------------------------------------------------------------------12 技术书明书-----------------------------------------------------------------------------------22.1 设计方案-------------------------------------------------------------------------------22.1.1 MCU的选择-------------------------------------------------------------------22.1.2 步进电机的驱动模块--------------------------------------------------------22.1.3 直流电机的驱动模块--------------------------------------------------------22.1.4 测速模块-----------------------------------------------------------------------22.1.5 显示模块-----------------------------------------------------------------------22.2 原理图设计----------------------------------------------------------------------------22.3 PCB图设计-----------------------------------------------------------------------------22.4 元件类型-------------------------------------------------------------------------------23 程序代码-------------------------------------------------------------------------------------31 设计任务书1.1 功能介绍本设计主要单片机系统、矩阵键盘、液晶显示、驱动模块、直流电机、步进电机组成。
利用AT89C52单片机作为主控芯片,配合L298和THB7128分别驱动直流电机和步进电机,以实现直流电机和步进电动机同步旋转,且误差小于3%,还需实现正反转,并用光电传感器实时测得速度,并在液晶显示器显示出来。
1.2 技术指标直流电机控制其正反转通过改变直流电极性得以改变,因此主要还是产生单路可根据设置占空比输出的PWM信号。
产生PWM信号有两个关键,一是开关信号周期,也就是PWM信号的周期,二是一个周期内,高电平的占空比。
信号周期与占空比均与时间有关,用定时器是合理的方法。
对于步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。
在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。
采用一个定时器,假设PWM周期对应的计数值为N0,PWM1、PWM2的占空比分别为DT1、DT2,那么,其对应的计数值分别为N0*DT1、N0*DT2,并不断查询定时器记数。
2 技术说明书2.1 设计方案本次设计的目的是以一个单片机为基础控制一个直流电机和一个步进电机同步运转,主要有控制模块、驱动模块、测速模块和显示模块等。
其中控制模块是由矩阵键盘组成,实现电机的正转、反转、加速以及减速。
驱动模块则是由两个电机的驱动电路组成,其中直流电机是由L298驱动,步进电机是由THB7128驱动。
显示模块是由LCD1602用作速度显示,测速模块是由光电编码器的M法测速,其中两个电机的同步控制是以所测得的速度作为反馈量,利用PID算法进行闭环控制实现同步运转。
2.1.1 MCU的选择本产品的MCU我们选的是STC89C52单片机,STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口。
另外STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35Mhz,6T/12T可选。
单片机最小系统2.1.2 步进电机的驱动模块THB7128是一款专业的两相步进电机驱动芯片。
它内部集成了细分、电流调节、CMOS功率放大等电路,配合简单的外围电路即可实现高性能、多细分、大电流的驱动电路。
适合驱动42、57型两相、四相混合式步进电机。
在低成本、低振动、小噪声、高速度的设计中应用效果较佳。
2.1.3 直流电机的驱动模块L298内部为双H桥,以及控制电路,没有环形脉冲分配电路,所以不能直接驱动步进电机,可配合L297使用组成完整的步进电机固定斩波频率的PWM 恒流斩波驱动器,也可配合其它环形脉冲分配电路或单片机使用。
2.1.4 测速模块测速模块主要采用红外对管,其中红外对管主要结构为光敏接收管,它是一个具有光敏特征的PN结,属于光敏二极管,具有单向导电性,因此工作时需加上反向电压。
无光照时,有很小的饱和反向漏电流(暗电流)。
此时光敏管不导通。
当光照时,饱和反向漏电流马上增加,形成光电流,在一定的范围内它随入射光强度的变化而增大。
红外线接收管,功能与光敏接收管相似只是不受可见光的干扰,感光面积大,灵敏度高,属于光敏二极管,一般只对红外线有反应。
红外线接收头,就是在红外线接收管的基础上增加了对微弱信号进行放大的处理的电路,类似开关电路,接收到红外信号给出高电平(接近工作电压),无红外信号低电平(约0.4)。
2.1.5 显示模块1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
2.2 框架图系统总框架:程序主框架:键盘控制流程图:N2.3原理图设计直流电机的驱动电路步进电机的驱动电路L298驱动电路原理图光电测速电路原理图2.4 元件类型2.4程序代码#include <reg52.h># define uint unsigned int# define uchar unsigned char sbit cp=P1^0;sbit ud=P1^1;sbit dir=P1^4;sbit free=P1^2;sbit dula=P2^6;sbit wela=P2^7;sbit en=P3^4;sbit rs=P3^5;sbit IN1 = P2^0;sbit IN2 = P2^1;sbit ENA = P2^4;sbit ENB = P2^5;sbit key1=P3^6;sbit key2=P3^7;uint p,p1,flag, pwm;int num1,num2;uint cnt1,cnt2,k;void delay(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void write_com(uchar com) {rs=0;delay(5);P0=com;en=1;delay(5);en=0;}void write_date(uchar date){rs=1;delay(5);P0=date;en=1;delay(5);en=0;}void display(){write_com(0x80);write_date((char)(num1/100)+'0');write_date((char)(num1%100/10)+'0');write_date('.');write_date((char)(num1%10)+'0');}void display1(){write_com(0x80+0x06);write_date((char)(num2/100)+'0');write_date((char)(num2%100/10)+'0');write_date('.');write_date((char)(num2%10)+'0');}typedef struct PID{double SetPoint;double Proportion;double Integral;double Derivative;double LastError;double PrevError;double SumError;} PID;double PIDCalc( PID *pp, double NextPoint ) {double dError,Error;Error = pp->SetPoint - NextPoint;pp->SumError += Error;dError = pp->LastError - pp->PrevError;pp->PrevError = pp->LastError;pp->LastError = Error;return (pp->Proportion * Error+ pp->Integral * pp->SumError+ pp->Derivative * dError);}void PIDInit (PID *pp){memset ( pp,0,sizeof(PID));}void PWM_change(uint PWM_num) {pwm_on2=PWM_num;}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void key(){if(key1==0){delay(2);if(key1==0){dir=~dir;IN1=~IN1;IN2=~IN2;while(!key1);}}}void init(){dula=0;wela=0;write_com(0x38);write_com(0x0c);write_com(0x06);TMOD=0x11;TH0=(65536-10)/256;TL0=(65536-10)/256;TH1=(65536-1000)/256;TL1=(65536-1000)%256;ET0=1;TR0=1;ET1=1;TR1=1;EX0=1;IT0=1;EX1=1;IT1=1;EA=1;IN1=1;IN2=0;PT1=1;ENA=0;}void main(){int t;init();pwm=40;while(1){key();if(flag){flag=0;display();display1();t=num1-num2;if(t>5){pwm+=1;}else if(t<-5){pwm-=1;}}}}void T0_timer()interrupt 1 {TH0=(65536-10)%256;TL0=(65536-10)%256;cnt1++;if(cnt1==100){cnt1=0;}if(cnt1<pwm)ENA = 1;else ENA=0;}void extre0()interrupt 0 {p++;}void extre1()interrupt 2{p1++;}void T1_timer() interrupt 3 {uint i;TH1=(65536-1000)/256;TL1=(65536-1000)%256;k++;cp=1;for(i=0; i<5;i++);cp=0;while(k==1000){flag=1;k=0;num1=p;num2=p1;p=0;p1=0;}}。