
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.
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)
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.
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.
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:
- viene costruita una tabella per una sinusoide con Nc=128 e campioni da 7 bit;
- engono calcolati i vari XSW per ottenere le frequenze DTMF a partire dalla sinusoide creata;
- vengono calcolati i vari campioni per le due sinusoidi da sommare e modificata l’ampiezza opportunamente;
- 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.
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.
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.
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.
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.

Tempo fa ho letto un articolo di design per il controllo remoto di un dispositivo in applicazioni agricole con un segnale DTMF: molto interessante. Anche in quel caso usava un micro, ma della microchip.
I mitici integrati MT8880 e MT8870 hanno fatto la storia del DTMF, ricordo varie applicazioni tra le quali l’attivazione remota di relè. Erano i telecontrolli quando non esisteva internet e nemmeno i telefonini.
Oggi i toni DTMF ormai sono anacronistici ma ho pubblicato questo articolo perché credo sia un ottimo educational utile sia al newbie che al professionista.