Napisal/-a S55TA » 01 Jul 2025, 08:05
Koda SWR power metra in nekaj razlage.
Ta dokument je vaš ključ do razumevanja, prilagajanja in izboljšanja programske opreme za vaš Arduino SWR meter. Namenjen je vsem, ki želijo vedeti, kaj se dogaja "pod pokrovom".
Filozofija Delovanja: Od RF do Številke
Srž delovanja je preprosta, a elegantna: Strojna oprema (Tandem Match Coupler in diodni detektor) pretvori droben del RF moči (direktne in odbite) v enosmerno (DC) napetost. Višja kot je moč, višja je DC napetost. Vezje to napetost oslabi s fiksnim napetostnim delilnikom, da zaščiti Arduino in jo spravi v primerno merilno območje. Arduino (njegov ADC - Analogno-Digitalni Pretvornik) izmeri to oslabljeno DC napetost.
Programska oprema (ta koda) vzame izmerjeno napetost, jo s pomočjo kalibracijskih tabel pretvori nazaj v moč (W) in iz razmerja med močmi (oziroma napetostmi) izračuna SWR.
Poglavje 1:
Pot Signala in Ključni Izračuni
Tu se skriva vsa "magija". Če razumete to, razumete vse. 1.1 analogToVoltage(int rawAdc) - Od Številk do Voltov Kaj počne: Pretvori surovo digitalno vrednost (0-1023), ki jo vrne ADC, v dejansko napetost v Voltih.
Kako deluje:
Arduino ADC ima 10-bitno ločljivost, kar pomeni 2¹⁰ = 1024 korakov (od 0 do 1023).
Vrednost 0 predstavlja 0V. Vrednost 1023 predstavlja referenčno napetost (ADC_ACTUAL_VREF).
Formula: Napetost = (PrebranaVrednost / NajvišjaVrednost) * ReferenčnaNapetost
V kodi: return (rawAdc / 1023.0) * ADC_ACTUAL_VREF. Hekerski nasvet: ADC_ACTUAL_VREF je najpomembnejša konstanta za natančnost! Nikoli ni točno 5.0V ali 3.3V. Z multimetrom natančno izmerite napetost na AREF pinu (ker uporabljate analogReference(EXTERNAL)) in to vrednost vpišite v kodo. Razlika med 3.30V in 3.28V že vpliva na končni rezultat.
1.2 interpolatePower(...) - Umetnost Uganjevanja med Točkami. Kaj počne: Ker diodni detektor ni linearen (dvojna moč ne pomeni dvojne napetosti), ne moremo uporabiti preproste formule. Namesto tega imamo tabelo znanih točk (npr. pri 0.5V je moč 2W, pri 0.6V je 3.5W). Ta funkcija izračuna moč za katerokoli napetost med temi točkami.
Kako deluje (Linearna Interpolacija):
Poišče dve zaporedni točki v kalibracijski tabeli, med kateri pade naša izmerjena napetost voltage. Recimo, da sta to (v_i, p_i) in (v_i+1, p_i+1).
Izračuna, kje znotraj intervala napetosti [v_i, v_i+1] se nahaja naša napetost. To je preprosto razmerje: (voltage - v_i) / (v_i+1 - v_i). Če je vrednost 0.5, je točno na pol poti.
To isto razmerje nato uporabi na intervalu moči [p_i, p_i+1] in ga prišteje k osnovni moči.
Formula: Moč = p_i + (RazmerjeNapetosti) * (p_i+1 - p_i)
Hekerski nasvet:
Natančnost celotnega merilnika je neposredno odvisna od kakovosti kalibracijskih tabel. Več točk kot imate, in bolj kot so te natančno izmerjene, boljši bo rezultat.
Tabele so v PROGMEM, da prihranijo dragocen SRAM. Zato se za branje uporablja funkcija pgm_read_float_near().
Koda v setup() preveri, ali so napetosti v tabeli naraščajoče. To je varovalka, ki prepreči, da bi interpolacija dala nesmiselne rezultate ali se sesula.
1.3 Izračun SWR v measureAndReport() - Pametnejši Pristop
Lahko bi izračunali fwd_watts in rev_watts in nato iz njiju SWR. Ampak koda uporablja boljši, bolj robusten pristop.
Zakaj je boljši? Vsaka interpolacija vnese manjšo napako. Če bi SWR računali iz dveh že interpoliranih vrednosti (moči), bi se napaki sešteli. Z izračunom iz razmerja napetosti, ki so bolj "surovi" podatki, se tej napaki izognemo.
Kako deluje:
Izračun koeficienta odbojnosti (Rho, ρ): To je temeljno razmerje v RF tehniki. Pove, kolikšen delež signala se je odbil.
rho = V_rev / V_fwd
Kjer sta V_rev in V_fwd dejanski napetosti na izhodu detektorja. Ker pa sta obe napetosti v našem vezju oslabljeni za enak faktor (s fiksnim -10.1 dB delilnikom), je razmerje oslabljenih napetosti enako razmerju originalnih napetosti. To je ključno!
V kodi: float rho = rev_voltage / fwd_voltage;
Omejitev Rho: V idealnem svetu je rho lahko največ 1 (vsa moč se odbije). V praksi lahko zaradi šuma in drobnih razlik v kalibraciji preseže 1. To bi povzročilo negativno vrednost v imenovalcu SWR formule in matematično napako. Zato koda varno omeji rho na 0.99.
V kodi: if (rho > 0.99) rho = 0.99;
Klasična SWR Formula:
SWR = (1 + rho) / (1 - rho)
Če je rho = 0 (ni odbite moči), je SWR = (1+0)/(1-0) = 1. Popolno.
Če je rho = 0.33 (tretjina napetosti se odbije), je SWR = (1.33)/(0.67) ≈ 2.0.
V kodi: swr = (1.0 + rho) / (1.0 - rho);
Prag za prikaz (Threshold): Računanje SWR pri zelo nizki moči (npr. samo šum) je nesmiselno in daje divje rezultate. Zato koda računa SWR le, če je direktna moč (fwd_watts) nad pragom SWR_DISPLAY_THRESHOLD_W. Sicer privzame, da je SWR idealen (1.0).
Poglavje 2: Kako "Hekati" Kodo (Ideje za Modifikacije)
NAJPOMEMBNEJŠE: Naredite svojo kalibracijo!
Priključite natančen merilnik moči in 50-ohmsko breme (dummy load).
Oddajajte z različnimi močmi (npr. 1W, 2W, 5W, 10W, 20W, ...).
Za vsako moč si na serijski monitor (ali z multimetrom na pinih A0/A1) zapišite izmerjeno napetost.
S temi pari vrednosti (Moč, Napetost) ustvarite svoje tabele fwd_calibration_voltage_PGM in fwd_calibration_power_w_PGM.
Za REV kanal obrnite mostiček in ponovite postopek. To bo 10x povečalo natančnost vašega instrumenta.
Prilagoditev Povprečenja:
Konstanta NUM_SAMPLES = 25 določa, koliko meritev se povpreči.
Povečajte vrednost (npr. na 50): Odčitki bodo bolj mirni in stabilni, a se bodo počasneje odzivali na spremembe (npr. pri SSB modulaciji).
Zmanjšajte vrednost (npr. na 10): Odčitki bodo hitrejši in bolj "poskočni", a tudi bolj občutljivi na šum.
Dodajte Alarm za Visok SWR:
Odkomentirajte pine za alarm (ALARM_IZHODNI_PIN).
V funkciji measureAndReport(), po izračunu SWR, dodajte:
Generated cpp
if (swr > 2.5 && fwd_watts > 1.0) { // Prag SWR in minimalna moč za alarm
digitalWrite(ALARM_IZHODNI_PIN, HIGH);
} else {
digitalWrite(ALARM_IZHODNI_PIN, LOW);
}
Implementacija "Peak Hold" Funkcije:
Dodajte globalne spremenljivke, npr. float fwd_peak_watts = 0.0;.
V loop() dodajte logiko, da če je trenutna moč višja od shranjene najvišje, se ta posodobi.
Dodajte gumb ali serijski ukaz, ki ponastavi fwd_peak_watts na 0.
To je izjemno uporabno za merjenje najvišje moči pri SSB oddaji.
Povezava z Zaslonom (LCD/OLED):
Podatki se že pošiljajo preko serijskega vmesnika v lepem formatu. Namesto Serial.println(dataString);, lahko te podatke pošljete na I2C ali SPI zaslon za samostojno delovanje brez računalnika.
To bi bilo za arduino kodo. Če bi kdo rad izdelal svojo kalibracijsko tabelo, ker ima natančnejši in močnejši izvor signala, naj sporoči, da mu pošljem kalibracijski software. Trenutno pa je nastavljeno do 130W kolikor je moj izvor signala.
- Priponke
-
VSWRPOWERMETER.zip
- (3.82 MiB) Prenešeno 7 krat