目次



開発環境について

SH-2A開発元であるルネサスエレクトロニクスからHigh-performance Embedded Workshop(HEW)という総合開発環境がリリースされていますが、こちらの環境は評価版ですと評価期間完了後にバイナリサイズ:256KBに制限されてしまいます。そこで、今回はプライベータ向け?のGCC環境で開発します。
具体的な環境構築はCQ出版の特設ページにありますので、興味のある方は覗いてみてください。

現在はHEWの「iodefine.h」「typedefine.h」をGCC環境に移植して開発しています。というのも、CQ出版のサイトにあるサンプルでは、必要分のIOマップを独自に設定して使っているのですが、すべては設定されていません。今後の拡張のことも考えると、この方法がよいと思います。

ブロック図について

作成中のソフトウェアのブロック図は下記になります。
blankimgプラグインエラー:画像を取得できませんでした。しばらく時間を置いてから再度お試しください。

  • ドライバ層
各種ハードとはドライバを介し制御する予定です。現在コーディング中のプログラムでは直接GPIOレジスタなどを叩いていたりしますが、平行してドライバ化作業をしており、ほぼ完了しています。後は組み込むだけなのですが、動いている処理がおかしくなると痛いので優先度・低で(^^;)

  • ユーザ層
    • クランク位置計算処理
      • IRQからのクランクパルスによる割り込み間隔を測定し、最大間隔を基準に位置を計算しています。この計算は1回転ごとに行っていますが、重い処理のため高回転時の処理遅延を考慮し、高速化など見直す必要がありそうです。
    • カム位置計算処理
      • 2回転分の吸気圧を測定し、点火(排気)・噴射(吸気)タイミングを判断するようにしています。この処理は現在のことろアイドリング中のみとしています。
    • 回転数計算
      • 100msあたりのクランクパルス数を元に、計算しています。本来であれば1回転あたりの時間を元に算出したいところですが、割り込みが多発するタイミングで少々問題があり、このような方法にしています・・・処理を見直したいです。
    • LCD表示
      • 500msごとに「回転数」「スロットル開閉度」「吸気温」「油温」を表示する予定です。(吸気温・油温センサの解析が不十分なため、現在の表示は回転数・スロットル開閉度のみ)。
    • IACバルブによるアイドリング補正処理
      • 現在IACバルブの解析が不十分なため未実装です。
    • O2センサによるフィードバック処理
      • 現在O2センサの解析が不十分なため未実装です。
    • デバッグ・エラーログ表示・SDカード保存
      • 勉強のあしあとにも記載がありますが、UART出力は重い処理のため、ログを出しすぎると制御が破綻します。またPCが接続できない環境で動作させた場合でもスムーズにデバッグできるように、デバッグ・エラー情報はSDカードに保存するようにしました。まぁこれも出力しすぎると処理破綻するのですが、UART出力よりは大量のログを残せるため、この方法を採用しました。
    • 点火・噴射マップのSDカード読み出し処理
      • 起動時にSDカードより点火・噴射マップ・レブリミッタ回転数などを読み出す処理を追加しています。これはPCアプリにてマップを修正することを想定しているためです。
    • アイドリング制御処理
      • アイドリング状態は「2000rpm未満 且つ スロットル開閉度0%」としました。エンジン制御処理とわざわざ分けた理由としては「制御マップの縮小(0-2000回転未満を省略)」と「アイドリング制御の点火・噴射時間・タイミングは基本固定とする」ためなのですが、よく考えると微妙なところかもしれません。。。とりあえずは、このまま設計を進めたいと思います。
    • エンジン制御処理
      • アイドリング状態は「2000rpm以上 又は スロットル開閉度0%以外」の場合の処理です。こちらは点火・噴射マップのマップより該当するデータを計算する必要が主処理になる予定です。

点火・噴射タイミング計算処理について

SH-2Aは144MHzで駆動しており性能はかなり良いほうなのですが、リアルタイム制御となると計算処理の重さがネックになります。1回転毎に計算することも検討したのですが、やはり処理上厳しいものがありましたので、点火・噴射マップより詳細テーブルを作成し、必要値を検索する方針としました。

テーブルを用いると処理は軽くなりますが、メモリを消費してしまうデメリットがあります。ただ、SH-2Aのメモリは1MBですので、プログラム本体(現在、約120kB)を含めても余裕があり、問題なしと判断しました。

テーブルの分解能については、下記のように誤差5%以内(例:1500-1550[rpm]の区間であれば、97%≒1500/1550)で収まるように調整しています。

回転数[rpm] 1500 1550 1600 1650 1700 1750 1800 1850 1900 1950
誤差[%] 97 97 97 97 97 97 97 97 97 98
1回転の時間[ms] 40 38.7 37.5 36.4 35.3 34.3 33.3 32.4 31.6 30.8
1度当りの時間[us] 111 108 104 101 98 95 93 90 88 85

回転数[rpm] 2000 2100 2200 2300 2400 2500 2600 2700 2800 2900
誤差[%] 95 95 96 96 96 96 96 96 97 97
1回転の時間[ms] 30 28.6 27.3 26.1 25 24 23.1 22.2 21.4 20.7
1度当りの時間[us] 83 79 76 72 69 67 64 62 60 57

回転数[rpm] 3000 3100 3200 3300 3400 3500 3600 3700 3800 3900
誤差[%] 97 97 97 97 97 97 97 97 97 98
1回転の時間[ms] 20 19.4 18.8 18.2 17.6 17.1 16.7 16.2 15.8 15.4
1度当りの時間[us] 56 54 52 51 49 48 46 45 44 43

回転数[rpm] 4000 4200 4400 4600 4800 5000 5200 5400 5600 5800
誤差[%] 95 95 96 96 96 96 96 96 97 97
1回転の時間[ms] 15 14.3 13.6 13 12.5 12 11.5 11.1 10.7 10.3
1度当りの時間[us] 42 40 38 36 35 33 32 31 30 29

回転数[rpm] 6000 6250 6500 6750 7000 7250 7500 7750
誤差[%] 96 96 96 96 97 97 97 97
1回転の時間[ms] 10 9.6 9.2 8.9 8.6 8.3 8 7.7
1度当りの時間[us] 28 27 26 25 24 23 22 22

回転数[rpm] 8000 8250 8500 8750 9000 9250 9500 9750
誤差[%] 97 97 97 97 97 97 97 98
1回転の時間[ms] 7.5 7.3 7.1 6.9 6.7 6.5 6.3 6.2
1度当りの時間[us] 21 20 20 19 19 18 18 17

回転数[rpm] 10000 10250 10500 10750 11000 11250 11500 11750
誤差[%] 98 98 98 98 98 98 98 98
1回転の時間[ms] 6 5.9 5.7 5.6 5.5 5.3 5.2 5.1
1度当りの時間[us] 17 16 16 16 15 15 14 14

上記表の1度当りの時間を元に、点火・噴射マップの通電間隔+通電停止角度を、通電開始・停止共にクランクパルス番号(1-8番目:30[deg]、9番目:120[deg])と補正用タイマ(10[us]割り込み)に変換し詳細?な制御を実現させています。といっても今もチューニング&検討中だったりしますが・・・
















最終更新:2010年09月17日 18:35