目次
開発環境について
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バルブによるアイドリング補正処理
- 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