2 1.XẬY DỰNG HÀM TRUYỀN-THIẾT LẬP PHƯƠNG TRÌNH SAI PHÂN ..... 2 ĐỀ BÀI: Dùng máy tính khảo sát quá trình quá độ của hệ điều khiển tự động.. Chương trình có thể viết bằng ngôn ngữ C/C++,
Trang 11
MỤC LỤC
ĐỀ BÀI: 2
1.XẬY DỰNG HÀM TRUYỀN-THIẾT LẬP PHƯƠNG TRÌNH SAI PHÂN 2
2.CODE CHƯƠNG TRÌNH MÔ PHỎNG – C# 4
3.IN KẾT QUẢ ĐƯỜNG CONG QUÁ ĐỘ 11
5.IN KẾT QUẢ Y[K] 14
6.CÁC CHỈ TIÊU CHẤT LƯỢNG CỦA HỆ THỐNG 16
7.NHẬN XÉT: 17
8.TÀI LIỆU THAM KHẢO: 17
Trang 22
ĐỀ BÀI:
Dùng máy tính khảo sát quá trình quá độ của hệ điều khiển tự động
Yêu cầu:
1 Chương trình có thể viết bằng ngôn ngữ C/C++,visual,VB,matlab,
2 Cho phép người dùng nhập các tham số T1,T2,T3,K1,K2,K3,
3 Cho phép người dùng nhập bước cắt mẫu T
4 Hiển thị đường cong quá độ trên trục có khắc tọa độ để đánh giá tính ổn định của hệ thống
5 Thể hiện được các chỉ tiêu như ymax , max (%), yod,Tmax ,Tod… trên đồ thị
6 In ra màn hình 100 điểm y[k] ( cứ 10 điểm in 1 giá trị)
1.XẬY DỰNG HÀM TRUYỀN-THIẾT LẬP PHƯƠNG TRÌNH SAI PHÂN
Hàm truyền kín của hệ thống là:
𝑊(𝑠) =
𝐾1
𝑇1𝑠 + 1
𝐾2
𝑇2𝑠 + 1
1 + 𝐾1 𝐾2 𝐾3 (𝑇1𝑠 + 1)(𝑇2𝑠 + 1)
(𝑇1𝑠 + 1)(𝑇2𝑠 + 1) + 𝐾1𝐾2𝐾3
𝑇1𝑇2𝑠2+ (𝑇1+ 𝑇2)𝑠 + 𝐾1𝐾2𝐾3+ 1
Trang 33
Thay 𝑠 = 2
𝑇.𝑧−1
𝑧+1 vào hàm W(s) ta có:
2
𝑇 .
𝑧 − 1
𝑧 + 1)
𝑇1𝑇2 ( 2 𝑇 𝑧 − 1 𝑧 + 1)
2 + (𝑇1+ 𝑇2) ( 2 𝑇 𝑧 − 1 𝑧 + 1) + 𝐾1𝐾2𝐾3+ 1
2(𝑧 + 1)2 4𝑇1𝑇2(𝑧 − 1)2+ (𝐾1𝐾2𝐾3+ 1)𝑇2(𝑧 + 1)2+ 2(𝑇1+ 𝑇2)𝑇(𝑧 + 1)(𝑧 − 1) Biến đổi về dạng:
𝑌(𝑧) 𝑈(𝑧) =
𝐾1𝐾2𝑇2(𝑧2+ 2𝑧 + 1)
𝐴𝑧2+ 𝐵𝑧 + 𝐶 Trong đó:
𝐴 = 4𝑇1 𝑇2+ 2𝑇(𝑇1 + 𝑇2) + (𝐾1𝐾2𝐾3+ 1)𝑇2
𝐵 = −8𝑇1 𝑇2+ 2𝑇2(𝐾1𝐾2𝐾3+ 1)
𝐶 = 4𝑇1 𝑇2− 2𝑇(𝑇1 + 𝑇2) + (𝐾1𝐾2𝐾3+ 1)𝑇2
Az2Y(z) + BzY(z) + CY(z) = K1K2T2 [z2U(z) + 2zU(z) + U(z)]
Dùng tính chất dịch hàm gốc cả biến đổi Z ta tìm được phương trình sai phân tương ứng:
AY[k+2] + BY[k+1] + CY[k] = K1K2T2 (U[k+2] + 2 U[k+1] + U[k])
Vì tín hiệu vào là tín hiệu nhảy cấp U(t) = 1(t) nên ta có:
U[k+2] = U[k+1] = U[k] = 1
AY[k+2] + BY[k+1] + CY[k] = 4K1K2T2
Y[k+2] = (4K1K2T2 – BY[k+1] – CY[k]) /A
Từ đó ta có công thức tính các giá trị đáp ứng y(t) như sau:
y[0] = y[1] = 0;
y[k+2] = (4K1K2T2 – By[k+1] – Cy[k]) /A;
k=0, 1, 2…999; A, B, C là các hằng số đã tính ở trên
Trang 44
2.CODE CHƯƠNG TRÌNH MÔ PHỎNG – C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace test
{
public partial class Form1 : Form
{
private Graphics graph;
private int x0, y0, xMax, yMax; // tọa độ gốc O, xMax, yMax
private int min, max;
private int delta_x=30;
private int delta_y=30; // độ lệch trục tọa độ khi vẽ
private double dx, x, y;
private float x1, y1, x2, y2;
private bool OnDinh = true;
private float K1, K2, K3, T1, T2, T; //thông số đầu vào
private float Tmin;
private float ymax, yod, x_ymax, Tod, Tmax, xicma; //Thông số đầu ra cần tính toán private int x_Tod; // Xác định tọa độ của Tod;
private float unit_x, unit_y; // Độ chia để vẽ đồ thị
private float A, B, C;
public Form1()
{
InitializeComponent();
graph = DrawArea.CreateGraphics();
Trang 55
xMax = DrawArea.Width;
yMax = DrawArea.Height;
x0 = 0;
y0 = DrawArea.Height;
}
private void button1_Click(object sender, EventArgs e)
{
int sopt = 1000;
graph.Clear(Color.White);
float[] y = new float[sopt];
PointF[] pnt = new PointF[sopt];
Pen blackPen = new Pen(Color.Black, 1);
Pen redPen = new Pen(Color.Red, 1);
Pen greenPen = new Pen(Color.Green, 3);
int index = 0;
for (int i = 0; i < 100; i++)
{
// 100 chỉ số điểm y[k] cần in ra
comboBox_item.Items.Add(index);
index += 10;
}
listBox1.Items.Clear(); // phải xóa rỗng listbox mỗi lần cập nhật lại đồ thị
// Kiểm tra nhập thông số hợp lệ hay không
if (float.TryParse(textBoxK1.Text, out K1) && float.TryParse(textBoxK2.Text, out K2)
&& float.TryParse(textBoxT2.Text, out T2) && float.TryParse(textBoxT1.Text, out T1) && float.TryParse(textBoxT.Text, out T)
&& float.TryParse(textBoxT2.Text, out K3))
{
if (T1 < T2) { Tmin = T1/20; }
else { Tmin = T2 / 20; }
if (T > Tmin)
{ MessageBox.Show("Xin nhập lại chu kỳ trich mẫu T, T<= (1/20) Min(T1,T2) !"); } // chu kỳ trích mẫu
else
{
A = 4 * T1 * T2 + 2*T*(T1+T2) + (1 + K1 * K2 * K3) *T*T;
B = (-8*T1*T2 +(2 +2*K1*K2*K3) *T*T);
C = 4*T1*T2 - 2*T*(T1+T2) + T*T*(1 + K1 *K2 *K3);
Trang 66
float a0 = (1 + K1 * K2 * K3);
float a1 = (T1 + T2);
float a2 = (T1 * T2);
//Kiem tra tinh on dinh he thong theo tieu chuan Hurwits
if ((a1 > 0) && (a2 > 0)) { OnDinh = true; }
else OnDinh = false;
y[0] = 0; y[1] = 0;
ymax = y[1];
float ymin = 0;
for (int i = 0; i < (sopt - 2); i++)
{
y[i + 2] = (4*K1*K2*T*T - B *y[i+1] - C* y[i]) / A;
if (ymax < y[i]) { ymax = y[i]; x_ymax = i; } // Tìm vị trí và giá trị của ymax
if (ymin > y[i]) { ymin = y[i]; }
}
if (ymin < 0) { y0 = DrawArea.Height / 2; }
// ymin dùng để vẽ trục tọa độ khi có giá trị y âm!!! => có thể hệ thống ko ổn định
else { y0 = DrawArea.Height; }
//=== Tính toán lại độ chia để đồ thị nằm chọn trong "gọn" trong picturebox
unit_x = (DrawArea.Width - 3 * delta_x) / (T * 1000);
unit_y = (y0 - 3 * delta_y) / ymax;
for (int j = 0; j <= (sopt - 1); j++)
{ // Cập nhật các điểm đồ thị ->pnt
float toado_x = +j * T;
float toado_y = y[j];
pnt[j].X = (float)(delta_x + toado_x * unit_x);
//nhân với độ chia để full màn hình pnt[j].Y = (float)( y0 - toado_y * unit_y - delta_y);
if (j % 10 == 0)
{ //Lấy 4 chữ số sau dấu phẩy
int tmp = (int)(y[j] * Math.Pow(10, 4));
float _item = (float)(tmp / Math.Pow(10, 4));
listBox1.Items.Add(_item); // Cứ 10 phần tử thì thêm y[] vào listbox }
// listBox1.DataSource = y; add cả mảng y
// listBox1.Items.Add(y[0]); add từng phần tử
}
Trang 77
VeTrucToaDo(); // Vẽ trục tọa độ
graph.DrawLines(greenPen, pnt); // Vẽ đồ thị
// Vẽ vạch chia hoành độ
Font f = new Font("Tahoma", 12);
Brush b = new SolidBrush(Color.Red);
float chi_so = 0;
for (int i = 0; i < 10; i++)
{ chi_so += 100;
graph.DrawLine(blackPen, delta_x + chi_so * T * unit_x, y0 - delta_y - 3, delta_x + chi_so * T * unit_x, y0 - delta_y + 3);
graph.DrawString(chi_so.ToString(), f, b, delta_x + (chi_so - 15) * T * unit_x, y0
- 20);
}
if (OnDinh)
{
//==============Tính thời gian hệ thống bắt đầu ổn định
int k = 999;
do
{
Tod = k * T; // Thời gian ổn định
k;
x_Tod = k;
}
while ((Math.Abs((y[k] - y[999]) / y[999]) <= 0.05) && (k >= x_ymax));
k = 999;
do
{ k; }
while (Math.Abs((y[k] - (1 / K2)) / (1 / K2)) <= 0.01);
yod = 0;
for (int i = k; i < 1000; i++)
{
yod += y[i];
}
yod = yod / (999 - k + 1);
xicma = Math.Abs(ymax - yod) * 100 / yod;
Tmax = x_ymax * T;
// Đưa ra các thông số đầu ra
textBoxHT.Text = "Ổn định";
textBoxTod.Text = Tod.ToString();
textBoxYod.Text = yod.ToString();
Trang 88
textBoxTmax.Text = Tmax.ToString();
textBoxYmax.Text = ymax.ToString();
textBoxxicma.Text = xicma.ToString();
// Vẽ gióng tọa độ của ymax
float toa_do_x = delta_x;
float toa_do_y = y0 - ymax * unit_y - delta_y;
do
{
graph.DrawLine(blackPen, toa_do_x, y0 - ymax * unit_y - delta_y, toa_do_x +
3, y0 - ymax * unit_y - delta_y); //giong ngang
toa_do_x += 6;
} while (toa_do_x <= delta_x + x_ymax * T * unit_x);
do{
graph.DrawLine(blackPen, delta_x + x_ymax * T * unit_x, toa_do_y, delta_x + x_ymax * T * unit_x, toa_do_y +3); //doc
toa_do_y +=6;
} while (toa_do_y <= y0 - ymax * unit_y - delta_y);
graph.DrawString("Ymax=" + ymax.ToString(), f, b, delta_x + x_ymax * T * unit_x, y0 - ymax * unit_y - 2 * delta_y);
// Vẽ gióng yod
toa_do_x = delta_x;
do
{
graph.DrawLine(blackPen, toa_do_x, y0 - delta_y - yod * unit_y, toa_do_x +3, y0 - delta_y - yod * unit_y);
graph.DrawLine(blackPen, toa_do_x, y0 - delta_y - yod * unit_y * 1.05F, toa_do_x + 3, y0 - delta_y - yod * unit_y * 1.05F);
graph.DrawLine(blackPen, toa_do_x, y0 - delta_y - yod * unit_y * 0.95F, toa_do_x + 3, y0 - delta_y - yod * unit_y * 0.95F);
toa_do_x += 6;
} while (toa_do_x <= (xMax - 2 * delta_x));
graph.DrawString("Yod=" + yod.ToString(), f, b, xMax - 7 * delta_x, y0 - delta_y
- yod * unit_y * 1.1F);
//Vẽ gióng Tod
toa_do_y = y0 - delta_y - y[x_Tod] * unit_y;
do
{
graph.DrawLine(blackPen, delta_x + x_Tod * T * unit_x, toa_do_y, delta_x + x_Tod * T * unit_x, toa_do_y + 3);
Trang 99
toa_do_y += 6;
} while (toa_do_y <= (y0-delta_y));
graph.DrawString("Tod=" + x_Tod.ToString(), f, b, delta_x + x_Tod * T * unit_x + 10, y0 - 2*delta_y);
chi_so = ymax / 5;
int _tmp = (int)(chi_so * Math.Pow(10, 1));
chi_so = (float)(_tmp / Math.Pow(10, 1));
float tmp2 = chi_so;
for (int i = 0; i <= 15; i++)
if ((chi_so>0) && (chi_so<ymax))
{
graph.DrawLine(blackPen, delta_x - 3, yMax - chi_so * unit_y - delta_y,
delta_x + 3, yMax - chi_so * unit_y - delta_y);
_tmp = (int)(chi_so * Math.Pow(10, 1));
chi_so = (float)(_tmp / Math.Pow(10, 1));
graph.DrawString(chi_so.ToString(), f, b, delta_x - 30, yMax - chi_so * unit_y - delta_y-10);
chi_so += tmp2;
}
} else
{ textBoxTod.Text = "N/A";
textBoxHT.Text = "Không ổn định";
textBoxYod.Text = "N/A";
textBoxTmax.Text = "N/A";
textBoxYmax.Text = "N/A";
textBoxxicma.Text = "N/A";
}
}
}
else
MessageBox.Show("Xin chỉ nhập dữ liệu dạng số!");
}
//============================================//
private void VeTrucToaDo()
{ Pen p = new Pen(Color.Black, 2);
graph.DrawLine(p, delta_x, y0 - delta_y, xMax - 2, y0 - delta_y);//truc hoanh
graph.DrawLine(p, delta_x, 4, delta_x, yMax - delta_y);//truc tung
MuiTen(graph, new Pen(Color.Black), new PointF((float)(xMax - 2.5), (float)(y0 -
delta_y)), new PointF((float)(xMax - 2), (float)(y0 - delta_x))); //mui ten Ox
MuiTen(graph, new Pen(Color.Black), new PointF((float)delta_y, (float)0), new
PointF((float)delta_y, (float)(-2.5))); //mui ten Oy
Trang 1010
VeOXY();
}
//============================================//
private void VeOXY()
{ Font f = new Font("Tahoma", 12);
Brush b = new SolidBrush(Color.Black);
graph.DrawString("O", f, b, x0, y0 - delta_y);
graph.DrawString("T", f, b, xMax - 20, y0 - 18);
graph.DrawString("Y", f, b, x0 + 3, 5);
}
//============================================//
public static void MuiTen(Graphics graphics, Pen p, PointF diemDau, PointF diemCuoi) { Pen myPen = new Pen(Color.Black);
myPen.Width = 5;
myPen.EndCap = LineCap.ArrowAnchor;
PointF endPoint = new PointF((diemDau.X + diemCuoi.X) / 2, (diemDau.Y +
diemCuoi.Y) / 2);
graphics.DrawLine(myPen, diemDau, endPoint);
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{ // Đưa chỉ số của y ra comboBox
comboBox_item.Text = ((listBox1.SelectedIndex) * 10).ToString();
}
private void comboBox_item_SelectedIndexChanged(object sender, EventArgs e)
{
listBox1.SelectedIndex =int.Parse(comboBox_item.Text ) /10;
}
}
}// END OF PROGRAM
Trang 1111
*GIAO DIỆN CHƯƠNG TRÌNH:
Khung bên trái, phần “NHẬP THAM SỐ” là để nhập các tham số K1, K2, K3,T1, T2,T
Sau khi nhập xong ấn “VẼ VÀ KIỂM TRA ĐẶC TÍNH HỆ THỐNG” để vẽ đồ thị
và tính toán các chỉ tiêu chất lượng và in ra các gị trị của y[k]
3.IN KẾT QUẢ ĐƯỜNG CONG QUÁ ĐỘ
Chọn bộ thông số: K1=4; K2=5; K3=2; T1=2; T2=3; T=0.01
Giao diện chương trình sau khi mô phỏng:
Trang 1212
Đồ thị:
Trang 1313
Trục x thể hiện giá trị T (1000 lần chu kỳ trich mẫu)
Trục y thể hiện giá trị của y(t) theo T
4.MÔ PHỎNG TRÊN MATLAB
Sơ đồ simulink:
Lệnh vẽ đồ thị:
>> figure(1)
>> plot(ScopeData.time,ScopeData.signals.values)
>> grid on
Đường cong quá độ thu được qua Matlab:
Trang 1414
Nhận xét:
Đồ thị thu được bằng chương trình mô phỏng có dạng giống với đồ thị mô phỏng bởi Matlab Như vậy, nếu bỏ qua sai số không thể tránh khỏi trong quá trình
mô phỏng, chúng ta có thể kiểm chứng được phương pháp tìm phương trình sai phân của hệ thống, và tính toán của chương trình mô phỏng là đúng
5.IN KẾT QUẢ Y[K]
In ra màn hình kết quả y[k], cách 10 số in 1 lần
Sử dụng listbox để đưa ra 100 giá trị, cứ 10 giá trị thì add phần tử đó vào listbox
y[10]=0.0145 y[260]=0.3254 y[510]=0.4337 y[760]=0.4703
y[20]=0.0587 y[270]=0.3475 y[520]=0.4435 y[770]=0.4744
Trang 1515
y[30]=0.1274 y[280]=0.377 y[530]=0.4555 y[780]=0.479
y[40]=0.214 y[290]=0.4113 y[540]=0.4686 y[790]=0.4839
y[50]=0.3116 y[300]=0.4479 y[550]=0.4819 y[800]=0.4886
y[60]=0.4128 y[310]=0.4841 y[560]=0.4945 y[810]=0.4928
y[70]=0.5109 y[320]=0.5176 y[570]=0.5056 y[820]=0.4964
y[80]=0.5996 y[330]=0.5466 y[580]=0.5147 y[830]=0.4991
y[90]=0.6738 y[340]=0.5693 y[590]=0.5213 y[840]=0.5009
y[100]=0.7301 y[350]=0.5849 y[600]=0.5251 y[850]=0.5016
y[110]=0.766 y[360]=0.593 y[610]=0.5263 y[860]=0.5014 y[120]=0.7809 y[370]=0.5935 y[620]=0.5248 y[870]=0.5003 y[130]=0.7754 y[380]=0.5871 y[630]=0.521 y[880]=0.4984 y[140]=0.7517 y[390]=0.5747 y[640]=0.5153 y[890]=0.496
y[150]=0.7126 y[400]=0.5576 y[650]=0.5083 y[900]=0.4933 y[160]=0.662 y[410]=0.5373 y[660]=0.5005 y[910]=0.4904 y[170]=0.6041 y[420]=0.5154 y[670]=0.4925 y[920]=0.4875 y[180]=0.5432 y[430]=0.4935 y[680]=0.4848 y[930]=0.4849 y[190]=0.4835 y[440]=0.4729 y[690]=0.4779 y[940]=0.4827 y[200]=0.4289 y[450]=0.4579 y[700]=0.4722 y[950]=0.481