RX62N 周辺機能紹介 MTU2 マルチファンクションタイマパルスユニット 2 ルネサスエレクトロニクス株式会社ルネサス半導体トレーニングセンター 2013/08/02 Rev. 1.00 00000-A
コンテンツ MTU2 の概要 プログラムサンプル (1) インプットキャプチャ機能 プログラムサンプル (2) PWM モード プログラムサンプル (3) 相補 PWM モード プログラムサンプルのカスタマイズ 2
MTU2 の概要 3
MTU2 の構成 MTU2 ユニット 0 チャネル チャネル 0 チャネル 1 チャネル 2 チャネル 3 16 ビットタイマ 同一機能 ユニット 1 チャネル4 チャネル5 チャネル6 チャネル7 チャネル8 チャネル9 チャネル10 チャネル11 4
MTU2 の仕様 5
MTU2 の動作概要カウント動作 TCNT 時間 6
MTU2 の動作概要インプットキャプチャ TCNT 入力信号が変化したときのカウンタ値 入力 時間 MTIOC0A 端子 入力信号の変化 7
MTU2 の動作概要コンペアマッチ TCNT 一致 ( コンペアマッチ ) 設定 TGRA 時間 出力 MTIOC0A 端子 出力信号の変化 8
プログラムサンプル (1) インプットキャプチャ機能 9
インプットキャプチャ動作 パルス幅 =(160h - 5h) クロック時間 周期 =(180h) クロック時間 10
プログラムサンプル (1) インプットキャプチャ機能仕様 インプットキャプチャ機能のプログラム例 MTIC5U 端子の入力信号の立ち下がりエッジでキャプチャし 配列 capture_data_array に格納する 仕様 動作モード インプットキャプチャモード 立ち下がりエッジ クロックソース PCLK[48MHz]/64 TCNTクリア 無し カウントスタートソフトウェアスタート 割り込み インプットキャプチャ割り込み 入力端子 MTIC5U 端子 11
プログラム フローチャート リセット スタート main TCIU5 割り込み関数 (Excep_MTU5_TCIU5) スタートアップルーチン init_mtu5 初期設定 立ち下がりエッジ発生時のカウント値を配列に書き込む setpsw_i( 組み込み関数 ) 割り込み許可 RTE 12
インプットキャプチャ機能の初期化フロー 初期化開始 モジュールストップ解除 端子の設定 カウンタクロックの選択 エッジの設定 カウントスタート 割り込み許可 割り込みコントローラの割り込み許可 割り込み優先レベルの設定 割り込み要求の許可 初期化終了 13
モジュールストップコントロールレジスタ A(MSTPCRA) ユニット 0 使用可 14
入力バッファコントロールレジスタ (ICR) 15
タイマコントロールレジスタ (TCR) 16
タイマ I/O コントロールレジスタ (TIOR) ( 省略 ) 17
タイマスタートレジスタ (TSTR) 18
タイマインタラプトイネーブルレジスタ (TIER) 19
割り込みコントローラの設定 割り込みコントローラ IER( 許可 ) IPR( 優先レベル ) CPU へ 20
割り込み要求許可レジスタ m(ierm)(m = 02h ~ 1Fh) IER11 21
割り込み要因プライオリティレジスタ m(iprm)(m= 00h~8Fh) TCNTU カウンタをインプットキャプチャしたときの割り込み :IPR5B 22
インプットキャプチャ機能の初期化関数 初期化開始 void init_mtu5(void) { // Wakeup MTU ch5 MSTP(MTU5) = 0; // ICU for MTIC5U is enable PORTD.ICR.BIT.B7 = 1; // PCLK/64 MTU5.TCRU.BIT.TPSC = 0x03; // Input capture start by falling edge MTU5.TIORU.BIT.IOC = 0x12; // MTU5.TCNTU performs count operation MTU5.TSTR.BIT.CSTU5 = 0x1; // TGIEU of MTU5 interrupt is enabled MTU5.TIER.BIT.TGIE5U = 1; // TGIEU of MTU5 interrupt is enabled IEN(MTU5,TGIU5) = 1; // TGIEU of MTU5 interrupt priority level is 1 IPR(MTU5,TGIU5) = 1; } モジュールストップ解除 端子の設定 カウンタクロックの選択 エッジの設定 カウントスタート 割り込み許可 割り込みコントローラの割り込み許可 割り込み優先レベルの設定 初期化終了 23
メイン関数 void main(void) { // MTU5 initialization init_mtu5(); setpsw_i(); while(1); } main init_mtu5 初期設定 setpsw_i( 組み込み関数 ) 割り込み許可 24
割り込み関数の作成とベクタテーブルの登録 // MTU5 TCIU5 #pragma interrupt (Excep_MTU5_TCIU5(vect=139)) void Excep_MTU5_TCIU5(void) { static uint8_t buff_index; // Timer count read capture_data_array[buff_index++] = MTU5.TGRU; } TCIU5 割り込み関数 (Excep_MTU5_TCIU5) 立ち下がりエッジ発生時のカウント値を配列に書き込む RTE 25
プログラムサンプル (2) PWM モード 26
PWM とは PWM(Pulse Width Modulation: パルス幅変調 ) はパルス波のデューティ比 を変化させて変調する変調方法 デューティ比を変化させることで 電圧や電流を制御できる デューティ比 波形例 平均電圧 パルス幅 小 低い 大 高い 周期 (T) デューティ比 = パルス幅 (High レベル区間 ) / 周期 27
PWM モードの動作 コンペアマッチ機能を使用 周期の設定 デューティ比の設定 28
プログラムサンプル (2) PWM モード仕様 インプットキャプチャ機能のプログラム例チャネル 0 の MTIOC0C 端子から周期 100μs デューティ比 30% のパルスを連続的に 出力する 仕様 動作モード PWMモード クロックソース PCLK[48MHz] TCNTクリア TGRCのコンペアマッチ カウントスタートソフトウェアスタート 割り込み なし 出力端子 MTIOC0C 端子 ( 初期 Low ) 29
プログラム フローチャート リセット スタート main スタートアップルーチン init_mtu0 MTU0 の初期化 初期化 カウント開始 start_mtu0 MTU0 カウントスタート wait( 組み込み関数 ) 割り込み要求待ち 低消費電力モードへ遷移 30
PWM モードの初期化フロー インプットキャプチャのサンプルと同じ 初期化開始 モジュールストップ解除 カウンタクロックの選択 カウンタクリア要因の選択 PWM モードの設定 波形出力レベルの選択 カウント値の設定 初期化終了 31
カウンタクロックの選択とカウント値の設定 ジェネラルレジスタCに設定する カウント値 =48[MHz] 100[ µ s] 1 = 4800 1 < 16ビット カウンタクロック = 周辺クロック 1 分周 ジェネラルレジスタDに設定するカウント値 =4800 0.3 1= 1440-1 < 16ビット TGRC TGRC のコンペアマッチでカウンタクリア TGRD MTIOC0C 32
タイマコントロールレジスタ (TCR) リセット後は設定不要 33
タイマモードレジスタ (TMDR) モード選択ビット 34
タイマコントロールレジスタ (TCR) 35
タイマ I/O コントロールレジスタ (TIOR) 周期の設定 デューティ比の設定 36
タイマジェネラルレジスタ (TGR) アウトプットコンペアレジスタとして機能 ( カウント値 - 1) を設定 ジェネラルレジスタ C のカウント値 =4800 ジェネラルレジスタ C のカウント値 =1440 37
PWM モードの初期化関数 void init_mtu0(void) { // Wakeup MTU0 MSTP(MTU0) = 0; // Counts on PCLK/1 リセット後は設定不要 MTU0.TCR.BIT.TPSC = 0; // TCNT0 is cleared by TGRC compare match MTU0.TCR.BIT.CCLR = 5; // PWM mode MTU0.TMDR.BIT.MD = 2; // (initial:low) -> (CompareMatch:High) MTU0.TIORL.BIT.IOC = 2; // (initial:low) -> (CompareMatch:Low) MTU0.TIORL.BIT.IOD = 1; // count is 48MHz*100μs-1 MTU0.TGRC = 48*100-1; // PWM duty is 30% MTU0.TGRD = 48*100*0.3-1; } 初期化開始モジュールストップ解除カウンタクロックの選択カウンタクリア要因の選択 PWMモードの設定波形出力レベルの選択カウント値の設定初期化終了 38
タイマスタートレジスタ (TSTR) 39
PWM モードのカウント開始関数 main void start_mtu0(void) { // Count start MTUA.TSTR.BIT.CST0 = 1; } init_port LED の初期化 init_cmt0 CMT0 初期化 start_cmt0 CMT0 カウントスタート setpsw_i( 組み込み関数 ) 割り込み許可 wait( 組み込み関数 ) 割り込み要求待ち 低消費電力モードへ遷移 40
PWM モードのメイン関数 void main(void) { // MTU0 initialization init_mtu0(); // MTU0 count start start_mtu0(); while(1){ // CPU sleep wait(); } } main init_port LED の初期化 init_cmt0 CMT0 初期化 start_cmt0 CMT0 カウントスタート setpsw_i( 組み込み関数 ) 割り込み許可 wait( 組み込み関数 ) 割り込み要求待ち 低消費電力モードへ遷移 41
プログラムサンプル (3) 相補 PWM モード 42
相補 PWM モードとは 正相と逆相がノンオーバラップの関係にある PWM 波形 オーバラップ ノンオーバラップ 正相 逆相 同時に ON ノンオーバラップ時間 ( デッドタイム ) PWM 出力信号のアクティブレベルをアクティブローとしたときの例 43
相補 PWM モードのカウント動作 ユニット 0 はチャネル 3 と 4 を組み合わせて使用 逆相用の周期設定 正相用の周期設定 カウント値 デッドタイムの設定 逆相用のカウンタ 正相用のカウンタ 時間 44
相補 PWM モードの出力 ユニット 0 はチャネル 3 と 4 を組み合わせて使用 カウント値 逆相用のカウンタ 正相用のカウンタ デューティ比の設定 3 3 相の相補 PWM 出力が可能 電圧 時間 正相の出力 アクティブローの例 デッドタイム 逆相の出力 45
プログラムサンプル (3) 相補 PWM モード仕様 相補 PWM モードのプログラム例キャリア周期が 400μs で デューティ比が 10% から 90% の間を 10% 刻みで変化する 相補 PWM 信号を出力します 仕様 動作モード 相補 PWMモード クロックソース PCLK[48MHz] カウントスタートソフトウェアスタート 割り込み 山の割り込み キャリア周期 400μsec デッドタイム 4μsec 出力端子 MTIOC4B-B MTIOC4D-B 端子 出力アクティブ アクティブロー 46
プログラム フローチャート リセットスタート main TGIA3 割り込み関数 (Excep_MTU3_TGIA3) スタートアップルーチン init_mtu_pwm 相補 PWM モード 3 に設定 デューティ比の変更 初期化 カウント開始 init_mtu_excep MTU の例外処理の設定 start_mtu MTU のカウンタを起動 setpsw_i( 組み込み関数 ) 割り込み許可 RTE PWM 出力 47
相補 PWM モードの初期化のフロー 初期化開始 A インプットキャプチャのサンプルと同じ モジュールストップ解除 端子の設定 相補 PWM モード設定 バッファ動作の設定 カウンタクロックの選択 波形出力の許可 カウンタの初期値の設定 キャリア周期の設定 初期化終了 デューティ比の設定 デッドタイムの設定 A 48
相補 PWM モードの出力端子 正相 逆相 正相 逆相 正相 逆相 49
ポートファンクションレジスタ C(PFCMTU) PWM 出力端子 1( 正 逆 ) PWM 出力端子 2( 正 逆 ) PWM 出力端子 3( 正 逆 ) 50
カウンタクロックの選択とカウント値の設定 カウント値 正相 チャネル4 のカウンタの初期値 = 0 < 16ビット 正相のキャリア周期 ( 半周期分のカウント値 ) 400[ µ s] 周期データレジスタ バッファレジスタの設定値 = 48[MHz] = 9600 < 16ビット 2 逆相 チャネル3 のカウンタの初期値 = 48[MHz] 4[ µ s] = 192 < 16ビット 逆のキャリア周期 ( 半周期分のカウント値 ) チャネル3 のジェネラルレジスタA,Cの設定値 = 9600 + 192 = 9792 < 16ビット 共通 デューティ比 チャネル4 のジェネラルレジスタB,Dの設定値 = 9600 10[%] = 960 < 16ビット デッドタイム デッドタイムデータレジスタの設定値 =192 < 16ビット 時間 51
タイマコントロールレジスタ (TCR) 逆相 正相 同じ値を設定する リセット後は設定不要 52
タイマカウンタ (TCNT) 正相 逆相 チャネル 4 のカウンタの初期値 =0 チャネル 3 のカウンタの初期値 =192 53
相補 PWM モードのバッファ動作 コンペアレジスタバッファレジスタテンポラリレジスタ S/Wで設定 自動的に転送 54
タイマ周期データレジスタ (TCDR) とタイマ周期バッファレジスタ (TCBR) 正相のキャリア周期 正相のキャリア周期設定用のカウント値 =9600 55
タイマジェネラルレジスタ (TGR) 逆相のキャリア周期 PWM 出力端子 1 のデューティ比 PWM 出力端子 2 のデューティ比 PWM 出力端子 3 のデューティ比 逆相のキャリア周期設定用のカウント値 =9600+192 デューティ比設定用のカウント値 = 960 56
タイマデッドタイムデータレジスタ (TDDR) デッドタイムのカウント値 =192 57
相補 PWM モードの初期化関数 ~ デッドタイムの設定まで ~ void init_mtu_pwm(void) { // Wakeup MTU3 MSTP(MTU3) = 0; // select group B IOPORT.PFCMTU.BIT.MTUS5 = 1; // Counts on PCLK/1 リセット後は MTU3.TCR.BIT.TPSC = 0x0; 設定不要 MTU4.TCR.BIT.TPSC = 0x0; // Initialization of the 16bit counter MTU3.TCNT = 48*4; // 48MHz*4μs MTU4.TCNT = 0; // half the PWM carrier cycle MTUA.TCDR = 48*400/2; MTUA.TCBR = 48*400/2; // half the PWM carrier cycle + Dead time MTU3.TGRA = 48*400/2+48*4; MTU3.TGRC = 48*400/2+48*4; // duty is 10% MTU4.TGRB = (48*400/2)*0.1; MTU4.TGRD = (48*400/2)*0.1; // Dead time set MTUA.TDDR = 48*4; // Set PWM mode 3 MTU3.TMDR.BIT.MD = 0xf; // Buffer is enabled MTU3.TMDR.BIT.BFA = 1; MTU3.TMDR.BIT.BFB = 1; // MTIOC4B and MTIOC4D output is enabled MTUA.TOER.BIT.OE4B = 1; MTUA.TOER.BIT.OE4D = 1; } 初期化開始 モジュールストップ解除 端子の設定 カウンタクロックの選択 カウンタの初期値の設定 キャリア周期の設定 デューティ比の設定 デッドタイムの設定 A 相補 PWM モード設定 バッファ動作の設定 波形出力の許可 初期化終了 A 58
相補 PWM モードの転送タイミング MTU3.TCNT MTU4.TCNT MTU3.TGRA TCDR TDDR 時間 59
タイマモードレジスタ (TMDR) ユニット 0 はチャネル 3 で設定 60
タイマモードレジスタ (TMDR) ユニット 0 はチャネル 3 で設定 61
タイマアウトプットマスタイネーブルレジスタ (TOER) PWM 出力端子 1( 正相 ) PWM 出力端子 2( 正相 ) PWM 出力端子 3( 正相 ) PWM 出力端子 1( 逆相 ) PWM 出力端子 2( 逆相 ) PWM 出力端子 3( 逆相 ) 62
相補 PWM モードの初期化関数 ~ 相補 PWM モードの設定から ~ void init_mtu_pwm(void) { // Wakeup MTU3 MSTP(MTU3) = 0; // select group B IOPORT.PFCMTU.BIT.MTUS5 = 1; // Counts on PCLK/1 MTU3.TCR.BIT.TPSC = 0x0; MTU4.TCR.BIT.TPSC = 0x0; // Initialization of the 16bit counter MTU3.TCNT = 48*4; // 48MHz*4μs MTU4.TCNT = 0; // half the PWM carrier cycle MTUA.TCDR = 48*400/2; MTUA.TCBR = 48*400/2; // half the PWM carrier cycle + Dead time MTU3.TGRA = 48*400/2+48*4; MTU3.TGRC = 48*400/2+48*4; // duty is 10% MTU4.TGRB = (48*400/2)*0.1; MTU4.TGRD = (48*400/2)*0.1; // Dead time set MTUA.TDDR = 48*4; // Set PWM mode 3 MTU3.TMDR.BIT.MD = 0xf; // Buffer is enabled MTU3.TMDR.BIT.BFA = 1; MTU3.TMDR.BIT.BFB = 1; // MTIOC4B and MTIOC4D output is enabled MTUA.TOER.BIT.OE4B = 1; MTUA.TOER.BIT.OE4D = 1; } 初期化開始 モジュールストップ解除 端子の設定 カウンタクロックの選択 カウンタの初期値の設定 キャリア周期の設定 デューティ比の設定 デッドタイムの設定 A 相補 PWM モード設定 バッファ動作の設定 波形出力の許可 初期化終了 A 63
割り込みのタイミング MTU3.TCNT MTU4.TCNT 山の割り込み : チャネル 3 の TCNT と TGRA がコンペアマッチで発生 MTU3.TGRA TCDR TDDR 時間 谷の割り込み : チャネル 4 の TCNT が 0 で発生 64
割り込み許可のフロー 割り込みの初期化開始 割り込み許可 割り込みコントローラの割り込み許可 割り込み優先レベルの設定 必要ならば山の割り込みと谷の割り込みそれぞれに対して行う 割り込みの初期化終了 65
タイマインタラプトイネーブルレジスタ (TIER) 66
割り込みコントローラの設定 割り込みコントローラ IER( 許可 ) IPR( 優先レベル ) CPU へ 67
割り込み要求許可レジスタ m(ierm)(m = 02h ~ 1Fh) IER10 IER11 68
割り込み要因プライオリティレジスタ m(iprm)(m= 00h~8Fh) 山の割り込み :IPR57 谷の割り込み :IPR5A 69
相補 PWM モードの割り込みの要求許可関数 void init_mtu_excep(void) { // TGIEA of MTU3 interrupt is enabled MTU3.TIER.BIT.TGIEA = 1; } // TGIEA of MTU3 interrupt is enabled IEN(MTU3,TGIA3) = 1; // TGIEA of MTU3 interrupt priority level is 1 IPR(MTU3,TGIA3) = 1; 割り込みの初期化開始割り込み許可割り込みコントローラの割り込み許可割り込み優先レベルの設定 割り込みの初期化終了 70
割り込み関数の作成とベクタテーブルの登録 // MTU3 TGIA3 #pragma interrupt (Excep_MTU3_TGIA3(vect=129)) void Excep_MTU3_TGIA3(void) { static int duty = 1; if( ++duty > 9) // Exceeds 90% { duty = 1; // set to 10% duty ratio } MTU4.TGRD = (48*400/2)*duty*0.1; } TGIA3 割り込み関数 (Excep_MTU3_TGIA3) デューティ比の変更 RTE 71
タイマスタートレジスタ (TSTR) 0xC0 72
相補 PWM モードのカウント開始関数 main void start_mtu(void) { // Count Start MTUA.TSTR.BYTE = 0xC0; } init_mtu_pwm 相補 PWM モード 3 に設定 init_mtu_excep MTU の例外処理の設定 start_mtu MTU のカウンタを起動 setpsw_i( 組み込み関数 ) 割り込み許可 PWM 出力 73
プログラムサンプルのカスタマイズ 74
相補 PWM モードのキャリア周期変更 デューティ比の変更キャリア周期の変更 (2 倍 ) // MTU3 TGIA3 #pragma interrupt (Excep_MTU3_TGIA3(vect=129)) void Excep_MTU3_TGIA3(void) { static int duty = 1; if( ++duty > 9) // Exceeds 90% { duty = 1; // set to 10% duty ratio } MTU4.TGRD = 48*200*duty*0.1; } // MTU3 TGIA3 #pragma interrupt (Excep_MTU3_TGIA3(vect=129)) void Excep_MTU3_TGIA3(void) { static int duty = 1; static int scale = 2; // half the PWM carrier cycle MTUA.TCBR = 48*200*scale; // half the PWM carrier cycle + Dead time MTU3.TGRC = 48*200*scale+48*4; } MTU4.TGRD = 48*200*scale*duty*0.1; 75
END ルネサスエレクトロニクス株式会社