FC2ブログ

スポンサーサイト

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

180mm進もう6

追記:重大な間違いがありました。赤は追記です。

今晩は!
寒い寒い寒い(ノД`)
早いものでこのシリーズも6回目になりました。「この説明要るな~、あ、そしたらこの説明もいるな~」ってやってたら180進もうの終わりが全く見えなくなりましたw

とりあえず前に進んで行こう(*´ω`)
まずは先週の課題から
SH7125でPWMを使うときの手順5でPWMモードを選ぶときに、PWMモード1に設定してみましょう。
PWMモードの選択は
MTU→TMDR(タイマモードレジスタ)→MD[3:0]
で設定します。自分で発見できたかな?
MD[3:0]ってのはMDには{0,1,2,3}の4bit分が割り当てられてるよってことで、10進法だと0~15までの16通りがあります。その中で設定禁止の項目があるので(下図参照)実質12通りから選択します。
01111.png

図からPWMモード1はMD1だけが1なので、
0*2^3+0*2^2+1*2^1+0*2^0=2
(こう書くと逆にわかりづらいか…)
なのでチャンネル0を使うとすれば、

MTU20.TMDR.BIT.MD=2;

が正解となります。
今回の問題に限らずルネサス製のマイコンで設定の文言は"○○○.○○○.BIT.○○○=○;"って形が大半です。
問題の解答は以上です。
----------------


今週は、PWMの割り込みの話とカウンター(TCNT)の速度の話です。
進もうの3で単位時間dtを0.001[s]に設定して、理想速度になるようにPWMの周期を設定すると理想速度の積分から進んだ距離が分かるよって感じの話をしました。
では実際に単位時間をそれにするのはどうするのってのが今回の話です。

まず正確に0.001秒を作らないといけません。これにはご存知の割り込みを使います。で、SH7125にはCMT割り込みとかMTU割り込みとかがあるのですが、気を付けないといけないのは例えば割り込み関数の中に処理がずらずらあるとしてその関数の最後にPWMの周期やDutyを変えるような処理を書いてしまうと、正確に0.001秒で速度を変えるという前提が怪しくなってしまいます。なのでお勧めは、PWMの周期とDutyだけを変える割り込み関数を新しく作ることです。

ということで割り込み関数を作っていきます。
今回は例としてMTU2のチャンネル1で割り込み関数を作るとしましょう。
新しく割り込み関数を作るときに大事になるのは、割り込み発生タイミングの設定と割り込み関数の設定です。

割り込みタイミングの設定はPWMの時に述べたカウンター(TCNT)とTGRBのコンペアマッチを使って設定します。他にもTCNTのフローやTGRAのコンペアマッチなど、MTUのチャンネルごとに割り込みの条件として使える要因がいくつかあるので、色々な設定ができます。例ではカウンターがアップしていって、TGRBとコンペアマッチしたら割り込み発生って感じのイメージで作ります。

ここでカウンター(TCNT)の進む速度の話。
カウンターはカウントスタートの処理と同時に自動的に数が上がる(もしくは下がる)のですが
進む速度が分からなければタイミング設定ができません。正確な時間は水晶発振子からマイコンに送られてくるクロックを使います。しかしそのクロックはとても早いので、例えば10秒ごとに割り込みをさせたいと思ったときにマイコンに来ているクロックを使おうとすると、250000000カウント必要->TGRAの上限である65535をオーバーしてしまうなどの事態が発生します。そこで出てくるのがプリスケーラーです。これは、マイコンに4クロック来たらTCNTは1カウントとするなど、マイコンのクロック何回分でTCNTを1カウントとしますか?という設定です。

では実際に割り込み発生タイミングの設定と割り込み関数の設定をしていきましょう。

STB.CR4.BIT._MTU2 = 0; //MTUスタンバイ解除
MTU2.TSTR.BYTE = 0; //カウンタ動作停止
まずは前回説明理由から上の2文を宣言
本当はレジスタから説明したいのですが、時間がかかって進まなくなってしまうので、天下り的にこの宣言が必要この宣言が必要、と、必要な文を教えていく感じにします。(といいつつ前回もそうだったかも^^;)

まずTGRBコンペアマッチによる割り込みを許可
MTU21.TIER.BIT.TGIEB = 1; //TGRBコンペアマッチによる割り込みを許可
予想できるかもしれませんが最後のTGIEBをTGIEAに変えるとTGRAとのコンペアマッチで割り込み可能になります。ちなみに前回は先頭が全部MTU20でしたが、今回はチャンネル1を使うので先頭はMTU21です。

次に割り込みの優先度を設定。
INTC.IPRD.BIT._MTU21G = 0xf; //割り込み優先度を高めに設定
これはどの割り込みよりも優先して実行してほしいので、0~15ある優先度でMAXのf(16進法で15)を選択しました。

次にプリスケーラーの設定。
MTU21.TCR.BIT.TPSC = 1; // プリスケーラ φ/4 {(φ=25MHz):0.04us }
データシートを見るとφというのが所々で登場します。
これは何かというとマイコンに来ているクロックの周波数です。Miceの皆さんが秋月で買うSH7125のマイコンボードには12.5Mhzの水晶発振子がついています。これがマイコン内の回路によって25Mhzのクロックとなり、使われます。原理は僕もよく分からないですがとりあえずφ=25Mhzです!(誤魔化した)
そして今回はTPSC=1を選択しましたがこの設定によって下表のようにφ/4でカウンターが進むということになります。これは、言い換えればマイコンでの4クロックがTCNT1カウントということです。
01112.png

ということで割り込み間隔を司るTGRBの設定をします。
MTU21.TGRB = 6250-1; //割り込み間隔[s]/{(1/φ)*プリスケーラー}
6250がどうやって出てきたかというと、目的の割り込み間隔は0.001[s]で
マイコンでの1クロックは1/25000000=4*10^(-8)[s]
今回設定したプリスケーラーからマイコンでの4クロックがMTUカウンターの1カウントなのでカウンターの進む速度は4*4*10^(-8)[s]
ということで設定すべきTGRBは0.001/{4*4*10^(-8)}=6250です。
-1してるのはコンペマッチの瞬間割り込みが発生してカウンターが0になるからです。
あ、ちなみに今回のように0.001秒など短い時間で割り込む分にはプリスケーラーを0(マイコンのクロックとカウンターの速度同じ)に設定しても何とかなります。

カウンターをスタートすれば完了
MTU2.TSTR.BYTE = 1;//カウンタスタート

これで、割り込みは発生します。
では次に割り込み関数を作りましょう。
上の手順で割り込み発生とは、具体的にはTGRBの割り込み許可が出ていて、TGRBコンペアマッチが発生したことによって、intprg.cファイルの210行付近
void INT_MTU2_1_TGIB1(void){/* sleep(); */}
↑この関数が実行されたということです。これを見てお分かりの通り中身が何もありません。ですので、コメントを消して中身を書けばその処理がされるので今回は短い内容ですし書き込んじゃいましょう。例としてMTUの0チャンネルで右モーター、MTU3チャンネルで左モーターを回しているとすると、
void INT_MTU2_1_TGIB1(void){
  MTU21.TSR.BIT.TGFB = 0;
  MTU20.TGRA=round(tmp_rmotor_TGRA);次週詳しく
  MTU20.TGRB=MTU20.TGRA/2;
  MTU23.TGRA=round(tmp_lmotor_TGRA);
  MTU23.TGRB=MTU23.TGRA/2;

  calc_TGRA();
}

正しくは、tmpと置かずに1[ms]ごとにTGRAを計算していくでした。
なので1[ms]毎に割り込むINT_MTU2_1_TGIB1関数内にcalc_TGRA関数を置くことで、PWMの周期であるTGRAを決定することにします。詳しくは180mm進もうの7回目と合わせて見てください。


という感じにすることで、ついにPWMでモーターが回せるようになります。

まず1行目ですがこれは全ての割り込みに必要なフラグクリアってやつです。実はコンペアマッチが発生したときにこのMTU21.TSR.BIT.TGFBが0->1になることで割り込みが発生できたのです。これがないと、もう一度TGRBとコンペアマッチしても1->1で割り込みは発生しません。
round()は進もうシリーズで課題で出した丸め込みのマクロです。各チャンネルでTGRBをTGRA/2としているのはDutyを50%にしていることと同じです。
実は今回モーターのMTUチャンネルを0と3に選んだのには理由があります。バッファ動作という何かがあって、PWMでパルスを送っているときに周期やDutyを変えるのはこのバッファでやると良いです。しかし、まあそんなに大事ってわけでもないので割愛します。ヒントとしてはMTU23.TGRC=round(tmp_lmotor_TGRA);のようにTGRA=でなくTGRC=となります。

さて、大分駆け足で申し訳なかったです。ついてこれましたか;w;
次週はいよいよ0.001毎のTGRAを求めてみます。(上で言うtmp_lmotor_TGRAに当たるところです)
終わりが見えてきたかも?w
ではでは(*^-^*)

コメントの投稿

非公開コメント

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