Indice |
Generalità
Mediante un microcontrollore opportunamente programmato, si possono svolgere le stesse funzioni di un circuito elettronico analogico. Mi riferisco alla possibilità di campionare i segnali in ingresso e simulare il circuito mediante operazioni alle differenze finite.
Svolgeremo un esempio pratico descrivendo una realizzazione che comprende un paio di semplici filtri, due rivelatori a valor massimo e una logica di confronto. Il tutto fa parte di un ricevitore per radiocomando a 3 canali On-Off in tecnica AFSK, ma è chiaro che non voglio fare concorrenza alla Futaba bensì soltanto servirmi di un esempio per mostrare come si possa simulare un filtro.
Non tratteremo l'argomento dei filtri in generale nè dei quadripoli nè tanto meno dei filtri digitali. Invece presupponiamo di avere un filtro già definito, nel senso che abbiamo già lo schema elettrico coi valori dei componenti o abbiamo già la funzione di trasferimento con poli e zeri, e desideriamo soltanto trovare il modo per simulare questo determinato filtro.
Assunte queste premesse, l'esempio che svolgeremo ha valore generale e può costituire un metodo valido per simulare qualsiasi filtro. I filtri di ordine superiore converrà considerarli come costituiti da più celle in cascata.
Il caso in esame
Con riferimento allo schema a blocchi quì sopra riportato, il problema che risolveremo è quello di simulare il filtro indicato come "Risonatore A".
Abbiamo lo schema elettrico e ne calcoliamo la funzione di trasferimento:
Applichiamo "brutalmente" la seguente sostituzione bilineare, in cui T è l'intervallo di campionamento:
Effettuata la sostituzione, l'operatore S sparisce e compare in sua vece l'operatore Z.
Poi portiamo a primo membro dell'eguaglianza la sola V2, cioè portiamo a secondo membro tutti i termini che contengono V1, e anche quelli che contengono V2 accompagnata dal simbolo operatoriale Z.
Ci vuole un paio di pagine di calcoli, ma si tratta di passaggi algebrici elementari e non è richiesta alcuna notazione o conoscenza superiore. Il risultato è costituito dalla seguente formula, dall'aspetto alquanto cabalistico:
A questo punto assumiamo che l'operatore Z significa "precedente" cioè ZV è il campione di segnale che precede V, Z2V precede ZV e così via.
In sostanza, lo ADC (analog to digital converter) del microcontrollore è programmato per campionare il segnale di ingresso V1 ad intervalli di tempo T, e la relativa ISR (Interrupt Servicing Routine) non deve fare altro che applicare la formula quì sopra scritta.
I coefficienti frazionari sono costanti (notiamo anche che hanno tutti lo stesso denominatore), dunque conviene calcolarli una volta per tutte all'inizio del Main Program, poi la ISR dovrà soltanto moltiplicare questi coefficienti costanti per le variabili, rappresentate dai segnali V1 campionati e V2 calcolati, e sommare; queste sono operazioni veloci fattibili in tempo reale.
Infine la ISR dovrà fare scorrere i valori delle variabili in memoria: ZV1 diventa Z2V1 per il passo successivo, V1 diventa ZV1 e così via.
Ce la caviamo con pochissimi microsecondi di tempo di CPU, il microcontrollore resta sostanzialmente libero per fare anche altre cose.
Formato dei dati numerici
I coefficienti costanti vengono calcolati in formato floating point e quì non ci sono problemi. Poi vanno convertiti in formato Integer per essere utilizzati dalla ISR, e quì qualche problema ci può essere. Se il valore è minore di uno, convertito in Integer diventerebbe zero e questo non va bene. Io ho usato il seguente metodo: esaminare il valore di ogni coefficiente (questo si può fare con lo stesso programma in fase di debug, oppure calcolandolo a parte), quindi moltiplicarlo per una opportuna potenza di 2 per scalarlo fino a un valore che sia comodo da rappresentare in formato Integer a 16 bit. Possiamo anche aggiungere 0.5 in floating al modulo per arrotondare la conversione in linguaggio C. Quando la ISR eseguirà la moltiplicazione di un coefficiente per una variabile, essendo due fattori entrambi a 16 bit, utilizzerà una variabile ausiliaria di appoggio Long Int a 32 bit. A questo punto bisogna dividere il risultato della moltiplicazione per la stessa potenza di 2 già utilizzata per scalare quel coefficiente, ricordando che la divisione può farsi velocemente con un semplice shift in memoria. Se tutto quadra, siamo tornati in rappresentazione a 16 bit e non siamo incorsi in nessun overflow, tenendo anche conto che lo ADC fornisce il segnale V1 a 12 bit.
La resistenza R del filtro ha semplicemente valore R=1, T si assume circa pari a 73 microsecondi cioè 14 kSample/sec.
La programmazione
Fornisco il programma in linguaggio C: electro.c
Questo programma è stato compilato con il compilatore C30 versione 3.25 lite student free che ho scaricato dal sito Microchip, e poi riversato con il programmatore Pickit3 tramite il connettore ICSP indicato nello schema, sotto Mplab 8.60.
La ISR dello ADC simula i due filtri A e B rappresentati nello schema a blocchi, e simula anche i rispettivi rivelatori a valor massimo.
Il Main Program configura lo HardWare del microcontrollore, poi calcola i coefficienti costanti, avvìa lo ADC e infine si pone in loop per confrontare le uscite dei due filtri A e B. Il risultato del confronto viene segnalato tramite due Led, ma potrebbero anche essere due transistor che azionano dei relè o altro.
L'hardware
Nella realizzazione pratica da me fatta, il segnale V1 viene prelevato tramite un jack dalla presa auricolare di un radio ricevitore Yaesu del tipo scanner, ma potrebbe provenire da qualsiasi altra fonte purchè non dia più di 3 volt picco/picco. L'altra estremità del cavetto di connessione si inserisce sullo stesso connettore ICSP usato per la programmazione, che quindi acquista una funzione alternativa.
Il trasmettitore per questo rudimentale "radiocomando AFSK" è capace di inviare un segnale modulato con 3 diverse frequenze audio: 263, 313 o 372 Hz che rappresentano i 3 canali di comando On-Off. E' chiaro che le due frequenze estreme coincidono con le frequenze di risonanza dei due filtri A e B; se le ampiezze all'uscita dei rispettivi rivelatori sono circa eguali vuol dire che la frequenza inviata è quella intermedia.
Non mi sono curato granchè dello warping tipico dei filtri digitali, eventualmente si può ritarare il tutto ma non ce ne è stato bisogno se non per altri motivi (componentistica del modulatore).
Riporto quì sotto lo schema del circuito che genera le tre frequenze suddette e funge da modulatore, e riporto anche un oscillogramma del segnale audio all'uscita dello scanner: la forma d'onda è distorta ma il funzionamento del radiocomando è affidabile grazie ai filtri.
Il fattore di merito dei risonatori, Q = 2 pigreco F R C, è stato fissato ad un valore di 15 che va bene per questa applicazione ma si può aumentare se serve per altri scopi.

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)

