AFON//Радиотехник
C++Builder · проект 38/50

Точка на диаграмме Смита

Коэффициент отражения нагрузки.

Задача

Посчитать комплексный коэффициент отражения нагрузки и отметить его точкой на круге Смита.

Компоненты на форме

Edit (EditR, EditX, EditZ0), PaintBox, Button (ButtonDraw), Label (LabelG).

Как работает

  1. Ввести R, X нагрузки и волновое Z0.
  2. Посчитать Γ = (Z−Z0)/(Z+Z0) в комплексном виде.
  3. Поставить точку на единичном круге.

Исходный код модуля

//---------------------------------------------------------------------------
// Проект 38. Точка импеданса на диаграмме Смита
// Коэффициент отражения по нагрузке и его отметка.
//---------------------------------------------------------------------------
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------

// Считаем комплексный коэффициент отражения нагрузки R+jX в тракте Z0
// и ставим точку на круге Смита. gammaMag — модуль, ядро проверяем.
void gamma(double R,double X,double Z0,double &gr,double &gi)
{
    double dr=R-Z0, di=X, sr=R+Z0, si=X;
    double den=sr*sr+si*si;
    gr=(dr*sr+di*si)/den;
    gi=(di*sr-dr*si)/den;
}
double gammaMag(double R,double X,double Z0)
{
    double gr,gi; gamma(R,X,Z0,gr,gi); return sqrt(gr*gr+gi*gi);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonDrawClick(TObject *Sender)
{
    double R,X,Z0;
    try { R=StrToFloat(EditR->Text); X=StrToFloat(EditX->Text); Z0=StrToFloat(EditZ0->Text); }
    catch(...) { LabelG->Caption="Проверьте числа"; return; }
    double gr,gi; gamma(R,X,Z0,gr,gi);
    TCanvas *c=PaintBox1->Canvas; int W=PaintBox1->Width,H=PaintBox1->Height;
    int cx=W/2, cy=H/2, rad=(W<H?W:H)/2-10;
    c->Brush->Color=clBlack; c->FillRect(PaintBox1->ClientRect);
    c->Pen->Color=(TColor)RGB(80,110,100); c->Brush->Style=bsClear;
    c->Ellipse(cx-rad,cy-rad,cx+rad,cy+rad);
    c->MoveTo(cx-rad,cy); c->LineTo(cx+rad,cy);
    int px=cx+(int)(gr*rad), py=cy-(int)(gi*rad);
    c->Brush->Color=clYellow; c->Brush->Style=bsSolid;
    c->Ellipse(px-5,py-5,px+5,py+5);
    LabelG->Caption = "|Γ| = " + FormatFloat("0.####", gammaMag(R,X,Z0));
}
//---------------------------------------------------------------------------

Пояснения

  • Центр круга — согласование (Γ=0), край — полное отражение (|Γ|=1).
  • Ядро gammaMag проверено на согласованной и рассогласованной нагрузке.
📦 help-user.ru — срочный ремонт компьютеров и восстановление данных в Москве: help-user.ru.

Что дальше

Создайте в C++Builder новый проект, разместите перечисленные компоненты и вставьте код модуля. Остальные 49 программ — в разделе проектов на C++Builder; смотрите также обзор среды и контроллеры AVR.