mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
feature(settings): вкладка Calibration — детектор мощности/КСВ, V/A, S-метр
Паритет с Thetis-Enhanced (Det. Cal. / Volts&Amps правки): - TCalibration в TGlobalSettings (JSON cal_*): модель детектора Alex-моста, per-band множитель FWD/REV 0.5..2.0, множитель напряжения, Voff/Sens датчика тока, офсет S-метра. - AlexDetToWatts: константы Thetis computeAlexFwdPower/computeRefPower по моделям (ANAN-100 / 200D / 7000DLE-Anvelina Pro 3 / 8000DLE-Orion MkII, 6m-спецкейс REV). Дефолт = прежняя формула ANAN-100 (поведение не меняется). - OnHPStatus: FWD и REV через модельную формулу x множитель банда; КСВ = (1+p)/(1-p), p=sqrt(RevW/FwdW) (Thetis) вместо отношения сырых ADC; напряжение x SupplyVoltCal; ток с калибруемыми Voff/Sens. - WDSPEngine.SMeterCalDB: офсет в GetSMeterDBm/GetSliceSMeter (главный S-метр, slice-флаги, web). - Выбор модели в комбо подставляет модельные дефолты датчика тока (Anvelina Pro 3/7000DLE: 340 мВ / 88 мВ/А — Thetis GetDefaultVoltCalibration). - Фиксы: гард FLoading при постройке вкладки (SetItemIndex стреляет OnChange на программном присвоении -> AV на nil-контролах), FPageCalib/FNavCalib в списках SelectPage (вкладка была невидимой). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+65
-6
@@ -400,7 +400,9 @@ function BoardSupportsSupplyCurrent(BoardType: Integer): Boolean;
|
||||
|
||||
// Convert raw ADC value to supply current in Amps (Board 5 / Orion MkII only)
|
||||
// Uses UserADC1 (bytes 55-56). Returns -1 for unsupported boards.
|
||||
function ADCToSupplyCurrent(RawADC: Word; BoardType: Integer): Double;
|
||||
// VoffMV/SensMVA — калибровка датчика (Thetis AmpVoff/AmpSens, ACS712-style).
|
||||
function ADCToSupplyCurrent(RawADC: Word; BoardType: Integer;
|
||||
VoffMV: Double = 360.0; SensMVA: Double = 120.0): Double;
|
||||
|
||||
// Convert raw ADC value to RF power in Watts (ANAN-100)
|
||||
function ADCToWatts100(RawADC: Word): Double;
|
||||
@@ -408,6 +410,16 @@ function ADCToWatts100(RawADC: Word): Double;
|
||||
// Convert raw ADC value to RF power in Watts (ANAN-10)
|
||||
function ADCToWatts10(RawADC: Word): Double;
|
||||
|
||||
// Alex bridge FWD/REV detector → Watts, константы Thetis computeAlexFwdPower/
|
||||
// computeRefPower по модели трансивера:
|
||||
// 0 = ANAN-10/100/100B/100D (Vref 3.3V)
|
||||
// 1 = ANAN-200D / Orion (Vref 5.0V)
|
||||
// 2 = ANAN-7000DLE / Anvelina Pro 3 / G2 / Red Pitaya
|
||||
// 3 = ANAN-8000DLE / Orion MkII
|
||||
// IsRev — REV-детектор (свой bridge_volt/offset), Is6m — 6m-коррекция REV.
|
||||
function AlexDetToWatts(RawADC: Word; DetModel: Integer;
|
||||
IsRev, Is6m: Boolean): Double;
|
||||
|
||||
implementation
|
||||
|
||||
procedure PackU32BE(Value: LongWord; out B: array of Byte; Offset: Integer);
|
||||
@@ -476,14 +488,15 @@ begin
|
||||
Result := BoardType = 5;
|
||||
end;
|
||||
|
||||
function ADCToSupplyCurrent(RawADC: Word; BoardType: Integer): Double;
|
||||
function ADCToSupplyCurrent(RawADC: Word; BoardType: Integer;
|
||||
VoffMV: Double; SensMVA: Double): Double;
|
||||
begin
|
||||
// Board 5 (Orion MkII): UserADC1, Vref=5V → mV = adc/4095*5000.
|
||||
// Current sensor: Voff=360mV, Sens=120mV/A (Thetis defaults, ACS712-style).
|
||||
// Formula: amps = (mV - Voff) / Sens.
|
||||
if BoardType = 5 then
|
||||
// Formula: amps = (mV - Voff) / Sens. Дефолты Voff=360мВ, Sens=120мВ/А
|
||||
// (Thetis, ACS712-style); переопределяются калибровкой.
|
||||
if (BoardType = 5) and (SensMVA > 0) then
|
||||
begin
|
||||
Result := ((RawADC / 4095.0) * 5000.0 - 360.0) / 120.0;
|
||||
Result := ((RawADC / 4095.0) * 5000.0 - VoffMV) / SensMVA;
|
||||
if Result < 0.0 then Result := 0.0;
|
||||
end else
|
||||
Result := -1.0;
|
||||
@@ -507,4 +520,50 @@ begin
|
||||
Result := (V * V) / 0.09;
|
||||
end;
|
||||
|
||||
function AlexDetToWatts(RawADC: Word; DetModel: Integer;
|
||||
IsRev, Is6m: Boolean): Double;
|
||||
var
|
||||
Bridge, Vref, V: Double;
|
||||
CalOff: Integer;
|
||||
begin
|
||||
// Константы из Thetis (console.cs computeAlexFwdPower / computeRefPower).
|
||||
// W = ((ADC - CalOff)/4095 * Vref)^2 / Bridge.
|
||||
case DetModel of
|
||||
1: begin // ANAN-200D / Orion
|
||||
Vref := 5.0;
|
||||
if IsRev then begin
|
||||
Bridge := 0.108; if Is6m then Bridge := 0.5;
|
||||
CalOff := 2;
|
||||
end else begin
|
||||
Bridge := 0.108; CalOff := 4;
|
||||
end;
|
||||
end;
|
||||
2: begin // ANAN-7000DLE / Anvelina Pro 3 / G2 / Red Pitaya
|
||||
Vref := 5.0;
|
||||
if IsRev then begin
|
||||
Bridge := 0.15; if Is6m then Bridge := 0.7;
|
||||
CalOff := 28;
|
||||
end else begin
|
||||
Bridge := 0.12; CalOff := 32;
|
||||
end;
|
||||
end;
|
||||
3: begin // ANAN-8000DLE / Orion MkII
|
||||
Vref := 5.0; Bridge := 0.08;
|
||||
if IsRev then CalOff := 16 else CalOff := 18;
|
||||
end;
|
||||
else begin // 0: ANAN-10/100/100B/100D
|
||||
Vref := 3.3;
|
||||
if IsRev then begin
|
||||
Bridge := 0.095; if Is6m then Bridge := 0.5;
|
||||
CalOff := 3;
|
||||
end else begin
|
||||
Bridge := 0.095; CalOff := 6;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
V := ((RawADC - CalOff) / 4095.0) * Vref;
|
||||
if V < 0 then V := 0;
|
||||
Result := (V * V) / Bridge;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
Reference in New Issue
Block a user