VHF Vermogens versterker (VHF-PA)
Op dit moment heb ik een werkende PA met een LD-MOSFET: SD2942. Schema's heb ik (nog) niet, maar een verdere uitleg komt nog op deze pagina.
Waarom een PIC16F877a?
Eigenlijk simpel: gezien het aantal aansluitingen dat deze PIC heeft en dus aanstuur- en 'uit-lees'- mogelijkheden best uitgebreid is (zie plaatje rechts). Nadeel van een PIC is dat er nog een programma in gepropt moet worden. Nu kan ik via internet iemand vragen een programma voor mij te maken, maar ik zelf vind het leuker om zelf iets in elkaar te verzinnen. De taal die ik gekozen heb is Proton PIC-Basic (www.protonbasic.co.uk).
Hieronder heb ik een lijstje met de gebruikte pennetjes en welke functie er aan gegeven is (welke pen van de PIC dat is, zie weer plaatje rechts) en welke niet beschreven is wordt niet gebruikt!
- RA2 = SWR reflected in (analoog)
- RA3 = SWR forward in (analoog)
- RD4 = LCD pin 11 (DB4)
- RD5 = LCD pin 12 (DB5)
- RD6 = LCD pin 13 (DB6)
- RD7 = LCD pin 14 (DB7)
- RE0 = LCD pin 4 (RS)
- RE1 = LCD pin 6 (EN)
- RB1 = PTT input (van tranceiver, laag actief!)
- RB2 = DS18B20 input (digitale thermosensor in koelblok)
- RB4 = Preamp aan/uit schakelaar
- RB5 = PA aan/uit schakelaar
- RC0 = schakelt preamp aan of uit (+12Volt voeding preamp via relais)
- RC1 = Stuurt COAX-relais aan
- RC2 = Output PTT (laag actief, nog geen gebruik er voor, via relais)
- RC3 = schakelt 48Volt naar FET module (via een relais)
- RC4 = ON AIR Led (rode led ten teken van 'ZENDEN')
- RC5 = TX AMP (groene led die meld dat de eindtrap ingeschakeld is en klaar voor gebruik)
- RC6 = RX AMP (groene led die meld dat de preamp is ingeschakeld)
Alle outputs van RC0 t/m RC3 worden via een relais geschakeld. De reden hiervan is dat de in- en output van een PIC niet hoger mogen zijn dan 5Volt, en de te schakelen spanningen 12 of 48 Volt is en ik deze galvanisch gescheiden wil houden van de PIC. De relais zelf worden via een NPN transistor direct door de PIC aangestuurd.
De 3 leds op RC4-RC6 worden direct door de PIC gevoed, dit geeft geen problemen => is RC4 hoog, dan brand de rode 'ON AIR' led.
Om de 2 schakelaars op RB4 en RB5 te kunnen 'lezen' is er een pull-up weerstand naar 5Volt nodig. De PIC16F877a heeft deze niet intern.
De analoge inputs zijn door middel van een diode 'beveiligd' tegen te hoge spanning toevoer. Op moment van schrijven moet ik nog een PEP-meet schakeling maken zodat de SWR aan de uitgang van de PA bepaald kan worden. Als deze te hoog is wordt de PA niet geactiveerd en blijft het vermogen gelijk aan de RF-input (COAX-relais schakelen de PA dan niet in de transmissie lijn). Dit om de FET tegen te hoge SWR te beschermen.
Ook de software in de PIC heeft nog geen SWR meet voorziening.
De temperatuur van het koelblok wordt direct onder de FET gemeten met een DS18B20. Dit is een digitale thermosensor. De software moet nog worden aangevuld met een temperatuurbewaking, waarbij de PA uitgeschakeld wordt bij een temperatuur van bijvoorbeeld 50°C en hoger.
Ondertussen heb ik de PA al gebruikt en succesvol enkele QSO's op 144MHz gemaakt waarbij de rapporten bevredigend waren (o.a. YL3AG in Letland, ruim 1000km)
Hieronder het programma dat ik geschreven heb. Ik geef geen support, programma is 'as-is', de comments leggen e.e.a. wel uit.
Compiler dat ik gebruik: Proton PICBASIC Compiler, Loader v1.0.0.6 Compiler v3.5.7.1
'****************************************************************
'* Name : VHF PA sequencer.BAS *
'* Author : André Berends *
'* Notice : Copyright (c) 2014 André Berends/PE1PQX *
'* : All Rights Reserved *
'* Date : 26-1-2014 *
'* Version : PQX_v1.0 *
'* Notes : Programma is nog niet af, benodigd aanvulligen. *
'* : SWR meting is nog niet geimplementeerd. *
'****************************************************************
; PIC16F877A: +---v---+
; (MCLR/Vpp/THV) <[1 40]<> RB7/PGD
; RA0/AN0 <[2 39]<> RB6/PGC
; RA1/AN1 <[3 38]> RB5 PA Enable switch
; SWR REV IN RA2/AN2/Vref- <[4 37]> RB4 PreAmp Enable switch
; SWR FWD IN RA3/AN3/Vref+ <[5 36]> RB3/PGM
; RA4/TOCKI <[6 35]> RB2 DS18B20 input
; RA5/AN4/SS <[7 34]> RB1 PTT INPUT
; LCD pin 4 (RS) RE0/RD/AN5 <[8 33]> RB0/INT
; LCD pin 6 (EN) RE1/WR/AN6 >[9 32]> VDD
; RE2/CS/AN7 >[10 31]> VSS
; VDD <[11 30]> RD7/PSP7 LCD PIN 14 (DB7)
; VSS <[12 29]> RD6/PSP6 LCD PIN 13 (DB6)
; OSC1/CLKIN <[13 28]> RD5/PSP5 LCD PIN 12 (DB5)
; OSC2/CLKOUT <[14 27]< RD4/PSP4 LCD PIN 11 (DB4)
; REL PREAMP PSU RC0/1OSI/T1CKI <[15 26]< RC7/RX/DT
; REL COAX-REL RC1/T1OSO/CCP2 <[16 25]< RC6/TX/CK RX AMP LED (GN)
; REL PTT out RC2/CCP1 <[17 24]< RC5/SDO TX AMP LED (GN)
; REL 50V PSU RC3/SCK/SCL <[18 23]< RC4/SDI/SDA ON AIR LED (RD)
; RD0/PSP0 <[19 22]< RD3/PSP3
; RD1/PSP1 <[20 21]< RD2/PSP2
; +-------+
Device = 16F877A ; 16F877a PIC
Config WDT_OFF, PWRTE_ON, LVP_OFF, HS_OSC
Xtal = 20 ; 20MHz kristal
All_Digital TRUE ; Alle ingangen digitaal
Declare Adin_Res 10 ; Resultaat in 10Bit
Declare Adin_Tad FRC ; Occsilator kiezen
Declare ADIN_DELAY 50 ; 50µS sample time
Declare LCD_DTPin PORTD.4 ; Data vanaf D.4
Declare LCD_ENPin PORTE.1 ; EN pin op E.1
Declare LCD_RSPin PORTE.0 ; RS pin op E.0
'############# DECLARATIES ###############
Symbol UIT = 0
Symbol FALSE = 0
Symbol OFF = 0
Symbol On = 1
Symbol TRUE = 1
Symbol AAN = 1
Symbol PTT_IN = PORTB.1 ; PTT input, laag actief!
Symbol ds18B20 = PORTB.2 ; Sluit de DS18B20 temperatuur sensor aan op deze poort
Symbol Pream_EN = PORTB.4 ; Schakelaar => preamp gebruiken of niet?
Symbol PA_EN = PORTB.5 ; Schakelaar => PA gebruiken of niet? (4Watt => 350Watt)
Symbol PREAMP_REL = PORTC.0 ; Relais voor schakelen 12 Volt voor Preamp (gelijk aan RX_AMP_LED)
Symbol COAX_REL = PORTC.1 ; Schakelen COAX-Relais, gelijk aan TX_AMP_LED & ON_AIR_LED (logisch EN)
Symbol PTT_REL_OUT = PORTC.2 ; PTT output, voor eventueel doorlussen naar ander apparaat zoals transverters
Symbol REL_50V_PSU = PORTC.3 ; Schakelt 50V spanning naar PA module (gelijk aan PA_EN!)
Symbol ON_AIR_LED = PORTC.4 ; On Air led, brand als PTT = laag (rood)
Symbol TX_AMP_LED = PORTC.5 ; PA_Enable led => PA gebruiken? Dan led AAN (GROEN)
Symbol RX_AMP_LED = PORTC.6 ; Preamp_enable led => Pream aan? Dan led AAN (GROEN), uit bij TX!!
Symbol controle = PORTC.7 ; controle port voor tijd-meet toepassingen. Normaal niet gebruikt.
;Variabelen declareren
;WORDs
Dim Temp As Word ;Bevat de temperatuur Celsius
Dim Temperatuur As Word
Dim Teller As Word
;BYTEs
Dim Remain As Byte ;De remain waarde voor berekening temperatuur achter de komma
Dim Slope As Byte ;Bevat de 'counts per graad Celsius' waarde
Dim TempDeci As Byte ;Bevat de temperatuur waarde "achter de komma"
Dim BD1 As Byte ;Byte Dummy 1
Dim Decimalen As Byte
;BITs
Dim NegTemp As Bit ;TRUE als temperatuur Celsius onder 0 oC komt, niet van toepassing in PA
'Poort werkigen, %1 = input, %0 = output
;TRISA = ; Port A nog niet gebruikt, wordt analoog input voor SWR
' 76543210 ; Bits per poort
TRISB = %11111111 ; Port B alles input
TRISC = %00000000 ; Port C alles output
DelayMS 200 ;LCD stabilisering
Cls
Print At 1, 1, "www.pe1pqx.eu"
Print At 2, 1, "VHF PA"
DelayMS 2000
Cls
For Teller = 1 To 5
' 1234567890123456
Print At 1, 1, " Waarschuwing!! "
Print At 2, 1, "Pin MAX 4 WATT!!"
ON_AIR_LED = AAN
TX_AMP_LED = AAN
RX_AMP_LED = AAN
DelayMS 500
Cls
ON_AIR_LED = UIT
TX_AMP_LED = UIT
RX_AMP_LED = UIT
DelayMS 500
Next
GoTo HoofdLus
End
'################# SUB ROUTINES #########################
'----------------- Temperatuur meting -------------------
'Tijdspanne voor subroutine: 600mSec inc convert wacht
'tijdspanne voor subroutine: 7.5 mSec ex convert wacht
TempMeting:
OWrite ds18B20, 1, [$CC, $44] ' Zend 'Convert' opdracht (temperatuur meten)
;While ORead ds18B20,4 = 0 : Wend ' Wacht tot conversie is voltooid. ('commented' i.v.m. tijdsvertraging!)
OWrite ds18B20, 1, [$CC, $BE] ' Zend 'Read ScratchPad' opdracht
ORead ds18B20, 2, [Temperatuur.LowByte, Temperatuur.HighByte] ;Lees temperatuur en plaats dit in de variabele
Decimalen = 0 ' Op 0 voor de zekerheid..
Decimalen = Temperatuur.LowByte << 5 ' Alleen de laatste 4 bits van Temperatuur zijn nodig.
Decimalen = Decimalen >> 4 ' Bits weer op de originele plaats zetten
Decimalen = Decimalen * 6.25 ' Resolutie van de DS18B20 is 0.0625 graden celcius.
Print At 2, 1, "Temp = " , Dec (Temperatuur >> 4) , ".", Dec1 Decimalen / 10, 223, "C "
' Door de laatste 4 bits van Temperatuur weg te gooien krijg je de graden Celcius.
Toggle controle
Return
'------------------------------------------------------------
Check_switch_boot:
'Controle van PA_EN, moet uit (hoog, 1) zijn!!
While PA_EN = 0
Print At 1, 1, " Schakel PA"
Print At 2, 1, "naar bypass!"
TX_AMP_LED = 1
DelayMS 500
Cls
TX_AMP_LED = 0
DelayMS 500
Wend
While PTT_IN = 0
' 1234567890123456
Print At 1, 1, " PTT ingedrukt"
Print At 2, 1, "Controleer AUB!"
ON_AIR_LED = 1
DelayMS 500
Cls
ON_AIR_LED = 0
DelayMS 500
Wend
Return
'------------------------------------------------------------
Check_switch:
'Controle van PA_EN en RX_AMP_EN
If PA_EN = 0 Then ; PA is enabled?
REL_50V_PSU = 1 ; 50Volt naar module inschakelen
' 1234567890123456
Print At 1, 1, "PA Operational "
TX_AMP_LED = 1 ; TX_AMP led aan (groen)
EndIf
If PA_EN = 1 Then ; PA is NIET enabled?
REL_50V_PSU = 0 ; 50Volt naar module uitzetten!
' 1234567890123456
Print At 1, 1, "PA Standby "
TX_AMP_LED = 0 ; TX_AMP led uit (groen)
EndIf
If Pream_EN = 0 Then ; Preamp aangezet?
PREAMP_REL = 1 ; 12Volt naar preamp inschakelen
RX_AMP_LED = 1 ; RX_AMP led aan (groen)
EndIf
If Pream_EN = 1 Then ; Preamp uitgezet?
PREAMP_REL = 0 ; 12Volt naar preamp uitschakelen
RX_AMP_LED = 0 ; RX_AMP led uit (groen)
EndIf
Return
'#################### HOOFD PROGRAM #####################
HoofdLus:
GoSub Check_switch_boot ;Controle bij opstart: PA_EN en PTT moeten uit zijn
'############## opwarmen DS18B20 voor temp meting #######
'############## wordt nu éénmaalig uitgevoerd #######
'############## en NIET op het display gezet! #######
OWrite ds18B20, 1, [$CC, $44] ' Zend 'Convert' opdracht (temperatuur meten)
While ORead ds18B20,4 = 0 : Wend ' Wacht tot conversie is voltooid.
OWrite ds18B20, 1, [$CC, $BE] ' Zend 'Read ScratchPad' opdracht
ORead ds18B20, 2, [Temperatuur.LowByte, Temperatuur.HighByte] ;Lees temperatuur en plaats dit in de variabele
Begin: ' Begin van 'bedrijfs-lus'.
GoSub TempMeting ' Meet temperatuur en zet op display
GoSub Check_switch ' Controle voor gebruik!
If PTT_IN = 0 Then GoSub Zenden ' PTT_IN = 0 => ZENDEN!!
GoTo Begin
'############### ZENDEN ################
Zenden:
While PTT_IN = 0 ' PTT_IN = 0, laag actief dus TX-en!
ON_AIR_LED = 1 ' ON_AIR_LED moet aan (rood, opvallend dus)
If Pream_EN = 0 Then ' Controle Preamp, aangezet?
PREAMP_REL = 0 ' Preamp uitschakelen
EndIf
DelayMS 50 ' 50mSec wachten om preamp de tijd te geven uit te gaan
If PA_EN = 0 Then ' Controle PA operational??
COAX_REL = 1 ' COAX-relais naar TX schakelen
DelayMS 10 ' Even wachten tot COAX-Relais op TX staan
EndIf
GoSub TempMeting ' Temperatuurbewaking...
;gosub CHECK_SWR ' Controle SWR, moet nog gemaakt worden!!
Wend
' Alles terug naar ontvangst zetten:
ON_AIR_LED = 0 ' ON_AIR_LED moet weer uit
If PA_EN = 0 Then ' Controle PA operational??
COAX_REL = 0 ' COAX-relais naar RX schakelen
DelayMS 10 ' Even wachten tot COAX-Relais op RX staan (voorkomen vernielen preamp)
EndIf
If Pream_EN = 0 Then ' Controle Preamp, aangezet?
PREAMP_REL = 1 ' Preamp inschakelen
EndIf
DelayMS 50 ' 50mSec wachten om preamp de tijd te geven aan te gaan
Return
End