« 職場でニコニコカレンダー (^-^) | トップページ | AP-SH2F-9A ROMデバッグメモ »

2007年10月 5日 (金)

SH7149のMTU2でPWM波形出力

メモついでに先日あったことを一つ。書いておかないと忘れてしまいそうなので。blogに書いておけば、あとでgoogleで検索したときにヒットするでしょ。

9/28のメールから抜粋。

さて、水曜日に解決できなかったMTU2によるPWM波形生成プログラ
ムの件、原因が判り、解決できましたのでお知らせします。

 原因は2つありました。ソースコードで書くと、

(1) PFC.PEIORL.BIT.B12 = 1; // TIOC4Aを出力に設定
(2) MTU2.TOER.BIT.OE4A = 1; // TIOC4AのMTU2出力許可

という2行が足りなかったことにより、PWM波形を生成できていま
せんでした。他の設定はそのまま正しくできていました。

(1) はハードウェアマニュアルの page 614 を、
(2) はハードウェアマニュアルの page 290 を参照してください。

 修正したプログラムを走らせ、デジタルオシロで 20ms周期、ON
時間が1500us の矩形波がでていることを確認できました。

ラジコンサーボを制御するために、MTU2を使ってPWM波形を生成したかったのですが、SH7149のハードウェアマニュアル図10.25 にあるフローチャートのとおり設定してもPWM出力が出来ませんでした。いろいろ試行錯誤してみたところ、このフローチャートに描かれていない設定がいくつかあることがわかりました。

最初に MTU2 にクロックを供給すること。最近のSH2は消費電力を抑えるためにデフォルトではモジュールスタンバイがかかっており、周辺回路に対してクロックが供給されていません。ですから、MTU2関連のレジスタを設定する前にスタンバイを解除する必要があります。これは、ハードウェアマニュアルの「使用上の注意」に書いてありますし、SH7125を使ったときにも同じことを経験していたので早めにクリアできました。

次に、PFC(ピンファンクションコントローラ)からPWM出力に使用するポートを「出力ポート」に設定すること。ポートE IOレジスタだけではなく、ポートEコントロールレジスタも合わせて設定するところがミソです。これはなかなか気付きませんでした。

最後にMTU2に出力許可をあたえること。これは気付かなかった。

参考までに、周期 20ms、デューティ 1500us で動作を確認したプログラムのMTU2設定部分を抜き出して載せておきます。

// MTU2のPWMモードでは、TGRAとTGRB、TGRCとTGRDをペアで使用して
// TIOCA、TIOCC端子からPWM出力を生成することができる。
//
// PWMモードの設定手順は次のとおり。
// (SH7149ハードウェアマニュアルRev.3.00 図10.25参照)
//
// [0] MTU2のスタンバイモードを解除する。(※1)
// [1] カウンタクロックを選択する。
// [2] カウンタクリア要因を選択する。
// [3] 波形出力レベルを選択する。(※2)
// [4] TGRに周期、デューティを設定する。
// [5] PWMモードを選択する。
// [6] カウント動作を開始する。
//
// 本プログラムでは、MTU2のチャンネル4をPMWモード1で使用して、
// TIOC4A端子からPWM出力を生成する。
//
// (※1) 図10.25のフローチャートには記載されておらず、見逃しやすいので注意が必要。
//  また、MTU2のスタンバイ解除はMTU2関連の設定を始める前に実行すること。
//  (MTU2にクロックが供給されないと、MTU2に対する一切の処理が無効になる。)
//
// (※2) タイマアウトプットマスタイネーブルレジスタ(TOER)の操作も図10.25のフローチャート
//  に記載されておらず、見逃しやすいので注意が必要。

unsigned short puls_width = 1875;  // 1500us/0.8us 動作確認用
unsigned short pwmFreq = 25000;   // PWMの信号周期を作るTGRAの値
  // MTU2クロックMpφ=20MHz, プリスケーラP=16 のとき周期 T = 20ms作る為に必要なTGRAの値は
     // TGRA = t・MPφ/p
  //  = (20 * 10^-3) * (20 * 10^6) / 16
  //  = 25000

 
CPG.FRQCR.BIT.MPFC = 3;  // MTU2に供給されるクロックを 20MHzに設定 (内部80Mhz/4)
PFC.PEIORL.BIT.B12   = 1; // TIOC4Aを出力に設定
PFC.PECRL4.BIT.PE12MD = 1; // PE12をTIOC4A入出力に設定

STB.CR4.BIT._MTU2 = 0;  // [0] MTU2のスタンバイモードを解除する。

        // [1] カウンタクロックを選択する。
MTU24.TCR.BIT.TPSC = 2;  //   プリスケーラ 1/16
MTU24.TCR.BIT.CKEG = 0;  //  立ち上がりエッジでカウント    
      
MTU24.TCR.BIT.CCLR = 1;  // [2] カウンタクリア要因を選択する。
        //   TGRAコンペアマッチでTCNTカウンタクリア
       
        // [3] 波形出力レベルを選択する。
MTU2.TOER.BIT.OE4A = 1;  // TIOC4AのMTU2出力許可 (TIORを設定する前に実行すること)
MTU24.TIOR.BIT.IOB = 5;  // 初期出力1, TGRBコンペアマッチで 0 出力
MTU24.TIOR.BIT.IOA = 2;  // 初期出力0, TGRAコンペアマッチで 1 出力


        // [4] TGRに周期、デューティを設定する。
MTU24.TGRA = pwmFreq;  // 周期
MTU24.TGRB = puls_width; // デューティ

        // [5] PWMモードを選択する。
MTU24.TMDR.BYTE   = 0x02; // PWMモード1に設定

MTU2.TSTR.BIT.CST4 =1 ;  // [6] カウント動作を開始する。

« 職場でニコニコカレンダー (^-^) | トップページ | AP-SH2F-9A ROMデバッグメモ »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/167990/16664284

この記事へのトラックバック一覧です: SH7149のMTU2でPWM波形出力:

« 職場でニコニコカレンダー (^-^) | トップページ | AP-SH2F-9A ROMデバッグメモ »

最近の写真