安裝完整的 SimpleFOClibrary 通過(guò)Arduino Library Manager安裝最簡(jiǎn)單的方式是直接通過(guò) Arduino IDE 中的 Arduino Library Manager 獲取庫(kù)。 
打開Arduino IDE, 點(diǎn)擊 Tools > Manage Libraries... ,啟動(dòng) Arduino Library Manager。 搜索 “Simple FOC” 庫(kù)并安裝 最新版本 . 重新打開Arduino IDE,就能在 File > Examples > Simple FOC 中看到庫(kù)例程。
通過(guò)Github安裝如果你更傾向于從github倉(cāng)庫(kù)直接下載庫(kù),請(qǐng)看以下指引。 壓縮包下載進(jìn)入 main 。 首先點(diǎn)擊 Clone or Download > Download ZIP 解壓下載的壓縮包到Arduino Libraries 文件夾( 文件夾路徑 Windows: Documents > Arduino > libraries 重新打開Arduino IDE,就能在 File > Examples > Simple FOC 中看到庫(kù)例程。
電腦終端克隆安裝好 SimpleFOClibrary ,準(zhǔn)備好所有必須的 硬件 后, 我們就要開始了解驅(qū)動(dòng)電機(jī)的Arduino代碼。以下是編寫程序時(shí)的所有重要步驟。 第0步 include庫(kù)在開始前,先include庫(kù)中的頭文件: 編寫程序的第一步是初始化和配置位置傳感器。 該庫(kù)支持以下位置傳感器: 編碼器: 支持光學(xué)、電容式、磁編碼器 (ABI方式) 磁性傳感器: 支持SPI, I2C, PWM以及Analog (模擬輸出) 霍爾傳感器: 3x霍爾探頭, 磁性傳感器 (UVW 接口)
選擇恰當(dāng)?shù)奈恢脗鞲衅鬟\(yùn)行以下例程: 磁性傳感器 編碼器 #include <SimpleFOC.h>// SPI 例程// MagneticSensorSPI(int cs芯片選擇引腳, float bit_resolution傳感器分辨率, int angle_register角度讀取寄存器)MagneticSensorSPI sensor = MagneticSensorSPI(10, 14, 0x3FFF);void setup() {
// 初始化磁傳感器硬件
sensor.init();}void loop() {} 在例程中,我們使用了14 位磁性傳感器進(jìn)行設(shè)置,比如: AS5047u, 并將其與引腳 10 連接。 磁性傳感器使用SPI方式通訊,在類 MagneticSensorSPI 中的實(shí)現(xiàn)與定義如下: 執(zhí)行 sensor.init() ,初始化傳感器硬件引腳 完整的設(shè)置和參數(shù)配置文件,請(qǐng)?jiān)L問(wèn) 位置傳感器 docs 。 配置好位置傳感器后,我們開始初始化和配置驅(qū)動(dòng)器。該庫(kù)支持由類BLDCDriver3PWM 和 BLDCDriver6PWM 控制的無(wú)刷直流電機(jī)驅(qū)動(dòng)器以及由類StepperDriver4PWM 控制的步進(jìn)電機(jī)驅(qū)動(dòng)器。 類BLDCDriver3PWM 的實(shí)例化需要以下參數(shù) : 例如: #include <SimpleFOC.h>// BLDCDriver3PWM( pin_pwmA, pin_pwmB, pin_pwmC, enable使能引腳(可選的))BLDCDriver3PWM driver = BLDCDriver3PWM(9, 5, 6, 8);// 實(shí)例化傳感器void setup() {
// 初始化傳感器
// 電源電壓
driver.voltage_power_supply = 12;
// 初始化驅(qū)動(dòng)器
driver.init();}void loop() {} 完整的設(shè)置和參數(shù)配置文件,請(qǐng)?jiān)L問(wèn) 驅(qū)動(dòng)器 docs 。 配置好位置傳感器及驅(qū)動(dòng)器后,如果驅(qū)動(dòng)器支持電流檢測(cè)的話,就要初始化和配置電流檢測(cè)。如果不支持的話,可以跳過(guò)這一步。 該庫(kù)暫時(shí)僅支持在線電流檢測(cè) InlineCurrentSense 這一種電流檢測(cè)方式。 類InlineCurrentSense 的實(shí)例化需要以下參數(shù): 例如: #include <SimpleFOC.h>// 實(shí)例化驅(qū)動(dòng)器// 實(shí)例化傳感器// InlineCurrentSense(shunt_resistance分流電阻, gain增益, adc_a, adc_b)InlineCurrentSense current_sense = InlineCurrentSense(0.01, 50, A0, A2);void setup() {
// 初始化傳感器
// 初始化驅(qū)動(dòng)器
// 初始化電流檢測(cè)
current_sense.init();}void loop() {} 完整的設(shè)置和參數(shù)配置文件,請(qǐng)?jiān)L問(wèn) 電流檢測(cè) docs 。 配置好位置傳感器及驅(qū)動(dòng)器后,我們開始初始化和配置電機(jī)。 該庫(kù)支持由 BLDCMotor 類控制的無(wú)刷直流電機(jī)以及由 StepperMotor 類控制的步進(jìn)電機(jī)。僅需填入電機(jī)極對(duì)數(shù)就能實(shí)現(xiàn)這兩個(gè)類的控制。 // StepperMotor(int pole_pairs極對(duì)數(shù))StepperMotor motor = StepperMotor(50); // BLDCMotor(int pole_pairs極對(duì)數(shù))BLDCMotor motor = BLDCMotor(11); 在這一例程,我們使用了無(wú)刷直流電機(jī): #include <SimpleFOC.h>// BLDCMotor( int pole_pairs極對(duì)數(shù) )BLDCMotor motor = BLDCMotor( 11);
// 實(shí)例化驅(qū)動(dòng)器// 實(shí)例化傳感器 // 實(shí)例化電流檢測(cè) void setup() {
// 初始化傳感器
// 連接電機(jī)和傳感器
motor.linkSensor(&sensor);
// 初始化驅(qū)動(dòng)器
// 連接電機(jī)和驅(qū)動(dòng)器
motor.linkDriver(&driver);
// 初始化電流檢測(cè)
// 連接其至電機(jī)
motor.linkCurrentSense(¤t_sese);
// 設(shè)置控制環(huán)類型
motor.controller = MotionControlType::velocity;
// 初始化電機(jī)
motor.init();}void loop() {} 在 創(chuàng)建motor 實(shí)例后,我們需要用motor.linkSensor() 連接傳感器,用 motor.linkDriver() 連接驅(qū)動(dòng)器。 下一步是配置電機(jī)。在這個(gè)配置例子中,我們僅用到了運(yùn)動(dòng)控制: // 設(shè)置控制環(huán)類型motor.controller = MotionControlType::velocity; 最后,我們執(zhí)行 motor.init() 函數(shù),完成電機(jī) motor 的設(shè)置。 完整的設(shè)置和參數(shù)配置文件,請(qǐng)?jiān)L問(wèn) 電機(jī) docs . 在初始化位置傳感器、驅(qū)動(dòng)器和電機(jī)之后,在運(yùn)行FOC算法之前,我們需要校準(zhǔn)電機(jī)和傳感器。這個(gè)過(guò)程被稱為 motor.initFOC() . 在這一步之后,我們將擁有一個(gè)能夠正常工作的位置傳感器以及配置好的電機(jī),我們的FOC算法就可以基于位置傳感器的測(cè)量設(shè)定合適的電壓。 在FOC算法的實(shí)時(shí)運(yùn)行時(shí),我們需要在Arduino loop() 中添加函數(shù) motor.loopFOC() 和 motor.move(target) 。 下面是其在代碼中的呈現(xiàn): #include <SimpleFOC.h>// 實(shí)例化電機(jī)// 實(shí)例化驅(qū)動(dòng)器// 實(shí)例化傳感器// 實(shí)例化電流檢測(cè)void setup() {
// 初始化傳感器
// 連接電機(jī)和傳感器
// 初始化驅(qū)動(dòng)器
// 連接電機(jī)和驅(qū)動(dòng)器
// 初始化電流檢測(cè)
// 連接電機(jī)和電流檢測(cè)
// 配置電機(jī)
// 初始化電機(jī)
// 校準(zhǔn)編碼器,啟用FOC
motor.initFOC();}void loop() {
// FOC算法函數(shù)
motor.loopFOC();
// 速度控制環(huán)函數(shù)
// 設(shè)置目標(biāo)速度或2rad/s
motor.move(2);} 無(wú)刷直流電機(jī)完整的設(shè)置和參數(shù)配置文件,請(qǐng)?jiān)L問(wèn) 無(wú)刷直流電機(jī) docs , 步進(jìn)電機(jī)的完整文件,請(qǐng)?jiān)L問(wèn) 步進(jìn)電機(jī) docs 。 類 BLDCMotor 和 StepperMotor 提供監(jiān)測(cè)函數(shù)。為了實(shí)現(xiàn)檢測(cè),你需要確保motor.useMonitoring() 調(diào)用了你想要輸出的串口實(shí)例 Serial 在 motor.init() 和 motor.initFOC() 的運(yùn)行過(guò)程中,類 Serial 將輸出電機(jī)初始化狀態(tài)。 如果你希望實(shí)時(shí)輸出電機(jī)狀態(tài)變量(這樣會(huì)影響它的性能——串口輸出的速度會(huì)很慢!),你可以在 Arduinoloop() 中添加函數(shù)motor.monitor() #include <SimpleFOC.h>// 實(shí)例化電機(jī)// 實(shí)例化驅(qū)動(dòng)器// 實(shí)例化傳感器void setup() {
// 初始化傳感器
// 連接電機(jī)和傳感器
// 初始化驅(qū)動(dòng)器
// 連接電機(jī)和驅(qū)動(dòng)器
// 初始化電流檢測(cè)
// 連接電機(jī)和電流檢測(cè)
// 監(jiān)視無(wú)刷直流電機(jī)
Serial.begin(115200);
// 監(jiān)視點(diǎn)
motor.useMonitoring(Serial);
// 配置電機(jī)
// 初始化電機(jī)
// 校準(zhǔn)編碼器,啟用FOC}void loop() {
// 執(zhí)行FOC
// 運(yùn)動(dòng)控制環(huán)
// 監(jiān)視函數(shù)向串行終端輸出電機(jī)變量的監(jiān)控
motor.monitor();} 完整的設(shè)置和參數(shù)配置文件,請(qǐng)?jiān)L問(wèn) 監(jiān)測(cè) docs。 最后,為了配置控制算法,設(shè)定目標(biāo)值,以用戶友好的方式獲得狀態(tài)變量(不只是像使用motor.monitor() 那樣的轉(zhuǎn)儲(chǔ))。Arduino SimpleFOC庫(kù) 為你提供像通信接口一樣的 G 代碼,組成類 Commander 。 以下代碼是用戶使用接口進(jìn)行通信的基礎(chǔ)實(shí)現(xiàn): #include <SimpleFOC.h>// 實(shí)例化電機(jī)// 實(shí)例化傳感器// commander實(shí)例化Commander commander = Commander(Serial);void doMotor(char* cmd){commander.motor(&motor, cmd);}void setup() {
// 初始化傳感器
// 連接電機(jī)和傳感器
// 初始化驅(qū)動(dòng)器
// 連接電機(jī)和驅(qū)動(dòng)器
// 初始化電流檢測(cè)
// 連接電機(jī)和電流檢測(cè)
// 啟用監(jiān)視器
// 訂閱電機(jī)至commands
commander.add('M',doMotor,"motor");
// 初始化電機(jī)
// 校準(zhǔn)編碼器,啟用FOC}void loop() {
// 執(zhí)行FOC
// 運(yùn)動(dòng)控制環(huán)
// 電機(jī)變量
// 讀取用戶命令
commander.run();} 完整的設(shè)置和參數(shù)配置文件,請(qǐng)?jiān)L問(wèn) 通信 docs。 現(xiàn)在你應(yīng)該已經(jīng)熟悉SimpleFOClibrary的代碼框架并且能夠開始編寫自己的應(yīng)用程序了。為了使這一過(guò)程更加簡(jiǎn)單易懂,我們?yōu)槟闾峁┝嗽敿?xì)的分步使用教程以確保你能夠在初次接觸這個(gè)庫(kù)時(shí)一步一步的順利進(jìn)行。 ?? 完整的Arduino代碼例程現(xiàn)在你已經(jīng)學(xué)習(xí)完Arduino項(xiàng)目的所有部分了,這是一些額外配置的完整代碼例程,請(qǐng)瀏覽這些代碼以便更好地將先前介紹的所有部分內(nèi)容融會(huì)貫通。這就是該庫(kù)的代碼例程: motor_full_control_serial_examples/magnetic_sensor/full_control_serial.ino 。 #include <SimpleFOC.h>// 磁傳感器實(shí)例 - SPIMagneticSensorSPI sensor = MagneticSensorSPI(AS5147_SPI, 10);// 無(wú)刷直流電機(jī)及驅(qū)動(dòng)器實(shí)例BLDCMotor motor = BLDCMotor(11);BLDCDriver3PWM driver = BLDCDriver3PWM(9, 5, 6, 8);// commander接口Commander command = Commander(Serial);void onMotor(char* cmd){ command.motor(&motor, cmd); }void setup() {
// 初始化磁傳感器硬件
sensor.init();
// 連接電機(jī)和傳感器
motor.linkSensor(&sensor);
// 配置驅(qū)動(dòng)器
// 電源電壓 [V]
driver.voltage_power_supply = 12;
driver.init();
// 連接驅(qū)動(dòng)器
motor.linkDriver(&driver);
// 設(shè)置控制環(huán)類型
motor.controller = MotionControlType::torque;
// 基于控制環(huán)類型配置控制器
motor.PID_velocity.P = 0.2;
motor.PID_velocity.I = 20;
motor.PID_velocity.D = 0;
// 默認(rèn)為電源電壓
motor.voltage_limit = 12;
// 速度低通濾波時(shí)間常數(shù)
motor.LPF_velocity.Tf = 0.01;
// 角度環(huán)控制器
motor.P_angle.P = 20;
// 角度環(huán)速度限制
motor.velocity_limit = 50;
// 使用串口監(jiān)視電機(jī)初始化
// 監(jiān)視點(diǎn)
Serial.begin(115200);
// 如果不需要,可以注釋掉此行
motor.useMonitoring(Serial);
// 初始化電機(jī)
motor.init();
// 校準(zhǔn)編碼器,啟用FOC
motor.initFOC();
// 設(shè)置初始目標(biāo)值
motor.target = 2;
// 定義電機(jī) id
command.add('A', onMotor, "motor");
// 運(yùn)行用戶命令配置電機(jī)(完整命令列表見docs.)
Serial.println(F("Motor commands sketch | Initial motion control > torque/voltage : target 2V."));
_delay(1000);}void loop() {
// 迭代設(shè)置FOC相電壓
motor.loopFOC();
// 設(shè)置外部環(huán)目標(biāo)的迭代函數(shù)
// 速度,位置或電壓
// 如果在參數(shù)中未設(shè)置目標(biāo),則使用電機(jī)目標(biāo)變量
motor.move();
// 用戶通信
command.run();} 開源代碼庫(kù)對(duì)擴(kuò)展和調(diào)整SimpleFOClibrary源代碼有興趣的朋友,可以在 SimpleFOClibrary 源代碼 docs 中找到完整文檔。
|