HF Wattmeter

Wattmeter thumbnail

Wattmeter thumbnailHF Wattmeter

Na mijn positieve ervaringen met het programmeren van kleinere PICs (Peripheral Interface Controllers) zoals de 12F675 (CW-callgever) vond ik het weer eens tijd worden voor een nieuw PIC-projectje.  Dit keer moest het iets worden met een (tekst) display, die tegenwoordig voor een prikkie op eBay te vinden zijn.

 

Wattmeter01

Ik wist er een, met fraaie blauwe achtergrondverlichting en witte karakters, voor een euro of 8 op de kop te tikken. Om een HD44780 display aan de praat te krijgen (…" Hello World "…) stuitte ik al snel op de 16F628A.

Een flinke, eerder gebouwde, HF dummyload (tot 150 Watt HF vermogen en grensfrequentie > 1 GHz) met gelijkrichter was nog niet voorzien van een meter. Een keramische 50 ohms weerstand van het type FLA-150-50, gemonteerd op een flink koellichaam, vormt het hart van het circuitje:

Wattmeter02

Zou het niet handig zijn om hier een digitale uitlezing aan te knopen? Natuurlijk zijn er kant-en-klare PIC RF power meters op het www te vinden, maar zelf een schakelingetje uitwerken en bijbehorende software schrijven is toch veel leuker.

Tot nu toe moest de gelijkspanning afkomstig uit de gelijkrichter in de dummyload gemeten worden om het gedissipeerde vermogen te kunnen berekenen volgens: P = (Vdc)2 / 100 

Wattmeter03

Eerst maar eens een Veroboardje met PIC en display maken om te leren het display met commando's aan te sturen. Zie het schemaatje hieronder voor de aansluitgegevens.

Wattmeter04

Er was geen rocket-science nodig om het 4×20 character display tot leven te laten komen.
Nu kon ik naar hartelust spelen met de karakterset van het display; letters, cijfers, symbolen plaatsen en staafdiagrammetjes maken bleek allemaal niet zo moeilijk.

Wattmeter05

Het display aansturen was gelukt. Maar om zinnige info op het scherm te krijgen moet de PIC met data uit de analoge buitenwereld gevoed worden. Helaas heeft de PIC16F628A geen Analoog/Digitaal Converter aan boord.
Dus moest er een los ADC-boardje komen; geen probleem met een 8-bits ADC0804CN chip; zie het schema verderop.
Een NE555 is nodig om de ADC met ongeveer 4 Hz te laten sampelen. Via een simpele spanningsdeler kan de analoge spanning (die tot zo'n 125 Volt dc kan oplopen) uit de HF dummyload naar de ADC0804CN geleid worden. De weerstanden hebben vrij hoge waarden (2 x 1 Mohm en 1 x 100 Kohm) om de gelijkrichtschakeling na de dummyload zo min mogelijk te belasten.
De ingang van de ADC chip wordt beveiligd met een 5V1 diode. Het pull-up weerstanden netwerkje is als een blokje getekend. In werkelijkheid is dat ook zo, het is een weerstand array (8x 4k7) uit een oude computer diskdrive. 8 losse 4k7 weerstandjes werken natuurlijk ook. Het array is, net als de meeste weerstanden, aan de onderzijde van het board gesoldeerd en dus hier niet zichtbaar op de foto.
De LED flasht met de frequentie van het sampelen (4 Hz). Met de (meerslagen) instelpotmeter van 1M kan de schakeling afgeregeld worden.

Wattmeter06

Wattmeter07

De 8-bits databus van de ADC hoeft alleen nog maar aan een 8-bits brede A-poort van de PIC geknoopt te worden (flatcable).
Nu moet de gemeten ingangsspanning nog met een stukje software omgezet worden in een meetwaarde. Zoals hieronder te zien is dat uiteindelijk gelukt.
 
Een graphbar, die een grove indicatie geeft van de gemeten spanning mag natuurlijk niet ontbreken. De 3 verticale streepjes boven de bar geven ongeveer aan waar je 1W, 10W en 100W kunt vinden.
De maximaal te meten waarde is 150W.

Wattmeter08

Het realiseren van de meting en zichtbaar maken van graphbar en meetwaarde op het display namen slecht 25% van
het beschikbare geheugen (totaal 2K) van de PIC in beslag.
Zonde om met de rest niets te doen. Een aanvulling was snel gevonden:
Naast de Watt kan het zendvermogen ook in dBm en dBW aangegeven worden (referentiewaarden t.o.v. 1mW resp. 1W).
Hiervoor is een simpele rekenslag nodig volgens dBm = 30 + 10.log (P) en dBW = 10.log(P)
Alleen de compiler ondersteunt de log(x) functie niet voor de PIC 16F628A. Jammer!
Maar niet getreurd, een stukje numerieke wiskunde kan hier helpen.
Een logaritme kunnen we benaderen met:  log (x) = ((x ^(1/(2^11)) – 1)*889. Probeer maar op je rekenmachine:
Neem een getal x (bijv. 45). Druk 11x op de wortel (x) toets. Trek van het resulaat 1 af en vermenigvuldig
de uitkomst met 889. Je zult zien dat de rekenmachine 1,6539… aangeeft. De echte waarde van log (45) is 1,6532…
Een uitstekende benadering dus!
Maar helaas zitten we nu weer met een functie waar de compiler wederom geen raad mee weet: worteltrekken.
De oplossing die zich hier aandient is de benadering van wortel (x) met de methode Newton Raphson.
In een aantal rekenslagen wordt wortel x en dus ook log(x) tot op een aantal decimalen nauwkeurig benaderd.
De bewerking die hier aan ten grondslag ligt:
wortel (Pwr1) ==> Xn=0.5*(Xn-1 + Pwr1/Xn-1)
Beetje omslachtig, dat wel, en de instructies nemen wat geheugenruimte in beslag (zo'n 1K), maar nu hebben we wel een PIC met bijna
volledig benut geheugen 🙂
Door de geneste loops verllopt de dBm/dBW berekening niet erg snel; de oplossing hiervoor is dat de berekening alleen plaatsvindt op het moment dat de
gebruiker dat ook wil. Er moet op een schakelaartje gedrukt worden om de berekening te starten.
De dBm/dBW waarde wordt dan na ongeveer een seconde op een nieuw schermpje getoond.
De benaderingsmethode is voor kleine meetwaarden niet erg nauwkeurig. Voor erg kleine vermogens verschijnt er dan ook een "-".

Wattmeter09

Wattmeter10

De 8 bits resolutie van de ADC is niet super, maar met dit project kan toch op een snelle, redelijk nauwkeurige, manier gemeten worden hoeveel de HF eindtrap levert aan een 50 ohm belasting. Het resultaat wordt dan ook getoond in 1 decimaal achter de komma, meer getallen achter de komma geven slechts een schijnnauwkeurigheid aan.Voor mij is de meter in ieder geval een welkome aanvulling in de shack, daar ik tot nu toe alleen de beschikking hadover QRP-Watt meters. Tot slot, voor de liefhebbers, hieronder het stukje software: 

 

Device 16F628A ;Gebruik een 16F628A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal
;
;wattmeter1.bas
;
;HF Wattmeter tot 150 Watt HF ingangsvermogen
;
;Circuit opgebouwd met semiconductors
;ADC0804CN, PIC16F628A, NE555, 7805
;
;Design by Ron van den Brink
;PA2RF
;Copyright 18 september 2008
;
;Laatste wijziging: graphbar, dBm berekening toegevoegd als subroutine
;Logische constanten
Symbol AAN = 0 ;Geinverteerd AAN
Symbol Lengte = 20 ;Lengte streepjeslijn
 
;Poortnamen
Symbol ReactieToets = PORTB.1 ;De toets voor start dBm, dBW berekening
;Variabele declareren
Dim Cnt As Word ;Variabele om ADC-poort in te lezen
Dim Lang As Float ;Lengte graphbar
Dim Vdc As Float ;Gelijkspanning over 50 ohms weerstand
Dim Pwr1 As Float ;HF vermogen
Dim P As Float ;Hulpvariabele voor wortel uit Pwr1
Dim Q As Float ;Hulpvariabele
Dim T As Float ;Hulpvariabele om dBm te berekenen
Dim A As Float ;Hulpvariabele om dBm te berekenen
Dim B As Float ;Hulpvariabele om dBW te berekenen
Dim H As Float ;Hulpvariabele nodig indien Pwr1 = 0 Watt
Dim Teller2 As Byte ;Hulpvariabele voor iteratie Newton Raphson
Dim Teller As Byte ;Hulpvariabele voor iteratie Newton Raphson
 
; 76543210
TRISA = %11111111 ;PORTA. all input voor ADC
TRISB = %11111111 ;PORTB. all input
 
PORTB_PULLUPS On ;On-chip pull-up weerstanden actief (voor schakelaar)
Clear ;Wis alle RAM geheugen
DelayMS 500 ;LCD stabilisering
 
;Hoofdprogramma
Cls ;Eerste keer scherm wissen
Print At 1,1, " RF Watt Meter"
Print At 2,1, " Copyright PA2RF"
Print At 3,1, " Sep. 2008"
DelayMS 3000
Cls
 
While 1=1
 
Cnt = PORTA ;Lees ADC0804CN
 
If ReactieToets=AAN Then GoSub LOGARITME ;Bereken dBm, dBW
 
Vdc = (Cnt*122)/255 ;Bereken gelijkspanning over 50 ohm
Pwr1 = (Vdc*Vdc)/100 ;Bereken gedissipeerd HF vermogen
 
Print At 1,1, " RF Power " , DEC1 Pwr1, " Watt "
Print At 3,1, "|    |              | " ;GraphBar indicators voor 1, 10, 100 W
Lang = (Cnt/255)*20 ;Lengte Graphbar hangt af van ADC waarde
 
Print At 4,1, Rep "-"\20 ;Teken dashed lijn
Print At 4,1, Rep 255\Lang ;Teken GraphBar
Wend
 
LOGARITME: ;LOG van Pwr1 bereken
 
Cls
Teller = 1
Teller2 = 1
H = Pwr1
Print At 1,1, "Calculate dBm, dBW "
Print At 2,1, "RF Power " , DEC1 Pwr1, " Watt "
 
Repeat
P=10
Repeat
P = P + (Pwr1/P) ;Newton Raphson om wortel Pwr1 te benaderen
P = 0.5*P ;Xn=0.5*(Xn-1 + Pwr1/Xn-1)
Inc Teller
Until Teller = 4 ;3 x loop levert voldoende nauwkeurige waarde voor wortel Pwr1
Pwr1=P
Inc Teller2
Until Teller2 = 12 ;11x hoofdloop doorlopen want log(x) ~ (x^(1/2^11)-1)*889
 
T=(P-1)*889
A=T*10+30 ;A=10*log(Pwr1)+ 30 (dBm)
B=A-30 ;dBW = dBm + 30
Print At 1,1," "
Print At 3,2,DEC1 A, " dBm @ 50 ohms "
Print At 4,2,DEC1 B, " dBW @ 50 ohms"
If H < 1 Then Print At 3,2, " – dBm @ 50 ohms " ; log (0) is – oneindig !
If H < 1 Then Print At 4,2, " – dBW @ 50 ohms " ; idem
DelayMS 4000
TAG1:
If ReactieToets = AAN Then GoTo TAG1
Cls
Return
 
End