Sahara's WebLog

日記のような、備忘録のような、うらみつらみのような、自慢のような…。

PIC32MM0064GPL028にスピーカーをつないで音声を鳴らす。

PICに何かのモジュールをつないでそれをPICで駆動してモジュールに音を鳴らさせるのでなくPIC単体でスピーカーを鳴らす。
ArduinoのPROGMEMにデータを置いてPWMで音声を鳴らす。」のPIC版だ。
音のサンプリング周波数を8kHzにした点以外、音データの準備は上の通りなので書かない。
音データはここから拝借した「正解です。」だ。

環境
MPLABX IDE v5.10
XC32 Compiler v2.15
MPLAB Code Configurator v3.66 (以後MCC)

MCCで用意したMCCPのPWMを使って出力した信号でスピーカーを鳴らす。

例によってMCCでの設定画面を貼る。
System Moduleはクロックを16MHzに設定した。

TMR1は音のサンプリング周波数の8kHzに合わせて 1/8000 = 125μs 間隔で割り込みを発生させる設定にする。

ここではCalculated Periodを25usにして、Call Back Function Rateを5とした。
25us × 5 = 125us
音を鳴らすのはMCCP1によるPWMだ。
ModeはDual Edge Compare, Bufferedとした。
ていうか、いまのところこれしか理解してない。
Primary Compare Value = 0x0、Timer Period = 0x100 で、参考にしたArduinoの例でのPWMの周期に合わせてみた。
16MHz ÷ 0x100 = 62.5kHz
Secondary Compare Value (CCP1RB)の値に音声データを当てはめることになるわけだが初期値は適当に0x64としておいた。
これは、プログラム時にレジスタ名を確認しやすくするためで、あとで0x0にする。

PWMの周波数やデューティー比は以下のように決められる。

出力は2ピン(RA0)とした。

Generateする。
作成されるtmr1.cの割り込み部分にsound()という関数を呼ぶようにコードを書く。

main.cにsound()を書く。

ロジアナで測定した信号の様子。

スピーカーをPICに直接つないで鳴らし、スマホのマイクで録音した音声。


細かな設定はまだ詰めていないが、とりあえず何を言っているかわかる程度には再生できる。
Arduino Nanoは電源電圧が5.0VだったがPIC32MM0064GPL028は3.25Vなので音は小さめだ。

追記
音楽もやってみたが、5秒ほどの音でデータのサイズは38665バイト。
フリー版のビルド後に42484バイトの使用量となり、23052バイトの空きとなった。
この音質なら7秒程度は入れられるということで、簡単なメッセージや効果音には十分使えるだろう。

関連記事
Arduino NanoでZockの起動時の音とモノアイの動きの再現
ArduinoのPROGMEMにデータを置いてPWMで音声を鳴らす。

このエントリーをはてなブックマークに追加

Posted under: PIC32MM0064GPL028


コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.