YS電子工作ラボ

<V.3版>

PWMによる
唱歌「ふるさと」

(→プロジェクトファイル(Harmony Ver.3 版 MHC v3.6.0) ダウンロード))


 PIC32MZのOCモジュールをPWMで動作させて、秋月電子通商の表面実装用スピーカー UM1515IAにより 唱歌「ふるさと」を演奏した
例を紹介します。

<仕様>
 ・ PIC32MZのOCモジュール(OC1)をPWMモードで使う。
 ・ スピーカは、秋月電子通商の表面実装用スピーカー UM1515IAとする。
    ・応答周波数: 850Hz~20KHz
    ・定格出力:0.5W
    ・最大出力:0.8W
    ・インピーダンス:8Ω
 ・ スピーカの音量調整がハードで行えるツマミを有する。
 ・演奏する 唱歌は「ふるさと」とし、下記楽譜の調(ヘ長調)、テンポ(80)、音符 及び休止符等に
  したがって スピーカの吹鳴周波数、吹鳴時間 及び休止時間等を定め演奏のこと。(参照→音楽の基礎知識



<回路図> (→ PDFファイル





<外観> PIC32MZ評価ボード(→購入方法)を使った実験品の外観です。

   



<動作結果> (→動画:1080pのHD動画を見ることができます。)

        唱歌「ふるさと」を 録音したMP3ファイルです。 PCで再生して聞いてください。。







<解説>   


 ■ MHC設定    

項目 1.[Prpject Graph]タブでの設定
■追加コンポーネント
  OCMP1, TMR2
2. [Prpject Graph]タブでの設定
■コンポーネント設定
 OCMP1 Select OutPut CompareMode:
   →   PWM Mode on OCx, Fault pin disable
3. [Prpject Graph]タブでの設定
■コンポーネント設定
  TMR2 Select Prescaler:
     →
 1 :16 Prescale value
MHC
備考
項目 4. [Clock Diagram]タブで、クロックの構成を外付け24MHz水晶発振器用、システムクロック200MHzに設定します。
 POSCMOD: → EC
 FPLLICLK: → POSC
 FPLLIDIV: → DIV_3
5. [Pin Settings]タブでの設定
■ピン71のRD0ポート
 Function: → OC1
 
MHC  
備考      


 ■ main.cに 青字部を追加します。 他のファイルへの追加は必要ありません。

  ① 所要の変数を定義します。
     四分音符の時間(長さ) T4 は、 60秒 ÷ テンポ(=80)なので、 T4 = 750 [msec] (=60 * 1000 / 80;
     int delay_Clock = 200000000; //200MHz
     int tempo_speed = 80; //テンポ=80
     int T4 = 750; //四分音符の時間(長さ) T4 = 750 [msec] //T4 = 60 * 1000 / 80;


  ② NOPを用いた 1μsec、1msecの遅延関数 delay_usec( )、delay_ms( )をつくります。
     void delay_us(volatile unsigned int usec) //1μsec遅延
     {
       volatile int count;
       count = (int)(delay_Clock/20000000)*usec;


  ③ 音階の違いは工学的には周波数の違いです。所要のPWM周波数に対応するタイマ2のPR2レジスタ値を
     設定します。また、OC1RSレジスタ値を設定してデューティの設定も行います。
     void BuzFreq(volatile int Freq, volatile float Duty) //PWM周波数(Freq) と デューティ(Duty)の設定関数
     {
       volatile int myPR; //PWM周期のレジスタ値( = PR2 at Timer2)
       volatile int myDuty; //PWM出力ON時間に相当するレジスタ値(= OC1RS at OC1)
       ……

       ……

  ④ 各音階に対応するPWM周波数とデューティを設定します。(→参考
    下記は第四オクターブの ド です。 PWM周波数を261.63Hz、デューティを0.5に設定しています。
    人間の耳の感度に周波数特性、音量特性があるので必要に応じてデューティを変えます。
    void Do_C4(void) //第四オクターブ ド //C4
    {
      BuzFreq(261.63,0.5);//ド //261.63Hz
    }
    ……
    ……


  ⑤ main ( )の始めでOCをイネーブル(有効)にします。
    OCMP1_Enable (); //OC1イネーブル


  ⑥ 繰り返しルーチン while ( true )の中でメロディーに沿った
    音階をならべていきます。 delay_ms( )の遅延関数で音符長さを設定します。
    音階と次の音階の間に 若干無音の時間をいれた方が実際の音楽らしくなります。
    //第1行: うさぎ追いし かの山 -----------------------------------------------------------
    //-----第一小節

    Fa_F4(); //ファ
    delay_ms(T4); //四分音符長さ
    noSound();

    Fa_F4(); //ファ
    delay_ms(T4); //四分音符長さ
    noSound();

    ……
    ……



以下、main.c 全文