検索
連載

MTUでブザーを鳴らして、“あの”レベルアップ音を再現したい!マイクロマウスで始める組み込み開発入門(9)(2/3 ページ)

マイクロマウスの市販組み立てキットを完成させた北上くんとえみちゃん。サンプルのソースコードに頼らず、オリジナルプログラムをイチから組もうと奮闘中。今回は、MTUのPWMモードを使ってブザーの制御にチャレンジする。

PC用表示 関連情報
Share
Tweet
LINE
Hatena

 前回、スイッチを正確に制御するために「CMT(コンペアマッチタイマー)」を使ってチャタリング防止の割り込み処理を追加しました。今回は、CMTよりも高機能な「MTU(マルチファンクションタイマーパルスユニット)」を使います。

 Pi:Co Classicに搭載されているマイコン、「SH7125」に備わっている3つのタイマーの特徴を、SH7125のデータシートから抜き出して比べてみましょう(画像4)。いかがでしょうか。この表を見ると、機能の充実度合いから、MTUがSH7125で使用するタイマーの主力であることがよく分かります。


SH7125のタイマー機能
画像4 SH7125のタイマー機能(SH7125ハードウェアマニュアルより抜粋)

 MTUは、名前に“パルス”が入っていることでも分かるように、タイマーとパルス発生機能が密接に結び付いています。このおかげで、周期と電圧を保つ時間を設定すれば、CPUに負荷を掛けずに制御波形を出し続けてくれます。この機能を「PWMモード」といいます。

 SH7125のMTUには、「PWMモード1」と「PWMモード2」の2種類があります。今回は、周期を決めるレジスタとパルス幅を決めるレジスタを1組として、1つのPWMを生成するPWMモード1を使用します。これは、画像5のような動きをします。

PWMモード1の動作
画像5 PWMモード1の動作

 画像5のようなパルスをブザーに出力することで音が鳴ります。周期を制御するのに、PWMモードを使えば音階が調整できるのです。

 MTUが優れているのは、PWMのON/OFFの出力を直接ポートに出せる点です。ブザーが接続されている「PE6」をMTU出力に設定すれば、ON/OFFのパルスが出るので簡単にブザーの制御ができます。


MTUの初期化プログラム

えみ

MTUって、多機能なんですねぇ。ブザーを鳴らす以外に何ができるのか、ワタシはまだ見当もつかないんですけど……。


北上

あのさ、「SH7125」のマニュアルは全部で690ページもあるって知ってるかな?


えみ

え〜っ。そんなにあるんですか!


北上

そのうちの約200ページがMTUの解説なんだよ。つまり、それだけ重要な機能ってことだよね。


えみ

ワタシ、全部覚える自信ないかも……。センパイ、すごいー。


北上

いや……。「えみちゃんと一緒に勉強する」って言ったじゃない。ボクもえみちゃんが来る前に、必死で予習しているんだよね。

いろんな機能があるから、実際にプログラミングしてハードウェアを動かしてみて……、必要なことから順番に覚えていけばいいと思うんだ。


えみ

(そうだったんだぁ……。)よーし、ワタシも頑張ろう!


北上

うん。じゃあ、プログラムを組んでみよう!!



 それでは、いつものようにプログラムを作成していきましょう。まずは、ブザーを鳴らすために必要な準備をしていきます。「init.h」にMTU設定を追加します(ソースコード1)。

void init_mtu(void);                //MTU設定
ソースコード1 「init.h」にMTU設定を追加する

 次に「init.c」のI/Oポートの初期化部分に、ブザーのポート出力設定(ソースコード2)を追加し、MTUの初期化(ソースコード3)を新たに記述します。

void init_io(void)
{
 
  ……(中略)……
 
    //ブザー
    PFC.PEIORL.BIT.B6        = 1;    //PE6を出力に設定
    //ブザーMTU
    PFC.PECRL2.BIT.PE6MD     = 1;    //PE6をMTU端子に設定
}
ソースコード2 「init.c」の「init_io(void)」にブザーの設定を追加。「PE6」はマルチプレクサになっており、「1」を設定することでMTU端子に設定できる

 MTUは、設定項目が多く少し複雑になります。画像6ソースコード3を照らし合わせて、理解を深めてください。

MTUの設定項目と流れ
画像6 MTUの設定項目と流れ
void init_mtu(void)
{
    //MTU2スタンバイモード解除
    STB.CR4.BIT._MTU2 = 0;
    //
    MTU2.TSTR.BYTE=0;                  //タイマー動作ストップ
    //ブザー用MTU
    MTU22.TCR.BIT.TPSC = 0;            //MTU22の動作クロックは24MHz
    MTU22.TCR.BIT.CCLR = 2;            //TGRBコンペアマッチでカウンタクリア
    MTU22.TIOR.BIT.IOB = 1;            //初期出力0コンペアマッチ0出力
    MTU22.TIOR.BIT.IOA = 2;            //初期出力0コンペアマッチ1出力
    MTU22.TGRA = 6000;
    MTU22.TGRB = 12000;                //発振周波数2kHz
    MTU22.TMDR.BIT.MD = 2;             //PWMモード1に設定
    //
    MTU2.TOER.BYTE=0xff;               //MTU出力端子を出力許可する
    //
    MTU2.TSTR.BIT.CST2 = 0;            //タイマーストップ
}
ソースコード3 「init.c」にinit_mtu関数を作成し、MTUの初期設定をする

 この設定で、以下のパルスが出力されます(画像7)。

ソースコード3で設定されるパルス出力
画像7 ソースコード3で設定されるパルス出力

 全てのハードウェアの初期化を行うinit_all関数に、MTUの初期化を追加します(ソースコード4)。

void init_all(void)
{
 
  ……(中略)……
 
    init_mtu();            //MTUの初期化
}
ソースコード4 「init.c」のinit_all関数にMTUの初期化を追加

 そして、ブザーのON/OFFと音階の周波数をどこからでも呼び出せるように「common.h」へ定義しておきます(ソースコード5)。

//ブザー ON/OFF
#define BZ_ON           1                      //ブザー ON
#define BZ_OFF          0                      //ブザー OFF
//音階の周波数
#define BZ_FREQ_REST    0                      //休符
#define BZ_FREQ_LA0     440                    //ラ(A)の周波数
#define BZ_FREQ_SI0     494                    //シ(B)の周波数
#define BZ_FREQ_DO      523                    //ド(C)の周波数
#define BZ_FREQ_RE      587                    //レ(D)の周波数
#define BZ_FREQ_MI      659                    //ミ(E)の周波数
#define BZ_FREQ_FA      698                    //ファ(F)の周波数
#define BZ_FREQ_SO      784                    //ソ(G)の周波数
#define BZ_FREQ_LA      880                    //ラ(A)の周波数
#define BZ_FREQ_SI      988                    //シ(B)の周波数
#define BZ_FREQ_DO2     1047                   //ド(C)の周波数
#define BZ_FREQ_RE2     1174                   //レ(D)の周波数
#define BZ_FREQ_MI2     1318                   //ミ(E)の周波数
#define BZ_FREQ_FA2     1396                   //ファ(F)の周波数
#define BZ_FREQ_SO2     1568                   //ソ(G)の周波数
#define BZ_FREQ_LA2     1760                   //ラ(A)の周波数
#define BZ_FREQ_SI2     1976                   //シ(B)の周波数
#define BZ_FREQ_DO3     2094                   //ド(C)の周波数
ソースコード5 「common.h」に音階を定義。「ラ」を基準に2オクターブ+2音を用意した

 これで、MTUでブザーを鳴らす初期設定が完了しました。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る