2012年9月13日木曜日

sh7144で8本(8相)のPWMを出力するプログラム。(停止させる関数以外動作確認済み。)
interface誌の基盤だと、出力ピンをプルアップしているところをパターンカットして、DBGMD=HとなっているところをDBGMD=L(GNDに落とす)必要があります。

pwm.c
//===================
#include <machine.h>
#include "iodefine.h"
void init_pwm(void)//PWM初期化関数
{
//マルチファンクションタイマパルスユニット(MTU)を用いてpwmを出力する。
MST.CR2.BIT._MTU = 0;//スタンバイ解除
//ピンファンクションコントローラで端子を初期化する。========
 //PWMモード1で出力端子に指定できる端子は最初から決められています。詳細はハードウェアマニュアルの
 //「11.4.5 PWMモード」の「表11.31 格PWM出力のレジスタと出力端子」を参照して下さい。
 //
 //つまり、これに合わせてIOを端子を初期化します。
 //ポートコントロールレジスタで機能選択。
  //チャンネル4(PWM2本出力可能)
   //PFC.PECRL1.BIT.PE15MD=1; //TIOC4D
   PFC.PECRL1.BIT.PE14MD=1; //TIOC4C
   //PFC.PECRL1.BIT.PE13MD=1; //TIOC4B
   PFC.PECRL1.BIT.PE12MD=1; //TIOC4A(SCI_TXD3)
  //チャンネル3(PWM2本出力可能)
   //PFC.PECRL1.BIT.PE11MD=1; //TIOC3D(SCI_RXD3)3
   PFC.PECRL1.BIT.PE10MD=1; //TIOC3C(SCI_TXD2)
   //PFC.PECRL1.BIT.PE9MD=1; //TIOC3B(SCI_SCK3)3
   PFC.PECRL1.BIT.PE8MD=1;  //TIOC3A(SCI_SCK2)
  //チャンネル2(PWM1本出力可能)
   //PFC.PECRL2.BIT.PE7MD=1; //TIOC2B(SCI_RXD2)2
   PFC.PECRL2.BIT.PE6MD=1;  //TIOC2A(SCI_SCK3)
  //チャンネル1(PWM1本出力可能)
   //PFC.PECRL2.BIT.PE5MD=1; //TIOC1B(SCI_TXD3)3
   PFC.PECRL2.BIT.PE4MD=1;  //TIOC1A(SCI_RXD3) //E10A使用時(DBGMD=H 時)はTCK入力に固定されます。
  //チャンネル0(PWM2本出力可能)
   //PFC.PECRL2.BIT.PE3MD=1; //TIOC0D   //E10A使用時(DBGMD=H 時)はTDO入力に固定されます。
   PFC.PECRL2.BIT.PE2MD=1;  //TIOC0C   //E10A使用時(DBGMD=H 時)はTDI入力に固定されます。
   //PFC.PECRL2.BIT.PE1MD=1; //TIOC0B   //E10A使用時(DBGMD=H 時)はTRST入力に固定されます。
   PFC.PECRL2.BIT.PE0MD=1;  //TIOC0A   //E10A使用時(DBGMD=H 時)はTMS入力に固定されます。
//----------------------------------------------------------
 //ポートIOレジスタで端子の入出力方向を決める。
 //出力に設定
  //チャンネル4(PWM2本出力可能)
   //PFC.PEIORL.BIT.B15=1; //TIOC4D//JP2-19
   PFC.PEIORL.BIT.B14=1; //TIOC4C//JP2-18//OK
   //PFC.PEIORL.BIT.B13=1; //TIOC4B//JP2-17
   PFC.PEIORL.BIT.B12=1; //TIOC4A//JP2-16
  //チャンネル3(PWM2本出力可能)
   //PFC.PEIORL.BIT.B11=1; //TIOC3D//JP2-15
   PFC.PEIORL.BIT.B10=1; //TIOC3C//JP2-14//OK
   //PFC.PEIORL.BIT.B9=1; //TIOC3B//JP2-13
   PFC.PEIORL.BIT.B8=1; //TIOC3A//JP2-12//OK
  //チャンネル2(PWM1本出力可能)
   //PFC.PEIORL.BIT.B7=1; //TIOC2B
   PFC.PEIORL.BIT.B6=1; //TIOC2A//JP2-10//OK
  //チャンネル1(PWM1本出力可能)
   //PFC.PEIORL.BIT.B5=1; //TIOC1B
   PFC.PEIORL.BIT.B4=1; //TIOC1A//JP3-1
  //チャンネル0(PWM2本出力可能)
   //PFC.PEIORL.BIT.B3=1; //TIOC0D
   PFC.PEIORL.BIT.B2=1; //TIOC0C//JP3-6
   //PFC.PEIORL.BIT.B1=1; //TIOC0B
   PFC.PEIORL.BIT.B0=1; //TIOC0A//JP3-5
//==========================================================
//タイマコントロールレジスタ(TCR)の設定
 //カウンタクリア(CCLR)の設定
 //カウンタをクリアする条件を指定する。
 //「TGRAのコンペアマッチインプットキャプチャでTCNTクリア」に指定。
  MTU0.TCR.BIT.CCLR = 1;
  MTU1.TCR.BIT.CCLR = 1;
  MTU2.TCR.BIT.CCLR = 1;//はiodefine.hに定義されていない。MUT1と同じ構造体だから一緒に書いてるっぽい?
  MTU3.TCR.BIT.CCLR = 1;
  MTU4.TCR.BIT.CCLR = 1;
 //カウンタクリア要因を選択
 //クロックエッジ(CKEG)の選択
 //00:立上がりエッジでカウント
 //01:立下りエッジでカウント
 //1X:両エッジでカウント
 //【記号説明】X:Don't care
  MTU0.TCR.BIT.CKEG = 1;
  MTU1.TCR.BIT.CKEG = 1;
  MTU2.TCR.BIT.CKEG = 1;//はiodefine.hに定義されていない。MUT1と同じ構造体だから一緒に書いてるっぽい?
  MTU3.TCR.BIT.CKEG = 1;
  MTU4.TCR.BIT.CKEG = 1;
 //カウンタクロックを選択
 //タイマプリスケーラ(TPSC)の設定
 //0:内部クロック:Pφ/1でカウント
 //1:内部クロック:Pφ/4でカウント
 //2:内部クロック:Pφ/16でカウント
 //3:内部クロック:Pφ/64でカウント
 //4:
 //5: チャンネルにより様々。
 //6:
 //7:
  MTU0.TCR.BIT.TPSC = 0;
  MTU1.TCR.BIT.TPSC = 0;
  MTU2.TCR.BIT.TPSC = 0;//はiodefine.hに定義されていない。MUT1と同じ構造体だから一緒に書いてるっぽい?
  MTU3.TCR.BIT.TPSC = 0;
  MTU4.TCR.BIT.TPSC = 0;

//タイマーステータスレジスタ(TSR)の設定
 //タイマジェネラルレジスタ(TGA)の設定
 //TGRの8ビット単位でのアクセスは禁止です。常に16ビット単位でアクセスしてください。
 //TGRは16ビットレジスタです。(つまり最大で0xFFFF)
 //
 // φ:システムクロック
 //Pφ:周辺クロック
 //
 //MTUのクロックPφ[MHz](ex:24MHz)
 //プリスケーラP(ex:P=16のときはPφ/16でカウントするという意味)
 //のとき周期T[ms](ex:T=20ms)
 //を作るのに必要なTGRAの値は
 //TGRA=T*Pφ/P
 //   =20[ms]*24MHz/16
 //   =(20*10^(-3))*(24*10^6)/16
 //   =30000
 //注意:[CCLR]で両エッジでカウントする様に指定した場合は2倍のカウントが必要です。
//TGRA=T*Pφ/P
//   =(10^(-5))*(24*10^(6))/1
//   =240
//    =0xF0

 //パルス周期を設定します。
  MTU0.TGRA = 0x00F0;
  MTU1.TGRA = 0x00F0;
  MTU2.TGRA = 0x00F0;//はiodefine.hに定義されていない。MUTと同じ構造体だから一緒に書いてるっぽい?
  MTU3.TGRA = 0x00F0;
  MTU4.TGRA = 0x00F0;
  MTU0.TGRC = 0x00F0;
  MTU3.TGRC = 0x00F0;
  MTU4.TGRC = 0x00F0;
 //デューテー値を設定する。
  //1:1 50%   0x0078
  //2:1 66.66・・・% 0x00A0
  //3:1 75%   0x0084
  //4:1 80%   0x00C0
  //5:1 83%   0x00C8
  MTU0.TGRB = 0x0078;//
  MTU1.TGRB = 0x00A0;//
  MTU2.TGRB = 0x0084;
  MTU3.TGRB = 0x00C0;
  MTU4.TGRB = 0x00C8;
  MTU0.TGRD = 0x8000;
  MTU3.TGRD = 0x8000;
  MTU4.TGRD = 0x8000;
//タイマアウトプットマスタイネーブルレジスタ(TOER)
//TOERは出力端子のTIOC4D、TIOC4C、TIOC3D、TIOC4B、TIOC4A、TIOC4Bの出力端子の許可/禁止を行います。
//0:MTU出力禁止
//1:MTU出力許可
 MTU.TOER.BIT.OE4A=1;
 //MTU.TOER.BIT.OE4B=1;
 MTU.TOER.BIT.OE4C=1;
 //MTU.TOER.BIT.OE4D=1;
 //MTU.TOER.BIT.OE3B=1;
 //MTU.TOER.BIT.OE3D=1;
//タイマI/Oコントロールレジスタ(TIOR)
//TIORのIOB3~IOB0はTGRBの機能を設定します。
//    周期:TGRA --> 初期出力0,コンペアマッチ出力0 [0001] --> 0x1
//デューティ比:TGRB --> 初期出力0,コンペアマッチ出力1 [0010] --> 0x2
//
//    周期:TGRC --> 初期出力0,コンペアマッチ出力0 [0001] --> 0x1
//デューティ比:TGRD --> 初期出力0,コンペアマッチ出力1 [0010] --> 0x2
 //7~4ビット
  //チャンネル0
   MTU0.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC0B
   MTU0.TIOR.BIT.IOD = 2;//TGRD:アウトプットコンペアレジスタ//出力端子:TIOC0D
  //チャンネル1
   MTU1.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC1B
  //チャンネル2
   MTU2.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC2B
  //チャンネル3
   MTU3.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC3B
   MTU3.TIOR.BIT.IOD = 2;//TGRD:アウトプットコンペアレジスタ//出力端子:TIOC3D
  //チャンネル4
   MTU4.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC4B
   MTU4.TIOR.BIT.IOD = 2;//TGRD:アウトプットコンペアレジスタ//出力端子:TIOC4D
 //3~0ビット
  //チャンネル0
   MTU0.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC0A
   MTU0.TIOR.BIT.IOC = 1;//TGRC:アウトプットコンペアレジスタ//出力端子:TIOC0C
  //チャンネル1
   MTU1.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC1A
  //チャンネル2
   MTU2.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC2A
  //チャンネル3:
   MTU3.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC3A
   MTU3.TIOR.BIT.IOC = 1;//TGRC:アウトプットコンペアレジスタ//出力端子:TIOC3C
  //チャンネル4
   MTU4.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC4A
   MTU4.TIOR.BIT.IOC = 1;//TGRC:アウトプットコンペアレジスタ//出力端子:TIOC4C
//タイマモードレジスタ(TMDR)
 //[BFB]0:TGRBとTGRDは通常動作
 //    1:TGRBとTGRDはバッファ動作
 //[BFA]0:TGRAとTGRCは通常動作
 //    1:TGRCとTGRCはバッファ動作
 //バッファ動作とは二つのレジスタを組み合わせて32ビットのカウンタにする事だと思う。
 //[MD]タイマの動作モードを指定します。
 //
 //今回は全てPWMモード1で設定します。
 //
 //PWMモード1で出力端子に指定できる端子は最初から決められています。詳細はハードウェアマニュアルの
 //「11.4.5 PWMモード」の「表11.31 格PWM出力のレジスタと出力端子」を参照して下さい。
 //
 //PWMモード2は他のジェネラルレジスタと同期させることでPWMを最大12本出力することができます。

 //チャンネル0
  MTU0.TMDR.BIT.BFB = 0;
  MTU0.TMDR.BIT.BFA = 0;
  MTU0.TMDR.BIT.MD = 2;
 //チャンネル1
  //MTU1.TMDR.BIT.BFB//TGRDを持たないチャンネル1、2ではこのビットはリザーブビットになります。
  //MTU1.TMDR.BIT.BFA//TGRCを持たないチャンネル1、2ではこのビットはリザーブビットになります。
  MTU1.TMDR.BIT.MD = 2;
 //チャンネル2
  //MTU2.TMDR.BIT.BFB//TGRDを持たないチャンネル1、2ではこのビットはリザーブビットになります。
  //MTU2.TMDR.BIT.BFA//TGRCを持たないチャンネル1、2ではこのビットはリザーブビットになります。
  MTU2.TMDR.BIT.MD = 2;
 //チャンネル3:
  MTU3.TMDR.BIT.BFB = 0;
  MTU3.TMDR.BIT.BFA = 0;
  MTU3.TMDR.BIT.MD = 2;
 //チャンネル4
  MTU4.TMDR.BIT.BFB = 0;
  MTU4.TMDR.BIT.BFA = 0;
  MTU4.TMDR.BIT.MD = 2;
}

void pwm_start(void){//PWMを出力する
 //タイマスタートレジスタ(TSTR)
 //[CST]0:カウント動作は停止
 //    1:カウント動作
 MTU.TSTR.BIT.CST4 = 1;
 MTU.TSTR.BIT.CST3 = 1;
 MTU.TSTR.BIT.CST2 = 1;
 MTU.TSTR.BIT.CST1 = 1;
 MTU.TSTR.BIT.CST0 = 1;
}
void pwm_stop_1(void){
 //発信を止めるには、「ハードウェアマニュアル 11.3.8 タイマスタートレジスタ(TSTR)」を参照すると、
 //1:CSTに0をライトする。
 //2:TIORに初期出力が0になるようにライトする。
 //やってみてないから良く分からないが、1:だけだと多分TCNTのカウントを一時的に停止するだけなので
 //出力レベルは保持されるのではないだろうか?
 //タイマスタートレジスタ(TSTR)
 //[CST]0:カウント動作は停止
 //    1:カウント動作
 MTU.TSTR.BIT.CST4 = 0;
 MTU.TSTR.BIT.CST3 = 0;
 MTU.TSTR.BIT.CST2 = 0;
 MTU.TSTR.BIT.CST1 = 0;
 MTU.TSTR.BIT.CST0 = 0;
}
void pwm_stop_2(void){
 //タイマI/Oコントロールレジスタ(TIOR)
 //TIORのIOB3~IOB0はTGRBの機能を設定します。
 //    周期:TGRA --> 初期出力0,コンペアマッチ出力0 [0001] --> 0x1
 //デューティ比:TGRB --> 初期出力0,コンペアマッチ出力1 [0010] --> 0x2
 //
 //    周期:TGRC --> 初期出力0,コンペアマッチ出力0 [0001] --> 0x1
 //デューティ比:TGRD --> 初期出力0,コンペアマッチ出力1 [0010] --> 0x2
 //7~4ビット
  //チャンネル0
   MTU0.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC0B
   MTU0.TIOR.BIT.IOD = 2;//TGRD:アウトプットコンペアレジスタ//出力端子:TIOC0D
  //チャンネル1
   MTU1.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC1B
  //チャンネル2
   MTU2.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC2B
  //チャンネル3
   MTU3.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC3B
   MTU3.TIOR.BIT.IOD = 2;//TGRD:アウトプットコンペアレジスタ//出力端子:TIOC3D
  //チャンネル4
   MTU4.TIOR.BIT.IOB = 2;//TGRB:アウトプットコンペアレジスタ//出力端子:TIOC4B
   MTU4.TIOR.BIT.IOD = 2;//TGRD:アウトプットコンペアレジスタ//出力端子:TIOC4D
 //3~0ビット
  //チャンネル0
   MTU0.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC0A
   MTU0.TIOR.BIT.IOC = 1;//TGRC:アウトプットコンペアレジスタ//出力端子:TIOC0C
  //チャンネル1
   MTU1.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC1A
  //チャンネル2
   MTU2.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC2A
  //チャンネル3:
   MTU3.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC3A
   MTU3.TIOR.BIT.IOC = 1;//TGRC:アウトプットコンペアレジスタ//出力端子:TIOC3C
  //チャンネル4
   MTU4.TIOR.BIT.IOA = 1;//TGRA:アウトプットコンペアレジスタ//出力端子:TIOC4A
   MTU4.TIOR.BIT.IOC = 1;//TGRC:アウトプットコンペアレジスタ//出力端子:TIOC4C

}
//=============================




pwm.h
//========================
extern void init_pwm(void);
extern void pwm_start(void);
extern void pwm_stop_1(void);
extern void pwm_stop_2(void);
//=========================



このブログのSH7144F関連記事トップ
http://the-united-front.blogspot.jp/2013/09/interface-20066sh7144f-blog-1-2012810.html





0 件のコメント:

コメントを投稿