课程设计报告
( 2006 2007 年度第 2 学期)
名 称: 计算机控制系统A
题 目: DDC单回路PID闭环
控制系统设计实时仿真
院 系: 动化系
班 级: 动班
学 号:
学生姓名:
指导教师:
设计周数: 周
成 绩:
日期:2007 年X月X 日
计算机控制系统A课程设计
务 书
目求
1 学解高级语言(C语言)实现数字PID控制算法模块程序方法
2 较验证理想微分PID实际微分PID控制算法阶跃响应加深述两种算法特点认识
3 学解模拟计算机方法
4 学掌握ADDA转换接口板方法
5 解种微机中断定时方法
6 学掌握通ADDA转换计算机获取控象动态特性方法
7. 通实时仿真实验掌握DDC单回路控制程序编制调试方法
二 容
1 C语言分编写理想微分PID实际微分PID控制算法模块微机中调试实现编写简单计算机绘图程序分绘制印出述两种算法单位阶跃响应曲线(课外机完成)
2 模拟计算机搭接成二阶惯性环节作模拟仿真控象
3 C语言编写HY6060进行定时采样定时输出接口程序微机中调试实现
4 DA输出阶跃信号时AD采集模拟控象响应绘制印出采集获飞升曲线初步计算出象模型
y
5 模拟计算机搭接二阶惯性环节作系统中控象计算机作DDC控制器通HY6060接口板实现模拟机实时控制仿真实验系统框图:
r
+
u
PID
模拟机
DA
AD
6. 整定控制器PID参数设定值阶跃情况印控制量u控量y曲线
三 进度计划
序号
设计容
完成时间
备注
1
编写数字PID控制算法模块
设计开始前
课程求8学时课外机时间完成
2
设计容组分工协作完成
设计周五
3
验收答辩
设计周末前
四 设计(实验)成果求
1 根设计组中分工完成设计容
2. 分析实时仿真结果完成设计报告设计报告C语言源程序印结果曲线外必须手写完成印稿
3. 提交设计报告参加设计答辩
五 考核方式
组设计容进行演示教师检查验收答辩学生进行出综合成绩
学生姓名:
指导教师:
2007 年 X月X 日
正 文
.设计思想
运编程软件Turboc20开发名Administrators监控软件Administrators包含HY6060进行定时采样定时输出接口模块手动切换模块控制界面显示模块PID参数进行整定通HY6060模拟计算机搭接二阶惯性环节数采集视化界面中获直观响应曲线通HY6060接口板实现模拟机实时控制
二.设计步骤
1前期准备工作
(1)需台具PC插槽微型计算机安装具直接IO力Windows 98系统Turboc20软件HY6060接线板套模拟计算机台
(2)复Turboc20参说明书学 HY6060
2 PID设计:
(1)采连续传递函数离散化方法差分法双线性变换法理想微分PID算式实际微分PID算式离散化写成差分方程形式便计算机实现
理想微分PID:
c0kp*(1+TTi+TdT)
c1kp*(1+2*TdT)
c2kp*TdT
u[0]u[0]+q0*e[2]+q1*e[1]+q2*e[0]
实际微分PID:
c0Tf(T+Tf)
c1kp*T(T+Tf)*(1+TTi+TdT)
c2kp*T(T+Tf)*(1+2*TdT)
c3kp*Td(T+Tf)
ac0*(u[0]u[1])+c1*e[0]+c2*e[1]+c3*e[2]+u[0]
(4)设置死区:实际控制系统中求控量十分精确设定值相等完全差容许偏差定范围变化种情况计算机控制避免控制动作频繁消系统振荡会采带死区PID算法
该算法原PID算法前加灵敏区实现
设置灵敏区C值
|e(k)|>C时|e(k)||e(k)|
|e(k)|
(5) 手动动踪扰切换
动手动程:系统处动时手操器实时踪PID调节器输出切换手动时控象处手操器开环控制调节器踪手操器输出
通设置键盘手动键H时系统处手动状态动键A时系统处动状态时设置相应功键P暂停E退出
3.二阶惯性环节搭接
利模拟计算机中电容电阻运算放器搭接已设计二阶惯性环节仿真控象传递函数
增益1左右象惯性时间足够
令R1R2R3R4R1M
R5R6510KC1C2C47uF
K(R2R1)*(R4R3)1
T1T2R*C1000000*0000004747s
G(s)1(47s+1)*(47s+1)
HY6060插入微型计算机PC插槽硬盘线接线板导线HY6060搭二阶惯性环节连接实现计算机二阶系统硬件连接通信做准备
接线电路图:(手抄)
4 PID参数整定
通matlab获象阶跃响应曲线确定出象延迟时间时间常数T开环增益K根 模整定法出PID调节器参数初步整定值通实验调整初步整定值终出组PID参数系统定值阶跃扰动响应曲线较理想
:T115 2 K1
TiT115 Td05*1 05*K*T1115 Kp115 Tf02
5.AD采集DA转换
(1)程采集二阶惯性环节输出电压通HY6060该模拟量进行AD转换然送入微型计算机转化数字信号设定值进行较利偏差进行PID控制PID调节器输出量送HY6060进行DA转换模拟信号电压值送二阶惯性环节新二阶惯性环节输出量该输出量次HY6060采集进行AD转换
采样时间取0055s中断实现
(2)HY6060:
通调整PID板基址base260 H
Base+0模拟输入信号通道选择寄存器实验中选通道1
base+1转换完成位寄存器高位置1转换完成置0转换未完成
base+2转换低8位数寄存器
base+3转换高4位数寄存器
base+4命令字寄存器实验中置0屏蔽定时触发外触发
通调整JP1JP2JP5JP6模拟电压输入范围单极性输入0+10
通调整JP3JP4模拟电压输出范围单极性输出0+10
(3)数模标度变换
采集模拟量A范围0+10电压转换电脑中数字量D12位二进制数应范围0—FFFH数字量DA*FFFH10
例0V电压应数字量000H
6控制界面设计
组Turboc20基控制界面实现控象PID参数设置调整通控制界面实现手动控制切换
三.实验结果
组采实际PID调节器控制具迟延二阶象(中二阶象模拟计算机实现)获良效果中整定实际PID调节器参数:
kp115
Ti115
Td1
Tf02
峰值时间(s)
超调量 ()
调节时间(s)
原系统阶跃响应
30
0
30
整定系统阶跃响应
3.9
15.1
14.7
原系统阶跃响应曲线整定系统阶跃响应曲线系统运行曲线手动切换PID调节器输出曲线见附录
四.实验总结
1实验程中组遇难点集中硬件方面HY6060AD通道DA通道连接测试等硬件方面问题软件查错调试等组成员方面验足解决问题程中组成员虚心老师周围学请教获解决问题基思路积极讨问题较圆满解决
2.组设计突出创新特色整定PID程中模整定法整定程非常简洁轻松整定参数实际整定效果非常出色时间学知识限法实现较性化操作界面较复杂功次设计中存缺憾组成员次设计程中获验教训契机学中更加注重学知识实践结合作品更加完善
五.参考文献
六附录
1.硬件连接图
2.PID响应曲线
理想PID响应曲线:
实际PID响应曲线:
3.象飞升特性曲线
4定值扰动曲线
5 程序清单
#include
#pragma hdrstop
#include Unit1h
#pragma package(smart_init)
#pragma resource *dfm
TForm1 *Form1
__fastcall TForm1TForm1(TComponent* Owner)
TForm(Owner)
{
}
#include
#include
static double e[3]u[2]y[3]spmanualUccrealstepidealsteptall
int tt1heightwidth
double T
double kp5
double Ti10
double Tf10
double Td3
typedef unsigned char UINT8
typedef unsigned short UINT16
void outportb(UINT16 PortUINT8 x)
{
asm mov dxPort
asm mov alx
asm out dxal
}
UINT8 inportb(UINT16 Port)
{
UINT8 r
asm mov dxPort
asm in aldx
asm mov ral
return r
}
void pidout()
void sample()
{
int ij
float k
unsigned char hl
outportb(0x2640)
for(i0i<1000i++)
outportb(0x2600x0f)
for(i0i<1000i++)
outportb(0x2610)
for(i0i<100i++)
for(j0j<100j++)
linportb(0x262)
for(i0i<1000i++)
hinportb(0x263)
hh&0x0f
i(int)h*256
ii+(int)l
Ucc50
y数组纯迟延y[2]保存前时刻象输出采样值
两拍y[2]变y[1]y[1]变y[0]计算偏差信号
e[0]spy[0]
y[0]y[1]
y[1]y[2]
控象电压输出范围5V~+5V
通该转换公式输出电压值转换000H~FFFH
y[2](i2047)*20*Ucc4095
return
}
void pidout()
{
int i
unsigned char hl
i(u[0]+5)*409510
hi256
lih*256
outportb(0x262l)
for(i0i<100i++)
outportb(0x263h)
for(i0i<100i++)
outportb(0x2610)
return
}
void idealpid()
{
double q0q1q2
q0kp*(1+TTi+TdT)
q1kp*(1+2*TdT)
q2kp*TdT
u[0]u[0]+q0*e[2]+q1*e[1]+q2*e[0]
e[2]e[1]
e[1]e[0]
return
}
void realpid()
{
int i
double akq1q2q3q4q5A11death0001saturate10
加死区
if(fabs(e[0])
if (fabs(e[0])>A)
k10000
else
k1
TiTi*k
*q0Td(Td+Kd*T)
q1kp*Td*(1+Kd)(Td+Kd*T)
q2kp*(2*Ti*Td*(1+Kd)+Td*(Kd*Ti+Td))(Ti*(Td+Kd*T))
q3kp*(Ti*Td*(1+Kd)+T*(Kd*Ti+Td)+Kd*T*T)(Ti*(Td+Kd*T))
q0Tf(T+Tf)
q1(kp*T+T*T*kpTi+Td*kp)(T+Tf)
q2(2*kp*Td+T*kp)(T+Tf)
q3Td(kp*T+kp*Tf)
au[0]+q0*(u[0]u[1])+q1*e[2]+q2*e[1]+q3*e[0]
c0Tf(T+Tf)
c1kp*T(T+Tf)*(1+TTi+TdT)
c2kp*T(T+Tf)*(1+2*TdT)
c3kp*Td(T+Tf)
ac0*(u[0]u[1])+c1*e[0]+c2*e[1]+c3*e[2]+u[0]
if(a>saturate)
{ k10000
TiTi*k
c0Tf(T+Tf)
c1kp*T(T+Tf)*(1+TTi+TdT)
c2kp*T(T+Tf)*(1+2*TdT)
c3kp*Td(T+Tf)
ac0*(u[0]u[1])+c1*e[0]+c2*e[1]+c3*e[2]+u[0]
}
if(a>saturate) asaturate *
采PID递推算法
q14*Tf(T+2*Tf)
q2(T2*Tf)(T+2*Tf)
q3(4*kp*Ti*Td+2*Ti*kp*T+kp*T*T)(2*Ti*T+4*Ti*Tf)
q4(2*kp*T8*kp*Ti*Td)(2*Ti*T+4*Ti*Tf)
q5(4*kp*Ti*Td2*Ti*kp*T+kp*T*T)(2*Ti*T+4*Ti*Tf)
aq1*u[0]+q2*u[1]+q3*e[0]+q4*e[1]+q5*e[2]
抗积分饱
if (abs(a)>saturate)
{
k10000
TiTi*k
q14*Tf(T+2*Tf)
q2(T2*Tf)(T+2*Tf)
q3(4*kp*Ti*Td+2*Ti*kp*T+kp*T*T)(2*Ti*T+4*Ti*Tf)
q4(2*kp*T8*kp*Ti*Td)(2*Ti*T+4*Ti*Tf)
q5(4*kp*Ti*Td2*Ti*kp*T+kp*T*T)(2*Ti*T+4*Ti*Tf)
aq1*u[0]+q2*u[1]+q3*e[0]+q4*e[1]+q5*e[2]
}
if (abs(a)>saturate) 果出现积分饱PID控制器输出u[k]限幅
{
if (a>saturate)
asaturate
else
a(1)*saturate
}
u[1]u[0]
u[0]a
e[2]e[1]
e[1]e[0]
Ti10
return
}
void realpidstep()
{
int i
double akq1q2q3q4q5A11death0001saturate10
加死区
if(fabs(e[0])
if (fabs(e[0])>A)
k10000
else
k1
TiTi*k
采PID递推算法
q14*Tf(T+2*Tf)
q2(T2*Tf)(T+2*Tf)
q3(4*kp*Ti*Td+2*Ti*kp*T+kp*T*T)(2*Ti*T+4*Ti*Tf)
q4(2*kp*T8*kp*Ti*Td)(2*Ti*T+4*Ti*Tf)
q5(4*kp*Ti*Td2*Ti*kp*T+kp*T*T)(2*Ti*T+4*Ti*Tf)
aq1*u[0]+q2*u[1]+q3*e[0]+q4*e[1]+q5*e[2]
抗积分饱
if (abs(a)>saturate)
{
k10000
TiTi*k
q14*Tf(T+2*Tf)
q2(T2*Tf)(T+2*Tf)
q3(4*kp*Ti*Td+2*Ti*kp*T+kp*T*T)(2*Ti*T+4*Ti*Tf)
q4(2*kp*T8*kp*Ti*Td)(2*Ti*T+4*Ti*Tf)
q5(4*kp*Ti*Td2*Ti*kp*T+kp*T*T)(2*Ti*T+4*Ti*Tf)
aq1*u[0]+q2*u[1]+q3*e[0]+q4*e[1]+q5*e[2]
}
if (abs(a)>saturate) 果出现积分饱PID控制器输出u[k]限幅
{
if (a>saturate)
asaturate
else
a(1)*saturate
}
u[1]u[0]
u[0]a
e[2]e[1]
e[1]e[0]
Ti10
return
}
void __fastcall TForm1Button1Click(TObject *Sender)
{
initial()
TTimer1>Interval
TT1000
manual0e[0]0e[1]0e[2]0u[0]0u[1]0
y[0]0y[1]0y[2]0Ucc5t0t10tall0
spStrToFloat(Edit4>Text)
realstep0
idealstep0
pidout()
heightPaintBox2>Height
widthPaintBox2>Width
PaintBox1>Canvas>Pen>ColorclRed
PaintBox2>Canvas>Pen>ColorclBlue
PaintBox1>Canvas>MoveTo(8height2)
PaintBox2>Canvas>MoveTo(8height2)
PaintBox1>Invalidate()
PaintBox2>Invalidate()
Timer1>Enabledtrue
}
void __fastcall TForm1Button2Click(TObject *Sender)
{
Timer1>Enabledfalse
}
void __fastcall TForm1BitBtn1Click(TObject *Sender)
{
t1t1+1
}
void __fastcall TForm1BitBtn2Click(TObject *Sender)
{
t1t11
}
void __fastcall TForm1Timer1Timer(TObject *Sender)
{ int yposupos
talltall+T
if(realstep1)
{
realpidstep()
uposheight(u[0]+5)*height10
if(t>72)
{ t1
PaintBox2>Invalidate()
PaintBox2>Canvas>MoveTo(0upos)
}
tt+1
PaintBox2>Canvas>LineTo(10*t+10upos)
Edit3>TextFloatToStr(u[0])
Edit5>TextFloatToStr(tall)
}
else if (idealstep1)
{
idealpid()
uposheight(u[0]+5)*height10
if(t>72)
{ t1
PaintBox2>Invalidate()
PaintBox2>Canvas>MoveTo(0upos)
}
tt+1
PaintBox2>Canvas>LineTo(10*t+10upos)
Edit3>TextFloatToStr(u[0])
Edit5>TextFloatToStr(tall)
}
else
{
int unchange0s1s2s3uposypos
采集AD转换系统输出数y[k]
sample()
Edit2>TextFloatToStr(y[0])
PID调节器处理偏差信号
if (manualMANUAL>Checked)
unchange20
manualMANUAL>Checked
if (MANUAL>Checked) s210
else s25
if(RealPID>Checked) s11
else s10
s3s1+s2+unchange
switch (s3)
{ case 5 Form1>Edit1>Text 手动动
for (int i0i<3i++) e[i]0
u[1]u[0]
idealpid()
break
case 6 for (int i1i<3i++) e[i]0
sample()
u[1]u[0]
spStrToFloat(Edit4>Text)
realpid()
if(fabs(u[0]u[1])>02)
{
Form1>Edit1>Text偏差太法切换
MANUAL>Checkedtrue
u[0]u[1]
}
else
Form1>Edit1>Text
break
case 10 u[0]u[0]+t1 动手动
t10
Form1>Edit1>Textu[0]
break
case 11 u[0]u[0]+t1
t10
Form1>Edit1>Textu[0]
break
case 25 idealpid()break 切换
case 26 realpid()
break
case 30 u[0]u[0]+t1
t10
Form1>Edit1>Textu[0]
break
case 31 u[0]u[0]+t1
t10
Form1>Edit1>Textu[0]
break
}
图形显示前y[k]u[k]
yposheight(y[0]+5)*height10
uposheight(u[0]+5)*height10
if(t>72)
{ t1
PaintBox1>Invalidate()
PaintBox2>Invalidate()
PaintBox1>Canvas>MoveTo(0ypos)
PaintBox2>Canvas>MoveTo(0upos)
}
tt+1
PaintBox1>Canvas>LineTo(10*t+10ypos)
PaintBox2>Canvas>LineTo(10*t+10upos)
u[k]通DA转换输送控象
pidout()
Edit3>TextFloatToStr(u[0])
Edit5>TextFloatToStr(tall)
}
}
void __fastcall TForm1Button4Click(TObject *Sender)
{
realstep1
idealstep0
TTimer1>Interval
TT1000
e[0]1e[1]0e[2]0
u[0]0u[1]0t0
heightPaintBox2>Height
PaintBox2>Canvas>Pen>ColorclBlue
PaintBox2>Canvas>MoveTo(8height2)
tall0
PaintBox1>Invalidate()
PaintBox2>Invalidate()
Timer1>Interval300
Timer1>Enabledtrue
}
void __fastcall TForm1BitBtn3Click(TObject *Sender)
{
spsp+100
Edit4>TextFloatToStr(sp)
}
void __fastcall TForm1BitBtn4Click(TObject *Sender)
{
spsp100
Edit4>TextFloatToStr(sp)
}
void __fastcall TForm1Button3Click(TObject *Sender)
{
idealstep1
TTimer1>Interval
TT1000
realstep0
e[0]1e[1]0e[2]0
u[0]0u[1]0t0
heightPaintBox2>Height
PaintBox2>Canvas>Pen>ColorclBlue
PaintBox2>Canvas>MoveTo(8height2)
tall0
PaintBox1>Invalidate()
PaintBox2>Invalidate()
Timer1>Interval300
Timer1>Enabledtrue
}
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档