H8(3048)を使ってギアポジションインジケータの2
またまた字が多いです。
言い訳 H8遊びの直接のきっかけである依頼人からの最初の依頼事項は一応クリアして
今は次の依頼事項に必要な調査中。
で、このギアポジションインジケータもその一環と言うことで...。
依頼人様今しばらくお待ちください。
・とりあえず仕様を決めます、出るものと入れるものを決めてやります。
・出すもの、ギアポジションを求めて7セグのLED1桁で表示するのが一番シンプルでコンパクトですが
他の用途に転用できるように16文字2行のLCD表示とします。
LEDは..私は7セグLED大好きなのでそのうちCPUボードと7セグLEDのみの構成でやってみたいですね。
・LCDには速度、回転数、ポジションを表示することにします。
・入れるもの、速度情報:スーパーシェルパは速度計がデジタルです60Hzで60Km/hになっています。
回転数:スーパーシェルパは一回転につき一回点火します。
先日実験したハイテンションコードから拾う方法よりは回路的に簡単なCDI用のパルサーコイルから拾います。
・次はギア表示のために記憶して置かなければいけない情報です。
・??rpmで??km/hの場合には何速なのかを何らかの形で記憶しておかなければなりません。
簡単そうなのはプログラム中に記述してしまうことです。
しかし計算が面倒(私にとっては)ですし
調整するのにいちいちソースを修正してコンパイル云々というのは現実的ではありません。
・そこで実走行時に調整できるようにしておき、そのデータを保存できるようにしておきます。
・具体的には設定モードに切り替えて、記録したいギアポジションを表示しておいて実際に走行し
そのギアにシフトした状態でボタンを押して記憶させる...といった操作になるでしょうか。
・バイクの場合はチェーン駆動ということもあって(滑りはしませんが遊びがあるので)
エンジンの回転数とスピードの関係を記憶させるときの状態によってはうまくいかないかもしれないですが...。
・速度と回転数を表示するのはそれぞれの信号の周波数を計るのと同じことになります。
・周波数を計るには、「パルスの繰り返し周期を測る」か「一定時間内のパルスの数を数える」どちらかになります。
下記は(ご存知だとは思いますが)それぞれの計り方です。
・「パルスの繰り返し周期を測る」:下の図で言えば時間t1を計り
周波数(Hz)であれば1(秒)/t1を計算すると一秒あたりのパルス数(=Hz)が求まります。
・「一定時間内のパルスの数を数える」:一定時間t2内にいくつのパルスが入るかを数え
パルス数×1(秒)/t2で一秒あたりのパルス数(=Hz)が求まります。

(図中のパルスが速度や回転数の信号だと思ってください。)
・で、どちらの方法を使って求めるか。
・スーパーシェルパの場合、回転数で1500rpmなら25Hz、速度で20km/hなら20Hz。
・1秒間パルス数を計っても25や20のパルス数ですから、微妙なところまで計るにはt2を長くしてやる必要があります。
しかし、十分な時間をかけるということは反応が悪くなることと同じです。
・レスポンスが悪いのはダメですから、これは使えません。
・パルスの周期を計る方法にします。(実は最初からこの方法しか考えてなかったのですが...。)
・この方法は何が素晴らしいと言って、ITUの機能であるインプットキャプチャを使えることです。
・インプットキャプチャは「ほとんど手放し」で周期を計れるありがたい機能です。
上の図では「インプットキャプチャに入力されるパルスの立ち上がりでキャプチャ」を指示するだけで
t1の時間を計り、割り込みを発生してくれます。
・t1の時間を計るということですが。
・下の図で上の信号が速度のパルスであるとします、下の信号がCPUのカウントするパルスであるとします。
・この例ではtの時間内に8のパルスをカウントしています。
カウントするパルスの周期はわかっていますから、とりもなおさず時間を計っていることになります。

(上図は概念的な図です、素人の私の脳での理解はこの程度です(寂笑))
・今回はITUの3と4を使います。
・なぜ3と4なのでしょうか?
特に意味はないんですが、H8を使うきっかけになったもともとの依頼人からの「次の依頼」のためです。
要はより優先順位の高い割り込みの高い処理をさせることがありそうなので0〜2番は空けておきます。
・ITUはそれぞれに特化した機能を持っていて
割り込みの優先順位の変更できる(はず)ですから適したチャネルを使えばいいんです。
が、面倒なのは嫌いなのでデフォルトの優先順位で低いほうから使うという事になります。
・具体的には内部クロックを8分周してカウントに使います。
しかしITUは16bitなので最大カウントは65535までです。
これに12Mhz/8=1.5Mhz=1パルスが0.00000066666………秒を数えさせるのですから
そのままだと65535×0.000000666=0.04369秒間隔のパルスを計測するのが最大です。
つまりそのままだと22.888hz以上の周波数しか計れない。
→23km/h以上の速度しか計れない。
→1373rpm以上の回転数しか計れないということになります。
・回転数はこれでもいいかもしれませんが速度はちょっとさびしい。
これを回避するにはカウントするクロックを外からもっと低い周波数を与えてやる。
またはソフト的に処理するか。
もちろんソフトで処理します。
・ソフト的にはカウンタのオーバーフローで割り込みを発生させて、別途カウントアップしてやります。
・H8という贅沢なハードを使っているんですから計算も贅沢にいきます。
が、浮動小数点は出来上がりのモジュールが大きくて遅そうなので使うのは整数型でlong(ここでは32bit)までにします。
(実際は遅いと支障があるような処理はしませんが)
・と、いったことを考えながらテスト用のプログラム(結局は本番用のプログラム)を組みます。
・RAM上で関数をデバッグしながらこつこつ積み上げて行くのが本来でしょうが
今回は書き込み回数制限にビビリながらROMに書き込んでテストしながら組んでいきます。
・秋月の3048マザーボードキットはスイッチやLCDがついているので
これらをそのまま使ってテスト環境=本番環境的に組みます。楽です。
・LCD表示関係は熊谷研究室様のものを流用させていただきます。
ありがたいことでございます。
・で、作りかけが下の写真です。テスト発振器が1個しかないので、速度は固定した値でテスト。
・通常モード

速度の後ろの”0”がポジションになります。
・ポジション教えモード
・下の例では、回転数1200rpm速度50km/hと同じ比率の組み合わせのとき”2”と表示されるということになります。
(1200rpm50km/hってそんな非現実的な...まあテストですから。)

教えたポジションを選択するとそのときの回転数と速度を表示。
値は「記憶」スイッチが押されるとEEPに書き込みます。
DIPスイッチの1番がセットと通常の切り替えです。
・この筐体ではバイクでテストが出来ないので、別途ケースを用意します。

タカチのSS-160ですW100×H38×D160は弁当箱サイズです。
・かなり大きなケースです、テスト用ですので大きいほうがいいかと。しかしデカイ。
ケースの加工、不器用なんで苦手なんです。ここからかなり難航することが予想されます。
メインページへ