---
# System prepended metadata

title: Sandal refactor by overlap
tags: [motor_drive, sandal]

---

# Sandal refactor by overlap

# 大方向

現在sandal 就是想要以 overlap 的方法修改，但也還要計畫，要考慮的部份還是很多的。
比較與實現相關的有 API 和 測試。
API的設計算是很正規的design pattern，執行的方法為了相容性也是和目前一樣。
測試的方法，算是目前空白的部份，需要自己做黑箱測試填上。

另外方向上，盡量以產生可重用在各處的library 為主。希望某些做出的 libraries 不要只用在驅動器。


# control block loop OOP API 設計

1. 繼承或接口的形式就是，init/exit 的部份可以不同，但是其它funciton 的調用都是要一樣的介面，參數意思也一模一樣。
    1. 以controller 為例，只要update function 的input 是一樣就好。目前pid 都是SISO
    2. 可以參考cia402 spec，對controller function的部份。
1. 內圈的block 和外圈block。
    1. 切換內部的block是肯定要的，同樣可參考cia402，問題在於什麼方法？特別是在init 的時候，是要1. malloc or 2.just expose pointer 就好，問題讓使用者 自己處理。我認為2比較好。
        1. e.g. velocity loop, position loop 和controller, filter的關係。
    1. feed-forward的部份應該不影響
    1. 速度環或電流環是否應該包含額外的處理。比如速度環要算FOC(acc to torque to current)。
        1. 我覺得這是命名或定義問題，應該取名為 velocity to torque loop 之類的。才是包含更大的部份。
        2. 我覺得可以思考如果分三個function ，這三個function 要取什麼名字。
    1. FOC 算在velocity 還是 current loop 是另一個問題（切在torque or current）。我認為取決於FOC到底會不會根據電流feedback 修改電流ref。由於MTPA的存在，所以應該要。~~current loop~~ loop。
1. 在多個block/loop 的串連部份，function/loop output 到指定的module的變數。然後 loop 的執行&次數由 module 控制。重點就在這個 控制流程的方法。
    1. 有RTOS才能開thread，並且module變數可能有concurrency 的問題（一般 1 write, 1 read 沒有）。
    2. 如果全部有分別的timer/interrupt。function 就要放到ISR裡。
    3. 單一timer/interrupt，單一 mode 對應1 function 做流程控制。interrupt 時間為最短者(current loop)
        1. 這個做法的問題在於肯定會有 中斷嵌套(Nested Interrupt)(巢狀中斷)。原因在於position loop 的執行時間>>current loop，所以同一個ISR，如果有執行position loop，那就會被沒有的打斷。所以MCU的 timer interrupt 一定要支援 nested interrupt功能，同時還要能設定可重入（**reentrant** interrupt），才能進入同一ISR。
        2. 可以看到sandal source code `PositionControl`, `VelocityControl` 的關係，所以 source code 是用此方法 自己控制的流程的方式。
        3. 看control.c 的 `SetOptionMode()`
            ```c=5537
                    if (ControlMode.wOptionMode == VELOCITY_SENSORLESS_MODE && ControlMode.wOptionMode != wMode)
                        SetEncoderType();
                    ControlMode.wOptionMode = wMode;
                    MotorControl = MotorCtrlFuncMap[wMode];
                    SpeedCalculator = SpeedCalcFuncMap[wMode];
                    InitMotor();
                    ClearEstimatorPara();
                    if (wMode == PRESSURE_MODE || wMode == SPEEDPRESS_MODE)
            ```
            可以看到，是上位機可以透過db直接指定模式。所以code內部沒有很好trace 流向。 我要取代的也就是 `PositionControl` function
        4. 其實是有問題的，current loop優先級 肯定要 > velocity > position。否則cuurent loop會被position 卡住而時間 jitter。
        5. loop的穩定性是由最差情況決定，所以pos/vel is vel/current 的週期的倍數。 e.g. 2-->4, 2-->6
        
# 測試
實際的機器是以 ethercat 使用，所以為了完整的黑箱測試，應該也是用 ethercat。
同時，將測試寫成程式，才有辦法多個項目自動測試。完整的測試，才能保證沒有改錯。
[igh master](https://gitlab.com/etherlab.org/ethercat) 是現成的ethercat master lib，可以把驅動部份處理好。
有知道說目前controller 都是用楊鵬寫的 ethercat master driver lib。不過那一套lib 需要FPGA支持。再加上master driver lib 只是組件影響call 底層API 而非影響測試的部份。為了讓大家少花硬體錢，可能用igh master比較好。

還是要自己寫cia402 master lib的部份。寫得好了話，同一個library 可以直接拿給開發用。

# 調試
以下只是proposal，未來大段時間都會以TMDC為主要debug手段。


要定義清楚什麼是調試。 實機上會有的就是 controller（控制器） 和 drive(驅動器)。調試要做的就是 
1. 在沒有使用特別的硬體debugger 的情況下（e.g. 燒錄器）
1. 監看驅動器裡，和應用相關的資料。而非register 等級的資料


可選功能
1. 多驅動器同時監看
2. 減少接線
3. 通用性(可調試其它廠家)
4. controller 與 drive 正常工作中，同時監看資料。


目前sandal 是用 TMDC。原理上就是額外的ethernet port，透過UDP傳送自己定義的application 資料。

可以考慮，直接用ethrecat 做調試功能。大部份的應用資料在cia402都有定義。



| 項目                      | ethernet                              | ethercat                                                                                                                                                                |
| ------------------------- |:------------------------------------- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 同時監看                  | 可以，如果要簡單化，MCU要支援DHCP協定 | 可以，但是每次新增看的東西就要停下ethercat PDO bus，重設定PDO。用SDO了話，很慢(1 request 1 response)                                                                    |
| 同時監看下減少接線        | 不行，幾台driver接幾條線              | 可以，不用加任何線                                                                                                                                                      |
| controller 與調試同時動作 | 可以                                  | 1.可以，要修改controller 程式，controller 要能代理調試的要求，和分享收到的資料/ <br/> 2.使用Hub 監聽(無法要求額外資料)/<br/>3.額外的ethercat ic 專門調試，增加成本<br/> |
| 通用性                    | 不行                                  | 部分可以，只要是cia402的標準                                                                                                                                            |

整體來說，還是ethernet 介面的彈性高，但要客制化的地方就多。

# 相容性
不論是調試(TMDC)還是 API的運作。目前的路徑都是走相容路線。理論上跨 module 的資料都是用DB 模組來達成，所以至少要接上 database 模組程式 的變數。 實際上有用到相當多的全域變數，所以可能連這些變數都要想辦法接上，而且很難弄。
這個差別就像銀行ATM和現金交易，ATM 才能查得到金流。



