《基于单片机的直流电机转速pid控制系统设计-学位论文.doc》由会员分享,可在线阅读,更多相关《基于单片机的直流电机转速pid控制系统设计-学位论文.doc(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、直流电机转速PID控制系统设计学 院: 专业班级: 姓 名: 学 号: 指导老师: 单片机原理课程设计任务书班级:自动化07 姓名: 指导教师:曹利钢 2010年6月7日设计题目:基于单片机的直流电机转速PID控制系统设计设计任务和要求1.直流电机型号自选2.对直流电机转速实时显示3.对转速实现恒值控制4.转速控制范围:1090,其中为电机额定转速5.稳态精度达:5r/min。:围aosu设计成果设计说明书一份电路图一份参考资料1.胡汉才.单片机原理及接口技术(第2版)M.北京:机械工业出版社,20042.陈光东,赵性初.单片机微型计算机原理与接口技术(第2版)M.武汉:华中科技大学出版社,1
2、999教研室主任签字: 年 月 日目 录第一章直流电机工作原理41.1 工作原理41.2、直流电机PID控制原理方框图5第二章硬件设计与实现82.1 硬件设计82.2系统面板图15第三章流程设计173.1 软件设计流程图17第四章程序说明204.1 直流电机部分程序204.2 温度检测部分程序28第五章说明及调试366.1 调试过程366.2 运行结果37第六章 课程设计体会39第七章 参考文献 39 第一章 直流电机工作原理1.1 工作原理 本设计中的电子钟的核心是AT89C51。硬件电路主要由六部分构成:PID控制电路、复位电路、键盘电路、显示电路、串行通信电路以及温度检测电路。 PID控
3、制电路是电子钟硬件电路的核心,没有PID控制电路,直流电机无法正常稳定运行。本系统电路采用的晶振11.0592MHz,一号单片机定时器采用的是定时器0工作在方式2定时,用于实现一定时间的计时,定时时间为10ms。复位电路可使单片机回复到初始状态。键盘可实现对直流电机转速的设定及启动的操作。温度检测是通过DS18B20芯片实现,在温度显示中还要注意数的转换。在该设计中还用到定时器1工作在方式2用来产生9600的波特率,用在两片单片机之间串行传送数据。1、 外部中断INT1当电机转一圈时向外部中断进行一次中断计数,从而实现电机转速的测量。2、 一号单片机转速显示 当电机转动时,显示部分可以把电机的
4、设定转速或者是通过通信由温度计算的转速显示出来,同时在右侧部分显示电机当下的转速。 二号单片机的温度显示与之类似。3、 温度测量温度测量有专门的芯片DS18B20。DS18B20 可编程温度传感器有 3 个管脚。GND 为接地线,DQ 为数据输入输出接口, 通过一个较弱的上拉电阻与单片机相连。VDD 为电源接口,既可由数据线提供电源,又可 由外部提供电源,范围 3O55 V。当 DSI8B20 接收到温度转换命令后,开始启动转换。转换完成后的温度值就以 16 位带 符号扩展的二进制补码形式存储在高速暂存存储器的 0,1 字节。单片机可通过单线接口读 到该数据,读取时低位在前,高位在后,数据格式
5、以 0062 5LSB 形式表示。4、 按键选择一号单片机的键盘采用44的按键方式检测按键。P0、P1口不断扫描按键的行和列从而计算出所选择的数值,进而执行相关的程序。二号单片机原理类似。5、 直流电机驱动部分一号单片机根据端口采集到的电机的转速,经过PID计算,通过另一端口发送PWM波,从而使电机改变转速。1.2、直流电机PID控制原理方框图 图2.2 电路连接图第二章 硬件设计与实现2.1硬件设计直流电机PID控制电路的核心是两块89C51,用两块89C51作控制是为了电机控制和温度检测互不干扰,其中一块控制电机,另一块实现温度检测。2.1.1 按键电路设计根据功能需要,本控制电路需要设置
6、一下功能键:按键设定转速。在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。 矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,下图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口
7、则作为输入。这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。 图2.1 按键电路参见表2.1。按键键名功能属性09设定设定转速值自动复位确定确定确定设定值自动复位清除清除去除设定值自动复位运行运行开始运行自动复位表2.1 按键功能表 按键操作说明如下: 09键:通过此按键设定要求电机转速的设定值。设定过程中数值依次左移,实现百十个位的设定。 确定键:该键为自动复位键,当设定完成后按确定键就可以使设定值赋给相应变量。 清除键:清除已经设定的转速值。运行键:设定值完毕则可以点此键进行
8、相应的运行。2.1.2 复位电路 复位是单片机的初始化操作,以便使CPU和系统中其他部件都处于一个确定的初始状态,并从这个状态开始工作。除了进入系统的正常初始化之外,当单片机系统在运行出错或操作错误使系统处于思索状态时,也可按复位键重新启动。 复位后,PC内容初始化为0000H,使单片机从0000H单元开始执行程序。89C51单片机复位信号的输入端是RST引脚,高电平有效。RST端的外部复位电路有两种操作方式:上电自动复位和按键手动复位。按键手动复位有电平方式和脉冲方式两种。本设计用的是按键电平复位时相当于RST端接高电平。如图2.2所示。需要注意的是单片机连接了8255A,复位电路也需与82
9、55A的RESET相连。电路为上电复位电路,它是利用电容充电来实现的。在接电瞬间,RESET端的电位与VCC相同,随着充电电流的减少,RESET的电位逐渐下降。只要保证RESET为高电平的时间大于两个机器周期,便能正常复位。该电路除具有上电复位功能外,若要复位,只需按RESET键,此时电源VCC经电阻R1、R2分压,在RESET端产生一个复位高电平。2.1.3显示电路本设计中使用LED数码管显示电机的设定和实际转速以及温度值。电路设计如下: 图2.3 转速的显示电路温度的显示电路在另一个单片机中完成,图相似。2.1.4温度检测系统设置了一路温度检测在该系统中,图4.6是一路温度硬件图。图2.4
10、 DS18B20测温原理框图图2.5 温度检测的硬件图2.1.5串行通讯 该系统用到两片单片机,因此单片机还需要连接串行接口,电路略。2.1.6晶振电路设计在AT89S51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。而在芯片内部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。其电路如图2.7。图2.7 晶振电路2.1.7 电机驱动电路通过端口采集电机转速进而输出PWM波完成电机控制。PWM(Pulse Width Modulation)控制技
11、术就是对脉冲的宽度进行调制的技术,即通过对一系列脉冲的宽度进行调制,来等效的获得所需要的波形(含形状和幅值);面积等效原理是PWM技术的重要基础理论;一种典型的PWM控制波形SPWM:脉冲的宽度按正弦规律变化而和正弦波等效的PWM波形称为SPWM波。 图2.7 电机驱动电路2.1.8报警电路当温度过高或者过低时,报警电路会自动报警。图2.8 报警电路2.2系统面板图时间控制模块面板图如图2.8,温度测量模块面板图如图2.9。图2.9 直流电机控制模块面板图图2.10 温度测量模块面板图第三章 流程设计 3.1 软件设计流程图3.1.1 主程序流程图电机调试程序流程:温度测量程序流程:3.1.2
12、 速度显示子程序流程图 图5.2速度显示子程序流程图3.1.3 温度采集程序流程图 3.3 温度采集程序流程图 3.4 报警子程序流程图3.1.4串行通信接受与发送流程图 第四章 程序说明4.1 直流电机部分程序#include #define uint unsigned int#define uchar unsigned charsbit p34=P34;sbit p26=P26;sbit p36=P36;uchar code table=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f ; uchar code chose=0x01,0
13、x02,0x04,0x08,0x10,0x20;uint shu6=1,2,3,4,5,6;uchar q=0,i=0,m=0,n=0;uint count,miaoshu,sv,k=0,k2=0,sv1,sv2; /定义计数值,实际温度值,设定的温度值uchar sec,tcnt,flag,flag1;int rk,yk,uk,uk_1=0,ek,ek_1=0,ek_2=0; /PID计算参数signed char T=20,Kp=30,Td=8,Ti=100,q0,q1,q2; /PID参数其值经反复调试得来uchar data buf4=0,1,1,1;/字型显示中间变量/*/延时子程序
14、用来产生1ms的延时,用于在程序中的等待/*/延时1ms子程序void delay(uchar z)uchar x,y;for(x=z;x0;x-)for(y=110;y0;y-);/*/显示子程序用来在数码管中显示电机的设定转速或计算转速以及实际转速/*/显示子程序void display(uint a,uint b)char i;shu0=a/100;shu1=a%100/10;shu2=a%10;shu3=b/100;shu4=b%100/10;shu5=b%10;for(i=0;i6;i+)P2=chosei;P0=tableshui;delay(5); /*/定时器中断子程序用来产生
15、0.1秒的中断,以此来测量电机的转速/*/ 定时器中断0子程序void t0(void) interrupt 1 using 0 /定时T0中断服务函数tcnt+; /每过250ust tcnt 加一if(tcnt=40) /计满40 次(1/100 秒)时tcnt=0; /重新再计sec+;if(sec=10) /定时0.1 秒,在从零开始计时sec=0; TH0=0x06; /对TH0 TL0 赋值 TL0=0x06;miaoshu=count; count=0;/*/用来记录中断数,从而得到转速/*/void sdf(void) interrupt 2 using 0 /外部中断服务函数
16、 count=count+1; /*/接收来自另一个单片机的中断并放入一个数组中以便在显示函数中方便调用此数据,其中加了容错程序,通过一个特殊字符11,来区别哪一个是三位数的百位,十位,个位。/*/void jieshou()/接收子程序uchar g; if(RI=1) g=SBUF; if(g=11) m=0; bufm=g; m+; if(m=4) m=0; RI=0;/REN=1; /*/检测按键值计算对应的数值/*/左移一位void yishu(uchar num)uchar bai,shi,ge;bai=sv1%100/10;shi=sv1%10;ge=num;sv1=bai*10
17、0+shi*10+ge;k2=sv1;/xinjia/*/检测对应的按键/*/按键子程序void key()uchar i,temp,lie,hang,shu;for(i=0;i4;i+) /求出按键值P1=chosei;temp=P1;temp=temp&0xf0;if(temp!=0xf0)hang=i;if(temp=0xe0)lie=1;else if(temp=0xd0)lie=2;else if(temp=0xb0)lie=3;else if(temp=0x70)lie=4;break; shu=hang*4+lie;/数为对应的按键switch(shu) case 1: if(!
18、flag)yishu(0);break; case 2: if(!flag) yishu(1);break; case 3: if(!flag) yishu(2);break; case 4: if(!flag) yishu(3);break; case 5: if(!flag) yishu(4);break; case 6: if(!flag) yishu(5);break; case 7: if(!flag) yishu(6);break; case 8: if(!flag) yishu(7);break;case 9: if(!flag) yishu(8);break;case 10:
19、if(!flag) yishu(9);break;case 11: flag+;/*flag1+*/; break;case 12: sv1=0;miaoshu=0;flag=0;flag1=0;break;case 13: flag1+; break; default: break;while(temp!=0xf0)/放键检测temp=P1;temp=temp&0xf0;for(i=0;i501) uk=501; /限定输出上限 if(uk100)p34=1; else if(ek=0)p34=1;delay(uk/10);display(sv,miaoshu);p34=0;delay(50
20、-uk/10);/else if(ek0)/p34=0; if(p26=0)display(sv1,miaoshu);else display(sv2,miaoshu); 4.2 温度检测部分程序#include#include #define uchar unsigned char #define uint unsigned intsbit DATA = P11; /DS18B20接入口uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/共阴极字型码
21、int temp,temp2; /温度值int ss;/中间的一个变量int dd;int j,i0=0,k;uchar sec,tcnt,flag0,flag1,sec2;uchar data b;/定时器中断次数uchar data buf4=0,0,0,0;/字型显示中间变量uchar data buf24=11,0,0,0;int alarmH=500; /默认报警值int alarmL=-10;/定义开关的接入口sbit k1=P25;/+sbit k2=P26;/-sbit k3=P27;/确认sbit k4=P24;sbit bell=P10;sbit HLight=P12;sb
22、it LLight=P13;sbit Red=P16;sbit Green=P17;sbit p36=P36;bit set=0;bit Flag=0;int n;/函数的声明区void key_to1();void key_to2();void delay(uint);void key();void Show();/函数的定义区/*延时子函数*/*/延时子程序用来产生延时,用于在程序中的等待/*/void delay(uint num)while(num-) ;/*/DS18b20温度传感器所需函数,分为初始化,读写字节,读取温度4个函数/*/Init_DS18B20(void) /传感器初
23、始化 uchar x=0; DATA = 1; /DQ复位 delay(10); /稍做延时 DATA = 0; /单片机将DQ拉低 delay(80); /精确延时 大于 480us /450 DATA = 1; /拉高总线 delay(20); x=DATA; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(30);ReadOneChar(void) /读一个字节uchar i=0;uchar dat = 0;for (i=8;i0;i-) DATA = 0; / 给脉冲信号 dat=1; DATA = 1; / 给脉冲信号 if(DATA) dat|=0x80; d
24、elay(8); return(dat);WriteOneChar(unsigned char dat)/写一个字节 uchar i=0; for (i=8; i0; i-) DATA = 0; DATA = dat&0x01; delay(10); DATA = 1; dat=1; delay(8);int ReadTemperature(void) /读取温度uchar a=0;uchar b=0;int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换Ini
25、t_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度a=ReadOneChar();/低位b=ReadOneChar();/高位t=b;t=8;t=t|a;tt=t*0.0625;t= tt*10+0.5; return(t);/*/根据采集到的温度的实际值来分别进行正负温度的显示,精确到小数点后一位/*/void display00() /*显示负值子函数 dd=-(temp-1); buf1=dd/100;buf2=dd/100;buf3=dd%100/10;bu
26、f0=dd%10; buf21=0;buf22=0;buf23=0;/动态显示for(j=0;j5;j+) P2=0xff; / 初始灯为灭的 P0=0x00;P2=0xfd; /显示小数点P0=0x80; /显示小数点delay(100); P2=0xff; / 初始灯为灭的 P0=0x00; P2=0xf7; /片选LCD1 P0=0x40;delay(100); P2=0xff; P0=0x00; P2=0xfb; /片选LCD2 P0=tablebuf2;delay(100);P2=0xff; P0=0x00;P2=0Xfd; /片选LCD3P0=tablebuf3;delay(100
27、);P2=0xff; P0=0x00;P2=0Xfe;P0=tablebuf0; /片选LCD4delay(100);P2=0xff; /显示正值子函数void display()buf1=temp/1000;/显示百位buf2=temp/100%10;/显示十位buf3=temp%100/10;/显示个位buf0=temp%10; /第4位 南北秒个位temp2=temp*7; buf21=temp2/1000;/显示百位buf22=temp2/100%10;/显示十位buf23=temp2%100/10;/显示个位for(j=0;j3;j+) P2=0xff; / 初始灯为灭的 P0=0x
28、00;P2=0xfd; /显示小数点P0=0x80; /显示小数点delay(300); P2=0xff; / 初始灯为灭的 P0=0x00; P2=0xf7; /片选LCD1 P0=tablebuf1;delay(300); P2=0xff; P0=0x00; P2=0xfb; /片选LCD2 P0=tablebuf2;delay(300);P2=0xff; P0=0x00;P2=0Xfd; /片选LCD3P0=tablebuf3;delay(300);P2=0xff; P0=0x00;P2=0Xfe;P0=tablebuf0; /片选LCD4delay(300);P2=0xff;/*/扫描按键,进行上下限的设定/*/void key()/按键扫描子程序 if(k1!=1) delay(20); if(k1!=1) while(k1!=1) key_to1(); for(n=0;n8;n+) Show(); if(k2!=1)delay(20);if(k2!=1) while(k2!=1) key_to2(); for(n=0;n8;n+) Show(); if(k3!=1)TR0=1; /复位,开定时 temp=ReadTemperature();if(k4!=1) delay(20);