资源描述
.
计算机控制系统
实 验 报 告
实验一 模拟式小功率随动系统的实验调试
实验二 A/D、D/A接口的使用和数据采集
实验三 中断及采样周期的调试
实验四 计算机控制系统的实验调试
姓名: 陈启航
学号: 13031144
同组人: 吴振环 陈秋鹏 李恺
指导教师: 袁少强
日期: 2016年6月16日
实验一 二阶系统的电子模拟及时域响应的动态测试
一、实验目的
1. 熟悉反馈控制系统的结构和工作原理,进一步了解位置随动系统的特点。
2. 掌握判别闭环系统的反馈极性的方法。
3. 了解开环放大倍数对稳定性的影响及对系统动态特性的影响,对静态误差的影响。
二、实验内容
1. 连接元件构成位置随动系统;
2. 利用计算机内的采样及显示程序,显示并分析输出的响应结果;
3. 反复调试达到设计要求。
三、实验设备
XSJ-3 小功率直流随动系统学习机一台、DH1718 双路直流稳压电源一台、4 1/2 数字多用表一台
四、实验原理
模拟式小功率随动系统如下图所示:
1. 实验前需进行零位调整,反馈极性判断,反馈极性判断又包括速度反馈极性判断和位置反馈极性判断,须使反馈为负反馈。
2. 动态闭环实验系统调试。按下面电路图连线,通过改变变阻器 大小来改变闭环系统放大倍数,通过一路A/D把输出相应采入计算机进行绘图,同时测量输入电压和反馈电位计输入电压,算出稳态误差。
五、实验结果
滑阻阻值(千欧)
7.1
18.3
24.1
38.3
比例系数
1
1.5
2.75
3.7
给定角度(度)
30
60
120
输出角度(度)
38
66
129
静差角度(度)
3
1
4
静态误差(mv)
-146.7
-6.2
-193.5
过度过程曲线
见下图
1. K=1时的过渡过程曲线
2. K=1.5时的过渡过程曲线
3. K=2.75时的过渡过程曲线
4. K=3.7时的过渡过程曲线
六、思考题及实验感想
1 如果速度反馈极性不对应如何处理?如果位置反馈极性不对应如何处理?
答:首先判断测速机反馈极性。在一级运放处加一电压,记住电机转向,然后断开输入,用手旋转电机按同一转向转动,测量测速机输出电压,如与前电机所加电压极性相同,则可将该信号接入运放二的负端;否则应把测速机输出极性倒置,即把另一信号接入运放二的负相端。
其次判断位置反馈极性。将回路接成开环状态,给电机加入一正电压,可使其转动,然后使电机回零,顺着电机刚才转动的方向转一小角度(不可转到非线性区),同时用数字电压表测电位计电刷的输出电压,倘若其值为负,则表明此时是负反馈,否则,需把电位计两端±10V接线头对调,以保证闭环系统是负反馈。
2. 系统是几阶无静差系统?产生静差的原因。
答:系统是二阶无静差系统。产生静差的原因有以下几点:第一,系统的非线性特性,由于电机有死区,故当误差太小时,系统输出给电机的电压也比较小,未达到电机的启动电压,导致电机不能转动,造成误差。第二,电位计的测量有误差,A/D采样也会造成误差。
3. 说出开环放大系数与静差及稳定性的关系。
答:增大开环放大倍数有助于减小静差和增加系统的快速性,如过渡过程曲线1和2对比所示。但是开环放大倍数过大会导致超调增加和系统振荡,甚至不稳定,如过渡过程曲线3和4所示。
感想:通过这次实验,深刻了解了对于速度反馈类型的调试,对静态误差的分析以及产生误差的原因等,并且对开环放大系数对系统的影响也在实验过程中得到验证。对今后学习将有极大作用。
实验二 A/D、D/A接口的使用和数据采集
一、实验目的
1. 了解A/D接口的基本原理,硬件结构及编程方法等
2. 掌握机器内部的数据转换和储存方式
3. 学会定时器的原理及使用方法
4. 测量A/D的输入/输出特性,分析误差产生原因
5. 了解D/A接口基本原理,芯片结构;
6. D/A与CPU的连接,地址设置及编程方法等
二、实验内容
1. 编制并调试带定时器的A/D程序
2. 编制并调试带定时器的D/A程序
3. 对编写程序进行测试
4. 分析误差产生原因
三、实验设备
IBM PC 系列微机一台(586)、HD1219 12位A/D D/A接口板一块、DH1718 双路直流稳压电源一台、4 1/2 数字多用表一台
四、实验步骤
1. 编制A/D采样程序,对不同电压进行采样测量,并转换码制。将所测的结果与真实结果进行对比。
2. 编制D/A程序,在计算机中输入不同电压对应的码,进行输出,并用电压表测量电压输出值,将实际值与理论值进行比较。
五、程序流程图
1. A/D程序流程图
2. D/A程序流程图
六、实验数据
1. A/D实验数据
电压(V)
-10
-7.5
-5
-2.5
0
2.5
5
7.5
10
偏移码
0
1f9
3f6
5f1
7f0
a08
c27
e1a
fbf
补码
f800
f9f9
fbf6
fdf1
fff0
208
427
61a
7bf
浮点数
-1.00
-0.753
-0.505
-0.257
-0.008
0.254
0.519
0.763
0.968
2. D/A实验数据
Code
0000
2000
4000
6000
8000
A000
C000
E000
FFFF
输入电压
-5
-3.75
-2.5
-1.25
0
1.25
2.5
3.75
5
输出电压
-4.9
-3.7
-2.4
-1.2
0
1.2
2.5
3.7
5
误差
-0.1
-0.05
-0.1
-0.05
0
0.05
0
0.05
0
七、思考题
1. 试分析采集误差产生原因有哪些?
答:①A/D和D/A本身存在量化误差;②A/D和D/A有非线性特性;③噪声干扰,在测量过程中发现无论是A/D还是D/A,在实验中都不是稳定不变的,一般尾数都在不断的变化,这是由于电路中本身的噪声,以及数据采集板在设计过程中没有考虑到信号干扰所造成的。
八、实验感想
通过这次实验,接触了计算机编程的语言逻辑,并且对计算机的A/D和D/A编程有了一定了解,通过实验机上的仿真程序对实验得到进一步的完善。
实验三 中断及采样周期的调试
一、实验目的
1. 学习中断的原理及编程方法
2. 掌握采样周期的实现方法
二、实验内容
1. 编制并调试所编写的程序
2. 按线路图搭接一个二阶系统并观察输出特性
3. 观察采样周期变化对系统的影响
三、实验设备
IBM PC 系列微机一台(586)、HD1219 12位A/D D/A接口板一块、DH1718 双路直流稳压电源一台、4 1/2 数字多用表一台
四、实验步骤
1. 编写并调试程序。参照照老师所给程序语句编写面板程序,合理布局,使在面板上可以看到输入的电压波形,输出的电压波形,并为了方便实验六里观察随动,所以又编写了两个表盘,便于更好的观察输入输出的电压变化。并编写简单的控制率,使可以通过改变程序中的参数改变控制率。
2. 按照下面的电路图连线,组成一个计算机控制系统,改变其采样周期,观察系统的特性。
五、实验数据
中断计时器的计数值,其中T以ms为单位。由于计时器为16位,n的最大值为0xFFFF,即65535,由此得出的最大值为。故实验中只取了两组数据,并对采样周期对系统性能的影响作定性的观察。由实验现象得出结论:采样周期对系统的性能影响较大,且越小,系统的稳定性越好,动态响应越理想。对于本实验的系统,时系统近似等幅振荡。
R
0
1
-1
0
0
Q
0
0
0
1
-1
Uda(理论)
0
1
-1
-1
1
Uda(实测)
0
1.91
-2.79
-1.74
1.57
实验截图如下:
T=10ms
T=20ms
T=25ms
T=30ms
T=32ms
六、思考题及实验感想
1. 为什么T越小系统特性越好,T可以无限小吗?
答:T小有利于改善系统的动态特性,因为采用较小的T,在同样的采样周期内就可以对系统进行更多次的采样和控制,使系统响应往期望的方向发展。但是T过小会使系统极点向单位圆靠近,很小的量化误差会对系统的稳定性造成很大的影响,可能会导致系统不稳定。因此T不能太大也不能过小,应根据实际情况选择一个合适的值。
实验感想:通过这次实验,对实验中计算机的仿真编程有了进一步的了解,并且对于编程中的中断程序有了认识,同时,对于采样周期的不同对实验结果产生的影响也有了进一步的深入了解。
实验四 计算机控制系统的实验调试
一、实验目的
1. 掌握数控伺服系统静态参数选取的一般方法
2. 掌握利用极点配置方法进行离散系统全状态反馈控制规律及降维观测器的设计
3. 掌握控制算法编排实现及比例因子配置方法
4. 学会数控伺服系统调试的方法与过程
二、实验内容
1. 选择合适的采样周期,对小功率随动系统的模型进行离散化
2. 利用极点配置方法进行离散系统全状态反馈控制规律及降维观测器的设计
3. 编辑实时控制程序,在计算机内实现控制律
4. 进行闭环动态系统调试
5. 讨论静态误差及其消除方法
三、实验设备
IBM PC 系列微机一台(586)、HD1219 12位A/D D/A接口板一块、DH1718 双路直流稳压电源一台、4 1/2 数字多用表一台
四、实验原理
该数控伺服系统的结构图如下图所示。该系统是一直流伺服系统,它由直流力矩电机、直流测速发电机、角位置测量电位计及直流放大器、80X86处理器计算机及A/D、D/A变换器组成。加入系统的指令输入信号通过A/D、D/A变换器进入计算机,经过计算机控制算法的处理产生控制指令,由D/A变换器输出,加到运算放大器输入端,与测速机测得的角速度信号综合比较,经过功率放大后驱动直流力矩电机转动。负载的转角由电位计测得,并通过A/D加入到计算机,通过控制指令的计算,形成一个完整的闭环控制系统。
(1) 确定增益系数
D/A输出 120mv,电机启动:
,;
D/A输出 5v,电机转速ω=26rad/s
闭环传递函数
稳态增益为,;
系统连续部分的传递函数为
;
若取
得状态方程
输出方程
由MATLAB可得
,
a=[0 1;0 -54.49];
b=[0;283.4];
[F,G]=c2d(a,b,0.01)
F =
1.0000 0.0077
0 0.5799
G =
0.0119
2.1849
(2) 设计状态反馈增益,使系统闭环极点ξ≥0.9,ωn ≥ 20 rad/s
系统在s平面的特征根
根据要求取,
得
根据,离散系统的特征根为
使用MATLAB计算状态反馈增益
F=[1,0.0077;0,0.5799];
G=[0.0119;2.1849];
P=[0.7877 + 0.0674*i,0.7877 - 0.0674*i];
k=acker(F,G,P)
k =
2.2735 -0.0103
(3) 设θ可测,设计降维观测器,观测器衰减速率是系统闭环衰减速率的 4倍。
降维观测器方程
L为观测器增益,观测器衰减速率是系统闭环衰减速率的 4倍,闭环极点为
观测器极点为
利用MATLAB可求得
L = 24.5844;
F22=0.5799;
F12=0.0077;
P=0.3906;
l=acker(F22',F12',P)
l =
24.5844
降维观测器方程
观测器误差方程
(4) 求离散控制律 D(z)
加入观测器和反馈增益系统的离散方程为:
对上式进行z变换
;
(5) 将 D(z)进行实现,配置适当的比例因子。
采用零极型编排结构实现
配置比例因子
控制器稳态增益为,高频增益为
选择比例因子为4
不考虑A/D,D/A的量程,结构图如下:
两图比较得:
K1=-0.505 K2=1 K3=-0.4615 K4=-0.8121 K5=0.21 K6=0.5 K7=2
(6)编排实现
按下图编排实现:
可得,k1=-0.45725,k2=1,k3=-0.09787,k4=0.233,k5=0.25,k6=0.125,k7=8
上面为理论计算得到的控制器,实验中使用的控制器参考了往届同学的工作,进行了较大修正,得到的效果较好。以下为实验实际所用的编排数据,程序见附录:
k1=-0.66,k2=1,k3=-0.456,k4=0.511,k5=0.74,k6=0.26,k7=2.7;
五、实验步骤
1. 按上述原理图接线。
2. 用C语言编制带曲显示的实时控制程序。实时控制程序参考流程图
3. 运行带曲显示的实时控制程序,调节系统达到控制要求,打印输出曲线
六、实验结果
实验结果比较顺利的完成了指定的任务。静差和超调均在规定范围之内。
控制界面的截图如下所示:
阶跃响应:
七、思考题
1. 若系统输入和输出有较大偏差,如何通过系数的调整解决?
答:若输出角度和输入角度有较大偏差,可以通过改变K1的值,增大或减小反馈值,从而达到改变输出电压,即调整输出角度的目的,不用重新设计状态反馈。
2. 系统引入速度反馈的作用是什么?
答:速度反馈的目的是改善系统的动态特性,使系统能够快速响应输入。
3. 参数 K1 、K5 对系统静特性的影响?
答:K1和K5影响的主要是系统的开环增益,增加开环增益可以减少系统静差,提高系统的快速性,同时太大的开环增益会是的系统振荡性加强甚至不稳定。
4. 参数 K3 、K4 对系统动特性的影响?
答:K3调整的是控制器的零点,可以调节系统的响应,但对稳定性影响不大;K4对应控制器的极点,对系统的动态响应及稳定性都起关键作用。
八、实验感想
通过这四次实验,对计算机控制系统的实验有了进一步了解,从前三次实验的分步了解认识到后来第四次综合性的大实验结合,对速度反馈系统有了深刻了解,并且学会了如果通过调节速度反馈中的系数大小来调节完善系统反馈的准确性,通过调节参数来减小系统静差,并且接触到了仿真程序的编写,以及如何控制这些仿真程序来改变仿真界面的类型等技巧,相信这些知识对我将来起到极大的作用。最后感谢老师的细心指导和每节课的耐心讲解,在我们遇到线路上的问题时,都会帮我们来排查故障。谢谢老师。
附(实验代码):
.页脚.
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#include <graphics.h>
#include <conio.h>
#include <dos.h>
#include <math.h>
#define pi 3.14159265
/*------define k1 to k7-------*/
//float k1=-0.68,k2=1,k3=-0.459,k4=0.521,k5=0.85,k6=1.02,k7=0.8;
/*------------------others----------------*/
//float k1=-0.505,k2=1,k3=-0.4615,k4=-0.8121,k5=0.21,k6=0.5,k7=2;
//float k1=-0.6546,k2=1,k3=-0.4293,k4=0.5024,k5=0.75,k6=4,k7=2;
float k1=-0.66,k2=1,k3=-0.456,k4=0.511,k5=0.74,k6=0.26,k7=2.7;
//float k1=-0.6743,k2=0.75,k3=-0.459,k4=0.521,k5=2,k6=2,k7=2;
//float k1=-0.67,k2=1,k3=-0.459,k4=0.521,k5=0.75,k6=0.25,k7=2;
//float k1=-0.6743,k2=0.75,k3=-0.459,k4=0.521,k5=4,k6=4,k7=2;
//float k1=-0.333,k2=0.75,k3=0.0329,k4=0.1963,k5=4,k6=4,,k7=2;
/*----------------------------------------*/
float t=0.1,x=0,x1,adpre=0,adpre1=0;
float timer=0;
int N1;
void interrupt (*oldint)(...);
void interrupt newint(...);
float adc(int n);
void dac(float da);
void initialscreen();
void main()
{
initialscreen();
oldint=getvect(0xb);
setvect(0xb,newint);
disable();
int n,temp;
N1=10/t;
x1=50*t;
n=2000000*t;
temp=n;
n=n*256;
outportb(0x31b,0xb6);
outportb(0x31a,n);
outportb(0x31a,temp);
outportb(0x21,inportb(0x21)&0xf7);
//setcolor(BLACK);
enable();
getch();
closegraph();
outportb(0x21,inport(0x21)|0x08);//8259 INTERRUPT END MARK
setvect(0xb,oldint); //RECOVER INTVECT
}
void interrupt newint(...)
{
while(timer>=N1)
{
disable();
outportb(0x20,0x20);
goto a;
}
timer=timer+0.3 ;
float ad0,ad1,a1,da,d1;
ad0=adc(0);
ad1=adc(1);
/*------DRAW THE PICTURE------*/
setcolor(BLUE);
line(240+x1*timer,120-adpre1*90,240+x1*timer,120-ad0*90);
adpre1=ad0;
setcolor(RED);
line(240+x1*(timer),350-adpre*90,240+x1*timer,350-ad1*90);
adpre=ad1;
/*------DRAW THE POINTER------*/
setcolor(RED);
setfillstyle(0,BLACK);
fillellipse(120,120,77,77);
setcolor(RED);
line(120,120,120+75*cos((ad0+0.5)*pi),120-75*sin((ad0+0.5)*pi));
setcolor(RED);
setfillstyle(0,RED);
fillellipse(120,350,77,77);
setcolor(YELLOW);
line(120,350,120+75*cos((ad1+0.5)*pi),350-75*sin((ad1+0.5)*pi));
/*
a1=ad1*k1+x;
d1=ad0*k5+a1*k2;
if(d1>=1/k6)
d1=1/k6;
else if(d1<=-1/k6)
d1=-1/k6;
da=k7*d1;
dac(da);
*/
da=2*(ad0-ad1);
dac(da);
a: outportb(0x20,0x20);
}
/*------D/A PROGRAM------*/
void dac(float da)
{
int y,lo,hi,newhi,newlo;
y=(da+1)/2*0xfff0;
lo=y&0x00ff;
hi=(y&0xff00)/256;
newhi=(hi&0x000f)*16+(hi&0x00f0)/16;
outportb(0x314,newhi);
newlo=(lo&0x00f0)/16;
outportb(0x315,newlo);
inportb(0x315);
}
/*------A/D PROGRAM------*/
float adc(int n)
{
float ad;
int p,q;
int i,r;
outportb(0x31b,0x18);
outportb(0x310,n);
for(i=0;i<500;i++)
outportb(0x311,0x0);
for(i=0;i<500;i++)
p=inportb(0x312)%16;
q=inportb(0x313);
//printf("%0x,%0x\n",p,q);
r=p*256+q;
//printf("%0x",r);
float r1=r;
ad=r1/0x800-1;
//printf("%f",ad);
//getch();
return ad;
}
/*------FIGURE PLOT------*/
void initialscreen()
{
int gm, i,Radius,numy,width,startx,starty,height,blockHeight;
char msg[100];
int point[16];
int gdriver = DETECT, gmode;
initgraph(&gdriver, &gmode,"D:\\BORLANDC\\BGI");
cleardevice();
setbkcolor(BLUE);
setcolor(14);
int x1=120,y1=120;
int x2=120,y2=350;
// Radius=80;
char k[100];
for(float t=0;t<360;t++)
{
if((int)(t)%5!=0)
{
line(x1+98*sin(t/180*pi),y1+98*cos((180-t)/180*pi),x1+100*sin(t/180*pi),y1+100*cos((180-t)/180*pi));
line(x2+98*sin(t/180*pi),y2+98*cos((180-t)/180*pi),x2+100*sin(t/180*pi),y2+100*cos((180-t)/180*pi));
}
else
if((int)t%10==0)
{
if((int)t%30==0)
{
sprintf(k,"%2.0f",t);
if(t>=360)
{
sprintf(k,"%2.0f",t-360);
outtextxy(x1+120*sin(t/180*pi),y1+120*cos((180-t)/180*pi),k);
outtextxy(x2+120*sin(t/180*pi),y2+120*cos((180-t)/180*pi),k);
}
else
{
outtextxy(x1-10+111*sin(t/180*pi),y1-3+111*cos((180-t)/180*pi),k);
outtextxy(x2-10+111*sin(t/180*pi),y2-3+111*cos((180-t)/180*pi),k);
}
setcolor(20);
line(x1+85*sin(t/180*pi),y1+85*cos((180-t)/180*pi),x1+100*sin(t/180*pi),y1+100*cos((180-t)/180*pi));
line(x2+85*sin(t/180*pi),y2+85*cos((180-t)/180*pi),x2+100*sin(t/180*pi),y2+100*cos((180-t)/180*pi));
setcolor(20);
}
else
{
line(x1+90*sin(t/180*pi),y1+90*cos((180-t)/180*pi),x1+100*sin(t/180*pi),y1+100*cos((180-t)/180*pi));
line(x2+90*sin(t/180*pi),y2+90*cos((180-t)/180*pi),x2+100*sin(t/180*pi),y2+100*cos((180-t)/180*pi));
}
}
else
{
line(x1+94*sin(t/180*pi),y1+94*cos((180-t)/180*pi),x1+100*sin(t/180*pi),y1+100*cos((180-t)/180*pi));
line(x2+94*sin(t/180*pi),y2+94*cos((180-t)/180*pi),x2+100*sin(t/180*pi),y2+100*cos((180-t)/180*pi));
}
}
char input,output;
setcolor(14);
sprintf(msg,"Input V:",input);
outtextxy(373,15,msg);
setcolor(14);
sprintf(msg,"Output V:",output);
outtextxy(373,235,msg);
setcolor(14);
sprintf(msg,"Input Angle:",output);
outtextxy(10,10,msg);
setcolor(14);
sprintf(msg,"Output Angle:",output);
outtextxy(10,235,msg);
height=180, width=380,startx=240,starty=30;
int rp[8];
char a[60];
setfillstyle(1,WHITE);
rp[0] = rp[2] = startx;
rp[1] = rp[7] = starty;
rp[4] = rp[6] = startx+width;
rp[3] = rp[5] = starty+height;
fillpoly(4,rp);
settextstyle(0,0,0);
setlinestyle(1,1,1);
setcolor(DARKGRAY);
height=180, width=380,startx=240,starty=260;
int tp[8];
char b[60];
setfillstyle(1,WHITE);
tp[0] = tp[2] = startx;
tp[1] = tp[7] = starty;
tp[4] = tp[6] = startx+width;
tp[3] = tp[5] = starty+height;
fillpoly(4,tp);
settextstyle(0,0,0);
setlinestyle(1,1,1);
setcolor(DARKGRAY);
/*------AXIS PLOT------*/
for(numy=30,i=0;i<=10;i++,numy+=18)
{
line(240,numy,620,numy);
}
for(numy=260,i=0;i<=10;i++,numy+=18)
{
line(240,numy,620,numy);
}
for(numy=19,i=0;i<=20;i++,numy+=19)
{
line(240+numy,30,240+numy,210);
}
for(numy=19,i=0;i<=20;i++,numy+=19)
{
line(240+numy,260,240+numy,440);
}
setcolor (14);
for(numy=30,i=0;i<=10;i++,numy+=18)
{
sprintf(msg,"%d",2*(5-i) );
outtextxy(225,numy,msg);
}
for(numy=260,i=0;i<=10;i++,numy+=18 )
{
sprintf(msg,"%d",2*(5-i) );
outtextxy(225,numy,msg);
}
setcolor(RED);
line(240,120,620,120);
line(240,350,620,350);
for(numy=240,i=0;i<11;i++,numy+=38)
{
sprintf(msg,"%d",i );
outtextxy(numy,125,msg);
}
for(numy=240,i=0;i<11;i++,numy+=38)
{
sprintf(msg,"%d",i);
outtextxy(numy,355,msg);
}
setcolor(GREEN) ;
setlinestyle(SOLID_LINE,0,1);
t=0;
circle(x1,y1,101);
line(x1,y1,x1+75*sin(t/180*pi),y1+75*cos((180-t)/180*pi));
circle(x2,y2,101);
line(x2,y2,x2+75*sin(t/180*pi),y2+75*cos((180-t)/180*pi));
setcolor(14);
outtextxy(350,450,"---------");
}
展开阅读全文