Generazione di toni DTMF con AVR

I segnali DTMF vengono usati dai dispositivi telefonici per effettuare una chiamata o per navigare appositi menu a guida vocale. Ecco come funziona lo standard DTMF e come implementarlo su un microcontrollore AVR con la tecnica PWM.

Introduzione

DTMF è l’acronimo di Dual-Tone Multiple Frequencies ed è un modo ampiamente utilizzato in telefonia per trasmettere informazioni  relative alla pressione dei tasti del tastierino numerico. In questo modo il tastierino può essere sostituito con qualcosa di più intelligente purché in grado di generare i corretti toni DTMF. Un segnale DTMF viene generato combinando due segnali sinusoidali di opportuna  ampiezza e frequenza fa ed fb. L’espressione di un tipico segnale DTMF è dunque del tipo:

f(t)=Aasin(2pfat)+Absin(2pfbt)

Il rapporto tra le due ampiezze Aa/Ab dovrebbe avere un valore compreso tra 0.7 e 0.9. La tabella 1 mostra la corrispondenza tra ciascuna cifra del tastierino telefonico e la coppia fa, fb. Ad esempio il tono DTMF corrispondente al numero 0 è dato dalla somma di due segnali sinusoidali di frequenza fa=1336Hz e fb=941Hz. L’uso di un doppio  tono  di codifica consente di usare un minor numero di frequenze (8 anziché 16) e di incrementare il livello di sicurezza.

Tabella 1. Corrispondenza tra cifra numerica e coppia di frequenze fa e fb

Tabella 1. Corrispondenza tra cifra numerica e coppia di frequenze fa e fb

GENERAZIONE DI SINUSOIDI IN PWM

Il primo problema da affrontare per generare toni DTMF è quello di produrre un’onda sinusoidale di frequenza opportuna ed uno dei modi per farlo è quello di utilizzare la tecnica PWM. Il principio della tecnica PWM è la generazione di un’onda quadra a duty cycle variabile della quale viene estratto il valore medio. In figura 1 è riportato un segnale PWM che permane a livello alto per un tempo X ed a livello basso per un tempo Y. Se VH e VL sono rispettivamente i valori di tensioni corrispondenti al livello alto e al livello basso dell’onda quadra, il valore medio VAV è dato da:

VAV=(XVH+YVL)/(X+Y)

Figura 1. Un segnale PWM per la generazione di un valore costante

Figura 1. Un segnale PWM per la generazione di un valore costante

In questo caso il valore medio è costante in quanto è costante il duty cycle dell’onda quadra. È evidente che per generare un’onda sinusoidale con un segnale PWM il valore medio (quindi il duty cycle) dell’onda quadra dovrà variare ad ogni periodo. I valori per il dimensionamento  del segnale PWM possono essere calcolati ad ogni ciclo o essere memorizzati in una tabella (lookup table) e maggiore è il numero di campioni (Nc) maggiore sarà l’accuratezza  del segnale sinusoidale generato. Se con f si indica la frequenza dell’onda sinusoidale (T=1/f ne è il periodo), con Nc il numero di campioni per periodo, con fCK la frequenza del timer e con fL la frequenza del segnale PWM (fCK/510), si ha:

f=fL/Nc=(fCK/510)/Nc

 La figura 2 mostra una sinusoide generata da un segnale PWM con Nc=12.

Figura 2. Una sinusoide generata da un segnale PWM

Figura 2. Una sinusoide generata da un segnale PWM

La frequenza del segnale PWM dipende dalla risoluzione desiderata. Con un timer ad 8 bit il massimo valore è 255 che dovrà essere raddoppiato visto che il timer conta in avanti e indietro (da qui il valore 510 utilizzato nella formula precedente). Utilizzando un clock da 8MHz la frequenza del segnale PWM sarà di 15,6KHz. Se i campioni non vengono letti in sequenza ma con salti predefiniti, è possibile generare onde a frequenza più elevata. Per questo motivo viene definito un nuovo parametro XSW che determina l’ampiezza del salto di lettura dei valori. Utilizzando XSW=2 verrà letto il primo campione, quindi il terzo, il quinto e così via e in un periodo completo gli stessi campioni verranno letti due volte generando un’onda di frequenza doppia. Utilizzando una tabella di lookup (LUT) il campione successivo (XLUT) viene calcolato dal precedente X’LUT sommando il valore scelto per XSW:

XLUT= X’LUT + XSW

XSW può essere ottenuto  dalla relazione: XSW=fNc/fL. in figura 3 è riportata un’onda sinusoidale di frequenza doppia ottenuta con XSW=2.

Figura 3. Onda sinusoidale ottenuta con XSW=2

Figura 3. Onda sinusoidale ottenuta con XSW=2

COME SOMMARE  LE DUE FREQUENZE PER OTTENERE IL SEGNALE DTMF

Come già detto il segnale DTMF si ottiene sommando due  sinusoidi di  frequenza ed  ampiezza opportune. Operativamente si imposta un tabella di lookup per una sinusoide con Nc=128 campioni ciascuno di 7 bit, quindi si calcolano gli otto valori di XSW per ottenere le frequenze previste dal DTMF (tabella 1). Il valore del campione da utilizzare come DTMF è la somma dei due campioni opportunamente  pesati. Fissando un rapporto di ampiezze pari a 3/4, il campione risultante è dato da:

XLUT=(X’LUTa+XSWa)+(X’LUTb+XSWb)3/4

Riassumendo:

  1. viene costruita una tabella per una sinusoide con Nc=128 e campioni da 7 bit;
  2. engono calcolati i vari XSW per ottenere le frequenze DTMF a partire dalla sinusoide creata;
  3. vengono calcolati i vari campioni per le due sinusoidi da sommare e modificata l’ampiezza opportunamente;
  4. viene calcolato il valore del campione risultante.

IMPLEMENTAZIONE

In figura 4 è mostrato lo schema elettrico di interconnessione tra un tastierino numerico e un AT90S4414. L’uscita utilizzata è la PD5 alla quale è collegato direttamente un altoparlante.

Figura 4. Connessione del keypad all’AVR

Figura 4. Connessione del keypad all’AVR

Eventualmente può essere inserito un filtro  passa-basso tra uscita ed altoparlante per migliorare la sinusoide di uscita. Il programma principale si occuperà di monitorare ciclicamente la tastiera in attesa della pressione di un tasto, quindi imposta il valore di XSWa e XSWb in accordo al tasto premuto. In figura 5 il diagramma di flusso del programma principale.

Figura 5. Diagramma di flusso del programma principale

Figura 5. Diagramma di flusso del programma principale

La routine di interrupt, il cui digramma di flusso è riportato in figura 6, preleva i valori di XSWa e XSWb e calcola il corretto valore per il campione PWM da generare quindi lo preleva dalla tabella di lookup.

Figura 6. Flow chart della routine di interruzione

Figura 6. Flow chart della routine di interruzione

Le entrate della tabella di lookup per la sinusoide di base a 128 campioni possono  essere ricavate dalla formula:

LUTx=63+63sin(2px/128) con x = 0..127

Il vantaggio di utilizzare campioni a 7 bit sta nel fatto che la somma dei due valori per la composizione del tono DTMF rientra sempre in 8 bit.

UN CENNO ALLA DECODIFICA

Decodificare un segnale DTMF significa ottenere un codice a 4 bit alla ricezione del segnale. In tabella 2 è riportata la corrispondenza tra la coppia di frequenze e il codice di decodifica.

Tabella 2. Decodifica dei segnali DTMF

Tabella 2. Decodifica dei segnali DTMF

Si noti che per i numeri da 1 a 9 la decodifica coincide con la rappresentazione in binario su 4 bit del numero decimale. Per operare la decodifica esistono vari decoder integrati. Un classico esempio è l’MT8870 un integrato che, regolato da un quarzo da 3,58MHz, riceve in ingresso il tono DTMF e dà in uscita i 4 bit di decodifica. Se la coppia di frequenze in ingresso è corretta, l’uscita viene convalidata portando il pin STD a livello alto per un periodo di tempo prefissato. In figura 7 è riportato  uno schema applicativo ed il pinout del decoder MT8870.

Figura 7. Decodifica DTMF mediante decoder MT8870

Figura 7. Decodifica DTMF mediante decoder MT8870

 

2 Commenti

  1. Maurizio Di Paolo Emilio Maurizio 5 febbraio 2016
  2. Emanuele Bonanni Emanuele 6 febbraio 2016

Scrivi un commento