1总体方案设计
次课程设计针PID控制淬火炉进行温度控制设计步骤分步
首先进行控制系统建模数字控制器设计设计方案:选ZieglerNichols方法进行PID参数整定建立闭环控制系统MATLAB仿真达求PID参数
AD转换
温度采集
加热电路
DA转换
AT89C52单片机
硬件设计实现单片机选AT89C52温度采集热电偶配合MAX6675DA转换DAC0802实现LCD显示温度系统框图图11
显示温度
图11 系统框图
软件设计先编写子程序包括AD转换温度检测子程序延迟子程序DA转换子程序PID控制程序系统初始化编写程序
protues进行硬件连线仿真否达系统求温度进行控制
2控制系统建模数字控制器设计
21设计容
淬火生产程中道关键工序温度控制精度直接影响产品质量淬火炉温度控制通常温区设计针温区进行温度控制求控制温度范围600800℃控制精度±1℃温度探头选热电偶输出010mA电流信号通双控硅控制器控制加热电阻两端电压输入电流输出电压线性关系象温控数学模型:
(21)
中:时间常数 T=400秒放系数 K=100℃mA滞时间 τ10秒控制算法选PID控制
22PID控制器原理
PID控制器偏差例积分微分进行控制调节器简称针控制象进行参数调节控象结构参数完全掌握精确数学模型时应PID控制技术方便PID控制器根设定值实际值误差利例积分微分等基控制规律者适配合形成PIPDPID等复合控制规律控制系统满足性指标求
典型PID控制系统结构图图21误差信号分进行例积分微分组合控制
U(s)
+
E(s)
+
+
C(s)
控象
+
R(s)
图21 PID控制系统结构图
PID控制算法模拟表达式:
(22)
应模拟PID调节器传递函数:
(23)
计算机控制系统中PID控制规律实现必须数值逼方法采样周期相短时求代积分差分代微分模拟PID离散化变差分方程
数字PID位置型控制算式:
(24)
数字PID增量型控制算式:
(25)
中 称例增益
称积分系数
称微分系数
果单纯数字PID控制器模仿模拟调节器会获更效果必须发挥计算机运算速度快逻辑判断功强编程灵活等优势控制性超模拟调节器
单回路控制系统中扰动作控参数偏离定值产生偏差动控制系统调节单元变送器测量值定值相较产生偏差进行例积分微分(PID)运算输出统标准信号控制执行机构动作实现温度压力流量工艺参数动控制例作P偏差成正积分作I偏差时间积累微分作D偏差变化率
例控制迅速反应误差减少稳态误差系统控制输入0系统程值等期值两种情况例控制出稳态误差期值变化时系统程值产生稳态误差例控制消稳态误差例放系数加会引起系统稳定
减稳态误差控制器中加入积分项积分项误差取决时间积分着时间增加积分项会增样误差积分项会着时间增加加推动控制器输出增稳态误差进步减少直等零
积分(I)例(P)通常起称例+积分(PI)控制器系统进入稳态稳态误差果单独积分(I)话积分输出时间积累逐渐增调节动作缓慢样会造成调节时系统稳定裕度降
动控制系统较惯性组件(环节)滞(delay)组件调节程中出现甚振荡解决办法引入微分(D)控制误差时候抑制误差作误差接零时抑制误差作应该零
应PID控制必须适调整例放系数KP积分时间TI微分时间TD整控制系统良性次设计采ZieglerNichols方法PID参数整定
23ZieglerNichols方法
ZieglerNichols方法基系统稳定性分析PID整定方法.设计程中需考虑特性求整定方法非常简单控制效果较理想
传统PID验调节体分步:
1关闭控制器ID元件加P元件产生振荡
2减P系统找界振荡点
3加I系统达设定值
4重新电观察超调振荡稳定时间否符合系统求
5针超调振荡情况适增加微分项
5步骤调节PID控制器时普遍步骤寻找合时ID参数时非易事
John ZieglerNathaniel Nichols发明著名回路整定技术PID算法应工业领域反馈控制策略中常ZieglerNichols整定技术1942年第次发表出直现广泛应着
谓PID回路整定指调整控制器实际值设定值间误差产生反作积极程度果正巧控制程相缓慢话PID算法设置成机干扰改变程变量者操作改变设定值时采取快速显著动作
相反果控制程执行器特灵敏控制器操作程变量话PID算法必须较长段时间应更保守校正力回路整定质确定控制器作产生程反作积极程度PID算法消误差提供帮助
年发展ZieglerNichols方法已发展成种参数设定中处验计算法间中间方法种方法控制器确定非常精确参数进行微调
ZieglerNichols方法分两步:
1构建闭环控制回路确定稳定极限
2根公式计算控制器参数
稳定极限P元件决定出现稳态振荡时达极限产生界系数Kpcrit界振荡周期Tcrit
确定界系数Kpcrit界振荡周期Tcrit根表21公式计算参数:
表21 PID参数计算
控制器类型
计算特征数
P
05KPcrit
PD
08KPcrit
012Tcrit
PI
045KPcrit
085Tcrit
PID
06KPcrit
05Tcrit
012Tcrit
24PID参数整定
首先建立闭环系统采阶跃输入加入PID控制器图22MATLAB仿真输出图23
图22 加PID控制器结构图
图23 加PID控制器阶跃响应
加入PID控制器结构图图24
图24 加入PID控制器结构图
根ZieglerNichols方法先积分微分系数0例控制例系数阶跃响应出现稳态振荡时图25示曲线
图25 时曲线
知KPcrit0655Tcrit37表21计算出PID参数:
(26)
(27)
(28)
图26 计算参数曲线
计算参数进行仿真图26发现系统超调较积分系数减例微分系数进行微调 时曲线图27示
图27 参数调整曲线
3硬件设计实现
31完整系统电路图
图31 完整系统电路图
图31次设计完整系统电路图
32温度检测
系统采热电偶采集温度MAX6675作热电偶放器AD转换
热电偶种感温元件温度信号转换成热电动势信号通电气仪表转换成测介质温度热电偶测温基原理两种成份均质导体组成闭合回路两端存温度梯度时回路中会电流通时两端间存Seebeck电动势:热电动势谓塞贝克效应两种成份均质导体热电极温度较高端工作端温度较低端端端通常处某恒定温度根热电动势温度函数关系制成热电偶分度表分度表端温度0 ℃时条件热电偶具分度表热电偶回路中接入第三种金属材料时该材料两接点温度相热电偶产生热电势保持变受第三种金属接入回路中影响热电偶测温时接入测量仪表测热电动势知道测介质温度
Maxim公司新推出MAX6675集成热电偶放器冷端补偿AD转换器SPI串口热电偶放器数字转换器MAX6675特性:简单SPI串行口温度值输出0℃~+1024℃测温范围12位025℃分辨率片冷端补偿高阻抗差动输入热电偶断线检测单+5V电源电压低功耗特性工作温度范围20℃~+85℃2000VESD信号MAX6675复杂单片热电偶数字转换器部具信号调节放器12位模拟数字化热电偶转换器冷端补偿传感校正数字控制器1SPI兼容接口1相关逻辑控制
33温度显示
次设计显示部分采LM016L显示2行16列英文字符8位数总线D0D7RSRWEN三控制端口(14 线)工作电压 5V没背光常1602B功引脚样(调背光二线脚)次设计LM016L显示炉温温度户设定温度
34DA转换电路
DA转换采DAC0832实现DAC0832双列直插式8位DA转换器完成数字量输入模拟量(电流)输出转换分辨率8位转换时间1μs满量程误差±1LSB
ILE高电片选信号CS写信号WR1低电时输入寄存器控制信号1种情况输入寄存器输出输入变化WR1低电变高时控制信号成低电时数锁存输入寄存器中样输入寄存器输出端外部数DB变化变化
第二级锁存说传送控制信号 XFER写信号 WR2时低电时二级锁存控制信号高电8位DAC寄存器输出输入变化WR2低电变高时控制信号变低电输入寄存器信息锁存DAC寄存器中
35加热电路
加热电路图32
图32 加热电路
炉温温度低设定温度时L1进行加热电容加热快慢取决两温度值差值
4软件设计
图41 程序流程图
程序流程图图41示
热电偶检测温度MAX6675放AD转换送入单片机程序首先液晶显示器显示开始设定温度实际温度接着直扫描键盘果KS0次设定温度加1液晶显示器显示出果KS1次设定温度减1液晶显示器显示出设定值温度实际值较计算差值果实际温度设定温度差值送入DAC转换器加热电路进行加热果实际温度设定温度没冷装置进行加热温度然运行程键盘扫描重复述程
参考文献
[1]潘新民单片微型计算机实系统设计民邮电出版社 199207
[2]沙占友单片机外围电路设计[M]北京:电子工业出版社 200301
[3]海生微型计算机控制技术清华学出版社2007
[4]孙育 ATMEL新型AT89S51系列单片机应清华学出版社200501
[5]贾金玲单片机原理应电子科技学出版社200408
附录1 程序
#include
#include
#include
#include
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar m
sbit lcdP2^0
sbit DOUTP2^3
sbit SCLKP2^4
sbit CSP2^5
sbit leP2 ^ 1
sbit oeP2 ^ 2
sbit RELAYP2^6
sbit KS0P1^0
sbit KS1P1^1
sbit KS2P1^2
uchar code LcdBuf1[] {Set temp}
uchar code LcdBuf2[] {Rel temp}
uchar Vref5
uchar a[6]
uchar g[6]
unsigned char sumout
uint SET_TEMP650
unsigned int read_max6675(void)
{ unsigned char i
unsigned int AD0
CS0
SCLK0 *输出数D15*
SCLK1
for(i12i>0i) *读取转换结果*
{ SCLK0
if(DOUT1) AD++
ADAD<<1 *数左移*
SCLK1
}
SCLK0
flagSO*读取D2断偶标志*
SCLK1
SCLK0
*输出数D1*
SCLK1
SCLK0
*输出数D0*
SCLK1
CS1
return AD
}
unsigned ADC1()
{
long l
uint q0
lread_max6675()
l(244894100)*l*Vref+1 转换电压值
ll+7500
g[0](l10000)10+'0' 取整数值数组
g[1](l1000)10+'0'
g[2](l100)10+'0'
a[3]'' 忽略数
a[4]t10+'0'
q(g[0]'0')*100+(g[1]'0')*10+(g[2]'0')
return q
}
void ADC()
{
long t
tread_max6675()
t(244894100)*t*Vref+1 转换电压值
tt+7500
a[0](t10000)10+'0' 取整数值数组
a[1](t1000)10+'0'
a[2](t100)10+'0'
}
void constant_temperature() 恒温
{
uint b
b(a[0]'0')*100+(a[1]'0')*10+(a[2]'0')
if(b
RELAY0
mSET_TEMPb
m(unsigned char)(m256)
}
else
{
RELAY1
mSET_TEMPb
m(unsigned char)(m256)
}
}
void delay_ms(uchar ms)
{
uint ij
for(i0i
}
typedef struct {
double SetPoint * 设定目标 Desired Value *
double Proportion * 例常数 Proportional Const *
double Integral * 积分常数 Integral Const *
double Derivative * 微分常数 Derivative Const *
double LastError * 前项误差 *
double PrevError * 前第二项误差 *
double SumError * 总误差 *
} PID
****************************************************************************
PID计算部分
****************************************************************************
double PIDCalc( PID *pp double NextPoint )
{
double dErrorError
double SetPoint
SetPointSET_TEMP
Error pp>SetPoint NextPoint * 计算前偏差 *
pp>SumError + Error * 积分总偏差*
dError pp>LastError pp>PrevError * 前微分 *
pp>PrevError pp>LastError
pp>LastError Error * 三误差值移位 *
return(NextPoint+pp>Proportion * Error + pp>Integral * pp>SumError + pp>Derivative * dError ) *返回总误差值*
}
void pid(void)
{
PID sPID * 定义PID结构体变量 *
double rOut * PID 响应输出 *
unsigned char rIn * PID 反馈 (Input) *
double x
sPIDProportion 036 * 设置 PID 例系数 *
sPIDIntegral 00006 * 设置PID积分系数 *
sPIDDerivative 18 * 设置PID微分系数 *
sPIDSetPoint 20 * 设置 PID 输出值 *
{
unsigned char sumout * PID进入循环检测状态中 *
unsigned char i
rIn ADC1() * 读传感器输出 *
for(i0i<50i++)
x 50 * (double)rIn 2560
rOut PIDCalc ( &sPIDx ) * 计算PID 输出 *
sumoutrOut*2565
}
}
void dac0832(out)
{
RELAY0
P3out
delay(100)
RELAY1
}
void key(void )
{
if(KS00)
delay_ms(1)
if(KS00)
SET_TEMP++
while(KS0)
if(KS10)
delay_ms(1)
if(KS10)
SET_TEMP
while(KS1)
display_onechar(09SET_TEMP100+'0')
display_onechar(010(SET_TEMP100)10+'0')
display_onechar(011SET_TEMP10+'0')
}
main()
{
lcd_init()
display_string(00LcdBuf1)
display_string(10LcdBuf2)
Write_CGRAM(LcdBuf) CGRAM写入定义摄氏度符号
display_onechar(0120) 显示定义摄氏度符号
display_onechar(0131) 显示定义摄氏度符号
display_onechar(1120)
display_onechar(1131)
while(1)
{
key()
ADC()
constant_temperature()
display_string(19a)
pid()
dac0832(sumout)
delay_ms(100)
}
}
附录2 LCD程序
#ifndef LCD_1602_
#define LCD_1602_
#include
#include
sbit LCD_RS P2 ^ 0
sbit LCD_RW P2 ^ 1
sbit LCD_E P2 ^ 2
#define LCD_DATA P0
unsigned char code LcdBuf[] { 定义汉字 5X7存储64字节
0x0c0x120x120x0c0x000x000x000x00
0x0f0x100x100x100x100x100x0f0x00
}
void delay(unsigned int ms)
{
unsigned char y
for(ms>0ms)
for(y120y>0y)
}
bit lcd_busy()
{ 测试LCD忙碌状态
bit result
LCD_RS 0
LCD_RW 1
LCD_E 1
_nop_()
_nop_()
_nop_()
_nop_()
result (LCD_DATA & 0x80)
LCD_E 0
return result
}
void WriteCommand(unsigned char wdata)
{
while(lcd_busy())
LCD_DATAwdata
LCD_RS0
LCD_RW0
LCD_E1
LCD_E0
delay(5)
LCD_E1
}
void WriteData(unsigned char wdata)
{
while(lcd_busy())
LCD_DATAwdata
LCD_RS1
LCD_RW0
LCD_E1
LCD_E0
delay(5)
LCD_E1
}
void lcd_init(void)
{
WriteCommand(0x38)
WriteCommand(0x38)
WriteCommand(0x38)
delay(5)
WriteCommand(0x08)
WriteCommand(0x01)
WriteCommand(0x06)
WriteCommand(0x0c)
}
void set_xy(unsigned char xunsigned char y)
{
switch (x)
{
case 0 y+0x80 break
case 1 y+0xc0 break
}
WriteCommand(y)
}
void display_onechar(unsigned char xunsigned char yunsigned char wdate)
{
set_xy(xy)
WriteData(wdate)
}
void display_string(unsigned char xunsigned char yunsigned char *s)
{
set_xy(xy)
while(*s)
{
WriteData(*s)
s++
}
}
******************************************************************
void Write_CGRAM(unsigned char *p)
{
unsigned char ijkk
unsigned char tmp0x40 操作CGRAM命令码
kk0
for(j0j<2j++) 64 字节存储空间生成 8 定义字符点阵 64X8
{
for(i0i<8i++) 8 字节生成 1 字符点阵
{
WriteCommand(tmp+i) 操作CGRAM命令码+写入CGRAM址
WriteData(p[kk]) 写入数
kk++
}
tmp + 8
}
}
#endif
附录3 完整硬件电路图
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档