Книги онлайн и без регистрации » Разная литература » Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория»

Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория»

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 283 284 285 286 287 288 289 290 291 ... 415
Перейти на страницу:
необходимо для регуляторов и всех основных видов коррекции. В дальнейшем может потребоваться разложение z-ПФ на элементарные дроби (для написания программ функционирующих на параллельно работающих ЦВМ) или на элементарные дроби (для контроля промежуточных координат). В этих случаях комплексные корни могут помешать. Те эту ситуацию вы должны предвидеть и при необходимости вам следует вернуться к первому этапу синтеза.

Промежуточный итог второго этапа продемонстрирован на рис. 4. Сравните с рисунком 2. Данный блок включите вместо регулятора, установите метод интегрирования — Euler и подберите минимальную частоту моделирования по существенному визуальному ухудшению переходного процесса. Для данной системы это 2000 Гц.

Откройте окно свойств блока "transferFunction" (рис. 4) и выполните преобразование ПФ к дискретной форме (Convert S->Z). Вам будет предложено выбрать период дискретизации. Установите его равным шагу моделирования или меньшим в 2.6 раз (потом не забудьте и свойства симуляции привести в соответствие). Результат преобразования показан на рис. 5. Проконтролируйте неизменность вида переходного процесса.

ЭТАП 3 — Выбор структурной схемы (алгоритма программы) и получение РУ цифрового ПИД-регулятора

В этом, демонстрационном примере не будем проектировать регулятор, реализуемый на параллельно функционирующих ЦВМ (для быстродействия) или адаптированный для независимого подбора полюсов и нулей (настраиваемый). Таким образом, из трех широко распространённых алгоритмов программ реализующих z-ПФ мы выбрали "непосредственный". Определимся с его модификацией, использующей два буфера, как наиболее наглядной. Поскольку непосредственный алгоритм не требует разложений z-ПФ, сразу запишем РУ для оригиналов.

Сравните это уравнение с z-ПФ на рис. 5 и со структурной схемой на рис. 6 (К=1), по которой можно построить z-ПФ любого порядка.

При манипуляциях с коэффициентами полиномов числителя и знаменателя дискретных фильтров следует воздержаться от округлений — переход от изображения Лапласа к Z-изображению описывается свертыванием правой полуплоскости "устойчивых" корней в несравнимо малую окружность единичного радиуса, т. е. точность позиционирования корней должна быть эквивалентно выше.

Следует отметить, что наиболее дешевые DSP — с фиксированной точкой (целочисленной математикой). При подобном ограничении можно увеличить все коэффициенты z-ПФ так, чтобы вес дробных остатков коэффициентов был незначителен, и корни остались прежними. Среди примеров программы VisSim вы найдете решение этой локальной задачи.

Если вами будет выбран другой алгоритм программной реализации z-ПФ и потребуется разложение последней на множители или на элементарные дроби, не обязательно его выполнять для дискретной ПФ. Разложить можно и непрерывную ПФ (нули и полюсы известны — рис. 3), а потом уже следует перейти к дискретным фильтрам первого порядка. При этом вы будете освобождены от расчетов и избежите неприятных манипуляций с "неокругляемыми" коэффициентами.

ЭТАП 4 — Написание программы ПИД-регулятора для ЦВМ

Не затрагивая вопрос выбора ЦВМ, скажем, что это может быть периферийный контроллер (PIC), микроЭВМ (8051, AVR,), ЭВМ (х86…), промышленный контроллер, DSP (ADSP-21xxx, TMS320, …) или схема на жесткой логике.

Составление программы выполняющей расчет рекурсивного уравнения (*) обычно не вызывает затруднений, если ЦВМ имеет команды деления и умножения чисел (желательно с большой мантиссой и плавающей точкой).

В табл. 1 и 2 представлены программы рекурсивного цифрового фильтра второго порядка. Они написаны на языках C++ и Паскале в средах разработки Borland C++Builder 4 и Borland Delphi 4 в соответствии с технологией создания моделей пользователя для программы VisSim. При трансляции получается файл pid.dll, главная функция которого "zW" может быть включена в модель программы VisSim с помощью блока "userFunction" (см. рис. 7). При записи коэффициентов РУ (*) в параметры блока и стробировании частотой 2000 Гц — это и будет модель искомого дискретного ПИД-регулятора.

Таблица 1

Файл pid.cpp

#include <math.h>

#include <condefs.h>

#pragma hdrstop

#define EXPORT32 declspec(dllexport)

//-----------

struct z TF_INFO {

       double k; // коэффициент усиления double

       double b0,b1,Ь2; // коэффициенты полинома числителя

       double a0, a1, a2; //коэффициенты полинома знаменателя

};

//----------

extern "С" {

       double buffer_x[2]={0,0}, buffer_y[]={0,0};

       double с, help_y;

//*** функция размещения параметров ***

//*** Вызывается VisSim-ом при создании блока ****

EXPORT32 long WINAPI zWPA(short FAR *ppCount){

      *ppCount=7; // число записываемых в файл vsm параметров модели пользователя

        return sizeof(z_TF_INFO);

}

//*** Процедура инициализации параметров ***

//*** Вызывается VisSim-ом после РА функции ***

XPORT32 void WINAPI zWPI(z_TF_INFO *zTF){

        zTF->k=31.9016459416667;

        zTF->b0=1;

        zTF->b1=-1.9894401341982;

        zTF->b2=0.98945592544195;

        zTF->a0=1;

        zTF->a1=-1.3333333333333;

        zTF->a2=0.33333333333333;

}

//*** функция изменения параметров ***

//*** Вызывается VisSim-ом при нажатии правой клавиши мыши ***

EXPORT32 LPSTR WINAPI zWPC(z_TF_INFO *zTF){

       return "k;Ь0;b1;b2;a0;a1;a2";

}

//*** Процедура Simulation Start ***

//*** Вызывается VisSim-ом на первом шаге моделирования ***

EXPORT32 long WINAPI zWSS(z_TF_INFO *zTF, long *runCount){

       buffer_x[0]=0; buffer_x[1]=0;

       buffer_y[0]=0; buffer_y[1]=0;

       help_y=0; c=0;

       return 0;

}

//*** Процедура Simulation End ***

//*** Вызывается VisSim-ом на последнем шаге моделирования ***

EXPORT32 long WINAPI zWSE(z_TF_INFO *zTF, long *runCount){

        return 0;

}

//*** Это базовая процедура в DLL ***

//*** Вызывается VisSim-ом на каждом шаге моделирования ***

EXPORT32 void WINAPI zW(z_TF_INFO *zTF, double FAR x[], double FAR y[])

        { if (x[0]==1 && c==0) {

//Непосредственный алгоритм с двумя буферами

        help_y=(zTF->k*(х[1]*zTF->b0+buffer_x[0]*zTF->b1+buffer_x[1]*zTF->b2)

              — (buffer_y[0]*zTF->a1+buffer_y[1]*zTF->a2)) / zTF->a0;

        buffer_x[1]=buffer_x[0]; buffer_x[0]=x[1];

        buffer_y[1]=buffer_y[0]; buffer_y[0]=help_y;

//Непосредственный алгоритм с одним буфером

/* double help;

help=(x[1]-(buffer_xf0/*zTF->a1+buffer_xfх[1]*zTF->a2))/zTF->aO;

help_y=(help*zTF->b0+buffer_x[0]*zTF->b1+buffer_x[1]*zTF->b2) *zTF->k; buffer_x[l]=buffer_x[0]; buffer_x[0]=help; */

}

у[0]=help_y;

c=x [0]; // организованна синхронизация блока no фронту

};

//----------

}//end extern "С" {

//----------

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*){

      return 1;

}

Таблица 2

Файл pid.dpr

library PID;

type

   InVector = array [0..9] of Double; {тип входной переменной: входов — 10}

   OutVector = array [0..9] of Double; {тип выходной переменной: выходов — 10}

   Global = record {запись параметров, и координат "dll"-модели}

       k: double;

       Ь0, b1 Ь2: double;

1 ... 283 284 285 286 287 288 289 290 291 ... 415
Перейти на страницу:

Комментарии
Минимальная длина комментария - 20 знаков. В коментария нецензурная лексика и оскорбления ЗАПРЕЩЕНЫ! Уважайте себя и других!
Комментариев еще нет. Хотите быть первым?