DM330011のデモプログラムを解析

投稿日 2013/04/15

先日購入したdsPIC DSCのスターターキットに付属のデモプログラムを解析してみました。

DM330011_2.jpg

DM330011

 

今回解析したのは、OCPWM方式で再生するデモの方です。CODECで再生する方(工場出荷時にROMに書き込まれている)ではありません。

 

あまり深くは追いかけてませんが、だいたい以下のようになっています。


 

まずボードのセットアップですが、J6をOCPWM側にしておきます。マイクとヘッドホンをつないでおきます。

 

PCとUSBケーブルで接続すると電源が入ります。

 

女性の声でデモの操作方法が、繰り返しアナウンスされます。

 

S1ボタンスイッチを押すと録音モードになり、マイクから音声を録音できます。

 

S2ボタンスイッチを押すと再生モードになり、録音した音声が繰り返し再生されます。

 

つまり簡単なボイスレコーダです。

 

アナウンスの部分は壊されないので、電源を入れなおせば、再び女性の声が流れます。

 

CODEC方式よりもOCPWM方式の方が、音質は劣るようです。


 

プログラムは、まず、

 

AD変換用のsamplesバッファ、エンコード用のencodeSamplesバッファ、デコード用のdecodeSamplesバッファをそれぞれ128byteで用意します。

 

SFM(Serial Flush Memory)の録音領域を消去しておきます。

 

CPUのI/Oポートなどを初期化します。SASKInit()
ADC(AN0)をDMA転送モードで初期化します。Timer3をトリガとして8KHz(T=125uS)でサンプリングします。DMAはピンポンモードで初期化します。。(ADCChannelInit())
アウトプットコンペアをDMAのPWMモードで初期化します。PWMのキャリア周波数はTimer2を使用して32KHzに設定されます。OCPWMInit()

 

ADCはCh0(AN0)にマイク信号が入力されます。8KHzでサンプリングし、2つのDMA SRAMを交互にサンプリングバッファとして使用します(ピンポンモード) 128ワード変換が終了したらDMA SRAMからsamplesバッファに読み込みます。(ADCChannelRead())

 

電源を入れてすぐは、4MBit(524288 x 8 = 4Mbit) SFMの先頭の約131Kbytesに女性の声でデモプログラムの説明音声が録音されているので、それを再生します。

 

SFMから128byte単位でencodeSamplesバッファに読み込み(SFMRead())、それをデコード(G711Ulaw2Lin())してdecodeSamplesバッファに入れ、OCPWMドライバに渡してPWM出力(OCPWMWrite()されます。

 

約131KByte転送したら、先頭にもどり、繰り返し再生されます。

 

録音、または再生しながらボタンスイッチの状態を見ています。

 

ボタンスイッチはS1とS2があり、チャタリング処理されて取り込まれます。

 

S1が押された場合は、録音モードとなり、マイクから音声を取り込みます。

 

AD変換された信号は、128byte単位でsamplesバッファに取り込まれ、エンコード(G711Lin2Ulaw())されてencodeSamplesバッファに入ります。

 

次にencodeSamplesバッファの内容はSFMに書き込まれます(SFMWrite())。この書き込みは女性の声を壊さないように、メモリの残りの部分が録音領域として使われます。

 

S2が押されると、再生モードになり、SFMの録音領域の先頭から128Byte単位でencodeSamplesバッファに読み込まれ(SFMRead())、デコード(G711Ulaw2Lin())されてdecodeSamplesバッファに入りOCPWMで出力(OCPWMWrite())されます。OCPWMWrite()でPWMDuty値に変換されます。

 

AD変換のデータ出力フォーマットは左寄せ符号付き小数です。このため値としては-32768から+32767の範囲をとります。Timer2はFosc/2=20MHz= 50nsのクロックをもとにPR2で625カウントされて1周期ですので、周波数は32KHzです。これをAD変換値で変調するには、まずAD変換値に+32768を加えて0から+65535の値に変換し、625を掛けて、62765で割ります。例えばAD変換値がちょうど0の場合、PR2は中央の312となりDuty50%となります。

 

デモボード(DM330011)の主なハードウェア・コンポーネントは以下のようになっています。

 

CPU: dsPIC33FJ256GP506
SFM: ATMEL AT25F4096 4MBits SPI
CODEC: Wolfson WM8510(16/24/32ビット 48 KHz) 今回のデモでは使用しない
Audio AMP: 100mW Headphone Amp LM4811
アンチエイリアシングフィルター: MCP6024 OP Amp
PWMフィルター: MCP6022 OP Amp
温度センサ: microchip TC1047A 今回のデモでは使用しない
プッシュボタンスイッチ:2個
LED: RED, AMBER(YELLOW), GREEN

 

AD変換されたデータは、G.711で符号化されてフラッシュメモリに記録されます。G.711についてはネットを探すと説明しているサイトがあります。

 

OCPWM方式は、PWM信号をオーディオ信号で変調し、それをフィルターに通すことによってオーディオ信号に戻し、ヘッドホンアンプで増幅して再生する方式です。


 

このボイスレコーダにDSPフィルターを加えるには、ADCからsamplesバッファに取り込む際に、デジタルフィルターを通せばよいことになります。





 

(JF1VRR)