期間試過 FTM(FlexTimer Module), 後來換成 PIT(有 4 個 PIT timers 比較好應用); 但是... 不同 timer 碰到不同的問題:
- FTM - 設定完 counter 時即觸發 interrupt, 也因此 1 個充放電的行程會觸發 4 次! 且如果有任何 I/O 的情況發生時, 還會影響其他的 ping. 以 digitalWriteFast() 設定 D_P_SPARK1 時, D_P_SIG_R/L/B 甚至 D_P_WBOS_HT 都會跟著動 @_@
也因此此種 "特性" 放棄使用此類型的 timers - PIT - 設定完 counter 後會在 counter == 0 時才觸發 interrupt, 但是... 在 ISR(runtime) 中修改/變更 counter 值這部份就一直有問題. 參考原廠技術文件、透過 Google 搜尋相關討論文章、嘗試所有找的到的方式... 就是無法正常運作.
而且當只有 pit0 在運作時, 充放電情況還勉強可以(當然是無法利用在實際的環境上), 過程中會有固定頻率中斷充放電的問題; 加入 pit1 後還是只有 pit0 可以勉強運作, pit1 對應 ISR 所驅動的 pin 會輕微做動...
目前試過 PIT 運作最正常的作法 - 直接在 setup() 將 PIT counter 固定(eg. 500us), 所有需要延時的以 global counter 的方式處理, 接下來會嘗試朝這個方向走
除了 timer 問題外, 另外就是處理速度問題; 在空載的情況下初步每秒可以執行 130K(@72MHz) 以上的迴圈, 但是只要以 float 型態開始計算 wheel angle, 整體僅剩下不到 10K!
後來改使用 integers 的方式 - 將 float 值 * 100 後即可得到 "小數點後 2 位", 雖然精度差距很大, 但是運算效能總算恢復到可接受的 40K... 不過, 相關配合的程式還沒有完全, 還待除錯.
2016-10-18
看來... 似乎還有一段長路要走 -_-||| 新的 PIT 寫法依然有固定頻率中斷充放電的問題.
程式開發有問題, 就先做硬體部份的作業... ;-)
把 connectors 全部做好了: 剛開始因為對工具不熟悉的關係, 光是 24 pins 就搞了超過 3.5 HRs; 後來經過高人指點(XD), 僅不到 1.5 HRs 就做好且每個端子還加焊過...
日前在購買 IC - MAX9926 時, 為了運費不經意買了一片 STM32F407 module board, 想說嘗試看看不同平台 - 與 Teensy 同樣是 ARM Cortex-M4 架構, 但是多了 FPU, 記憶體更多(1MB Flash/192+4KB RAM), 運算效能更高... 加上價錢也不貴(約合 NT$490)所以就買了... 到貨才看到拍賣頁面上有人反應穩定性很差, 故障率高 @_@
經過多次測試, 穩定性確實很差; 原先板上的 dip switch 有接觸不良的情況, 後來改成 jumper 形式; 改完後就可以 "較容易" 進入 DFU mode 且可正常在該 mode upload firmware, 但是 "正常" mode 卻一直有問題發生 - Linux 無法辨識 USB device! 要重複插拔 USB connector 後偶爾可以辨識到.
不過... 也因此學到了許多東西 ;-)
後續有時間再補上相關的工具、資料.
(本 BKSPtw Blog 內任何一篇文章皆可自由轉載, 但是煩請註明出處並附上文章連結. 感謝!)
若各位朋友有任何保養/維修的需求, 歡迎來電或者留言詢問. Thanks! |