マイコン工作実験日記

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

ダイアルトーンの生成

2015-12-06 11:27:53 | SLIC
Ag1171sを使った電話機とのインタフェース。着信音生成の次はダイアルトーンの生成です。オフフックしたら、400Hzのダイアルトーンを送出することにします。今後幾つかの周波数の信号を生成することを考えているので、sinのテーブルを用意しておき、それを参照して必要な周波数の信号を生成してDACに送ることにします。sinテーブルなんて自分で作ってもいいんですが、CMSIS-DSPに含まれているだろうと思い確認したところsinTable_q15があったので、これを使うことにしました。

サンプリングは24KHzで行うこととし、STM32L476のTIM7を使ってタイミング生成。DAC1のトリガーソースとしてTIM7のトリガーイベントを選択して、DMAで送信することにしました。400サンプル分のバッファを用意しておき、これをダブルバッファリングで使用。半分のデータを送信している間に、残りの半分のバッファに次に送信すべきデータを準備してやります。基本的なドライバのコードはSTM32CubeMXを使って生成しています。





DMAにCircular modeというのがあることを知ったので、これを使うことにしました。一度、DMAを開始すると繰り返し同じバッファからのDMA送信をおこなってくれます。バッファの半分まで送信が終わった時点と全ての送信が終わった時点で割り込みがかかってコールバックが呼ばれるので、そのタイミングで送信が終了したバッファに次の送信データを用意してやることで、繰り返し400Hzの波形を出力してやります。

sinTable_q15のデータは符号付の16bitデータです。そのため、このデータを直接DACに出力しても正しい波形にはなりません。0x8000~0xffffの値は負の値ですが、このままDACに送ってしまうと、逆に出力電圧が高くなってしまいます。そこで、0x8000とXORをとって符号を反転しておきます。STM32のDACは12bitなので16bitデータを4bitシフトしてやる必要がありますが、DACへの書き込み時に左詰め/右詰めしてくれる機能があるので、この機能を使えばソフトでは4bitのシフト処理は不要となります。CubeMXの設定を探しても左詰め/右詰め指定の設定をする箇所がないので戸惑いましたが、この指定はHALのAPIを呼び出す際に指定する仕様になっています。今回は左詰めを指定。符号を反転させた波形データはフルスイングした信号となっていますので、音声として再生すると音が大きすぎます。2bit右シフトして出力してやると丁度加減が良いようです。


ダイアルトーンの生成が確認できたので、次は異なる周波数も生成する実験をやってみるべく作業中です。