信号処理 入門

3 タイマ(MTU)
岐阜大学大学院 工学研究科 応用情報学専攻
1
割り込み
 事象の発生を非同期に受け付ける方法
 割り込み要因となる事象が発生すると,CPUが現在の処理を中断して,決
められた割り込みハンドラを自動的に実行
 割り込みが発生した時点でPC(プログラム・カウンタ)を退避させ,PCの値を割
り込みハンドラのアドレスに設定
 割り込みハンドラに事象に対応した処理を記述
 割り込み要因




割り込み端子への外部からの信号
タイマで指定時間が経過した
A/D変換器の変換処理が終了した
etc…
2
MTU
 5チャンネルの16ビットタイマを内蔵
 最大16本のパルス入出力が可能
 各チャネルごとに8種類のカウンタ入力クロックを選択可能
 各チャネルとも次の動作を設定可能
 コンペアマッチによる波形出力
 インプットキャプチャ機能
 カウンタクリア動作
 複数のタイマカウンタ(TCNT)への同時書き込み
 コンペアマッチ/インプットキャプチャによる同時クリア
 カウンタの同期動作による各レジスタの同期入出力
 同期動作と組み合わせることによる最大12相のPWM出力
 チャネル0,3,4はバッファ動作を設定可能
 チャネル1,2はおのおの独立に位相計数モードを設定可能
 A/D変換器の変換スタートトリガを生成可能
3
MTUのレジスタ
 チャンネルごと







タイマコントロールレジスタ(TCR)
タイマモードレジスタ(TMDR)
タイマI/Oコントロールレジスタ(TIOR)
タイマインタラプトイネーブルレジスタ(TIER)
タイマステータスレジスタ(TSR)
タイマカウンタ(TCNT)
タイマジェネラルレジスタ(TGRA, TGRB, TGRC, TGRD)
 共通レジスタ
 タイマスタートレジスタ(TSTR)
 タイマシンクロレジスタ(TSYR)
 タイマ3/4共通レジスタ







タイマアウトプットマスタイネーブルレジスタ(TOER)
タイマアウトプットコントロールレジスタ(TOCR)
タイマゲートコントロールレジスタ(TGCR)
タイマ周期データレジスタ(TCDR)
タイマデッドタイムデータレジスタ(TDDR)
タイマサブカウンタ(TCNTS)
タイマ周期バッファレジスタ(TCBR)
4
MTUのブロック図
5
時間を計る=数を数える
TCNT
0xFFFF
0x0000
3ms
0.7s
時間
 24MHzでカウントする場合
 65,535(0XFFFF)カウントするのに約0.003秒かかる
 93.75kHz(24MHz/256)でカウントする場合
 65,535(0XFFFF)カウントするのに約0.7秒かかる
6
クロック
動作クロック
該当モジュール
動作クロック
該当モジュール
システムクロック(φ)
CPU
UBC
DTC
BSC
DMAC
WDT
AUD
ROM
RAM
周辺クロック(Pφ)
MTU
POE
SCI
I2C
A/D
CMT
H-UDI
 実習用基板
 システムクロック: 48MHz
 周辺クロック: 24MHz
7
カウントクロック
カウントクロック
チャンネル0
チャンネル1
チャンネル2
チャンネル3
チャンネル4
Pφ/1
Pφ/4
Pφ/16
Pφ/64
TCLKA
TCLKB
TCLKC
TCLKD
Pφ/1
Pφ/4
Pφ/16
Pφ/64
Pφ/256
TCLKA
TCLKB
Pφ/1
Pφ/4
Pφ/16
Pφ/64
Pφ/1024
TCLKA
TCLKB
TCLKC
Pφ/1
Pφ/4
Pφ/16
Pφ/64
Pφ/256
Pφ/1024
TCLKA
TCLKB
Pφ/1
Pφ/4
Pφ/16
Pφ/64
Pφ/256
Pφ/1024
TCLKA
TCLKB
TCLK*: 外部クロック
 Pφ =24MHzの場合
 Pφ/256でカウントする場合、 Pφ/256=93.75kHz
8
任意の数までカウントする
TCNT
TGRAと値が一致したらTCNTをクリア
0xFFFF
TGRA
0x0000
時間
 コンペアマッチ
 タイマジェネラルレジスタ(TGR)の値と比較
 TGRA, TGRB, TGRC, TGRB
9
コンペアマッチで割り込む
TCNT
TGRAと値が一致したらTCNTをクリア
と同時に割り込みを発生
0xFFFF
TGRA
0x0000
時間
 割り込みの発生
1.
コンペアマッチでタイマステータスレジスタ(TSR)にフラグが立つ
 TCNT = TGRAのときにフラグがセットされる
 具体的には、MTU4.TSR.BIT.TGFA = 1となる
2. TGFAのフラグが立っていれば割り込みを発生する
 この設定はタイマインタラプトイネーブルレジスタ(TIER)で行う
 MTU4.TIER.BIT.TGIEA = 1 ←TGFAビットによる割り込み要求を許可
10
タイマコントロールレジスタ(TCR)
 各チャンネルのTCNTを制御する8ビットのレジスタ
ビット
7
6
5
4
3
2
1
0
ビット名
CCLR
2
CCLR
1
CCLR
0
CKEG
1
CKEG
0
TPSC
2
TPSC
1
TPSC
0
説明
カウンタクリアの要因を
指定
クロックのエッ
ジを選択
TCNTのカウンタクロック
を選択
 カウンタクリア
 コンペアマッチでクリアするor禁止
 クロックのエッジ
 立ち上がり,立ち下がり,両エッジ
 カウンタクロック
 チャンネル0,1,2:クロックの1/64まで
 チャンネル3,4:クロックの1/1024まで
11
割り込みハンドラ
 割り込みが発生したときに呼び出されるルーチン(関数)
 割り込みが発生したときに行いたい処理を記述しておく
 intprg.cにあらかじめ定義してあるので改造する
ここを改造
// 120 MTU4 TGIA4
void INT_MTU4_TGIA4(void){/* sleep (); */}
TGFAビットによる割り込み要求(TGIA)があったときに呼び出されるハンドラ
12
TMDR,TIER,TIOR
 タイマモードレジスタ(TMDR)
 動作モードを設定
 通常動作,PWMモード,位相計数モード,相補PWMモード
 タイマインタラプトイネーブルレジスタ(TIER)




割り込み要求の許可,禁止
A/D 変換開始要求イネーブル
アンダフローインタラプトイネーブル
TGR インタラプトイネーブル
 タイマI/O コントロールレジスタ(TIOR)
 TGRの機能を設定
13
スタンバイモード設定
 節電の為,MTUやシリアル通信などの内蔵周辺機能は初期状態
で低消費電力状態となっている
 使用する場合には最初に有効化する事が必要
 MTUの場合
 MST.CR2.BIT._MTU = 0;
 A/D1の場合
 MST.CR2.BIT._AD1 = 0;
14
例題1-4-1:LED点滅プログラム
 基板に接続されているLEDを一定時間毎に点滅させるプログラム
 タイマによる割り込みを用いることで,「一定時間」を正確に作り出
す
 今回は0.5秒毎に点灯と消灯を繰り返す
 今回はインターバル・タイマとしてMTUを使用
 仕様
 MTUのチャネル4を使用
 LEDはポートE15に接続
15
プログラムの流れ(1/2)
 main関数
 LEDのポートの設定
 MTU4の設定と起動
 TGRAとのコンペアマッチで割り込み
 マッチ時にカウンタをクリアすることで,定期的に割り込み
 割り込み間隔は0.5秒
 割り込みハンドラ(int_mtu4_tgia4())
 コンペアマッチの状態フラグのクリア
 LEDの点滅(状態の反転)
16
プログラムの流れ(2/2)
init_mtu()
main()
初期化
ポートレジスタ設定
(17.1.9)
初期化
MTU4割り込み
タイムコントロール
レジスタ設定
(11.3.1)
init_mtu4_tgia4()
MTUの初期化
TGRAのコンペア
マッチで割り込み
LED反転
while(1)
MTUスタート
17
割り込み間隔の設定
 割り込み間隔(周波数)を設定する
 割り込み周波数はTGRAで設定
 TGRAの設定方法
 TGRA=(カウンタ周波数/割り込み周波数)-1
 -1は,マッチの次のカウント時にクリアされるため
 今回の場合:0.5秒(2Hz)で割り込み
 93.75kHz(Pφ/256)でカウント(MTU4.TCR.BIT.TPSC = 4;)
 カウント回数は93.75kHz/2Hz=46875
 よってTGRAに46874を設定( MTU4.TGRA = 46874; )
18
割り込みの使用方法
 割り込みハンドラの設定
 自動生成されるハンドリングプログ
ラムを,自分の関数を呼び出すよう
に変更
 intprg.c
 割り込みハンドラの記述
 実際に割り込みで行いたい処理を
記述
 レジスタの設定
 割り込みの初期マスクのクリア
 使用する割り込みの優先度を設定
 使用機能の割り込み許可フラグの
設定
…
// 120 MTU4 TGIA4
//追加
void int_mtu4_tgia4();
void INT_MTU4_TGIA4(void){
int_mtu4_tgia4();
}
//コメントアウト
//void INT_MTU4_TGIA4(void){/* sleep();*/}
…
 機能のスタート
19
タイマ・プログラム例(1/2)
 MTUの初期化関数




MTU回路の起動
立ち上がりエッジでカウント
TGRAのコンペアマッチでクリア
クロックサイクルの設定
void init_mtu()
{
MST.CR2.BIT._MTU = 0; //MTUを起動
//立ち上がりエッジ
MTU4.TCR.BIT.CKEG = 0;
//TGRAのコンペアマッチでクリア
MTU4.TCR.BIT.CCLR = 1;
//P_phi/256(93.75kHz)でカウント
MTU4.TCR.BIT.TPSC = 4;
//93.75khz / 2Hz(0.5sec) - 1 = 46874
MTU4.TGRA = 46874;
//カウンタを0に
MTU4.TCNT = 0;
 クロック周波数の1/256の速度でカ
ウント
 24MHz / 256 = 93.75kHz
 TGRAの値を設定
 0.5秒に1回割り込ませる
 93.75kHz / 2Hz = 46875
 クリアは一致したカウント値を更新
するタイミングで行われるため,
TGRA+1の周期になる
//通常動作(16ビットタイマー)
MTU4.TMDR.BIT.MD = 0;
//TGIA4マッチで割り込み
MTU4.TIER.BIT.TGIEA = 1;
//MTU4の割り込みの優先度を1に設定
INTC.IPRF.BIT._MTU4G = 1;
 モード設定
 割り込み許可,優先度を設定
 タイマスタート
MTU.TSTR.BIT.CST4 = 1; //MTU4をスタート
}
20
タイマ・プログラム例(2/2)
 割り込みハンドラ
 コンペアマッチ発生により立ったス
テータスフラグのクリア
 LEDの反転
void int_mtu4_tgia4()
{
//割り込みフラグをクリア
MTU4.TSR.BIT.TGFA = 0;
PE.DRL.BIT.B15 ^= 1; //LED反転
}
 メイン関数




LEDポートの設定
割り込みマスクのクリア
MTUの初期化関数の呼び出し
無限ループ
void main(void)
{
//初期化
PFC.PEIORL.BIT.B15 = 1; //PE15を出力に設定
set_imask(0); //割り込みマスクをクリア
init_mtu(); //MTUの初期化
while (1);
}
21
演習1:LED点滅時間の変更
 LEDの点滅時間を0.5秒以外にする
 1秒,2秒など
 変更方法
 TGRAの値を変更して,コンペアマッチのタイミングを変更
 CKEG,TPSCの値を変更して,カウント速度を変更
 割り込み回数を保存しておき,複数回に一度だけLEDの状態を変更
 注意点
 TGRA及びTCNTは 16bitレジスタなので,65535より大きい値をとることは出
来ない
 TGRAを倍にして1秒は無理
22
演習2:LED表示方法の変更
 LED(PE15)1個による点滅ではなく,4個のLEDを順に点灯
 ポートEの11,12,13,14の4個
 PE11→PE12→PE13→PE14→PE11→…
 注意点
 各LEDの入出力設定を忘れない
23