參考 - Ardu-stim 備忘 | Arduino | O2 Sensor

年紀有了記憶力已經不像之前那樣可靠了(嗯? 有可靠過嗎? XD), 所以這篇是用來提醒自己, 以免下次遇到同樣的問題時又再浪費時間研究.

  • 新的模擬訊號 - wheel_defs.h
    所有的模擬訊號皆在此定義; 有一個要特別注意的是: 將所有訊號全部納入 pattern array 內; 例如 ZZR1200 僅有 pick-up coil 會送出 timing signal, ECU 再依此決定 spark plug 那時候要充電、那時放電; 還有如果未來的改裝尚會配合 MAP sensor 來識別第 1 缸, 那麼 pattern 要如何訂?

    經過多次實驗後, 我將每齒再細分成 8 等份, 藉此讓模擬的訊號可以較 "平順" 精準; 而 ISRs.cpp - ISR(TIMER1_COMPA_vect) 是將讀到的 byte 值直接寫到指定 port - PORTB, 剛開始讓我迷惑、困擾許久, Ardu-stim 到底把資料寫到哪去? 怎麼沒有 digitalWrite()?? 後來才知道有 port register 這種寫法(不夠用功), 所以原先還在修改 ISR(TIMER1_COMPA_vect) 這個 function 的, 直到看到其他的 wheel pattern define 才知道 - 直接將 pattern 設定在 array 裏面就好了, 不需要修改程式...

    依據 Arduino 官網的說明文件, PORTB 對應至 8 ~ 13 這 5 個 port, 所以當寫入 B00000001 時, port 8 狀態變成 HIGH; 同理寫入 B00000100, port 10 狀態變成 HIGH... 那麼如果寫入 B00000101 會怎樣? 那就是 port 8 & 10 變成 HIGH. 就是這麼簡單 ;-)

    因為我除了需要模擬 pick-up coil 訊號外, 尚需要驅動 coil & MAP 的模擬訊號, 所以最終的 pattern array 如下:
    const unsigned char kawasaki_zzr1200[] PROGMEM =
    {
      1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,32,0, 8, 8, 8,0,0,1,0,0,0,0,0,0,0, /* 1st revolution */
      1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, 0,0,16,16,16,0,0,1,1,1,1,0,0,0,0,

      1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0, 8, 8, 8,0,0,1,0,0,0,0,0,0,0, /* 2nd revolution */
      1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,16,16,16,0,0,1,1,1,1,0,0,0,0
    };

    其中 32 為 MAP sensor signal, 僅 crankshaft 每轉 4 圈才出現 1 次, 而 8 則是 coil#1 的 charge signal - crankshaft 每轉半圈產生, 16 是 coil#2 的 charge signal

    !注意! charge signal 設定是針對 1,000 RPM 設定的, 轉速愈高, 必須越提前才是 - service manual: 10° BTDC @1 000 r/min (rpm) to 47.6° BTDC @7 000 r/min (rpm)
  • 以可變電阻調整轉速 -- 目前還找不到他是接在哪個 analog port...
    折衷的作法是透過 serial console 手動設定轉速(Set Fixed RPM) or 讓 Ardu-stim 反覆在指定的轉速之間(Sweep the RPM (min,max,rate(rpm/sec)))
以上面為例, 記得要在 ardustim.ino - setup() 內將 port 11 ~ 13 的 pin mode 設定成 OUTPUT 才行.



(本 BKSPtw Blog 內任何一篇文章皆可自由轉載, 但是煩請註明出處並附上文章連結. 感謝!)

若各位朋友有任何保養/維修的需求, 歡迎來電或者留言詢問. Thanks!
較新的 較舊