//---------------------------------------------------------------------------
// Проект 48. Расчёт радиатора
// Тепловое сопротивление и площадь охладителя по мощности
// рассеяния — чтобы транзистор или стабилизатор не сгорел.
//---------------------------------------------------------------------------
#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)
{
}
//---------------------------------------------------------------------------
double RequiredThermalResistance(double Tj, double Ta, double P, double Rjc, double Rcs)
{
    if (P <= 0) return 0;
    return (Tj - Ta) / P - Rjc - Rcs;
}
//---------------------------------------------------------------------------
double HeatsinkArea(double Rth)
{
    if (Rth <= 0) return 0;
    return 50.0 / Rth;
}
//---------------------------------------------------------------------------
double JunctionTemp(double Ta, double P, double Rjc, double Rcs, double Rsa)
{
    return Ta + P * (Rjc + Rcs + Rsa);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonCalcClick(TObject *Sender)
{
    double P, Tj, Ta, Rjc, Rcs;
    try {
        P = StrToFloat(EditPower->Text); Tj = StrToFloat(EditTj->Text);
        Ta = StrToFloat(EditTa->Text); Rjc = StrToFloat(EditRjc->Text); Rcs = StrToFloat(EditRcs->Text);
    } catch (...) { MemoResult->Text = "Проверьте числа"; return; }
    if (P <= 0) { MemoResult->Text = "Мощность должна быть больше нуля"; return; }
    if (Tj <= Ta) { MemoResult->Text = "Предельная температура ниже окружающей"; return; }
    double Rsa = RequiredThermalResistance(Tj, Ta, P, Rjc, Rcs);
    MemoResult->Lines->Clear();
    MemoResult->Lines->Add("Рассеиваемая мощность: " + FormatFloat("0.##", P) + " Вт");
    MemoResult->Lines->Add("Перегрев допустим:     " + FormatFloat("0.#", Tj - Ta) + " °C");
    MemoResult->Lines->Add("");
    if (Rsa <= 0) {
        MemoResult->Lines->Add("Радиатор не спасёт: собственное тепловое");
        MemoResult->Lines->Add("сопротивление корпуса уже превышает допустимое.");
        MemoResult->Lines->Add("Нужен корпус мощнее, обдув или снижение мощности.");
        return;
    }
    double area = HeatsinkArea(Rsa);
    MemoResult->Lines->Add("Требуемое тепловое сопротивление радиатора:");
    MemoResult->Lines->Add("   Rрад = " + FormatFloat("0.##", Rsa) + " °C/Вт");
    MemoResult->Lines->Add("");
    MemoResult->Lines->Add("Ориентировочная площадь: " + FormatFloat("0", area) + " см²");
    MemoResult->Lines->Add("   (алюминий, естественная конвекция)");
    MemoResult->Lines->Add("");
    double Tjreal = JunctionTemp(Ta, P, Rjc, Rcs, Rsa);
    MemoResult->Lines->Add("Проверка: температура кристалла составит " + FormatFloat("0.#", Tjreal) + " °C");
    if (Rsa < 1.0) MemoResult->Lines->Add("Внимание: нужен очень эффективный радиатор с обдувом.");
}
//---------------------------------------------------------------------------
