本文參(zhao)考(chao)至官方文檔https://docs.simplefoc.com/docs_chinese/monitoring
引言
在使用Simple FOC控制電機的過程中,尤其是對電機進行調試的時候,我們常常希望能在初始化和校准過程中顯示電機的狀態以及實時了解到電機每時每刻的狀態參數。當然,強大的Simple FOC庫早已為我們准備好了一切,那就是今天的主角(划重點):監控功能和Commander接口。Simplefoc庫實現了一個簡單的通信方案,借此,我們可以快速方便地對所設置的參數進行測試、調試和監控。在使用官方的SimpleFOCStudio(推薦新手使用,中文版戳這SimpleFOCStudio中文版)圖形化傻瓜式調參以及監控電機之余,我們不妨來深入了解一下這套通信方式~既能增長知識,還能方便我們二次開發。
監控功能
BLDCMotor 和 StepperMotor 類支持使用 Serial 進行監控:
motor.useMonitoring(Serial);
監控有兩個主要目標:
監控電機初始化過程
初始化motor.init() 和校准過程 motor.initFOC()期間,電機將向串口輸出其狀態。啟用此功能不會直接影響實時性能,因為在 motor.loopFOC() 和motor.move()函數中沒有預定義的實時循環監控。
這是一個電機正常初始化監控輸出實例:
MOT: Monitor enabled!
MOT: Init
MOT: Enable driver.
MOT: Align sensor.
MOT: sensor direction==CW
MOT: PP check: OK!
MOT: Zero elec. angle: 4.28
MOT: Align current sense.
MOT: Success: 2
MOT: Ready.
位置傳感器導致電機初始化失敗:
MOT: Monitor enabled!
MOT: Init
MOT: Enable driver.
MOT: Align sensor.
MOT: Failed to notice movement
MOT: Init FOC failed.
以及電流傳感導致的電機初始化失敗:
MOT: Monitor enabled!
MOT: Init
MOT: Enable driver.
MOT: Align sensor.
MOT: sensor direction==CW
MOT: PP check: OK!
MOT: Zero elec. angle: 4.28
MOT: Align current sense.
MOT: Fail!
MOT: Init FOC failed.
電機變量實時監控
監控的第二個作用是實時標簽分離輸出電機變量到串行終端。它是啟用的,包括這行循環函數:
監控的第二個作用是將電機變量實時以選項卡分隔的方式輸出到串行終端。 在loop()中執行以下函數來啟動:
motor.monitor()
監控功能可輸出7種不同的電機具體變量::
target- 當前目標值,具體到所使用的運動控制(電流、電壓、速度或位置)voltage.q- 設置 電壓分量qvoltage.d- 設置電壓分量dcurrent.q- 電流分量q的測量值(如果電流傳感可用)current.d- 電流分量d的測量值(如果電流傳感可用)shaft_velocity- 電機速度shaft_angle- 電機位置
設置監視的首選值,可以在setup() 函數中更改 motor.monitoring_variables 參數。
motor.monitor_variables = _MON_TARGET | _MON_VEL | _MON_ANGLE; // 默認 _MON_TARGET | _MON_VOLT_Q | _MON_VEL | _MON_ANGLE
默認情況下,監控的變量為 target,voltage.q,velocity,angle。該參數是一個7bit值,其中每個位代表 bool 標志信號,來表示變量應該輸出 (1) 還是不輸出 (0),。因此,我們定義了一組幫助監控常量,可以組合起來更容易地處理監控:
#define _MON_TARGET 0b1000000 // 監視器目標值
#define _MON_VOLT_Q 0b0100000 // 監視器電壓q值
#define _MON_VOLT_D 0b0010000 // 監視器電壓d值
#define _MON_CURR_Q 0b0001000 // 監視器電流q值 - 如有測量
#define _MON_CURR_D 0b0000100 // 監視器電流d值 - 如有測量
#define _MON_VEL 0b0000010 // 監視器速度值
#define _MON_ANGLE 0b0000001 // 監視器角度值
此外,使用motor.monitor() 函數輸出實時執行變量在許多情況下會對電機性能產生負面影響,因此,應該盡可能減少對該函數的調用,特別是在低波特率時輸出很多變量。你可以通過參數motor.monitor_downsample來設置:
// 降采樣
motor.monitor_downsample = 100; // 默認為10
這個變量告訴 motor.monitor() 直到計數到monitor_downsample時才將變量輸出到串行。也就是說每到一次monitor_downsample循環才會輸出一次變量。
下面是一個完整的配置代碼實例:
...
void setup(){
...
Serial.begin(115200); // 越高越好
motor.useMonitoring(Serial);
//顯示變量
motor.monitor_variables = _MON_TARGET | _MON_VEL | _MON_ANGLE;
// 下采樣
motor.monitor_downsample = 100; // 默認為10
...
}
void loop(){
....
motor.monitor();
}
實時監控功能主要用於實時可視化,特別適用於Arduino IDE的Serial Plotter

或者在 Serial Terminal
...
voltage,target,velocity
1.17 2.00 2.29
1.23 2.00 1.96
1.30 2.00 1.65
1.28 2.00 1.80
1.20 2.00 2.20
1.07 2.00 2.70
0.91 2.00 3.22
0.69 2.00 3.74
0.40 2.00 4.34
0.18 2.00 4.57
0.09 2.00 4.38
0.06 2.00 4.04
0.08 2.00 3.58
0.11 2.00 3.14
0.18 2.00 2.65
0.27 2.00 2.13
0.37 2.00 1.65
0.47 2.00 1.26
0.55 2.00 0.99
0.64 2.00 0.77
0.71 2.00 0.67
...
執行時間障礙
這個方法的目的是在主循環函數中順着loopFOC()和 move()函數調用。因此, motor.monitor()將會影響執行性能,降低FOC算法的采樣頻率,因此在運行代碼時要考慮這個因素。
自定義串行終端監控
如果希望實現自己的監控功能或只是將電機變量輸出到Serial串行終端,這里有BLDCMotor和StepperMotor 類的公共變量,可以隨時訪問。
// 電流目標值
float target;
// 當前電機角度
float shaft_angle;
// 當前電機速度
float shaft_velocity;
// 當前目標速度
float shaft_velocity_sp;
// 當前目標角度
float shaft_angle_sp;
// 當前設置的電機電壓 (voltage.q, voltage.d)
DQVoltage_s voltage;
// 當前電機電流 (current.q, current.d) - 如有測量
DQCurrent_s current;
// 相電壓
float Ua, Ub, Uc;
在此之前可以通過添加motor來訪問這些變量中的任何一個。例如:
Serial.println(motor.shaft_angle);// 打印當前電機位置至串口終端
// 或者
Serial.println(motor.Ua); // 打印相電壓Ua至串口終端
監視只能在一個方向上工作,並且假設它實現用戶通信。
使用電機命令實時用戶通信
為了在用戶和電機之間進行雙向通信, Arduino SimpleFOC庫 為你提供了 電機命令接口。
