3
\$\begingroup\$

I am planning to do some research in data transmission over the air. For this I am interested in DTMF encoding and decoding.

Is there a widely available IC to achieve this? A circuit diagram using the same ic would be a better answer. An arduino solution would be even better.

\$\endgroup\$
3
\$\begingroup\$

Holtek Semiconductor have traditionally had a wide range of DTMF encoders and the Holtek HT9170 may be a good option for a decoder while the Holtek HT9200 is an option for the encoder. The datasheets contain examples of connecting to a microcontroller and they are quite easy to use.

Holtek products often don't seem to be carried by a lot of larger suppliers but I just checked and they still seem to be commonly available from smaller suppliers so you shouldn't have much trouble tracking them down.

\$\endgroup\$
2
\$\begingroup\$

The dsPIC line of microcontrollers from Microchip can generate and detect DTMF signals in firmware, using the DSP features of the microcontroller. The downloads for the libraries and user guides are available here for download. I have used these in a project and they work quite well. dsPIC33F microntrollers are available for under $3 in a DIP package.

\$\endgroup\$
1
\$\begingroup\$

An Arduino could decode DTMF by putting an interrupt on zero crossings and counting the interval. Use an opamp to go from signal to rising/falling detect pulse, and use a pin change interrupt to record the time of the changes. The timing between successive samples can be inverted to give you frequency/ies. The interrupt latency of the AVR chip is < 3 us, although the Arduino library adds some significant latencies on top of that to drive the timers/counters; still, it will be precise enough to > 20 kHz input signals.

\$\endgroup\$
  • \$\begingroup\$ I'm not sure how well interval timing alone could work without having the input pre-filtered to separate out the upper and lower tones. It is possible to decode DTMF using a zero-cross detector alone (I've done it using a PIC16C621, and it worked pretty well) but the code is rather tricky. \$\endgroup\$ – supercat Jun 10 '13 at 18:03
  • \$\begingroup\$ The code is rather tricky, agreed :-) But it makes for a cheaper BOM if you already have suitable electrical interface. \$\endgroup\$ – Jon Watte Jun 12 '13 at 0:02
  • \$\begingroup\$ As noted, I've used a zero-crossing sensor to detect DTMF, but I polled the state of the sensor at regular intervals and worked off that. Perhaps one could formulate an algorithm which would work using an interrupt triggered by the zero crossings, but I'm not sure quite how. I really distrust the use of zero-crossing interrupts for purposes other than waking up when any signal is present, since there's not really any limit how close zero-crossings can be to each other. \$\endgroup\$ – supercat Jun 12 '13 at 16:15
  • \$\begingroup\$ "there's not really any limit how close zero-crossings can be to each other" Nyquist shows that, in fact, there is. Which is why I did the math on bandwidth in my response. And the available bandwidth shows that you will get more detailed data with zero crossing timing than you'll get with regular sampling, for the typical DTMF frequencies (although in general, they can be thought of as equivalents with different trade-offs.) \$\endgroup\$ – Jon Watte Jun 12 '13 at 19:28
1
\$\begingroup\$

Generating DTMF with Arduino (purely in software) is relatively simple. One example can be found here.

Decoding DTMF is more challenging, and I wouldn't try to achieve it purely in software on a 16MHz 8-bit CPU. I had success with such a project using the M8870 chip which is readily available. My project is documented here, and the schematic (which includes the M8870, the Arduino, and some unrelated stuff) is here.

\$\endgroup\$

Not the answer you're looking for? Browse other questions tagged or ask your own question.