DACを使ってのダイアルトーンやモデム信号の生成はできるたので、今度はADCの番です。音声受信の前段階として、まずは電話機からのDTMF信号を拾ってみます。Ag1171sのVout出力はSTM32L476のPA3につなげているので、ADC2_IN8でこれを受けます。ADCにはオーバサンプリング機能が用意されているようなので、これを使ってみようということで次の設定を用意。
![](https://blogimg.goo.ne.jp/user_image/78/5f/2bced8d91b8c8a7c09000e76c179965d.png)
8倍のクロックでサンプリングしたものを8で割って平均を取った値をサンプル値とします。クロックはTIM6を使って64KHzを生成してこれをトリガとしてADCに変換を開始させます。結果として8KHzでのサンプリング値が得られます。
![](https://blogimg.goo.ne.jp/user_image/00/d8/783e28e5faabccc757164aecd5dd8225.png)
変換結果はDMAを使ってメモリに転送。DACと同じくサーキュラーモードを使って、バッファの半分の転送が終わったところで割り込みをかけてDTMF検出処理を動かします。
DTMF検出については、Keilのサイトにとても良いサンプルコードがあったので、これをそのまま流用することにしました。Keilのツールとともに使うことが使用許諾条件になっているので、これには違反しているんですが。。。このコード、STM32用と題してあり8KHzサンプリングされたADCデータ(12ビット右詰め)を処理することが前提となっていますが、信号処理部分は大きくハードに依存しているわけでもないので、異なるMCUを使う場合でも簡単に移植できるでしょう。
![](https://blogimg.goo.ne.jp/user_image/4b/bd/3d20d64eb649f34e8759128ccb053564.png)
何の問題もなくあっさりとDTMF検出が動きました。
![](https://blogimg.goo.ne.jp/user_image/78/5f/2bced8d91b8c8a7c09000e76c179965d.png)
8倍のクロックでサンプリングしたものを8で割って平均を取った値をサンプル値とします。クロックはTIM6を使って64KHzを生成してこれをトリガとしてADCに変換を開始させます。結果として8KHzでのサンプリング値が得られます。
![](https://blogimg.goo.ne.jp/user_image/00/d8/783e28e5faabccc757164aecd5dd8225.png)
変換結果はDMAを使ってメモリに転送。DACと同じくサーキュラーモードを使って、バッファの半分の転送が終わったところで割り込みをかけてDTMF検出処理を動かします。
DTMF検出については、Keilのサイトにとても良いサンプルコードがあったので、これをそのまま流用することにしました。Keilのツールとともに使うことが使用許諾条件になっているので、これには違反しているんですが。。。このコード、STM32用と題してあり8KHzサンプリングされたADCデータ(12ビット右詰め)を処理することが前提となっていますが、信号処理部分は大きくハードに依存しているわけでもないので、異なるMCUを使う場合でも簡単に移植できるでしょう。
![](https://blogimg.goo.ne.jp/user_image/4b/bd/3d20d64eb649f34e8759128ccb053564.png)
何の問題もなくあっさりとDTMF検出が動きました。