はちゅねタコメーター製作(妄想中)

出来事

  • AVRSPImkIIが届く
  • 準備試験用のパーツ(フォトカプラとか各種電子部品群)が届く
  • 作業用ノートにAVRstudio等を突っ込んで環境作成
  • タコメーターの作成に必要な基礎情報の収集完了
  • 基本仕様と大まかな処理フロー完成
  • 元絵の収集開始(はちゅね、かぐぁみね)

暫定仕様(案)

大まかな全体のイメージが固まってきたので箇条書きにしてみる。

  1. 表示系(優先順位順)
    1. 点火信号の受信
      1. 簡易タコメータ(バーグラフ)
        大まかなバーグラフ(レブrpmを最大とし、10sec保持のMaxを表示)
      2. シフトポイントインジケータ
        任意指定のrpmを超えると黄色LED点灯
      3. レブリミットアラートインジケータ
        任意指定のrpmまで500rpmを切ると赤色LED点灯
      4. 初音ミクアニメーション(タコ連動)
        >アイドル=ネギ準備(2コマ:゚△゚&まばたき)
        >走行中 =ネギ振り(2コマ:゚△゚)
        >シフト超=表情変化(2コマ:゚□゚)
        >レブ接近=表情変化(2コマ:>□<)
        >信号待ち=どんより(2コマ:=△=&肩で息)
        >0rpm=居眠り(1コマ:居眠り)
    2. 周囲明度の測定
      1. CdSと1kΩと半固定抵抗(100kΩ程度)を直列に繋ぎ、CdSの電圧をADCに取り込んで計測。
        実測値を元に、LCDバックライトをON/OFFする敷居値を決定。
    3. 外気温の測定(将来実装。ポートを確保)
      1. 気温表示
        大きめのデジタル表示を数秒間隔で更新
    4. 方位の測定(将来実装。ポートを確保)
      1. デジタルコンパスによる進行方向の表示
        方位角(3桁)を表示、北の方向を16分割で大雑把に表示
        (参考1:http://www.sparkfun.com/commerce/product_info.php?products_id=7915
        (参考2:http://wiring.org.co/learning/examples/HMC6352sparkfun.html

動作についての基本情報

パルスの間隔が 4ms とする時、その周波数は 1/0.004=250Hz。これをrpmに換算すると 250Hz*60sec=15,600rpm。
ms単位のパルス幅を Pms とすると、60,000/Pms=rpmrpm化できる。
 
Timer0 = 8bit = 256Ticks
Timer1 = 16bit = 65536Ticks
 
AVR基準クロックが20MHzの場合(Timer0)
周比が1の時 20MHz 1パルス0.05μS 一周12.8μS

分解能について

単純にTimer0のオーバーフロー割込"のみ"でパルス幅計測を行うと、15000rpm付近で600rpm以下の分解能となってしまう。
パルス検知時にオーバーフロー回数に加えてタイマー値も拾う事で、20000rpm付近でも10rpm前後の分解能を得られる。
なお低回転側の分解能は、Word型の限界である65535カウントから、72rpm(概ね1.0Sec)が限界となる。

処理フローイメージ

割込設定

  1. ピン変化割込(PCIx)を設定。
  2. Timer0を設定(クロック20MHzの分周比1/1)、オーバーフロー割込を設定

 
演算フロー

  1. ピン変化割込を有効化。Timer0を有効化。
  2. 一定間隔で表示フローをコール。
  3. 必要に応じてその他の計測処理もコール。
  4. 2へ戻る。

 
※ここの表示インターバルは、液晶実機の反応速度を確認してから決定する。
 なお、気温や方位は1sec〜数十sec間隔でもよい。
 
ピン変化割込

  1. TurnとTimer0を表示制御用変数(cTurnとcTick)へ代入。
  2. TurnとTimer0をリセット。
  3. 戻る。

 
Timer0オーバーフロー割込

  1. Turnをインクリメント。
    Turnインクリメント時にオーバーフローする(下記の閾値を超える)場合は、Stallフラグを立ててTurnをゼロクリア。
    閾値は200rpm(0.3sec)にあたる23437(=(15 * 20000000) / (64 * 200))。
  2. 戻る。

 
表示フロー

  1. 別変数へ取り込んだ値を元に計算を実行(演算中の割込を考慮し、さらに別変数で演算を実施すること)。
    cTurnとcTickに数値があるとする場合、以下の式でrpmを算出。
    rpm = (60 * 20000000) / (cTick + (cTurn * $FF))
    ※20000000は基準クロック
  2. アニメーション用カウンタをインクリメントさせる。
    ただし、アニメーションモードが変化した時はゼロリセット。
  3. 各種描画制御処理を演算、LCDへの転送データを生成、表示を更新。
  4. 戻る。

懸案事項

  • 使用予定液晶の応答速度や実寸法。
  • エンジン点火信号の安全な取得方法。