日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

開始上手SimpleFOClibrary

 beginnow1 2022-05-24 發(fā)布于廣東

安裝完整的 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ù)例程。

 電腦終端克隆

  • 打開電腦終端并運(yùn)行下列代碼:

    cd #arduino 庫(kù)文件夾git clone https://github.com/simplefoc/Arduino-FOC.git
  • 重新打開Arduino IDE,就能在 File > Examples > Simple FOC中看到庫(kù)例程。

安裝好 SimpleFOClibrary ,準(zhǔn)備好所有必須的 硬件 后, 我們就要開始了解驅(qū)動(dòng)電機(jī)的Arduino代碼。以下是編寫程序時(shí)的所有重要步驟。

第0步 include庫(kù)

在開始前,先include庫(kù)中的頭文件:

#include <SimpleFOC.h>

步驟1 設(shè)置位置傳感器

編寫程序的第一步是初始化和配置位置傳感器。 該庫(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)與定義如下:
  • chip_select 引腳: 10

  • 傳感器總 CPR(每圈脈沖數(shù)): CPR = 2^14bit =16384

  • angle SPI 寄存器: 0x3FFF

執(zhí)行 sensor.init(),初始化傳感器硬件引腳

完整的設(shè)置和參數(shù)配置文件,請(qǐng)?jiān)L問(wèn) 位置傳感器 docs 。

步驟2 設(shè)置驅(qū)動(dòng)器

配置好位置傳感器后,我們開始初始化和配置驅(qū)動(dòng)器。該庫(kù)支持由類BLDCDriver3PWM 和 BLDCDriver6PWM 控制的無(wú)刷直流電機(jī)驅(qū)動(dòng)器以及由類StepperDriver4PWM 控制的步進(jìn)電機(jī)驅(qū)動(dòng)器。

BLDCDriver3PWM的實(shí)例化需要以下參數(shù) :

  • AB 和 C 相對(duì)應(yīng)的引腳編號(hào)

  • enable 的引腳編號(hào) (可選)

例如:

#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 。

步驟3 設(shè)置電流檢測(cè)

配置好位置傳感器及驅(qū)動(dòng)器后,如果驅(qū)動(dòng)器支持電流檢測(cè)的話,就要初始化和配置電流檢測(cè)。如果不支持的話,可以跳過(guò)這一步。 該庫(kù)暫時(shí)僅支持在線電流檢測(cè) InlineCurrentSense這一種電流檢測(cè)方式。

InlineCurrentSense 的實(shí)例化需要以下參數(shù):

  • 采樣電阻的阻值 shunt_resistance

  • 放大增益 gain

  • A, B (以及可選C)相對(duì)應(yīng)的引腳編號(hào)

例如:

#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 。

步驟4 設(shè)置電機(jī)

配置好位置傳感器及驅(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(&current_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 .

步驟5 FOC 例程及實(shí)時(shí)位置控制

在初始化位置傳感器、驅(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) 。

  • motor.loopFOC():FOC 算法執(zhí)行——應(yīng)該盡可能快地被執(zhí)行 ,頻率> 1kHz。

  • motor.move(target): 位置控制例程——取決于motor.controller 參數(shù)。

下面是其在代碼中的呈現(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 。

步驟6 監(jiān)測(cè) 

類 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。

步驟7  命令接口

最后,為了配置控制算法,設(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

步驟8 分步使用教程

現(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 中找到完整文檔。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多