FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

180mm進もう5

明けまして、おめでとうございます!
本年も健康に気を付けて頑張って参りましょう(*´ω`)

前回はPWMの用語の説明をしました。
今回はPWMの設定についてみていきます。

12281_20131229031619fcc.png

PWMの設定は上の図の流れで行うことで発動します。
上の図を少し補足(付けたし?)すると

0、MTU2を使う準備をする
1、カウンターの速さを決める
2、カウンタクリアのタイミングを決める
3、TGRA,TGRB,TGRC,…,とコンペアマッチしたとき何をするか決める
4、周期とDutyを決める
5、複数あるPWMモードのうち、どのPWMモードを使うか決める
6、カウントスタートする

となります。
では、0~6まで順に見ていきましょう。
ここでは例としてSH7125のPWMモード1をTIOC0A端子(PE0と同じ端子)からPWM出力をしてみます。

ちなみに、どうしてTIOC0AとPE0とか同じ端子なのに呼び方が変わるの?
という疑問が湧くと思いますが、機能ごとに違う呼び方があるためです。
例えば端子1つに対してPE0としか呼べない場合、PE0、PE2、PE4はPWM出力できるけどその他のPEはPWM使えないと言ったように、データシートがややこしくなるのが容易に想像できます。最初は混乱すると思いますが1つの端子に2つ以上の呼び方があったら呼び名の数だけ機能があるんだなーくらいに思ってください。秋月のSH7125のマイコンボードの説明書だと端子1つにあたかも1つしか呼び方がないようで混乱を招きますが、マイコンの端子一本に機能が1つとは限りませんので要注意。

-------------------------------
では気を取り直して、
0、MTU2を使う準備をする
1~6の手順でPWMモードを使う準備はできますが、実際に使うときは、あらかじめ端子の状態が変わるようにしていないといけません。そのために、まずは(PE0・TIOC0A)端子をTIOC0Aとして使うよという宣言が必要です。デフォルトは「PE0として使用」になってますのでPEとして使うときは下の2文を宣言しなくても大丈夫です。

PFC.PECRL1.BIT.PE0MD = 1;
PFC.PEIORL.BIT.B0 = 1;

この2文が(PE0・TIOC0A)端子をTIOC0Aとして使うよという宣言になります。
次にこの2文

STB.CR4.BIT._MTU2 = 0; //MTUスタンバイ解除
MTU2.TSTR.BYTE = 0; //カウンタ動作停止

上の文はMTUを使うよという宣言です。これがないとMTUに従属しているPWMモードは発動ができません。
補足としてそれらの関係図
01041.png
ちなみにMTU2の2は何かというとマイコンが進化した証です。
SHより新しいシリーズのRXでは、MTU3になってます(^p^)
コメントでカウンタ動作停止と書いてある文について、PWMの周期やDutyよりさらに根本の設定はカウンタを止めて行う必要があるのでこの文が必要です

これで0は終わりです。
0は誰かに教えてもらわないとマイコンはじめたての人は大難関ですね~

1、カウンターの速さを決める
カウンターの速さを決めましょう。今回の例ではMTU2のチャンネル0を使うので
MTU20.TCR.BIT.TPSC = 2; // プリスケーラ MPφ (MPφ=25MHz):0.04us(次週詳しく)
となります。
ここでちょっとレジスタ関係の説明。
レジスタとは設定が保存される場所です。
当然ですがC言語で書いた英数字がそのままマイコンに送られているわけではなく、コンパイラで機械語にされて送られます。例えば上のような文を書いたときには結果的にMTU20.TCR.BIT.TPSCに割り当てられているメモリが0か1になるわけです。そしてマイコン上ではそのメモリが0か1かを読み取って処理を行っているということです。(これ書いててマイコンさん改めて偉大だと思った)

で、結果的にはそうなのですが、ユーザーが分かりやすいように、C言語での設定がしやすいように機能ごとにまとめられていたり、'.'を使った法則があるという感じです。

MTU20.TCR.BIT.TPSC = 2;この文だけ見ると気持ち悪いですが、
MTU2の0チャンネルだからMTU20で、タイマコントロールレジスタの設定だからTCRでその中のTCNTの速度を決めるのはTPSCだからTCR.BIT.TPSCね、と、慣れてくるとこの法則があることがとても親切でありがたいものだと気づくはずです!w
それで、=2;ってところで速さを選んでいます。今回はTCNTは0.04[us]毎に自動的に1カウント上がります。

2、カウンタクリアのタイミングを決める
とりあえずこの図にあるようにTGRAでカウンタクリア、TGRBで出力って感じにしてみましょう。
01042.png

MTU20.TCR.BIT.CCLR = 1; // TGRAコンペアマッチでTCNTクリア
データシートの表からTGRAとコンペアマッチするとTCNTがクリアとなる設定(=1)を選びました。
この設定はつまりPWMの周期になるということが分かってくれると嬉しいかも ^^) _旦~~

3、TGRA,TGRB,TGRC,…,とコンペアマッチしたとき何をするか決める
さっきの図の動作になるようにTGRBとコンペアマッチしたときは出力するようにしましょう。
ということで
01043.png
から
01044.png
と順にみていくと、
IOBを2にしたときにTGRBのコンペアマッチで1出力(端子を5Vにする)になることが分かります。
従って、
MTU20.TIORH.BIT.IOA = 1; // 初期状態:0 コンペアマッチ:0
MTU20.TIORH.BIT.IOB = 2; // 初期状態:0 コンペアマッチ:1
となります。

4、周期とDutyを決める
これは180mm進もうの2で話したように1[ms]毎に周期とDutyを変えることになるので、とりあえずは適当な値
に設定しました。
MTU20.TGRA = 6200; //周期(今は適当)
MTU20.TGRB = 99; //Duty(今は適当)

5、複数あるPWMモードのうち、どのPWMモードを使うか決める
今回はPWMモード1なのでPWMモード1に設定したい!->宿題

6、カウントスタートする
MTU2.TSTR.BYTE = 1; //カウンタ動作開始

-------------------------------

以上0~6の手順を踏むとPWMが使えます~
ようやく具体的なところには入れてよかった。
今週の問題は5,のPWMモード1に設定することです
次週はPWM用の割り込みの話と、カウンターの速度の話をするよ~

それと、どうやるかも分からないキット案はただいま配線中まで来ました。
就活しろと言われたら何も反論できない…
01045.png

ではではまた次週~(*^-^*)

コメントの投稿

非公開コメント

時計
カテゴリ
最新記事
12月14日開始
RSSリンクの表示
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。