マイコン工作実験日記

Microcontroller を用いての工作、実験記録

DTMFを拾ってみる

2015-12-27 19:39:47 | SLIC
DACを使ってのダイアルトーンやモデム信号の生成はできるたので、今度はADCの番です。音声受信の前段階として、まずは電話機からのDTMF信号を拾ってみます。Ag1171sのVout出力はSTM32L476のPA3につなげているので、ADC2_IN8でこれを受けます。ADCにはオーバサンプリング機能が用意されているようなので、これを使ってみようということで次の設定を用意。



8倍のクロックでサンプリングしたものを8で割って平均を取った値をサンプル値とします。クロックはTIM6を使って64KHzを生成してこれをトリガとしてADCに変換を開始させます。結果として8KHzでのサンプリング値が得られます。



変換結果はDMAを使ってメモリに転送。DACと同じくサーキュラーモードを使って、バッファの半分の転送が終わったところで割り込みをかけてDTMF検出処理を動かします。

DTMF検出については、Keilのサイトにとても良いサンプルコードがあったので、これをそのまま流用することにしました。Keilのツールとともに使うことが使用許諾条件になっているので、これには違反しているんですが。。。このコード、STM32用と題してあり8KHzサンプリングされたADCデータ(12ビット右詰め)を処理することが前提となっていますが、信号処理部分は大きくハードに依存しているわけでもないので、異なるMCUを使う場合でも簡単に移植できるでしょう。



何の問題もなくあっさりとDTMF検出が動きました。