YS電子工作ラボ

  第80回PICクラブ 情報交換会 (開催日 2021.08.07)
<紹介作品

PIC32MZ (PWM + フィルタ)式アンプ
               WAVプレーヤ

以下、 第80回情報交換会報告(後閑さん、FaceBook Picfun.club.より)
 ■ 講評 (後閑さん)

 PIC32MZを使ったWAVファイルの再生コード紹介:斎藤さん
   多くのサンプリング周波数に対応できるWAV再生コードの紹介でした。PWMによる音の出力でしたが結構良い音で聴こえます。

 以下、紹介に際し使用した資料
 
  PIC32MZ (PWM + フィルタ)式アンプ
               WAVプレーヤ
  2021.08.07 PIC情報交換会資料 
  YS電子工作デザイン http://www.ys-labo.com/  斎藤
  YS電子工作ショップ http://ys-labo.shop-pro.jp/
1.  概要
  1.1 諸元、性能
 ・ SDカードの中にあるWAVファイルを(PWM + フィルタ)のアンプで再生にするプレーヤ
 ・ 再生可能なWAVファイルは 1. チャンネル数: モノラル/ステレオ、 2. データ幅: 8/16ビット、 3. サンプリング周波数: 8KHz~48KHz  
 ・ OC(Output Compare、旧CCP)モジュール:入力クロック=100MHz、PWM周波数=100kHz、PWM最小デューティ=1/1000
 ・ ファイル名、チャンネル数、データ幅、サンプリング周波数、ファイルサイズ、などのファイル情報をUART経由で Tera Term(PC)に表示
 


1.2. システム構成
           
2.  外観
全体 フィルタ部 拡大

3.  回路図(→PDFファイル
4.
  開発環境
 ・ Harmony v.2.04 XC32 v2.40
   及び Harmony v.3 XC32 v2.40 
 ・ PIC: PIC32MZ2048EFH100
5.
 プログラム
 ① 押しボタンスイッチ(再生開始/停止、スキップ)の検出: 変化割込み
 ② PIC起動直後: SDカード内全WAVファイルにテーブル作成
 ③ SDカードデータの読み出し: 4096バイト x 2個によるダブルバッファ方式 
 ④ WAVファイルオープン後、ファイルヘッダー情報解読
   ・ オフセット 0x00から4byte : 固定文字列 …… LIFF
   ・ オフセット 0x04から4バイト: ファイルサイズ (例) BA D2 06 00 → 6*16**4+13*16**3+2*16**2+11*16+10 = 447,152[byte]
   ・ オフセット 0x16から2バイト: チャンネル数  (例)モノラル の場合 0x0001、ステレオの場合 0x0002
   ・ オフセット 0x18から4バイト: サンプリングレート (例) 44 AC 00 00 → 44.1kHz
   ・ オフセット 0x22から2バイト: データ幅  (例) 08 00→8bit、 10 00 → 16bit
   ・ オフセット 0x2C以降 :  サウンドデータ   
 ⑤ サンプリング周波数(例:44.1KHz)毎の割込み処理
    Duty = サンプリングの振幅 / 最大振幅 により、PWM(100KHz)のDutyを算出 → OCタイマのレジスタ値を設定
  
<実際のプログラム抜粋>
 ……
 ……
   
        if(ysBit == 8)  //サウンドデータが8ビットの場合
        {
            temp_float = (float)Buf_A[ptr_A];
            Duty = temp_float / 256;  //float で演算
            Reg_Duty = (unsigned short int)((float)PR2 * (float)Duty); //デューティ設定用レジスタ値の演算
            OC8RS = Reg_Duty;
            if(MonoSte == 1)ptr_A += 1; //モノラルの場合
            else ptr_A += 2; //ステレオの場合
        }
        else    //サウンドデータが8ビット以外場合(→サウンドデータが16ビットの場合として処理)
        {
            temp_short = (short signed int)((Buf_A[ptr_A +1] << 8) + Buf_A[ptr_A]);     
                  //サウンドデータ: 16bit singned short int、リトルエンディアン //Buf_A[ptr_A]:unsigned char
            temp_float = (float)temp_short;     //signed short int → floatに変換
            Duty = (temp_float + 32768)/65536;  //float で演算
            Reg_Duty = (unsigned short int)((float)PR2 * (float)Duty); //デューティ設定用レジスタ値の演算
            OC8RS = Reg_Duty;
            
            if(MonoSte == 1)ptr_A += 2; //モノラルの場合
            else ptr_A += 4; //ステレオの場合
        }

 ……  ……


6.   動作結果
 
1. 動画   →  YouTube (1080pのHD動画)


2.. Tera Term ログ全文

7. 参考
  7.1 WAVEフォーマット変換ソフト の紹介  
   ・ソフト名:  WAVEフォーマット変換プラス    作者: T.Yamamoto    ダウンロード先: URL(Vector、 無料)
 ・説明&特徴
  WAVEフォーマットを変換するソフトです。
  8bit/16bit/24bit/32bit整数型/32bit浮動小数点数型フォーマットを相互に変換できます。
  変換可能なサンプリング周波数[Hz]は次の通りです。
  192000、176400、96000、88200、48000、44100、22050、11025、
  8000、16000、24000、32000
  モノラル⇔ステレオ変換も可能です。
  なお、4bitは非対応です。
   
 ・使い方:
  1. Openボタンを押して 変換元のWAVEファイルを開く。
  2. 変換後のデータ幅、サンプリング周波数、チャンネル数 を選択
  3. Conv.ボタンを押しファイルに名前を付けて保存





7.2 YS電子工作ラボHP での紹介 及びプロジェクトファイルダウンロード
 
     
PIC32MZ Harmony v2.04版   → URL  
PIC32MZ Harmony v3版   → URL