Temporizzatore per alimentatori per amplificatori lineari a valvole
Questo progetto nacque ormai 2 lustri fa e potrà per alcune soluzioni hardware apparire obsoleto. Ma le riflessioni sulla logica di funzionamento e la solida architettura impiegata sono quantomai odierne ancora oggi.
Tutto il progetto fu sviluppato colla preziosa collaborazione dell’amico Claudio, IK4MTS: senza la sua passione e competenza le idee non si sarebbero mai tramutate in realtà.
Il problema:
Il problema da risolvere era la corretta temporizzazione dell’accensione e spegnimento del mio costruendo amplificatore lineare per i 144 MHz col classico push-pull di 8930 Eimac (4CX350).
Come noto, gli amplificatori a tubi elettronici, richiedono una ben precisa sequenza di temporizzazione dell’applicazione e rimozione delle tensioni di alimentazione all’accensione e spegnimento, pena uno scadimento dell’affidabilità della valvola.
I motivi di ciò riguardano principalmente la regimazione termica del filamento e del corpo valvola.
Le soluzioni più diffuse impiegano una serie di interruttori da operare manualmente in sequenza, ovvero una serie di temporizzatori in logica cablata che eseguono le operazioni autonomamente.
I limiti di tali soluzioni sono principalmente dati dal bisogno di supervisione di un operatore e dalla loro scarsa “robustezza” in caso di eventi anomali quali ad esempio cadute di tensione di rete o rientri di radiofrequenza o necessità di interrompere la sequenza in corso. In tutti questi casi, anomali ma verosimili dell’impiego reale da parte del radioamatore (specie se in portatile come me), l’amplificatore si può trovare in condizioni di pericolo o peggio non preventivamente definite.
Occorreva quindi superare di slancio, tutte queste limitazioni delle soluzioni comunemente impiegate e dar vita ad un progetto robusto ed innovativo che rispondesse alla seguente lista di obiettivi:
-
gestione corretta sequenza di accensione al comando “start”
-
gestione corretta sequenza spegnimento al comando “stop”
-
possibilità di abortire in qualunque momento la sequenza in atto (accensione/spegnimento),
-
messa in sicurezza dell’amplificatore in caso di temporanea mancanza di alimentazione (buche di tensione, blackout out, spegnimento del gruppo elettrogeno…)
-
operazione sicura in caso di brevi ma profonde variazioni di tensione (flickers)
-
messa in sicurezza dell’amplificatore in caso di forte rientro di RF nel controllore, tale da non poter garantire la corretta operatività.
-
Visualizzazione dello stato del sistema di controllo
Hardware:
Lo schema adottato è quello visibile nella figura seguente:
Vediamo assieme le varie funzioni:
Il circuito ha sostanzialmente i seguenti ingressi/uscite:
-
pulsante start (accensione)
-
pulsante stop (spegnimento)
-
alimentazione 230 Vac
-
6 linee opto isolate per comando degli alimentatori dell’amplificatore
-
7 led di stato
-
1 cicalino per messaggi acustici di errore
La CPU (U1) è una Intel 8053. E’ un microcontrollore molto popolare, sicuro, economico, collaudato e semplice da utilizzare. La disponibilità gratuita di semplici strumenti di sviluppo e debug fu elemento decisivo per la scelta di questo componente.
La CPU ha un clock quarzato a 2MHz e dispone di otto linee di I/O programmabili. Per la nostra applicazione decidemmo di impiegare due linee (P1.0 e P1.1) come ingressi dei comandi Start/Stop, mentre le rimanenti sei (P1.2…P1.7), furono configurate come uscita dei comandi ai vari alimentatori dell’amplificatore lineare.
Avendo bisogno di una settima linea di output per comandare la segnalazione acustica, si decise di impiegare il Txd, la linea di trasmissione della porta di comunicazione seriale del micro, altrimenti inutilizzata.
L’integrato U3 è la EPROM 27C32, una vecchia 4k*8 dove risiede tutto il codice.
Oggi la disponibilità e popolarità di CPU con E2PROM interna, farebbe ovviamente raggruppare U1 ed U3 in un singolo dispositivo.. ma 10 anni fa tutto questo ancora era fuori dalla portata dello sviluppatore amatoriale…
U2, il 74HC573 è un latch che interfaccia il bus degli indirizzi fra CPU ed Eprom. L’aggiornamento della parola sui pins della memoria è comandato dalla linea ALE/P della CPU.
U6 è un MAX803, un integrato supervisore dell’alimentazione e del watch-dog. Ad esso sono demandati i compiti di:
-
informare la CPU di una caduta di alimentazione tramite la linea INT-PF0 (INT0 della CPU)
-
sbloccare la CPU tramite la linea RESET nel caso di mancanza del refresh del watch-dog, normalmente evidenziato dal lampeggiare del led blu D1 sulla linea HD-LAMP (uscita T1della CPU)
-
gestire la partenza della CPU al power-on
-
gestire un reset manuale del sistema (pulsante MR)
La parte in basso a sinistra dello schema è l’alimentatore che è diviso in due sezioni:
-
una genera 9V non stabilizzati per le segnalazioni luminose ed il cicalino; in cascata viene reso disponibile il +5V per tutta la logica
-
un’altra sezione, produce invece il segnale di Power-fail, indicante una buca di alimentazione non gestibile dal sistema (soprattutto dall’alimentatore della valvola).
Le uscite di comandi della CPU sono bufferizzate dall’integrato U4, un 74HC365, abilitato dalla linea T0 della CPU. Questa configurazione si rese necessaria per evitare accidentali e transitorie attivazioni delle uscite durante la fase di inizializzazione della CPU.
In questo modo invece, qualunque sia lo stato all’accensione delle linee P1.2..P1.7, gli output della scheda rimangono aperti fintanto che il timer interno T0 non si sia esaurito, cioè ad inizializzazione completata e stabilizzata.
I dispositivi da IS01 ad IS06 sono 6 optoisolatori modello SFH610 che comandano gli alimentatori dell’amplificatore lineare, garantendo una elevata immunità ai disturbi ed isolamento galvanico fra i circuiti.
Nel dettaglio:
-
H1 = primo stadio anodica (soft-start inserito)
-
H2 = secondo stadio anodica (soft start bypassato)
-
G1 = alimentazione di griglia controllo (prima griglia)
-
G2 = alimentazione di griglia schermo (seconda griglia)
-
Heat = alimentatore filamento
-
Fan = ventilazione anodica
Lo stato di ogni uscita è visualizzato da un led, comandato dal line-driver U5 (un comune ULN2803)
Tutta l’elettronica è stata assemblata su una comune piastra millefori cablata con somma cura e pulizia. Nonostante la semplicità dell’assemblaggio, la soluzione si è dimostrata robusta ed affidabile. (vedi figura 1)
Nulla toglie che un circuito stampato ben disegnato possa spingere l’immunità e l’affidabilità del sistema verso limiti ancora più elevati.
Software:
il programma di gestione è composto da un corpo principale (main) che chiama diverse subroutines con varie temporizzazioni che realizzano le seguenti funzioni:
-
inizializzazione sistema
-
procedura di ON (main)
-
procedura di OFF (main)
-
debounce (antirimbalzo) sugli ingressi On/Off (3,9msec)
-
gestione del watch-dog (RTI)
-
gestione power fail (RTI)
1. La prima azione del codice è di inizializzare correttamente tutto il sistema, pulendo i vari registri e predisponendo le varie linee di I/O ed i timer.
2. Vediamo nel diagramma a stati seguente, una descrizione funzionale della routine principale (main, procedure 2 e 3), che governano la sequenza acceso-spento e viceversa.
Il codice è realizzato sulla base di una macchina a stati.
Da uno stato al seguente si transita una volta scaduto il tempo d’attesa, che può essere messo a punto sui bisogni propri di ogni tubo da controllare, ovvero per la richiesta di cambio stato (on→off off→on) da parte dell’operatore.
Nel nostro modello, la sequenza di accensione si sviluppava colla seguente temporizzazione, a partire dall’istante “T0” che è quello di convalida del comando “ON”:
- Istante “T0” Ventola ON
- Istante “T0”+ 1” accensione filamento
- Istante “T0” + 181” accensione griglia controllo (negativo Vg1)
- Istante “T0” + 183” accensione soft start anodica
- Istante “T0” + 188” bypass soft start anodica
- Istante “T0” + 191” accensione griglia schermo (Vg2)
mentre quella di spegnimento come segue (sempre con T0 assunto come istante di convalida comando spegnimento):
- Istante “T0” spegnimento griglia schermo (Vg2)
- Istante “T0”+ 2” inserzione soft start anodica
- Istante “T0” + 4” spegnimento completo anodica
- Istante “T0” + 6” spegnimento griglia controllo (negativo Vg1)
- Istante “T0” + 11” spegnimento filamento
- Istante “T0” + 241” ventola OFF
Durante l’attesa di ogni transizione, si verifica continuamente se l’operatore ha richiesto di abortire la sequenza, nel qual caso, il verso viene invertito rispettando la sicurezza delle temporizzazioni.
Le fasi di attesa sono sviluppate in subroutines specifiche, richiamate dalla macchina a stati principale.
4. La funzione “debounce”, è un filtro software sui comandi di ingresso (pulsanti on e off).
Il suo scopo è di impedire che brevi disturbi sulla linea, ovvero accidentali pressioni dei pulsanti vengano interpretati come comandi da eseguire.
La realizzazione software è molto semplice e diretta: ogni 3,9 msec viene letto il valore degli ingressi. Dal momento che si rileva una transizione, parte un contatore di filtro della durata di circa un secondo (255×3,9msec). Se al termine del tempo di osservazione tutti i campioni sono stati concordi, si valida il comando e si aggiorna la condizione interna della macchina a stati.
Un task specifico, ogni 78,6msec, contiene le funzioni 5 e 6 relative alla sicurezza ed è chiamato nel codice: RTI (RealTimeInterrupt).
5. è la gestione del watch-dog.
Nel caso di blocco od errore della CPU per un qualsivoglia motivo, disturbo, guasto, sporcamento registri, l’integrato esterno MAX803 ne attiva la linea di reset hardware. Per mantenere il sistema funzionante in normali condizioni, la CPU deve quindi periodicamente “informare” il MAX803 che tutto procede correttamente agendo sulla linea di uscita del timer T1. La routine si incarica quindi, a cadenza fissa, di resettare il watch-dog, preservando così la continua operatività del sistema.
6. questa funzione, gestisce il caso di mancanza di alimentazione per un qualunque motivo.
La routine assolve principalmente a due compiti:
-
mettere in sicurezza il sistema
-
trasmettere un messaggio acustico in codice morse che informa l’operatore dell’accaduto anche se non nelle immediate vicinanze dell’apparato
Vediamo come agisce:
la linea di power_fail viene filtrata e convalidata con un debounce di 47 msec.
A questo punto, rilevata con certezza l’impossibilità di continuare in sicurezza le operazioni a causa di un brusco e prolungato (rispetto all’inerzia dell’alimentatore e del tubo) abbassamento della tensione di rete, le uscite vengono aperte, interdicendo così l’alimentazione.
La ventilazione invece rimane attiva per evitare colpi di calore, molto pericolosi.
Nel caso che la situazione di messa in sicurezza richiedesse una diversa configurazione delle uscite per una specifica valvola, è ovviamente possibile ottenerla semplicemente aggiornando alcuni flag.
Al termine delle azioni “elettriche”, viene emesso dal cicalino un messaggio in telegrafia che informa l’operatore dell’accaduto.
Conclusioni
pur non essendo un progetto assolutamente innovativo o moderno da un punto di vista hardware, ha mostrato negli anni una elevata robustezza di funzionamento sfidando le condizioni operative più avverse, specie in termini di compatibilità elettromagnetica.
Il codice si è rilevato sicuro e pressoché infallibile anche in situazioni anomale.
Credo quindi che sia ancor oggi un’ottima base per lo sviluppo di simili sistemi di temporizzazione, magari impiegando microcontrollori più moderni.
Buon lavoro a tutti dunque!
Pierluigi Poggi – IW4BLG – 31 luglio 2008
Per chi volesse addentrarsi nelle pieghe del codice dell’8053, lo stesso è scaricabile liberamente qua, sotto licenza GPL.