《计算机控制》课程设计报告
题目: 串联校正控制器设计 姓名: 学号:
2013年12月2日
4
《计算机控制》课程设计任务书
指导教师签字: 系(教研室)主任签字:
2013年 11 月 25 日
1、 模拟控制器的设计
原系统的开环传递函数为
K
,单位负反馈。
s (s +1)(s +4)
根据题目要求,系统阻尼比为0.5,无阻尼自然振荡频率2rad/s。因此期望主导极点为
s d =-ξωn ±j ω=-1±
用Matlab 绘制其根轨迹如下图所示:
R oot Locus
a g i n a r y A x i s (s e c o n d s ) I m
-1
----
-1
R eal A xi s (seconds )
图 1 校正前系统的根轨迹
由上图可知,期望闭环极点位于根轨迹左侧,可以采用相位超前校正,使根轨迹左移。
由图可见,开环几点之一,s =-1正好位于期望闭环极点s d 垂线下的负实轴上,如果令校正装置的零点设在紧靠s =-1这个开环极点的左侧,另z c =-1.2,这样做往往能增大s d 成为闭环主导极点的可能性。运用Matlab 编程求出对应于零点z c =-1.2的极点为p c =-5,因此校正后系统的开环传递函数为:
G (s ) =
K (s +1.2)
s (s +1)(s +2)(s +5)
其根轨迹如图2所
-1
a g i n a r y A x i s (s e c o n d s I m )
----
R eal A xi s (seconds )
-1
图 2 校正后系统根轨迹
根据幅值条件,可以求出系统工作于点s d 的K 值为30。 原系统及校正后系统的阶跃响应如图3所示:
1. S t ep R esponse
1. p l i t u d e A m
0. 0. 0. 0. [**************]20
Ti m e (seconds)
图 3 原系统阶跃响应
4
1. S t ep R esponse
1. p l i t u d e A m
0. 0. 0. 0. [**************]20
Ti m e (seconds)
图 4 校正后系统的阶跃响应
可以看出原系统阶跃响应单调递增变化,为过阻尼的情况;校正后系统衰减震荡,为欠阻尼,由其根轨迹曲线可以看出,工作点近似位于期望闭环极点上。至此,模拟控制器设计完毕。
2、 器件选取及电路设计
(1) 控制器选用STC89C52单片机,晶振选取12MHz 。P0口作为普通I/O口使用,故需接入上拉电阻。
(2) A/D选用ADC0804。其分辨率为8位,转换时间为100us ,输入电压范围为0~5V。芯片内部具有三态输出数据锁存器,可直接连接在数据总线上。
(3) D/A选用DAC0832。其为8位D/A转换器,其转换时间为1us 。数据输入可以采用双缓冲、单缓冲、或直通方式,以便适用于各种电路的需要。工作电压为+5V~+15V,基准电压为范围为-10V~+10V。D/A转换结果采用电流形式输出,可通过外接运算放大器将其转换成电压。
由上述器件可以计算出,完成一次A/D、D/A转换所需要的时间为101us ;单片机每执行一条指令所需时间为0.083us ,给定采样时间0.01s ,即10000us ,足够完成程序运算与A/D、D/A的转换。原理图如图5所示:
图 5 数字控制器原理图
3、 数字控制器的设计以及被控对象的离散化
由模拟控制器到数字控制器的实现有许多方法,比如一阶前向差分、一阶后向差分、双线性变换法、零极点匹配法等等。考虑到双线性变换发使用方便且有一定精度,故选取其作为离散化方法。上一步选取了采样周期为0.01s ,由Matlab 运算得到离散化之后的控制器脉冲传函为:
G c (z ) =
0.9815 z - 0.9698
z - 0.9512
求得相应的差分方程为:u (k ) =0.9815e (k ) -0.9698(k -1) +0.9512u (k -1) 。
被控对象采用零阶保持器离散化,最终的离散化系统方框图如图6所示:
图 6 离散系统方框图
用simulink 对系统进行仿真,可得到系统的阶跃响应曲线:
图 7 simulink仿真图
图 8 离散系统阶跃响应曲线
与原系统相比,相差不大。下面给出离散化前后的bode 图:
图 9 离散化前后bode 图
上图中,实线为离散前系统的bode 图,点画线为离散化之后的bode 图,可以看出,两者差别不大,可以满足要求。
4、 程序设计
程序设计的总体思路是采用外部中断的方式进行。首先启动A/D转换,当转换完成时,触发单片机外部中断,进入中断服务子程序程序。在中断服务程序中,进行控制量的求取,然后再次启动A/D转换,中断返回。D/A采用直通工作方式,即只需要变化数据输入端,其模拟输出就紧跟着变化。由于D/A的转换时间为1us ,而A/D转换时间为100us ,故D/A芯片有足够的时间完成转换。
使用keil 开发环境进行程序编写调试。并且利用keil 的软件调试模式进行计算中断服务子程序运行一次所需要的时间。进而可以计算出每个周期内采样、转换与计算输出所需的总时间,然后与确定的采样周期相比较,确定采样周期的选取是否符合条件。
软件调试界面如图10所示:
图 10 Keil软件调试模式
分别对进入中断以及中断返回进行计时,即可得到中断服务子程序运行时间,如图11所示:
图 11 中断服务程序运行时间
由上图可以计算中断服务程序运行的时间为:
0.0011554-0.01076=0.000794s
A/D转换时间为100us ,故每周期总共用时为:
0.000794+0.001=0.001794s
故所选取的采样周期0.01s 完全足够其完成采样与运算。
程序流程图如下所示:
图 12 软件流程图
5、 心得体会
本次课程设计持续一周时间,在这一周内,我完成了从系统设计到控制器的具体编程实现等工作,有很大的收获。这次课设将以前学过的很多知识串联起来,形成整体化、系统化的思想,提高了我们综合运用所学知识解决实际问题的能力,也提升了我们有目的地查阅资料解决问题的能力。当然,这次课程设计更多的是让我识到自己的不足。作为一名大学生,掌握的知识确很过时,会用的只是课程中讲过的一些很简单很基本的芯片和控制器,不能与最新的只知识接轨,知识结构的老化,对所学专业认识的浅显,纸上谈兵,缺乏实践经验等等都是我们亟待解决的问题。在以后的学习工程中,我一定会积极拓宽自己的视野,多接触一些新知识,丰富自己,提升自己。我们的路还有很长。
6、 参考文献
[1] 张晋格主编. 自动控制原理. 哈尔滨:哈尔滨工业大学出版社,2003.
[2] 刘建昌等主编. 计算机控制系统. 北京:科学出版社,2009.
[3] 张毅刚主编. 单片机原理及应用. 北京:高等教育出版社,2004.
[4] 张晋格,陈丽兰主编. 控制系统CAD —基于MA TLAB 语言. 北京:机械工业出版社,2010.
[5] 郭天祥编著.51单片机C 语言教程. 北京:电子工业出版社,2009.
7、 附录
Matlab 程序:
程序一:
%%校正前根轨迹
clc,clear,close all ;
num=1;
den=conv([1 1 0],[1 4]);
G=tf(num,den);
figure(1);
rlocus(G);
T=feedback(G,1);
figure(2);
step(T,20);
程序二:
%%求取极点位置
clc,clear,close all ;
x=-20:0.001:-1;
angs=angle(-1+sqrt(3)*1i-(-1.2))*180/pi-90-angle(-1+sqrt(3)*1i-0)*180/pi-angle(-1+sqrt(3)*1i-(-4))*180/pi-angle(-1+sqrt(3)*1i-x)*180/pi;
p=spline(angs,x,-180)
程序三:
%%校正后根轨迹还未进行离散化
clc,clear,close all ;
G=tf([1 1.2],conv([1 1 0],[1 9 20]));
figure(1);
rlocus(G)
s=-1+sqrt(3)*1i;
k=abs(s*(s+1)*(s+4)*(s+5)/(s+1.2))
Gc=tf([k 1.2*k],[conv([1 1 0],[1 9 20])]);%期望极点处开环传函
T=feedback(Gc,1);%期望极点处闭环传函
figure(2);
step(T,20)
程序四:
%运用双线性变换,进行离散化, 判稳???
clc,clear,close all ;
num=[1 1.2];
den=[1 5];
Gs=tf(num,den);%连续系统的控制器
Gz=c2d(Gs, 0.01, 'tustin' ) %双线性离散化之后的控制器
Gp=tf([30],conv([1 1 0],[1 4]));%连续系统的被控对象传函
Gpz=c2d(Gp,0.01,'zoh' ); %采用零阶保持器离散化之后的被控对象脉冲传函
sysc=Gs*Gp;
sysd=Gz*Gpz;
%画出离散化前后系统的bode 图,比较性能差异
figure(1);
bode(sysc, 'r-' , sysd, 'b-.' );
axis();
grid;
T=feedback(sysd,1);%离散系统的闭环传函(单位反馈)
figure(2),step(T,20);
C 源程序:
#include
#include
#define uint unsigned int
sbit ADRD=P2^0;
sbit ADWR=P2^1;
sbit INTR=P2^2;
static float ek=0;
static float ek_1=0;
static float uk=0;
static float uk_1=0; //以上四个变量存储用于计算每次输出的值
void Init()
{
P0=0X00;//由于P0为D/A的输入口,而D/A为直通工作方式故初始化其为0 P1=0x00;//P1口为读A/D的数据口,将其初始化为全1
P2=0xff;//P2口控制A/D的读写端,将其初始化为全1,使A/D芯片不工作 P3=0xff;
}
void main()
{
Init(); //初始化 注意,一定要先声明变量,在进行其他操作,否则会出现许多奇怪的错误
TMOD=0x01;//设置定时器TO 为工作方式1
TH0=(65536-10000)/256;
TL0=(65535-10000)%256;
PT0=1;//设置定时器中断0优先级最高
EA=1; //开总中断
ET0=1;//开外部中断0
TR0=1;//启动定时器T0
while(1);//主程序进入循环,等待中断产生
}
void T0_time(void) interrupt 1
{
TH0=(65536-10000)/256; //重装初值
TL0=(65535-10000)%256;
INTR=1;//先将其置高,A/D转换结束时,其将变为低电平
//下面启动A/D转换
ADWR=1;
_nop_();
ADWR=0;//拉低WR ,启动A/D转换
_nop_();
ADWR=1;
while(INTR); //INTR低电平表示A/D转换完成
//下面进行读取A/D,并赋值给e(k)
P1=0xff;//P1、P2、P3口均为准双向I/O口,读取之前要向其先写1 ADRD=1;
_nop_();
ADRD=0;
_nop_();
ek=P1;
ADRD=1;
//下面计算u(k)的输出值
uk=0.9815*ek-0.9698*ek_1+0.9512*uk_1;
P0=uk;//计算得到的控制量,由P0口输出给D/A芯片
//更新数据
ek_1=ek;
uk_1=uk;
}
《计算机控制》课程设计报告
题目: 串联校正控制器设计 姓名: 学号:
2013年12月2日
4
《计算机控制》课程设计任务书
指导教师签字: 系(教研室)主任签字:
2013年 11 月 25 日
1、 模拟控制器的设计
原系统的开环传递函数为
K
,单位负反馈。
s (s +1)(s +4)
根据题目要求,系统阻尼比为0.5,无阻尼自然振荡频率2rad/s。因此期望主导极点为
s d =-ξωn ±j ω=-1±
用Matlab 绘制其根轨迹如下图所示:
R oot Locus
a g i n a r y A x i s (s e c o n d s ) I m
-1
----
-1
R eal A xi s (seconds )
图 1 校正前系统的根轨迹
由上图可知,期望闭环极点位于根轨迹左侧,可以采用相位超前校正,使根轨迹左移。
由图可见,开环几点之一,s =-1正好位于期望闭环极点s d 垂线下的负实轴上,如果令校正装置的零点设在紧靠s =-1这个开环极点的左侧,另z c =-1.2,这样做往往能增大s d 成为闭环主导极点的可能性。运用Matlab 编程求出对应于零点z c =-1.2的极点为p c =-5,因此校正后系统的开环传递函数为:
G (s ) =
K (s +1.2)
s (s +1)(s +2)(s +5)
其根轨迹如图2所
-1
a g i n a r y A x i s (s e c o n d s I m )
----
R eal A xi s (seconds )
-1
图 2 校正后系统根轨迹
根据幅值条件,可以求出系统工作于点s d 的K 值为30。 原系统及校正后系统的阶跃响应如图3所示:
1. S t ep R esponse
1. p l i t u d e A m
0. 0. 0. 0. [**************]20
Ti m e (seconds)
图 3 原系统阶跃响应
4
1. S t ep R esponse
1. p l i t u d e A m
0. 0. 0. 0. [**************]20
Ti m e (seconds)
图 4 校正后系统的阶跃响应
可以看出原系统阶跃响应单调递增变化,为过阻尼的情况;校正后系统衰减震荡,为欠阻尼,由其根轨迹曲线可以看出,工作点近似位于期望闭环极点上。至此,模拟控制器设计完毕。
2、 器件选取及电路设计
(1) 控制器选用STC89C52单片机,晶振选取12MHz 。P0口作为普通I/O口使用,故需接入上拉电阻。
(2) A/D选用ADC0804。其分辨率为8位,转换时间为100us ,输入电压范围为0~5V。芯片内部具有三态输出数据锁存器,可直接连接在数据总线上。
(3) D/A选用DAC0832。其为8位D/A转换器,其转换时间为1us 。数据输入可以采用双缓冲、单缓冲、或直通方式,以便适用于各种电路的需要。工作电压为+5V~+15V,基准电压为范围为-10V~+10V。D/A转换结果采用电流形式输出,可通过外接运算放大器将其转换成电压。
由上述器件可以计算出,完成一次A/D、D/A转换所需要的时间为101us ;单片机每执行一条指令所需时间为0.083us ,给定采样时间0.01s ,即10000us ,足够完成程序运算与A/D、D/A的转换。原理图如图5所示:
图 5 数字控制器原理图
3、 数字控制器的设计以及被控对象的离散化
由模拟控制器到数字控制器的实现有许多方法,比如一阶前向差分、一阶后向差分、双线性变换法、零极点匹配法等等。考虑到双线性变换发使用方便且有一定精度,故选取其作为离散化方法。上一步选取了采样周期为0.01s ,由Matlab 运算得到离散化之后的控制器脉冲传函为:
G c (z ) =
0.9815 z - 0.9698
z - 0.9512
求得相应的差分方程为:u (k ) =0.9815e (k ) -0.9698(k -1) +0.9512u (k -1) 。
被控对象采用零阶保持器离散化,最终的离散化系统方框图如图6所示:
图 6 离散系统方框图
用simulink 对系统进行仿真,可得到系统的阶跃响应曲线:
图 7 simulink仿真图
图 8 离散系统阶跃响应曲线
与原系统相比,相差不大。下面给出离散化前后的bode 图:
图 9 离散化前后bode 图
上图中,实线为离散前系统的bode 图,点画线为离散化之后的bode 图,可以看出,两者差别不大,可以满足要求。
4、 程序设计
程序设计的总体思路是采用外部中断的方式进行。首先启动A/D转换,当转换完成时,触发单片机外部中断,进入中断服务子程序程序。在中断服务程序中,进行控制量的求取,然后再次启动A/D转换,中断返回。D/A采用直通工作方式,即只需要变化数据输入端,其模拟输出就紧跟着变化。由于D/A的转换时间为1us ,而A/D转换时间为100us ,故D/A芯片有足够的时间完成转换。
使用keil 开发环境进行程序编写调试。并且利用keil 的软件调试模式进行计算中断服务子程序运行一次所需要的时间。进而可以计算出每个周期内采样、转换与计算输出所需的总时间,然后与确定的采样周期相比较,确定采样周期的选取是否符合条件。
软件调试界面如图10所示:
图 10 Keil软件调试模式
分别对进入中断以及中断返回进行计时,即可得到中断服务子程序运行时间,如图11所示:
图 11 中断服务程序运行时间
由上图可以计算中断服务程序运行的时间为:
0.0011554-0.01076=0.000794s
A/D转换时间为100us ,故每周期总共用时为:
0.000794+0.001=0.001794s
故所选取的采样周期0.01s 完全足够其完成采样与运算。
程序流程图如下所示:
图 12 软件流程图
5、 心得体会
本次课程设计持续一周时间,在这一周内,我完成了从系统设计到控制器的具体编程实现等工作,有很大的收获。这次课设将以前学过的很多知识串联起来,形成整体化、系统化的思想,提高了我们综合运用所学知识解决实际问题的能力,也提升了我们有目的地查阅资料解决问题的能力。当然,这次课程设计更多的是让我识到自己的不足。作为一名大学生,掌握的知识确很过时,会用的只是课程中讲过的一些很简单很基本的芯片和控制器,不能与最新的只知识接轨,知识结构的老化,对所学专业认识的浅显,纸上谈兵,缺乏实践经验等等都是我们亟待解决的问题。在以后的学习工程中,我一定会积极拓宽自己的视野,多接触一些新知识,丰富自己,提升自己。我们的路还有很长。
6、 参考文献
[1] 张晋格主编. 自动控制原理. 哈尔滨:哈尔滨工业大学出版社,2003.
[2] 刘建昌等主编. 计算机控制系统. 北京:科学出版社,2009.
[3] 张毅刚主编. 单片机原理及应用. 北京:高等教育出版社,2004.
[4] 张晋格,陈丽兰主编. 控制系统CAD —基于MA TLAB 语言. 北京:机械工业出版社,2010.
[5] 郭天祥编著.51单片机C 语言教程. 北京:电子工业出版社,2009.
7、 附录
Matlab 程序:
程序一:
%%校正前根轨迹
clc,clear,close all ;
num=1;
den=conv([1 1 0],[1 4]);
G=tf(num,den);
figure(1);
rlocus(G);
T=feedback(G,1);
figure(2);
step(T,20);
程序二:
%%求取极点位置
clc,clear,close all ;
x=-20:0.001:-1;
angs=angle(-1+sqrt(3)*1i-(-1.2))*180/pi-90-angle(-1+sqrt(3)*1i-0)*180/pi-angle(-1+sqrt(3)*1i-(-4))*180/pi-angle(-1+sqrt(3)*1i-x)*180/pi;
p=spline(angs,x,-180)
程序三:
%%校正后根轨迹还未进行离散化
clc,clear,close all ;
G=tf([1 1.2],conv([1 1 0],[1 9 20]));
figure(1);
rlocus(G)
s=-1+sqrt(3)*1i;
k=abs(s*(s+1)*(s+4)*(s+5)/(s+1.2))
Gc=tf([k 1.2*k],[conv([1 1 0],[1 9 20])]);%期望极点处开环传函
T=feedback(Gc,1);%期望极点处闭环传函
figure(2);
step(T,20)
程序四:
%运用双线性变换,进行离散化, 判稳???
clc,clear,close all ;
num=[1 1.2];
den=[1 5];
Gs=tf(num,den);%连续系统的控制器
Gz=c2d(Gs, 0.01, 'tustin' ) %双线性离散化之后的控制器
Gp=tf([30],conv([1 1 0],[1 4]));%连续系统的被控对象传函
Gpz=c2d(Gp,0.01,'zoh' ); %采用零阶保持器离散化之后的被控对象脉冲传函
sysc=Gs*Gp;
sysd=Gz*Gpz;
%画出离散化前后系统的bode 图,比较性能差异
figure(1);
bode(sysc, 'r-' , sysd, 'b-.' );
axis();
grid;
T=feedback(sysd,1);%离散系统的闭环传函(单位反馈)
figure(2),step(T,20);
C 源程序:
#include
#include
#define uint unsigned int
sbit ADRD=P2^0;
sbit ADWR=P2^1;
sbit INTR=P2^2;
static float ek=0;
static float ek_1=0;
static float uk=0;
static float uk_1=0; //以上四个变量存储用于计算每次输出的值
void Init()
{
P0=0X00;//由于P0为D/A的输入口,而D/A为直通工作方式故初始化其为0 P1=0x00;//P1口为读A/D的数据口,将其初始化为全1
P2=0xff;//P2口控制A/D的读写端,将其初始化为全1,使A/D芯片不工作 P3=0xff;
}
void main()
{
Init(); //初始化 注意,一定要先声明变量,在进行其他操作,否则会出现许多奇怪的错误
TMOD=0x01;//设置定时器TO 为工作方式1
TH0=(65536-10000)/256;
TL0=(65535-10000)%256;
PT0=1;//设置定时器中断0优先级最高
EA=1; //开总中断
ET0=1;//开外部中断0
TR0=1;//启动定时器T0
while(1);//主程序进入循环,等待中断产生
}
void T0_time(void) interrupt 1
{
TH0=(65536-10000)/256; //重装初值
TL0=(65535-10000)%256;
INTR=1;//先将其置高,A/D转换结束时,其将变为低电平
//下面启动A/D转换
ADWR=1;
_nop_();
ADWR=0;//拉低WR ,启动A/D转换
_nop_();
ADWR=1;
while(INTR); //INTR低电平表示A/D转换完成
//下面进行读取A/D,并赋值给e(k)
P1=0xff;//P1、P2、P3口均为准双向I/O口,读取之前要向其先写1 ADRD=1;
_nop_();
ADRD=0;
_nop_();
ek=P1;
ADRD=1;
//下面计算u(k)的输出值
uk=0.9815*ek-0.9698*ek_1+0.9512*uk_1;
P0=uk;//计算得到的控制量,由P0口输出给D/A芯片
//更新数据
ek_1=ek;
uk_1=uk;
}