среда, 31 августа 2011 г.

Умножитель ун9/27-1.3 в преобразователе напряжения.

В статье "удвоитель для преобразователя напряжения" показана схема преобразователя в котором использовался удвоитель для повышения напряжения снятого со вторичной обмотки трансформатора. Если напряжение на вторичной обмотке большое и/или напряжение требуется увеличить до большей величины то удобнее использовать готовый умножитель например ун9/27-1.3 из старого телевизора. Схема приведена на рисунке 1:

Преобразователь напряжения с умножителем ун9/27-1.3
Рисунок 1 - Преобразователь напряжения с умножителем ун9/27-1.3 

Вместо микроконтроллера, в данном случае, лучше использовать схему попроще например мультивибратор или какой нибудь генератор колебаний. Микроконтроллер удобен тем что можно: изменять частоту управляющих импульсов, их скважность, осуществлять модуляцию, запускать и останавливать преобразование напряжения по заданной программе и в общем по всякому управлять работой преобразователя не внося изменений в схему или совершая какие либо другие сложные действия. На рисунке ниже чёрными стрелочками показаны выводы умножителя на которые подавалось переменное напряжение, красной и синей показаны выводы с которых снималось выходное напряжение.


На изображении ниже показана собранная схема преобразователя с умножителем.


Напряжение на выходе составило примерно 150 В.

среда, 24 августа 2011 г.

Применение метода переменных состояния для формирования математической модели цепи.

Рассмотрим формирование математической модели для анализа переходного процесса в схеме на рисунке 1:

Схема
Рисунок 1 - Схема

Для схемы на рисунке 1 составим направленный граф и выделим на нем нормальное дерево:

Направленный граф
Рисунок 2 - Направленный граф

Дерево графа показано жирными линиями. Хорды графа показаны тонкими серыми линиями. Граф показывает связи между узлами которые (связи) называются ветвями графа, направленный граф, помимо этого, показывает направления ветвей. В данном случае для каждого элемента поставлена отдельная ветвь. Все узлы находятся в местах соединения ветвей. Дерево графа это набор ветвей образующий путь между всеми узлами но не образующий замкнутых контуров. Выбор ветвей дерева должен производиться с учётом следующего приоритета:
1) источники ЭДС,
2) конденсаторы,
3) резисторы,
4) катушки.
Ветви не вошедшие в дерево являются хордами. Хорды выбираются в соответствии с приоритетом:
1) конденсаторы,
2) резисторы,
3) катушки,
4) источники тока.
 Далее выбираются контуры так чтобы в каждом из них содержалась одна хорда и направление обхода контура выбирается по направлению этой хорды.
    Математическая модель цепи может быть найдена из уравнения 1:


Где Ip - матрица токов ребер, Ux - матрица напряжений хорд, F- матрица ребер, Up - матрица напряжений ребер, Ix - матрица токов хорд.
   Запишем матрицу токов ребер и матрицу токов хорд в соответствии с приведенными выше приоритетами для ребер и для хорд:


 IE - ток источника, второй элемент матрицы Ip это ток конденсатора (смотри формулу 2 в статье "ёмкостное сопротивление конденсатора"), IRE - ток резистора RE, IRL - ток резистора RL, IRH - ток резистора RH, IL - ток катушки.
  Запишем матрицу напряжений ребер и матрицу напряжений хорд в соответствии с приведенными выше приоритетами для ребер и для хорд:


E - ЭДС источника E, UC - напряжение конденсатора, последние два элемента матрицы Up и первый элемент матрицы Ux - напряжения соответствующих резисторов (из закона Ома), последний элемент матрицы Ux это напряжение катушки (смотри "первый закон коммутации, ЭДС катушки"). Далее составим матрицу контуров B:

Число строк матрицы контуров равно числу контуров (в нашем случае два), число столбцов матрицы контуров равно числу ветвей. Каждый столбец принадлежит какой либо ветви а каждая строка - какому либо контуру, каждый контур принадлежит какой либо хорде. Столбцы и строки выставляются по порядку в соответствии с приведенными выше приоритетами для ребер и для хорд. Матрица контуров B заполняется так: 
  • Если ветвь принадлежит какому то контуру и совпадает с ним по направлению то в ячейке столбец которой принадлежит этой ветви а строка принадлежит этому контуру записывается 1.
  • Если ветвь принадлежит какому то контуру и не совпадает с ним по направлению то в ячейке столбец которой принадлежит этой ветви а строка принадлежит этому контуру записывается -1.
  • Если ветвь не принадлежит какому то контуру то в ячейке столбец которой принадлежит этой ветви а строка принадлежит этому контуру записывается 0.
Например ветвь E принадлежит контуру II и не совпадает с ним по направлению поэтому в ячейке столбца принадлежащего ветви E (первый столбец) и строки принадлежащей контуру II (вторая строка) записывается -1. Та часть матрицы столбцы которой принадлежат 
ветвям-ребрам называется матрицей ребер, остальная часть матрицы называется матрицей хорд. Если на главной диагонали матрицы хорд стоят единицы а в остальной её части - нули (как в нашем случае) то из матрицы контуров B можно выделить матрицу ребер F если нет то значит при составлении графа и/или при составлении матрицы контуров B была допущена ошибка. Контуры графа нумеруются согласно второму приоритету и их принадлежности хордам. 
  Выделим матрицу ребер F из матрицы контуров B:


Найдем матрицу -F:


 Транспонируем матрицу F (заменим столбцы строками а строки столбцами):

Подставим найденные матрицы Ip, Ux, -F, FT, Up, Ix в уравнение 1:


Перемножим матрицы во второй части уравнения:


Запишем это выражение в виде системы уравнений:


Из второго уравнения выразим производную напряжения конденсатора по времени через напряжение конденсатора используя пятое уравнение а из шестого уравнения выразим производную тока катушки по времени через ток катушки используя первое, третье и четвёртое уравнения:


Данная система уравнений представляет собой математическую модель схемы на рисунке 1.

среда, 17 августа 2011 г.

Математическая модель ИППН

Ранее рассматривался принцип работы ИППН и создавалась математическая модель ёмкостного фильтра которая представляла собой дифференциальное уравнение решением которого при заданных начальных условиях (начальном t и начальном Uc) является функция описывающая изменение напряжения конденсатора во времени. Ёмкостной фильтр, в отличии от ИППН (импульсного преобразователя напряжения), содержал всего один реактивный элемент и не содержал коммутирующих элементов (диодов, транзисторов, тиристоров и т.д.) поэтому математическая модель состояла из одного уравнения, в общем случае, если в схеме нет коммутирующих элементов, математическая модель схемы представляет собой систему уравнений с числом уравнений равным числу реактивных элементов (в некоторых схемах число уравнений может быть меньше из за наличия особых контуров и/или особых сечений). Если в схеме содержаться коммутирующие элементы которые можно считать идеальными то можно представить что схема имеет некоторое количество состояний в которых она может находиться. Например в схеме замещения ИППН, на рисунке 1, имеется два коммутирующих элемента - это ключ S и диод VD каждый из этих элементов может находиться в одном из двух состояний: 1) открыт, 2) закрыт; состояния этих элементов определяют состояние схемы. 

Схема замещения ИППН
Рисунок 1 - Схема замещения ИППН

Если элемент находиться в открытом состоянии то его можно заменить перемычкой если в закрытом то разрывом цепи. Таким образом состояние схемы это схема которая получается в результате разрывов или замыканий коммутирующими элементами тех или иных участков цепи а работа схемы это работа её состояний последовательно сменяющих друг друга. Зная принцип работы схемы можно делать предположения о возможных последовательностях состояний схемы при её работе. В статье "принцип работы ИППН повышающего и понижающего типа", как видно из названия, был рассмотрен принцип работы ИППН и показано что при его работе возможны два случая циклически сменяющих друг друга последовательностей состояний схемы. Для составления математической модели выберем положительные направления токов ветвей и обходов контуров схемы:
Схема ИППН с выбранными положительными направлениями токов ветвей и обходов контуров
Рисунок 2 - Схема ИППН с выбранными положительными направлениями токов ветвей и обходов контуров

Составим схему для состояния при котором ключ S замкнут (ключ заменяется перемычкой) а диод VD закрыт (заменяется разрывом): 

Первое состояние ИППН
Рисунок 3 - Первое состояние ИППН

Составим для данной схемы уравнения по второму закону Кирхгофа для двух имеющихся в схеме контуров:
В первом уравнении перенесем производную тока катушки по времени в левую часть а всё остальное в правую. Во втором уравнении перенесем производную напряжения конденсатора по времени в левую часть а всё остальное в правую и получим систему уравнений состояния (2) для первого состояния схемы:


Составим схему для второго состояния при котором ключ S разомкнут а диод VD открыт: 

Второе состояние ИППН
Рисунок 4 - Второе состояние ИППН

Составим для данной схемы два уравнения по второму закону Кирхгофа, для контуров обходы которых показаны на рисунке 4, и одно уравнение по первому закону Кирхгофа для узла, после чего выразим производную тока катушки по времени и производную напряжения конденсатора по времени:



Составим схему для третьего состояния при котором ключ S разомкнут, диод VD закрыт: 

Третье состояние ИППН
Рисунок 5 - Третье состояние ИППН

Третье состояние описывается только одним уравнением, составим его:


Состояние при котором открыты оба коммутирующих элемента открыты не появляется поэтому составлять для него уравнения нет смысла. Математическая модель схемы с коммутирующими элементами состоит не только из систем уравнений для каждого состояния но и из условий перехода в каждое состояние. Первое состояние наступает тогда когда замыкается ключ S. Ключ S может замыкаться и размыкаться с определённой частотой поэтому условием перехода в первое состояние может быть наступление промежутка времени значение которого кратно какому либо числу. Второе состояние наступает когда ключ S размыкается поэтому условием перехода во второе состояние может быть наступление промежутка времени значение которого кратно числу для первого состояния с некоторым смещением. Третье состояние наступает после второго когда ток катушки доходит до нуля. Если во втором состоянии ток катушки не доходит до нуля то третье состояние не появляется. 

      

среда, 10 августа 2011 г.

Программа для вывода графика на языке C++.

Для того чтобы вывести график не используя маткад, как описано в предыдущей статье, была написана программа исходный код которой приведен ниже. Изменяя переменные steepVG и steepHG, в коде, можно настроить программу для показа разных графиков. steepVG - шаг по вертикали, steepHG - шаг по горизонтали. Также может понадобиться умножать загруженные значения на некоторые коэффициенты. В коде прорисовки графика значения из массива t умножаются на 10 чтобы график вытянулся по оси времени. Можно изменить надписи у горизонтальной и/или вертикальной осей,
например заменить:
glCallLists(strlen("U,B"), GL_UNSIGNED_BYTE, "U,B");
на:
glCallLists(strlen("I,A"), GL_UNSIGNED_BYTE, "I,A");
и выводить график тока.
В программе используются функции OpenGL поэтому в параметры проекта надо включить файл lopengl32.lib. Если используется Dev C++ то это можно сделать как показано на скриншоте ниже. Проект - параметры проекта - параметры - компоновщик - добавить библиотеку.
Проект - параметры проекта - параметры - компоновщик - добавить библиотеку

Исходный код программы:

#include  < windows.h >
#include  < gl/gl.h  >
#include  < stdio.h >

HDC hDC;
float fI;
int B;
float steepVG=1.0f;//steep vertical grid
float steepHG=0.1f;//steep horizontal grid
char buf[100];//буфер для разных случаев
float t[100],Uc[100];
FILE *t_stream;
FILE *u_stream;

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam);
void glEnable (HWND hWnd, HGLRC *hRC);
void glDisable(HWND hWnd, HGLRC hRC);
void gPrint(float val);

int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int iCmdShow)
{
  WNDCLASS wc;
  HWND hWnd;
  HGLRC hRC;
  MSG msg;
  BOOL bQuit = FALSE;

  wc.style = CS_OWNDC;
  wc.lpfnWndProc = WndProc;
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hInstance = hInstance;
  wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
  wc.hCursor = LoadCursor (NULL, IDC_ARROW);
  wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
  wc.lpszMenuName = NULL;
  wc.lpszClassName = "gr";
  RegisterClass (&wc);

  hWnd = CreateWindow ("gr", "График",
  WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
  80, 50, 700, 500,
  NULL, NULL, hInstance, NULL);

  glEnable(hWnd, &hRC);

   while (!bQuit)
   {
      if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
     {
         if (msg.message == WM_QUIT)
         {
         bQuit = TRUE;
         }
       else
     {
     TranslateMessage (&msg);
     DispatchMessage (&msg);
     }
   }
   else
   {
     //здесь код OpenGL
    glClearColor (1.0f, 1.0f, 1.0f, 0.0f);
    glClear (GL_COLOR_BUFFER_BIT);
    //прорисовка сетки
    glColor3f( 0.0f, 1.0f, 0.0f );
    glLineWidth(1);
    glBegin(GL_LINES);
    for(fI=(-0.9f);fI<0.9f;fI+=0.1f)
    {
    glVertex2f(fI, -0.9f);glVertex2f(fI, 0.9f);//vertical grid
    }
    for(fI=(-0.9f);fI<0.9f;fI+=0.1f)
    {
    glVertex2f(-0.9f, fI);glVertex2f(0.9f, fI);//horizontal grid
    }
    glEnd();
    //надписи у вертикальной оси
    glColor3f( 0.0f, 0.0f, 0.0f );
    glRasterPos2f(-0.98f, 0.9f);
    glCallLists(strlen("U,B"), GL_UNSIGNED_BYTE, "U,B");
    for(fI=(-0.9f);fI<0.9f;fI+=0.1f)
    {
    glRasterPos2f(-0.98f, fI-0.01f);
    gPrint(fI*steepVG);
    }
    //надписи у горизонтальной оси
    glRasterPos2f(0.85f, 0.05f);
    glCallLists(strlen("t,c"), GL_UNSIGNED_BYTE, "t,c");
    for(fI=(-1.0f);fI<0.9f;fI+=0.1f)
    {
    glRasterPos2f(fI+0.05f,-0.95f);
    gPrint((fI+1.0f)*steepHG);
    }
    //прорисовка осей
    glColor3f( 0.0f, 0.0f, 0.0f );
    glLineWidth(1);
    glBegin(GL_LINES);
    glVertex2f( -0.9f, 0.0f );glVertex2f( 0.9f, 0.0f );//horizontal axis
    glVertex2f( 0.9f, 0.0f );glVertex2f( 0.85f, -0.015f );
    glVertex2f( 0.9f, 0.0f );glVertex2f( 0.85f, 0.015f );
    glVertex2f( -0.9f, -0.9f);glVertex2f( -0.9f, 0.9f);//vertical axis
    glVertex2f( -0.9f, 0.9f);glVertex2f( -0.91f, 0.85f);
    glVertex2f( -0.9f, 0.9f);glVertex2f( -0.89f, 0.85f);
    glEnd();
    //прорисовка графика
    glColor3f( 1.0f, 0.0f, 0.0f );
    glBegin(GL_LINE_STRIP);
    for(int i=0;i<100;i++)
    {
    glVertex2f( (t[i]*10.0f)-0.9f, Uc[i]);
    }
    glEnd();
    //можно раскомментировать для показа точек
    /*
    glPointSize(3);
    glColor3f( 0.0f, 0.0f, 1.0f );
    glBegin(GL_POINTS);
    for(int i=0;i<100;i++)
    {
     glVertex2f((t[i]*10.0f)-0.9f,Uc[i]);
    }
     glEnd();
     */
     SwapBuffers (hDC);
     }
  }
  glDisable(hWnd, hRC);
  DestroyWindow (hWnd);

  return msg.wParam;
}

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
  switch (message)
  {
  case WM_CREATE:
  //загрузка значений в массивы t и Uc
  if((t_stream=fopen("time.txt","r"))&&(u_stream=fopen("voltage.txt","r")))
  {
    for (int i=0;i<100;i++)
    {
    fgets(buf, 100, t_stream);
    t[i]=atof(buf);
    fgets(buf, 100, u_stream);
    Uc[i]=atof(buf);
    }
  fclose(t_stream);
  fclose(u_stream);
  }
  else MessageBox ( NULL,"Файл не найден","Error" , MB_OK);
  return 0;

  case WM_CLOSE:
  PostQuitMessage (0);
  return 0;

  case WM_KEYDOWN:
    switch (wParam)
    {
    case VK_ESCAPE:
    PostQuitMessage(0);
    return 0;
    }
    return 0;

  default:
  return DefWindowProc (hWnd, message, wParam, lParam);
  }
}

void glEnable (HWND hWnd, HGLRC *hRC)
{
PIXELFORMATDESCRIPTOR pfd;
int iFormat;
HFONT font;
hDC = GetDC (hWnd);
ZeroMemory (&pfd, sizeof (pfd));
pfd.nSize = sizeof (pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24;
pfd.cDepthBits = 16;
pfd.iLayerType = PFD_MAIN_PLANE;
iFormat = ChoosePixelFormat (hDC, &pfd);
SetPixelFormat (hDC, iFormat, &pfd);
*hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC,*hRC);
B = glGenLists(255);
font=CreateFont(-10,0,0,0,FW_BOLD,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_TT_PRECIS,
CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,FF_DONTCARE|DEFAULT_PITCH,"Arial");
SelectObject(hDC, font);
wglUseFontBitmaps(hDC,1,255,B);
}

void glDisable (HWND hWnd, HGLRC hRC)
{
wglMakeCurrent (NULL, NULL);
wglDeleteContext (hRC);
ReleaseDC (hWnd, hDC);
glDeleteLists(B,255);
}

void gPrint(float val)
{
sprintf(buf,"%f",val);
glCallLists(5,GL_UNSIGNED_BYTE,buf);
}

В обработчике событий WndProc находиться код загрузки значений. Файлы из которых загружаются значения должны быть в той же папке что и программа, иметь формат txt, содержать значения расположенные по порядку в каждой строке и называться time и voltage. Для примера можно взять файлы  time.txt и voltage.txt созданные программой код которой приведен в предыдущей статье. Ниже приведен график построенный по значениям из этих файлов.
график напряжения на конденсаторе емкостного фильтра
Увеличив число рассчитываемых точек в программе из предыдущей статьи и изменив соответствующим образом исходный код программы приведенный здесь можно достроить график дальше до установившегося значения напряжения на конденсаторе. Если необходимо показать точки то можно раскомментировать код показа точек.