申し訳ないほど長らくお待たせしています。やっと自分では満足したソースが出てたのではないかと思いますが、実装テストしないとコレばかりは違和感や動作感がわかりませんという但し書きが毎回付く。なにかひらめきが調子いいので今のうちに片づけるぞ。
バイクメーカ純正のタコメータは針に重みを効かせたり、ダンパーで指針を押さえ込んでいる関係で純正タコメータの場合は移動変化が顕著にみえずスムーズに針は移動する。
片やデジタル的に読み取って、デジタル的に動かすステッピングモータはデジタル故に正確で特にアイドリング付近の移動量変化が顕著見えます。(要はアイドリングで針がプルプル震える現象が出る)
RZRに関してもシングルエンジンよりは変動率は少ないがそれでも正確に読み取るので針はプルプル震える。ただ、残念なことに当方のRZRのエンジンは師匠いわく変なエンジンなので不正爆発も出ず、アイドリングでは淡々と回り、針は震えない。なので針は微動もでず、たまに思い出したようにピクリと動くだけだ。
それまではそれが普通であると思っていた。テスターであるフロントソーサ号やたまたま師匠宅にあったRZ350に取り付けて初めて気が付き驚いた次第です。それも師匠の言葉でそれが普通だと聞かされて更に驚く。
当時の別のテスターから、このあたりの移動量が目に付くということで、特有のことだと疑わず最初はインタフェースに載ったノイズを疑った程だった。
改善を進めていたがへっぽこプログラマーの上に自車が全くテスターにならないため、鈍亀より遅く全くと言って良いほど改良が進んでいなかった。
プログラム開発では、原理を考え、理解した上でプログミンク化するため、当方の知識の習得に時間が経過してしまったが現在、3つの方法を試している。方策を考え理解し、その後にプログラム化しているので亀以上に進捗が遅いのは理解していただきたい。
動作:適応範囲 0~2000rpm
1)パルス取得を平滑化したい
移動平均法(バッファリング)を使って、急な変化をなだらかにする
欠点 理論上小さい遅延が発生する
#define AVG_SIZE 8
uint16_t rpm_history[AVG_SIZE] = {0};
uint8_t rpm_index = 0;
uint16_t smooth_rpm(uint16_t new_rpm) {
rpm_history[rpm_index] = new_rpm;
rpm_index = (rpm_index + 1) % AVG_SIZE;
uint32_t sum = 0;
for (int i = 0; i < AVG_SIZE; i++) {
sum += rpm_history[i];
}
return sum / AVG_SIZE;
}
2)取得時間を延ばして変動率を抑えたい
アイドリング付近の複数パルス間の平均周期を取る
欠点 これも遅延が発生すると考える
#define NUM_PULSES 8
volatile uint32_t pulse_times[NUM_PULSES];
volatile uint8_t pulse_count = 0;
void __interrupt() pulse_isr() {
static uint32_t last_time = 0;
uint32_t now = micros(); // 1us単位の現在時刻
uint32_t interval = now - last_time;
last_time = now;
pulse_times[pulse_count] = interval;
pulse_count = (pulse_count + 1) % NUM_PULSES;
}
uint16_t get_avg_rpm() {
uint32_t sum = 0;
for (int i = 0; i < NUM_PULSES; i++) {
sum += pulse_times[i];
}
if (sum == 0) return 0;
// 平均周期 → 平均周波数(Hz)→ RPM(回転数/分)
float avg_interval = sum / (float)NUM_PULSES;
float freq = 1e6 / avg_interval;
float rpm = freq * 60.0f;
return (uint16_t)rpm;
}
3)応答性と安定性の両立(1)と(2)の中間的手法
ローパスフィルタ(一次IIRフィルタ:デジタルフィルタ)やスムージング(変化量による制限)を取る
欠点 制限によって見た目に不自然に感じるかもしれない。低速では可能だが閾値が不明
これらのテストを実施し、1)~3)での複合案を選択して、プロミング化が出来たので実際の実装に入り、フロントソーサ号でテスト予定
簡易テストのため、OSR-CDIから12Vパルスを取り出しメータに貼りつけて後日に動作確認をします。
トビラの絵はよってたかってフロントソーサ号をゼロヨンマシンに仕立て上げるため、改造を行っています。お題は11秒台を出す。1速でOSRーCDIのマップ1を使用し、2速以上ではマップ0を使用するための車両改造の写真です。既にキャブ回りの改造が済んでおり、1速でパワーが出過ぎて怖いとのことで急遽YPVSの開度を全開にしないマップを用意して切替改造をおこなってる。

写真のニュートラルスイッチ兼ギアポジションスイッチを提供しようとしましたが、既に壊れたニュートラルスイッチを改造していたため、出る幕がなく、テスト情報は取得出来なかった(残念)
改造途中、スイッチ回路に12Vを印加したため、OSR-CDIのPICが二回ほど昇天されました。
原因に関しては中々気が付きません。1回目はジュースを買い(コンビニでトイレ借用)の帰りに考えてたら回路的に12Vが流れ込むじゃんということで対策したのですが、それ以外にも流れ込む要因があるんじゃなかったけ?何か有ったような気がするけどなんだっけ?で思い出せず2回目に同じ事をする。
壊してからオイルランプチェック回路からの流れ込みに気が付く。
PICを2個用意していたのが全部使っちまったなぁ。というの夜の20時ごろ
試走は1回だけ出来、開度を半分ほどにしたら、1速と2速の繋がりが悪いということで開度を75%程度にして帰宅して貰った。危うくバイクで帰宅できなくなる帰宅難民が出るところでした(笑)
開度の調整は現地で調整をしながらテストする方向性に変更するらしい。
今後自分のOSR-CDIでもテストするのでスイッチ入力部には電流制限抵抗と電圧制限のツェナーでも置いておこうと! タメになる改造実験でした。
コメント