1、直流电机转速 PID 控 制系统设计 学 院: 专业班级: 姓 名: 学 号: 指导老师: 单片机原理课程设计任务书 班级:自动化 07 姓名: 指导教师:曹利钢 2010 年 6 月 7 日 设计题目:基于单片机的直流电机转速 PID 控制系统设计 设 计 任 务 和 要 求 1.直流电机型号自选 2.对直流电机转速实时显示 3.对转速实现恒值控制 4.转速控制范围:10 90 ,其中 为电机额定转速NnNn 5.稳态精度达:5r/min。 设 计 成 果 设计说明书一份 电路图一份 参 考 资 料 1.胡汉才.单片机原理及接口技术(第 2 版)M.北京:机械工业出版社,2004 2.陈光东
2、,赵性初.单片机微型计算机原理与接口技术(第 2 版)M.武汉:华中科技 大学出版社,1999 教研室主任签字: 年 月 日 目 录 第一章 直流电机工 作原理 4 1.1 工作原理 .4 1.2、直流电机 PID 控制原理方框图 5 第二章 硬件设计与 实现 8 2.1 硬件设计 .8 2.2 系统面板图 15 第 三章 流程设计 .17 3.1 软件设计流程图 .17 第 四章 程序说明 .20 4.1 直流电机部分程序 20 4.2 温度检测部分程序 28 第五章 说明 及调试 .36 6.1 调试过程 36 6.2 运行结 果 37 第 6 章 课程设计体会 39 第 7 章 参考文献
3、 39 第一章 直流电机工作原理 1.1 工作原理 本设计中的电子钟的核心是 AT89C51。硬件电路主要由六部分 构成:PID 控制电路、复位电路、键盘电路、显示电路、串行通信 电路以及温度检测电路。 PID 控制电路是电子钟硬件电路的核心,没有 PID 控制电路, 直流电机无法正常稳定运行。本系统电路采用的晶振 11.0592MHz, 一号单片机定时器采用的是定时器 0 工作在方式 2 定时,用于实现 一定时间的计时,定时时间为 10ms。复位电路可使单片机回复到初 始状态。键盘可实现对直流电机转速的设定及启动的操作。温度检 测是通过 DS18B20 芯片实现,在温度显示中还要注意数的转换
4、。在 该设计中还用到定时器 1 工作在方式 2 用来产生 9600 的波特率,用 在两片单片机之间串行传送数据。 1、 外部中断 INT1 当电机转一圈时向外部中断进行一次中断计数,从而实现电 机转速的测量。 2、 一号单片机转速显示 当电机转动时,显示部分可以把电机的设定转速或者是通过 通信由温度计算的转速显示出来,同时在右侧部分显示电机当下的 转速。 二号单片机的温度显示与之类似。 3、 温度测量 温度测量有专门的芯片 DS18B20。DS18B20 可编程温度传感器 有 3 个管脚。GND 为接地线, DQ 为数据输入输出接口, 通 过一个较弱的上拉电阻与单片机相连。VDD 为电源接口,
5、既可 由数据线提供电源,又可 由外部提供电源,范围 3O55 V。当 DSI8B20 接收到温度转换命令后,开始启动转换。转换 完成后的温度值就以 16 位带 符号扩展的二进制补码形式存 储在高速暂存存储器的 0,1 字节。单片机可通过单线接口读 到该数据,读取时低位在前,高位在后,数据格式以 0062 5LSB 形式表示。 4、 按键选择 一号单片机的键盘采用 44 的按键方式检测按键。P0、P1 口 不断扫描按键的行和列从而计算出所选择的数值,进而执行相 关的程序。 二号单片机原理类似。 5、 直流电机驱动部分 一号单片机根据端口采集到的电机的转速,经过 PID 计算,通 过另一端口发送
6、PWM 波,从而使电机改变转速。 1.2、直流电机 PID 控制原理方框图 复 位 键 盘 显 示 89C51 键 盘 显 示 测 温 89C51 电 机 驱 动 测 速 报 警 串 行 通 信 图 2.1直 流 电 机 PID控 制 电 路 方 框 图 图 2.2 电路连接图 第二章 硬件设计与实现 2.1 硬件设计 直流电机 PID 控制电路的核心是两块 89C51,用两块 89C51 作 控制是为了电机控制和温度检测互不干扰,其中一块控制电机,另 一块实现温度检测。 2.1.1 按键电路设计 根据功能需要,本控制电路需要设置一下功能键:按键设定转速。 在键盘中按键数量较多时,为了减少 I
7、/O 口的占用,通常将按键排 列成矩阵形式,如图 1 所示。在矩阵式键盘中,每条水平线和垂直 线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个 端口(如 P1 口)就可以构成 4*4=16 个按键,比之直接将端口线用 于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条 线就可以构成 20 键的键盘,而直接用端口线则只能多出一键(9 键) 。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理 的。 矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些, 下图中,列线通过电阻接正电源,并将行线所接的单片机的 I/O 口 作为输出端,而列线所接的 I/O 口则作为输入。这
8、样,当按键没有 按下时,所有的输入端都是高电平,代表无键按下。行线输出是低 电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入 线的状态就可得知是否有键按下了。 a0 a1 a2 a3 a4a5 a6a7 0 1 2 3 4 5 6 7 8 9 确 定 清 除 运 行 图 2.1 按键电路 参见表 2.1。 按键 键名 功能 属性 09 设定 设定转速值 自动复位 确定 确定 确定设定值 自动复位 清除 清除 去除设定值 自动复位 运行 运行 开始运行 自动复位 表 2.1 按键功能表 按键操作说明如下: 09 键:通过此按键设定要求电机转速的设定值。设定过程中 数值依次左移,实现百十
9、个位的设定。 确定键:该键为自动复位键,当设定完成后按确定键就可以使 设定值赋给相应变量。 清除键:清除已经设定的转速值。 运行键:设定值完毕则可以点此键进行相应的运行。 2.1.2 复位电路 复位是单片机的初始化操作,以便使 CPU 和系统中其他部件都处于 一个确定的初始状态,并从这个状态开始工作。除了进入系统的正 常初始化之外,当单片机系统在运行出错或操作错误使系统处于思 索状态时,也可按复位键重新启动。 复位后,PC 内容初始化为 0000H,使单片机从 0000H 单元开始 执行程序。89C51 单片机复位信号的输入端是 RST 引脚,高电平有 效。 RST 端的外部复位电路有两种操作
10、方式:上电自动复位和按键 手 动复位。按键手动复位有电平方式和脉冲方式两种。本设计用的是 按键电平复位时相当于 RST 端接高电平。如图 2.2 所示。 需要注意的是单片机连接了 8255A,复位电路也需与 8255A 的 rstRST a2 a0 C3 1uF R11k RESET 相连。电路为上电复位电路,它是利用电容充电来实现的。 在接电瞬间,RESET 端的电位与 VCC 相同,随着充电电流的减少, RESET 的电位逐渐下降。只要保证 RESET 为高电平的时间大于两个 机器周期,便能正常复位。该电路除具有上电复位功能外,若要复 位,只需按 RESET 键,此时电源 VCC 经电阻
11、R1、R2 分压,在 RESET 端产生一个复位高电平。 2.1.3 显示电路 本设计中使用 LED 数码管显示电机的设定和实际转速以及温度值。 电路设计如下: INT1 a0 a1 a2 a3 a4a5 a6a7 A02 A14 A26 A38 OE1 Y0 18Y1 16Y2 14 Y3 12 U2:A 74HC240A01 A113 A215 A317 OE19 Y0 9Y1 7Y2 5 Y3 3 U2:B 74HC240 234 567 89 1RP1 RESPACK-8 图 2.3 转速的显示电路 温度的显示电路在另一个单片机中完成,图相似。 2.1.4 温度检测 系统设置了一路温度
12、检测在该系统中,图 4.6 是一路温度硬件图。 图 2.4 DS18B20 测温原理框图 P1.1 P1.1 P1.4P1.5P1.6 P1.6 +5V P1.7P1.7 P1.0 P1.0 P1.2 P1.2 P1.3 P1.3 GND XTAL218 XTAL119 ALE30 EA31 PSEN29 RST9 P0.0/AD0 39P0.1/AD1 38P0.2/AD2 37 P0.3/AD3 36P0.4/AD4 35P0.5/AD5 34 P0.6/AD6 3P0.7/AD7 32 P1.0/T21 P1.1/T2EX2 P1.23 P1.34 P1.45 P1.56 P1.67 P
13、1.78 P3.0/RXD 10P3.1/TXD 1P3.2/INT0 12 P3.3/INT1 13P3.4/T0 14 P3.7/RD 17P3.6/WR 16P3.5/T1 15 P2.7/A15 28 P2.0/A8 21P2.1/A9 2P2.2/A10 23 P2.3/A1 24P2.4/A12 25P2.5/A13 26 P2.6/A14 27 U2 AT89C 52 38.3DQ2 VC3 GND1U3 DS18B20 +5V D1 D2 图 2.5 温度检测的硬件图 2.1.5 串行通讯 该系统用到两片单片机,因此单片机还需要连接串行接口,电 路略。 2.1.6 晶振电路设计
14、 在 AT89S51 芯片内部有一个高增益反相放大器,其输入端为芯 片引脚 XTAL1,输出端为引脚 XTAL2。而在芯片内部,XTAL1 和 XTAL2 之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激 振荡器。时钟电路产生的振荡脉冲经过触发器进行二分频之后,才 成为单片机的时钟脉冲信号。其电路如图 2.7。 X1 CRYSTAL C11nF C21nF 图 2.7 晶振电路 2.1.7 电机驱动电路 通过端口采集电机转速进而输出 PWM 波完成电机控制。 PWM(Pulse Width Modulation)控制技术就是对脉冲的宽度进 行调制的技术,即通过对一系列脉冲的宽度进行调制,来
15、等效的获 得所需要的波形(含形状和幅值) ;面积等效原理是 PWM 技术的重要 基础理论;一种典型的 PWM 控制波形 SPWM:脉冲的宽度按正弦规律 变化而和正弦波等效的 PWM 波形称为 SPWM 波。 INT1 123U?:A 74LS386 IN15 IN27 ENA6 OUT1 2OUT2 3 ENB1 OUT3 13OUT4 14 IN310 IN412 SENSA1 SENSB15 GND 8 VS 4 VC 9 U12 L298 +88.8 U12(VS) 图 2.7 电机驱动电路 2.1.8 报警电路 当温度过高或者过低时,报警电路会自动报警。 P1.0 P1.0 BUZ1
16、BUZZER Q12N3393 +5V R3470 图 2.8 报警电路 2.2 系统面板图 时间控制模块面板图如图 2.8,温度测量模块面板图如图 2.9。 INT1 rstRST a0 a23a45a67 a1a2 a3a4a5 a6a71a0 XTAL218XTAL119 ALE301PSN29RST 9 P0./AD039.1/18P0.2/AD237.3/36P0.4/AD435.5/54P0.6/AD63 .7/72 P2.7/A1528 P2.0/A821.1/9P2./A023.3/14P2.4/A225.5/136.6/47 P1.0.P1.2.3P1.4.5P1.6 .78
17、 P3.0/RXD10.1/TP3.2/IN012./IT13P3.4/014 P3.7/RD17.6/W6.5/T15 U 80C51 123U?:A74LS386 IN15I27ENA6 OUT12OUT23B1 OUT313 OUT414IN310I42SENSA1 B5 GND8 VS4VC9 U12 L298 +8. U12(VS) A0214A2638OE1 Y01816Y21432U2: 74HC240A0113A21537OE19 Y0917Y2533U:B 74HC240 2345678 9 1RP1 RESPACK-8 0 1 2 34 5 6 7 8 9 确 定 清 除运
18、 行 AB X1CRYSTALC1 nF C21nF C31uFR1 k SW1SW-SPDTR21自 动 温 度 调 节手 动 温 度 调 节 图 2.9 直流电机控制模块面板图 P1. P1. P1.4.5P1.6P1.6+5V .7P1.7 P1.0.0P1.2 .2P1.3 .3GND XTAL218XTAL119 ALE301PSN29RST 9 P0./AD039.1/18P0.2/AD237.3/36P0.4/AD435.5/54P0.6/AD63 .7/72 P1.0/T21./EX2P1.23.34P1.45.56P1.67 .78 P3.0/RXD10.1/TP3.2/IN
19、012./IT13P3.4/014 P3.7/RD17.6/W6.5/T15 P2.7/A1528 P2.0/A821.1/9P2./A023.3/14P2.4/A225.5/136.6/47 U2 AT89C52 2345678 9 1RP3 10K +5V 38.DQ2VC3GN1U3DS18B20+5V BUZ1BUZER上 下 限 报 警 切 换 +-设 置 完 成 Q12N393 +5VR3470D12 X2CRYSTALC4 1nF C51nF 图 2.10 温度测量模块面板图 第三章 流程设计 3.1 软件设计流程图 3.1.1 主程序流程图 电机调试程序流程: 初 始 化 计
20、时 器 键 盘 扫 描 接 受 另 一 单 片 机 信 息 显 示 转 速 开 始 返 回 中 断 子 程 序 检 查 INT1口 若 有 高 电 平 则 计 数 加 1 温度测量程序流程: 初 始 化 计 时 器 键 盘 扫 描 测 量 温 度 显 示 温 度 开 始 返 回 中 断 子 程 序 检 查 计 时 溢 出 若 有 则 向 另 一单 片 机 发 送 信 息 显 示 温 度 3.1.2 速度显示子程序流程图 获 得 另 一 单 片 机 传 送 值 检 测 实 际 转 速 值 查 找 相 应 数 码 开 始 返 回 取 设 定 值 显 示 相 应 数 值 自 动 ? Y N 图 5.
21、2 速度显示子程序流程图 3.1.3 温度采集程序流程图 3.3 温度采集程序流程图 3.4 报警子程序流程图 3.1.4 串行通信接受与发送流程图 初始化波特率 9 6 0 0 T 1 产生波特率 读 S B U F 内数据 存储接收的数据 清中断标志 R I 返回 初始化波特率 9 6 0 0 T 1 产生波特率 将发送的数据送 A 将 A 中数据送 S B U F 清中断标志 T I 返回 第四章 程序说明 4.1 直流电机部分程序 #include #define uint unsigned int #define uchar unsigned char sbit p34=P34; s
22、bit p26=P26; sbit p36=P36; uchar code table=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f ; uchar code chose=0x01,0x02,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,
23、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;/字型显示中间变量 /* */ 延时子程序用来产生 1ms 的延时,用于在程序中的等待 /* */ /延时 1ms 子程序 void delay(uchar z) uchar x,y; for(x=z;x0;x-) for(y=110;y0;y-); /* */ 显示子程序用来在数码管中显示电机的设定转速或计算转速以及实 际转速 /* */ /显示子程序 void d
24、isplay(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;i=0) p34=1; delay(uk/10); display(sv,miaoshu); p34=0; delay(50-uk/10); / else if(ek0;i-) DATA = 0; / 给脉冲信号 dat=1; DATA = 1; / 给脉冲信号 if(DATA) dat|=0x80; delay(8); return(dat); WriteOneCha
25、r(unsigned char dat)/写一个字节 uchar i=0; for (i=8; i0; i-) DATA = 0; DATA = dat 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); / 启动温度转换 Init_DS18B20(); WriteOneChar(0xC
26、C); /跳过读序号列号的操作 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; buf0=dd
27、%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; /片选 LCD3 P0=tablebuf3
28、; delay(100); P2=0xff; P0=0x00; P2=0Xfe; P0=tablebuf0; /片选 LCD4 delay(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
29、;j+) P2=0xff; / 初始灯为灭的 P0=0x00; 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; /片选 LCD3 P0=tablebuf3; delay(300); P2=0xff; P0=0x00; P2=0Xfe; P0
30、=tablebuf0; /片选 LCD4 delay(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;n=1100) temp=-550; if(set=0) alarmH=temp; else alarmL=temp; void key_to2
31、() TR0=0; /关定时器 temp-=10; if(tempalarmH|temp=0) HLight=1;LLight=0;display();/显示函数 if(temp0) HLight=0;LLight=1;display00(); /* */ 主函数 /* */ void main() TCON=0x05; TMOD=0X21; SCON=0X40; TH0=0XD8; TL0=0XF0; TH1=0Xfc; TL1=0Xfc; EA=1; ET0=1; TR0=1; TR1=1; /EX0=1; for(n=0;n500;n+)/显示启动 LOGo“- - - -“ bell=
32、0;logo(); Red=0; while(1) key(); ss=ReadTemperature(); Show(); alarm(); if(Flag=1) bell=!bell; /蜂鸣器滴滴响 else bell=0; /* */ 延时子程序用来产生 10ms 的延时,用于在程序中的等待,并且每 10ms 进行 一次 串行通信,把电机应有的转速值发给另一个单片机。 /* */ void time0(void) interrupt 1 using 1 /每隔 10ms 执行一次此子程序 TH0=0X56; TL0=0XDC; temp=ss; TI=0; SBUF=buf2i0; i
33、0+; if(i0=4) i0=0; /* if(i0=3) SBUF=buf2i0; i0=0; else SBUF=buf2i0; i0+; */ 第五章 说明及调试 5.1 调试过程 在该系统的构想之初有不少困惑。主要是在定时器个数的 选择以及关于 PID 算法。最后还是决定用 1 个定时器。在调试 过程中遇到了不少小小的麻烦。比如在按键调试的时候,就遇 到了按键没反应的问题,后来修改程序后,按键有反应了,但 新的问题又出来了。主要是按键不好使,要么按下没反应,要 么按下太久,系统把一次按键动作当成了几次。后来在按键扫 描函数中加入了等待按键弹起的语句,解决了按键的灵敏问题。 在调制 P
34、WM 波形的时候发现电机的转速并不随输出的控制信 号的改变而变化。用示波器观察输出波形,发现输出波形并不 规则。理论上应该是输出一个一定占空比的方波啊。经过一段 时间的测试,发现信号输出引脚给出了高低电平,但示波器检 测出来的信号看上去并不像给了高低电平啊,就像一个脉冲干 扰。突然来个尖脉冲,然后很快衰减。后来缩短定时器的中断 时候后,该问题得到解决,输出波形正常。输出波形正常后再 测试电机转速,电机转速仍然不正常。 在编写 PID 算法的时候,发现占空比变化剧烈,要么是 0, 要么就是 100,总是在两个极值上变化。修改 PID 参数后问题 没有得到很好解决,后来才发是因为现变量的类型给定义
35、错了。 修改后,问题得到解决。在 PID 的调试过程中还遇到不少小问 题,在此就不一一累述了。 还有一个是编写串行通信的时候发现串行通信始终没法完 成。后来发现时程序中对于 RI 的处理不对导致了失败。 在编写完了后,发现程序并没按预定的程式那样运行,后来 才发现是定时器中代码太长的原因。后来只在定时器中保留 PWM 波形调制部分将一些按键扫描之类的函数都拿到主函数中, 在定时器中设立标志位。在主函数中通过判断标志位来选择调 用子函数,该问题得到了解决。 5.2 运行结果 手动设定转速的运行情况如下 图 5.1 手动设定运行方式 设定为根据温度自动运行情况如下 图 5.2 根据温度自动运行 第六章 课程设计体会 经过一周时间的学习实验,我已经对很熟悉了,在做课程 设计的过程中,我感到自己学到的知识十分有限,所以查阅了 大量书籍,通过这次书记的学习,我的知识增长了很多。更深 刻地了解有关变压器的知识,同时也弄明白了以前不明白的知 识点。这次实验设计对我的益处很大。 第七章 参考文献 1.胡汉才.单片机原理及接口技术(第 2 版)M.北京:机械 工业出版社,2004 2.陈光东,赵性初.单片机微型计算机原理与接口技术(第 2 版)M.武汉:华中科技大学出版社,1999