TRASMETTITORE FM CON QN8027



Questo chip trasmettitore FM trasmette nella banda di frequenza che va da 76 MHz a 108 MHz ed eroga  una potenza massima di - 5 dBm su 50 ohm (necessario un adattatore di impedenza), si trova in commercio montato su una schedina  assieme a tutti i componenti necessari per il suo funzionamento. Sulla schedina è montato un regolatore di tensione (3.3 V) che permette di alimentarla a 5 V anche se il chip lavora a 3.3 V.
Per quanto riguarda i segnali digitali  in teoria dovrebbero avere un massimo livello di 3.6 V, infatti all'inizio della realizzazione di questo progetto interposi tra Arduino e la schedina TX un traslatore di livello ma il sistema non funzionava bene; il livello da 3.3 V scendeva a valori molto bassi e il chip non rispondeva ad Arduino, non ne ho capito il perché. Allora ho deciso di inviare i dati direttamente da Arduino all'integrato e il tutto ha funzionato subito. Per evitare che il livello raggiunga i 5 V ho utilizzato resistenze di pull-up piuttosto alte (10 K) che in aggiunta a quelle presenti sulla schedina (in serie alle linee SDA, SCL) fanno in modo che il livello non superi 4 Vp, sempre più alto di 0.4 V  del massimo accettabile ma fino ad ora non si è guastato nulla. Vedi foto sotto:



Lo schema è raffigurato nella seguente figura:


POTENZA IN USCITA

Per quanto riguarda la potenza in uscita il datasheet del chip ha la manina corta, esso dichiara solo una tensione massima su una ignota impedenza adattata. Non danno neppure l'impedenza di uscita  e questa non si può misurare con l'analizzatore di rete tipo NanoVna perché si brucerebbe subito l'ingresso dello strumento. Ma per adattare l'uscita ad un carico serve conoscere l'impedenza. Che fare? Io ho proceduto nella seguente maniera usando un  oscilloscopio, una sonda a FET e l'analizzatore di spettro TinySa.
L'impedenza di uscita è in realtà solo resistiva dato che il finale RF (dentro al chip) è caricato da un gruppo risonante con l'induttanza esterna e un varicap interno (che viene regolato automaticamente dalla calibrazione ad ogni cambio di frequenza) che sono  in parallelo  tra loro, questo fa si che ogni reattanza  parassita venga inglobata dal gruppo risonante e l'uscita veda una sola resistenza.

Fare riferimento alla seguente figura:

.

Tramite una sonda a FET viene prelevato il segnale in uscita del trasmettitore e inviato all'ingresso dell'oscilloscopio chiuso a 50 ohm, in questo modo si viene a conoscere l'ampiezza del segnale all'uscita del trasmettitore senza caricarla, infatti la sonda a FET presenta al suo ingresso una resistenza di 10 Mohm con una capacità in parallelo dell'ordine del pF che caricano pochissimo, praticamente niente, l'uscita RF, la sonda che ho usato io mantiene questa impedenza fino a 800 Mhz  ben superiore a quelle sulle quali si sta lavorando (76 MHz - 108 MHz). La sonda è raffigurata sotto:



Tale misura NON può essere effettuata con la classica sonda per oscilloscopi; infatti questa (commutata su X10) presenta  una capacità attorno ai 15 pF troppo alta per fare questo tipo di misurazioni. Inoltre il cavo della sonda si avvicina alla lunghezza d'onda delle frequenze in gioco e dato che  non è chiuso sulla sua impedenza caratteristica si generano onde stazionarie che falsificano l'ampiezza del segnale osservato.

Nella figura seguente è visualizzato il segnale misurato a centro banda (98 MHz) che è pari a 1.24 Vp ("p" sta per picco):



Anche se non conosciamo la resistenza di uscita  sappiamo che quando il suo valore è identico a quello del carico ai capi di quest'ultimo si ha esattamente la metà di 1.24 Vp ovvero 0.62 Vp corrispondenti a 115.8 dBuVp che sono vicini a quelli riportati sul datascheet (119 dBuVp), quindi il procedimento è giusto (per la conversione consiglio di usare il calcolatore on line  https://absolute-emc.com/calculator).

Conviene ora passare dal valore massimo al valore efficace che ci tornerà utile quando si useranno i dBm.

Vout = Vout_p / 1.41 = 1.24 / 1.41 = 0.873 V

Nella seguente figura è rappresentato il circuito di uscita equivalente senza carico; ovvero un generatore ideale di tensione con in serie una resistenza di uscita (Rx) incognita:






Nella seguente figura è invece rappresentato il circuito di uscita equivalente con carico Rc = Rx; ovvero un sistema adattato dove:

Vout_c = Vout / 2 = 0.873 / 2 = 0.436 V:



Ora bisogna determinare la Rx.
Per fare questo collego in uscita l'analizzatore di spettro (che ha l'impedenza di ingresso pari a 50 ohm) come nella figura sottostante:



Il livello misurato sullo strumento è pari a -40.7 dBm, siccome uso sempre un attenuatore di 30dB sull'ingresso dello strumento il vero valore in uscita del trasmettitore è -10.7 dBm pari a  65.2 mV, la situazione è raffigurata nella seguente figura:



A questo punto, con la formula del partitore, ricavo l'incognita Rx:

Vout_c = [50  /  (50 + Rx)] * Vout = [50  /  (50 + Rx)] * 0.873 = 0.0652 V

da cui:

Rx = (50 * Vout - 50 * Vout_c ) / Vout_c =  (50 * 0.873 - 50 * 0.0652)  /  0.0652 = 620 ohm

Abbiamo trovato la resistenza di uscita del trasmettitore. Il circuito di uscita del chip per il massimo trasferimento di potenza è raffigurato nella seguente figura:



Ma 0.436 V su 620 ohm corrispondono a -5.1 dBm (306 *10^(-3) mW),  questa potenza può essere trasferita integralmente (trascurando le perdite)  su un carico di 50 ohm  tramite adattatore di impedenza, per calcolarne i componenti ho usato l'applicazione del digramma di Smith, vedi figura successiva:



Di seguito la misura tramite TinySa:



Togliendo i soliti 30 dB di attenuazione si ottengono -5.2 dBm (piccola differenza dovuta agli errori dello strumento e delle cifre decimali approssimate nei calcoli).
Per avere una ulteriore conferma del giusto procedimento ho misurato il segnale, con sonda a FET, sul pin di uscita del chip con accordatore inserito e chiuso sui 50 ohm, dalla figura seguente si nota che la tensione è circa  metà di quella a circuito aperto (1.24 Vp), quindi il procedimento è giusto!



Di sotto l'adattatore montato sotto la scheda:



AUDIO

Per provare l'audio ho inviato su entrambi gli ingressi LEFT e RIGHT un segnale a 1 KHz e ne ho variato il livello misurando la deviazione e la banda con il TinySA, qui sotto i risultati:

Livello = 90 mVpp, deviazione = 19.2 KHz, Banda = 41.4 KHz.

Livello = 300 mVpp, deviazione = 43.4 KHz, Banda = 89.9 KHz.


Livello = 500 mVpp, deviazione = 67.6 KHz, Banda = 138.4 KHz.


Dove Vpp significa volt picco - picco.
Per saggiare la qualità audio ho collegato ad entrambi gli ingressi l'uscita di una schedina microfonica (vedi immagine sotto) che fornisce un livello di circa 500 mVpp parlando distante dal microfono 2 cm con voce normale, l'audio l'ho ascoltato in altoparlante del ricevitore FM XHDATA.



L'audio è ottimo, unico piccolo fastidio è che nel momento in cui si parla si ascolta nel ricevitore un lieve soffio come se ci fosse un compressore audio nel chip.

RDS

Un'altra caratteristica interessante di questo chip è che con esso si può spedire un testo RDS, sotto la foto del ricevitore che visualizza il testo da me spedito (il mio nome):


Unico consiglio che posso darvi è che quando scriverete il testo nella funzione dovrete inserire  uno spazio tra la fine dell'ultimo carattere del testo stesso e il doppio apice, come segue:

radio.sendRadioText("Fabio ");

LIBRERIA

Esiste una meravigliosa libreria (forse l'unica al mondo) creata dal sig. ManojBhakarPCM a https://github.com/ManojBhakarPCM/Arduino-QN8027-with-Full-RDS-support, premetto che mi considero un mediocre  informatico per cui non sono riuscito a fare installare la libreria dall' IDE di Arduino e ho dovuto trovare un altro sistema per far funzionare il mio programma.
In pratica ho fatto creare dall' IDE, in maniera consueta, la cartella dove potesse risiedere il file con estensione .ino, dopo di che in quella stessa cartella ho inserito i due file con estensione .cpp e .h. Poi nel file .cpp e nel file .ino ho inserito il percorso intero che porta alla cartella suddetta dove si trovano i tre file:

#include "C:UsersFabioDocumentsArduinolibrariesON8027srcqn8027_extQN8027Radio.h"

ma ripeto, non sono un mago in informatica.

Qui sotto i moduli della libreria con le spiegazioni dell'autore:

MODULI LIBRERIA

void QN8027Radio::setClockSource(uint8_t value)
  value::meaning
  0 :: Using XTAL             between pin1 and pin2
  1 :: Inject digital clock   between pin1 and ground.
  2 :: single end sin wave    between pin1 and ground.
  3 :: differential sin wave  between pin1 and pin2

void QN8027Radio::setCrystalCurrent(float value)
  maximum current can be 400 uA
  you can input percentage of 400 in parameter
  for example setCrystalCurrent(50) means 50% of 400 = 200uA
  defualt is 100 micro ampere.

void QN8027Radio::setTxFreqDeviation(uint8_t value)
  set overall FM channel Bandwidth. less deviation means it will make sharp narrow peak in FM band.
  actual deviation in KHz = Fdev * 0.58
  Fdev values can be set from 0 to 255.
  default is 129 which means 74.82 KHz
  maximum bandwidth can be 148 KHz by setting Fdev value to 255

void QN8027Radio::radioNoAudioAutoOFF(uint8_t value)
ON  : RF power Amplifier will be off automatically after 60 second of no audio input at pin 6 and pin 7 (which is default)
  OFF : PA will never off. No effect of audio input silence.

void QN8027Radio::setTxPower(uint8_t value)
  sets power of internal RF Power Amplifier.
  you can set value from 20 to 75.
  actual power = 0.62 * setX + 71 dBu
  maximum power can be 117.5 dBu
  minimum power can be 83.4  dBu
  default value of value is 127 which makes no sense(not between 20 and 75). but we assumes that default is max.
  althogh value is 7 bit long, which means you can set values from 0 to 127. but they said not to be valid.

void QN8027Radio::setRDSFreqDeviation(uint8_t value)
  set bandwidth of RDS channel.
  actual bandwidth in KHz = value * 0.35
  value can be set from 0 to 127
  defualt is 6 which means 2.1 KHz
  maximum bandwidth can be 44.45 KHz by setting value value to 127

void QN8027Radio::MonoAudio(uint8_t value)
  stop mixing Left and Right audio in MPX. means receiver will get only mono audio.
  default is stereo. value can be ON or OFF

void QN8027Radio::mute(uint8_t value)
mutes audio to transmitter output. transmitter will only transmite carrier frequency without audio.
value variable can be:  ON or OFF
default is OFF.
 
void QN8027Radio::scrambleAudio(uint8_t value)
  I really dont know why is this option there. it gave mono audio with narrow CarrierWave bandwidth in my tests.
  you can provide ON or OFF in parameter to this function.

void QN8027Radio::setTxPilotFreqDeviation(uint8_t value)
  Set main pilot frequency (19KHz) Width(Bandwidth).
  value = 7  means 7% of 75 KHz
  value = 8  means 8% of 75 KHz
  value = 9  means 9% of 75 KHz (it is defualt)
  value = 10 means 10%of 75 KHz
  this will automatically affect second and third harmonics.

void QN8027Radio::setAudioInpImp(uint8_t value)
 
  Audio Input Impedence, lower value boosts volume, 5,10,20,40 KOhm

void QN8027Radio::setTxInputBufferGain(uint8_t value)
  set audio amplification in input buffer. actual gain is also depends on inputImpedence() functions parameter.
  actual gain in dB = Gain = [(IBGain+1)*3] - [LRInputImpdKOhm*6]
  you can set IBGain value from 0 to 5
d efault is 3
void QN8027Radio::setTxDigitalGain(uint8_t value)
  Digital Audio Amplification in decibel.
  value::Meaning
  0    :: 0 dB (default)
  1  :: 1 dB
  2  :: 2 dB

void QN8027Radio::reset()
  Resets all registers(settings) to default.

void QN8027Radio::reCalibrate()
Recalibrates internal RF power amplifier for load antenna attached. this process is automatic and you just need to use this function only.

void QN8027Radio::setPreEmphTime50(uint8_t value)
  ON = PreEmphasis Time Constant = 50uS
  OFF= PreEmphasis Time Constant = 75uS (Which is defualt)

void QN8027Radio::setFrequency(float value)
  Set Transmitting Frequency From 76 to 108 MHz with decimal point
  Example - setFrequency(88.1); , setFrequency(100);
void QN8027Radio::setCrystalFreq(uint8_t value)
  if clock input source is XTAL then you can set which XTAL was used.
  value::Meaning
  12  :: 12 MHz
  24  :: 24 MHz (default)

void QN8027Radio::Switch(uint8_t value)
  Turn Transmitter ON or OFF. by defualt it is off and does not start just by giving voltage to this chip.
  you must call this function to start transmitter.
void QN8027Radio::RDS(uint8_t value)
  set RDS channel ON or OFF

void QN8027Radio::radioNoAudioAutoOFF(uint8_t value)
ON : RF power Amplifier will be off automatically after 60 second of no audio input at pin 6 and pin 7 (which is default)
  OFF : PA will never off. No effect of audio input silence.

void QN8027Radio::sendRadioText(String value)
Sends Song Artist Album Name. value must be maximum 64 Byte long

void QN8027Radio::sendStationName(String value)
  Sends Station Name such as "MbPCM FM" to a RDS enabled receiver.
  Value must be maximum 8 byte long String.

float QN8027Radio::getFrequency()
    Get Currently Transmitting Frequency with decimal point

uint8_t QN8027Radio::getFSMStatus()
    gets FSM status.
    value::Meaning
    0    :: Resetting
    1   :: ReCalibrating
    2    :: IDLE
    3    :: Tx Ready
    4   :: PA Calibration
    5   :: Transmitting
    6   :: PA is OFF

uint8_t QN8027Radio::getAudioInpPeak()
    get maximum amplitude of input audio since last reading
    multiply this value by 45 and you will get amplitude in mili Volts.

uint8_t QN8027Radio::getStatus()

Qui il mio programma  con i file .cpp e .h.
Fabio
 HOME