PWMと電力とリセット

最大スピードはどのくらいか?を試そうとして、「フルスピードで前進した後に急制動をかける」ようなプログラムを作って流してみる。ミニマイコンカーのプログラム環境「ブロッくん一号」は、メインプログラムから「100%だ!」といわれたときにどんだけのパワーで回すかを「最大回転数」というパラメータ(%値)で持っている。この値はデフォルトでは70%になっていて、メニューから簡単に変更できるので、試運転時と本番でパワーを変えるとかが一発でできて結構便利だと思う。
最大パワーを見るのが目的だったので、当然この値を100%にしてみたのだけれど、なんと、そうしたらモーターが動かなくなった。一瞬びくっとしてあとホールド。なんだこりゃ?しかもよく見るとパイロットランプが動作中点滅から待機中点滅に移行しているっぽい。んー?これはひょっとしてリセットがかかってる? いろいろ愚直に試してみるとどうも 85%を超えたところでこの現象が起こっているご様子。

ミニマイコンカーのプログラム環境「ブロッくん一号」はDCモータパワー制御をPWMを使ってやっている。具体的にはH8のタイマZのPWMモードを使って、1ms周期のPWM波形を生成している。
CPUボード(RY3687)は動作周波数が14.7456MHzなので

#define CYCLE_1MS   14744  /* 1ms サイクル   うーん、、14745じゃないのは何故?*/
    :
/* 初期化 */
    P_TMRZ0.GRA0            = CYCLE_1MS; // タイマ周期設定

のようにしておいて、PWMの反転位相を後からGRC0に設定してパワーをコントロールしている。
たとえば左モータだったら

	out_l = speed_l * RUN_PWM_L / 100;
        P_TMRZ0.GRC0 = (long)CYCLE_1MS * (our_l) / 100L;

てな感じ。たとえばout_l = 50パーセントだったら CYCLE_1MS/2 = 半周期でパタパタ反転するわけだ。上記スニップル中のマクロ RUN_PWM_Lが件の「最大回転数」。

とか、、、、最初、いけてない事に「リセットする」=「ダブルエクセプション」と思い込んでいたので、この辺りを追い掛け回した。だけど、すこーし考えてみたら、このPWMモードの仕組みで割り込みがかかるわけではないし、割り込みイネーブルもまったく問題なくGRA以外では割り込みがかからないようになっていた。さらによーく考えてみて思いついた。まさかまさかまさか。。。

プルパワーってことは電力喰うよね。それで思いっきり電圧降下してCPUがダウン? あははははははは。

実は電池にエネループ充電池を使っていたりしたので、乾電池に交換してみたらまったく問題なく動いた。寒い。なんだったんだ無駄なこの解説は (・く・;)