Dahlin算法控制设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算机控制》课程设计报告
题目: Dahlin算法控制设计
姓名: 王明华
学号: 120730103
2016年1月4日
《计算机控制》课程设计任务书
指导教师签字:系(教研室)主任签字:
2015年12 月28 日
1. 设计题目名称
29、Dahlin 算法控制设计
被控对象为)
120)(1(4)(G 12p ++=-s s e s s
,T=1s, 8=τT , 采用Dahlin 算法设计消除振铃的
数字控制器。
2. 课程设计的目的
课程设计是一门将课堂知识应用到软硬件设计中的课程,是大学课程里不可或缺的,学习和利用好这门课程是很有必要的。
《计算机控制系统》是一门理论性、实用性和实践性都很强的课程,课程设计环节应占有更加重要的地位。
计算机控制系统的课程设计是一个综合运用知识的过程,它需要控制理论、程序设计、硬件电路设计等方面的知识融合。
通过课程设计,加深对学生控制算法设计的认识,学会控制算法的实际应用,使学生从整体上了解计算机控制系统的实际组成,掌握计算机控制系统的整体设计方法和设计步骤,编程调试,为从事计算机控制系统的理论设计和系统的调试工作打下基础。
3. 课程设计的实验条件
(1)软件:MA TLAB 、keil 、proteus (2)硬件:计算机、单片机
4. 课程设计的原理
许多实际工程中(如化工及热工过程)经常遇到一些纯滞后调节系统,往往滞后时间
比较长。
对于这样的系统,人们较为感兴趣的是要求系统没有超调量或者超调量很小,超调成为主要的设计目标。
尤其是具有滞后的控制系统,用一般的随动系统设计方法是不行的,而且往往PID 算法的效果也欠佳。
因此,在含有滞后的温度控制中引入大林算法,对解决滞后问题具有很好的效果。
以下是大林算法的简单介绍和应用到题目的解题思路。
被控对象含有纯滞后环节s e τ-的一阶或者二阶惯性环节,它的传递函数为:
1()1s
p K
G s e T s τ-=
+ (1)
12()(1)(1)
s
p K
G s e T s T s τ-=
++ (2)
式中,12,ττ为对象的时间常数;τ为对象的延迟时间。
大林算法的控制目标:设计控制器,使得整个系统的闭环传递函数为带有纯滞后的一
阶环节,且要求闭环系统的纯滞后时间等于被控对象的纯滞后时间,即
1
()1s
s e T s ττ-Φ=
+ NT τ= (3)
工业过程控制的调节系统,阶跃输入,往往希望模拟和离散化后系统的阶跃响应不变,
所以采用零阶保持器法:
/1/111(1)()11T T Ts N s T T e e z z Z e s T s e z ττττ-------⎡⎤--Φ==⎢⎥+-⎣⎦ (4) 系统的控制器为:
/1
//11
1()1(1)()()()()1(1)T T N T T T T N e z e z D z G z z G z e z e z τττ--------Φ-==
Φ--- (5) ()D z 就是所要求的控制器,它可以由计算机程序来实现。
显然,他随着被控对象的不
同而不同。
对象具有纯滞后的一阶惯性环节时
1
1/1/1
111()11T T Ts s N T T e K e G z Z e Kz s T s e z τ-------⎡⎤--==⎢⎥+-⎣⎦
(6) 将它带入式(5)得
//1///11(1)(1)
()(1)[1(1)]
T T T T T T T T T N e e z D z K e e z e z τττττ-----------=---- (7)
式中,T 为采样周期;τ为对象的时间常数;T τ为闭环系统的时间常数。
同理,对象具有纯滞后的二阶惯性环节时
121112//11
12()1()(1)(1)(1)(1)N Ts s T T T T Kz C C z e K G z Z e s T s T s e
z e z τ---------⎡⎤+-==⎢⎥++--⎣⎦ (8) 将它带入式(5)得
12///11//111
12(1)(1)(1)
()()[1(1)]T T T T T T T T T T N e e z e z D z K C C z e z e z τττ--------------=+--- (9) 式中,22//11221
1
1()T T T T C T e T e T T --=+
--; 12
2111(
)//21221
1
()T T T T T T T C e
T e T e T T -+--=+
--。
5. 总体设计方案
基于达林算法的采样控制系统结构框图如图所示:
D(z)ZOH
图1 基于达林算法的采样控制系统结构框图
D(z)系统的设计核心,它实际上是由计算机实现,它的输入输出均是时间上
离散的数字信号信号。
在实际运用中要经过 A/D ,D/A 的转换,利用数字控制起来控制被控对象,达到期望的性能指标。
被控对象为)
120)(1(4)(G 12p ++=-s s e s s
,T=1s ,8=τT ,11T =,220T =,12τ=,
则12N =。
控制目标的系统闭环传函为
1211
()181
s s s e e T s s ττ--Φ=
=++ (10) 对于题目中二阶对象,其脉冲传函为
121112//11
12()1()(1)(1)(1)(1)N Ts s T T T T Kz C C z e K G z Z e s T s T s e z e z τ---------⎡⎤+-==⎢⎥++--⎣⎦
(11) 校正后的闭环脉冲传函为
/1/1
11(1)()11T T Ts N s T T e e z z Z e s T s e z ττττ-------⎡⎤--Φ==⎢⎥+-⎣⎦
(12) 控制器的计算为
12///11//111
12(1)(1)(1)
()()[1(1)]T T T T T T T T T T N e e z e z D z K C C z e z e z τττ--------------=+--- (13) 代入各个参数得
111/20111/811/81211
1
111211.630(1)(1)
()(10.7072)[1(1)]
1.630(10.632)(10.0488)(10.7072)[10.8820.118]
e z e z D z z e z e z z z z z z ------------------=
+-----=
+-- (14)
该控制器中,含有极点0.7072Z =-,接近1Z =-点。
该点会引起振铃。
将该振铃用
1Z =-代替,得消除振铃的控制器:
111121
1.630(10.632)(10.0488)
()10.8820.118z z D z z z
-------=-- (15) 由D(z)得到差分方程:
()0.882(1)0.118(13) 1.630() 1.110(1)0.050(2)u k u k u k e k e k e k =-+-+--+- (16)
然后,利用simulink 对其进行仿真,得到未消除振铃和消除振铃之后的仿真结果,并对结果进行分析,并用proteus 软件,进行对单片机、AD 转换器和DA 转换器的选取,进行电路图的搭建,对其进行硬件部分的实现。
6. 系统仿真
6.1 simulink 系统仿真框图
分别对未消除振铃的系统和消除振铃的系统进行仿真。
(1)未消除振铃的系统仿真框图
图2 未消除振铃的系统仿真框图
(2)消除振铃的系统仿真框图
图3 消除振铃的系统仿真框图
6.2 simulink系统仿真结果
(1)未消除振铃的系统仿真结果
图4 未消除振铃的系统仿真结果
(2)消除振铃的系统仿真结果
图5 消除振铃的系统仿真结果
仿真结果分析:
直接计算得到的控制器后,系统输出c稳定,没有超调。
但是控制器输出u有大幅度的振铃现象。
如图4所示。
消除振铃后,系统输出c依然稳定,控制器输出u也没有了振铃现象,如图5所示。
消除振铃后,效果比较好。
7. 控制器的硬件实现
7.1 硬件电路部分
7.1.1 AD转换器
本课设AD 转换器选用的是TLC549。
TLC549是TI 公司生产的一种低价位、高性能的8位串行A/D转换器,它以8位开关电容逐次逼近的方法实现A/D 转换,最大转换速率为4MHZ,电源为3V 至6V。
它能方便地采用三线串行接口方式与各种微处理器连接,构成各种廉价的测控应用系统。
图 6 TLC549 接口电路图
AD 转换器的电路设计:
1) SCLK为外接时钟输入端,由单片机P1.3脚产生,故将接单片机的P1.3。
2)CS为AD转换片选信号,低电平有效,由程序控制与单片机的P1.4脚相连。
3)REF+和REF-是AD芯片的参考电压,这里分别接的+5V和地,则输入信号范围是0~5V,对应数字信号0x00~0xFF。
4)SDO是串行数据的输出口,由P3.4引脚读取。
7.1.2 DA转换器
本课设D/A 转换器选用的是TLC5615。
TLC5615是具有串行接口的D/A转换器,其输出为电压型,最大输出电压是基准电压的两倍。
性能优于早期的电流型转换器。
只需要3根线就能完成10位数据的传输,节省了IO口资源,易于和工业标准的微处理器或微控制器(单片机)接口。
图7 TLC5615C 接口电路图
DA 转换电路设计:
1) SCLK为DA 转换芯片的时钟信号,又单片机的P1.1提供。
故SCLK引脚将与单片机的
P1.1引脚相连接。
2)CS 为AD 转换片选信号,低电平有效,由程序控制与单片机的P1.2脚相连。
3)REFIN为参考电压。
本电路中由电阻分压得到,为2.5V,则DA输出电压范围是0~5V,对应数字信号0x0000~0x03FF。
4)DIN为芯片的数字输入引脚,与单片机的P1.0引脚相连。
7.1.3 控制器
本课设控制器选用的是AT89C51。
AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS 8位微处理器,51单片机是目前应用最广泛的8位单片机之一,其代表型号是ATMEL公司的A T89系列。
图8 单片机最小系统
单片机的最小系统如上图所示,其中包括:(1)晶振,这里我们用的是12MHZ,又单片机的时钟周期决定;(2)复位电路;(3)电源,这里AT89C51中VCC已经在内部连到电源上了。
7.2 软件实现部分
接下来是用C语言进行程序的编写,用keil软件的实现。
首先,在keil软件中新建一个项目,注意这里用到的是AT89C51单片机,然后进行编程,实现对单片机系统的控制,和对DA转换器、AD转换器的分别控制,其中包括中断程序、延时程序、定时器程序等。
程序编写完成,编译无误后,再生成hex文件,最后打开在proteus中画好的电路图,将写好的程序hex文件加载到单片机中,进行仿真。
本部分软件实现的大致流程,如下图9、
10所示,为主程序和中断子程序的流程图。
主程序
系统初始化
采样周期是否到达
采样周期变量清零
A/D 采样
计算u(k)
D/A 输出u(k)
采样变量赋新值
yes
定时器中断服务程序
定时器初值重装
时间计数变量自加
中断返回
图9 主程序流程图 图10 中断子程序流程图
主程序的功能主要是:对定时器的赋值、开外中断、初始各变量。
中断程序实现的功能:对给定信号进行采样,待采样周期到时,则采样反馈信号,并将采样值存储,接下来便是计算偏差E(k),计算U(k)。
8. 课程设计心得体会
通过本次课设,我对于大林算法的MA TLAB 仿真,proteus 的硬件设计有了更多的了解。
我在做仿真的时候,对于大林算法的控制器解出的D(z)计算了好几次,总是不一样,然后用m 文件进行了计算,得到了准确的结果,然后用simulink 进行了仿真得到了图像。
然后对于proteus 的电路图画得不熟悉,过程中进行了许多次的百度。
以后要拿出时间在硬件上下功夫,对于课程中学到的知识进行物理上的实现,将知识
用到实处。
9. 参考文献
1.《单片机原理及应用》张毅刚主编. 高等教育出版社.2003.1
2.
2. 《新概念51 单片机C 语言教程》郭天祥主编. 2008.11.
3. 《控制系统CAD——基于MA TLAB 语言》张晋格陈丽兰主编.机械工业出版社.2010.08.
10.程序清单(C程序)
/********************************************************************
* 文件名:Dahlin.c
* 描述: Dahlin算法数字控制器
* 班级:1202103
* 创建人:王明华120730103
********************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit AD_Out = P3^4; //TLC549 输出端
sbit CS = P1^4; //TLC549 片选信号
sbit AD_In = P1^3; //TLC549 输入端
sbit SPI_CLK = P1^1; //TLC5615 时钟信号
sbit SPI_DATA = P1^0; //TLC5615 数据信号
sbit CS_DA = P1^2; //TLC5615 片选信号
int Count = 0; //时间计数变量
int ek=0,ek1=0,ek2=0; //采样变量。
ek为E(k),ek1为e(k-1),ek2为e(k-2)。
int uk_out=0,uk[26]={0};//控制器输出变量。
uk[i]表示u[k-i]
/********************************************************************
* 名称: AD_Change(void)
* 功能: TLC549 驱动程序,模拟SPI 模式从AD 芯片中读出8 位数据
*********************************************************************/
uchar AD_Change(void)
{
uchar i,temp = 0;
AD_In = 0;
_nop_();
_nop_();
CS = 0;
_nop_();
_nop_();
_nop_();
_nop_();
if(AD_Out == 1) temp += 1;
for(i=0; i<8; i++)
AD_In = 1;
_nop_();
_nop_();
AD_In = 0;
_nop_();
_nop_();
if(i != 7)
{
temp = temp << 1;
if(AD_Out == 1) temp += 1;
}
}
CS = 1;
return temp;
}
/********************************************************************/ * 名称: Delay()
* 功能: 延时,延时时间为1ms * del
* 输入: del
* 输出: 无
*********************************************************************/ void Delay(uint del)
{
uchar i, j;
for(i=0; i<del; i++)
for(j=0; j<=148; j++);
}
/********************************************************************/ * 名称: Average()
* 功能: 平均值滤波法,取一共十个数据,
* 输入: 十个待处理的值
* 输出:得到一个的平均值
*********************************************************************/ uint Average(uint buffer[10])
{
uchar i;
int temp = 0;
for(i=0; i<10; i++) //对十个采样数据求平均数
{
temp += buffer[i];
}
temp = (uint)(((float)temp) / 10 + 0.5);
return(temp);
/********************************************************************/ * 名称: AD_Filter()
* 功能: 进行AD 采集10 次,并进行滤波处理
* 输入: 三十次AD 采集值
* 输出:经过处理后的AD 值
*********************************************************************/ uint AD_Filter()
{
uint Date_Buffer[10] = {0}, temp;
uchar i;
for(i=0; i<10; i++)
{
Date_Buffer[i] = AD_Change();
Delay(1); //延时1 毫秒采集一次。
这里可以根据工作需要调整时间。
}
temp = Average(Date_Buffer);
return(temp);
}
/********************************************************************/ * 名称: DA5615()
* 功能: 向DA 芯片中写入12 位串行数据并进行数模转换。
* 输入: 无
* 输出:无
*********************************************************************/ void DA5615(uint da)
{
uchar i;
da<<=6;
CS_DA=0;
SPI_CLK=0;
for (i=0;i<12;i++)
{
SPI_DA TA=(bit)(da&0x8000);
SPI_CLK=1;
da<<=1;
SPI_CLK=0;
}
CS_DA=1;
SPI_CLK=0;
for (i=0;i<12;i++);
}
/********************************************************************/ * 名称: Time0_Init()
* 功能: 定时器的初始化,11.0592MZ 晶振,50ms
* 输入: 无
* 输出: 无
*********************************************************************/ void Time0_Init()
{
TMOD = 0x01; //定时器0,工作方式1
IE = 0x82; //打开中断
TH0 = 0x4c; //装填初值
TL0 = 0x00;
TR0 = 1; //定时器使能
}
/********************************************************************/ * 名称: Main()
* 功能: 主函数
* 输入: 无
* 输出: 无
*********************************************************************/ void Main(void)
{
int i;
Time0_Init();
while(1)
{
if(Count>=10)
{
Count = 0;
ek = AD_Filter(); //读取AD 并滤波,得到ek 的值
uk_out=(int)((0.882*uk[1]+0.118*uk[13]+0.96*ek-1.266*ek1-0.350*ek2)*4096/5); //通过差分方程计算uk_out。
DA5615(uk_out); //控制器输出
ek2 = ek1; //采样变量更新
ek1 = ek;
for(i=25;i>0;i--) //输出变量数组的更新
{
uk[i]=uk[i-1];
}
}
}
}。