ODrive應用 #1 ODrive入門指南

ODrive 入門指南

硬件需求

需要準備以下硬件:

  • 一個或者兩個 無刷馬達。但是使用一個馬達加上一個編碼器也可以開始測試。

  • 一個或者兩個編碼器

  • 一個功率電阻。推薦使用50w以上的功率電阻連接到 ODrive AUX 端口。
    怎麼判斷我是否需要功率電阻? 應該選擇多大功率的功率電阻?
    如果沒有制動電阻,則ODrive會在減速期間將多餘的功率泵回電源,以達到所需的減速扭矩。如果供電電源沒有消耗掉該電源(如果不是電池供電則不會消耗),總線電壓將不可避免地升高。這有可能造成開關電源被損壞。當總線電壓過高時,ODrive的過電壓保護將會觸發,電機在慣性下自由旋轉直到停止。這種情況可能是問題,也可能不是問題,根據你的具體應用而定。

    功率電阻的功率選擇取決於你的電機設置和電機減速時產生的峯值功率或者平均減速功率。

    爲了安全起見,需要考慮電機的轉速和電機所能承受的電流。

    當以最大速度和最大電機電流制動時,功率電阻器中消耗的功率可以計算爲: P_brake = V_emf * I_motor 其中 V_emf = motor_rpm / motor_kv

  • 一個供電電源(24V ODrive 需要12V-24V,48V ODrive 需要12V-48V), 使用電池也是可以的。可參考電源選擇指南來選擇合適的電源。
    怎麼區分我的 ODrive 是24V版本還是48V版本?
    凡是2018年7月之後生產的 ODrive 都有明確的絲印標識表明板子的電壓版本。如果之前的沒有絲印標誌的可以通過ODrive上的8個灰色圓柱電容區分。 如果是470uF,則說明您使用的是24V版本; 如果是120uF,則說明您使用的是48V版本。

ODrive 接線

確保編碼器和電機之間的機械連接良好,接觸不良會導致災難性的振盪或失控

所有非電源 I/O 均爲3.3V輸出,輸入耐壓5V。

電機接線

  • 將電機線連接到ODrive螺釘端子中。 不建議使用鱷魚夾之類的夾式連接器,因爲這會引起相電阻/電感測量問題。

編碼器接線

將編碼器連接到 J4 端子。A,B相是必需的,Z(索引脈衝)是可選的。 A,B和Z線有3.3k上拉電阻,用於開漏編碼器輸出。對於具有弱驅動電流(<4mA)的單端推輓信號,您可能需要去掉 ODrive 上的上拉電阻。
ODrive all hooked up

安全的接通電源

把安全放在首位。在給ODrive通電之前考慮一下一旦上電電機立即開始旋轉會發生什麼情況。

  • 與某些設備不同,ODrive不能通過USB端口供電,因此即使僅使用USB與之通信也需要24/48伏電源輸入。USB線可以在通電之前或之後連接都可以。
  • 要接通ODrive的電源,請將電源連接到DC端子。 注意正負極。 連接時產生的小火花是正常的。 這是由電容充電引起的。

下載和安裝調試軟件odrivetool

本指南中的多處引用了名爲 odrivetool的調試軟件,因此您應該首先安裝該實用程序。

Windows

  1. 安裝 Python 3 我們推薦Anaconda發行版,因爲它包含許多有用的科學工具,但是您也可以安裝獨立的python。
  • Anaconda發行版: 從這裏下載安裝包。運行下載的文件並按照引導進行安裝。
  • 獨立的 Python: 從這裏下載安裝包。運行下載的文件並按照引導進行安裝。
  • 如果您的電腦已經安裝了Python 2 現在又安裝了 Python 3,請使用 C:\Users\YOUR_USERNAME\AppData\Local\Programs\Python\Python36-32\Scripts\pip替換掉 Python 2 中的 pip。
  1. 啓動命令提示符。
  • Anaconda發行版: 在開始菜單下輸入 Anaconda Prompt Enter
  • 獨立的 Python: 在開始菜單下輸入 cmd Enter
  1. 輸入 pip install odrive Enter,安裝odrivetool
  2. 將USB線插入ODrive上的microUSB連接器,然後將其連接到PC。
  3. 使用 Zadig 將 ODrive 的驅動程序配置爲 libusb-win32。
  • 從選項菜單中選擇“列出所有設備”,然後選擇“ ODrive 3.x本機接口(接口2)”。 在設備列表中選擇該選項,然後從目標驅動程序列表中選擇“ libusb-win32”,然後點擊“安裝驅動程序”按鈕。

OSX

我們將在 Terminal 中運行以下命令進行安裝。

  1. 首先安裝 homebrew 如果已經安裝過可以略過:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  1. 安裝 python:
brew install python
  1. 如果提示出錯: Error: python 2.7.14_2 is already installed 通過以下命令進行升級:
brew upgrade python
  1. odrive tools 需要 libusb 和 ODrive 進行通訊:
brew install libusb
  1. 使用 pip 進行 odrive tools 的安裝:
pip3 install odrive

問題排除

  1. 權限錯誤: 只需要在命令前加上sudo即可
sudo pip3 install odrive
  1. 依賴項錯誤: 如果安裝過程中出現 (Ex. “No module…” or “module_name not found”)
sudo pip3 install module_name

再次嘗試第5步

Linux

  1. 安裝 Python 3. (Ubuntu, sudo apt install python3 python3-pip)
  2. 在命令行終端中輸入sudo pip3 install odrive Enter 進行 ODrive tools 的安裝。

固件

ODrive v3.5 和更高版本

您的板子內部已經燒錄好了固件。如果運行遇到什麼問題,可以嘗試使用DFU重新燒錄固件,參考DFU固件燒錄

ODrive v3.4 和更低版本

您的板子內部沒有預先燒錄固件。 請自行使用 ST Link 進行固件燒錄,參考ST Link固件燒錄

運行 odrivetool

通過輸入odrivetool Enter,啓動odrivetool。 連接 ODrive 然後等待 odrivetool 發現它。 然後就可通過指令和 ODrive 交互。例如可以輸入 odrv0.vbus_voltage Enter 來查看當前供電電壓。
它看起來應該像這樣:

ODrive control utility v0.4.0
Please connect your ODrive.
Type help() for help.

Connected to ODrive 306A396A3235 as odrv0
In [1]: odrv0.vbus_voltage
Out[1]: 11.97055721282959

您正在查看的工具是功能齊全的Python命令提示符,因此您可以鍵入任何有效的python代碼。

更多有關odrivetool的介紹可以參考 odrivetool入門指南

配置電機 M0

請仔細閱讀本節,否則可能會造成損壞
針對平衡車輪轂電機可以參考 平衡車輪轂電機和遙控器設置指南

1. 設置極限:

怎樣設置極限?
上一個步驟我們已經啓動了 odrivetool。您可以這這裏直接輸入變量名稱進行設置。
例如,設置M0的極限電流爲10A您可以輸入: odrv0.axis0.motor.config.current_lim = 10 Enter
電機電流極限
odrv0.axis0.motor.config.current_lim [A]
出於安全原因,默認電流極限設置爲10A。 這是相當小的,但是對於確保驅動器穩定是有好處的。 配置完ODrive後,可以將其增加到60A以提高性能。 請注意,高於60A時,必須更改電流放大器的增益。 您可以通過請求不同的電流範圍來實現。 例如,對於M0上的90A:odrv0.axis0.motor.config.requested_current_range = 90 [A],然後保存配置並重新啓動,因爲僅在啓動期間將增益寫入DRV(MOSFET驅動器)。

注意: 電機電流和從電源汲取的電流通常不相同。 您不應該查看電源電流以瞭解電動機電流的狀況。
爲什麼電機電流和電源電流不同呢?
有時,電動機中的電流僅連接到電源中的電流,而有時它只是從一個相中循環出來,然後又回到另一相中。 這就是調製幅度(有時人們將其稱爲佔空比,但這有點令人困惑,因爲我們使用SVM而不是直接PWM)。 當調製幅度爲0時,在電機各相上看到的平均電壓爲0,並且電機電流永遠不會連接到電源。 當幅度爲100%時,它始終處於連接狀態;而當幅度爲50%時,它處於連接狀態的一半,而僅在電動機中循環的時間爲一半。
對調製幅度的最大影響是轉速。 還有其他一些較小的因素,但總的來說:如果電機仍然靜止,則電動機上的50A電流由電源上的5A電流並非沒有道理。 當電動機旋轉至接近最高轉速時,電源電流和電機電流將彼此接近。
電機轉速極限
odrv0.axis0.controller.config.vel_limit [counts/s]。
電機將被限制爲該速度。 同樣,默認值很慢。

校準電流
您可以將odrv0.axis0.motor.config.calibration_current [A] 更改爲您感到合適的最大值,以便在電機靜止時連續通過電機運行。 如果您使用的是小型電機(即15A額定電流),則可能需要將calibration_current減小到小於默認值。

2. 設置其他硬件參數

odrv0.config.brake_resistance [Ohm]
這是制動電阻器的電阻。 如果您不使用它,則可以將其設置爲0。 請注意,您的接線和螺釘端子中可能會有一些額外的電阻,因此,如果在制動時遇到問題,則可能需要將此參數在制動電阻阻值的基礎上增加約0.05歐姆。

odrv0.axis0.motor.config.pole_pairs
這是轉子中的磁極數除以二。 您可以簡單地數一下轉子中的永磁體(如果可以看到的話)的數量。
注意: 不是定子中的線圈的數量
如果看不到它們,請嘗試用手拿着一塊磁鐵在轉子上滑動,並計算其停止的次數。 這將是磁極對數。 如果使用磁性金屬片而非磁鐵,則會得到磁極數

odrv0.axis0.motor.config.motor_type
這是使用的電機類型。 當前支持兩種類型的電機:大電流電機(MOTOR_TYPE_HIGH_CURRENT)和雲臺電機(MOTOR_TYPE_GIMBAL)。
我該選擇哪種電機類型
如果您使用的是常規的無刷電機類似這種,您應該設置電機類型爲 MOTOR_TYPE_HIGH_CURRENT。對於小電流的雲臺用無刷電機類似這種 ,您應該設置電機類型爲 MOTOR_TYPE_GIMBAL。不要把非小電流雲臺電機配置爲MOTOR_TYPE_GIMBAL ,這樣可能會使電機或ODrive過熱。
更多細節:
如果100毫安的電流噪聲對您來說“很小”,則可以選擇MOTOR_TYPE_HIGH_CURRENT
如果100毫安的電流噪聲對您來說“很大”,並且您的應用不需要電機快速旋轉(Ω* L << R),並且電機的電阻相當大(1 ohm或更大),則可以 選擇了MOTOR_TYPE_GIMBAL
如果100毫安的電流噪聲對您來說“很大”,並且您的應用需要電機高速旋轉,則需要更換ODrive上的電流採樣電阻爲更大值,使之能採集到相對較低的電流。
注意: 使用雲臺電機時,current_limcalibration_current實際上是“電壓極限”和“校準電壓”,因爲我們不使用電流反饋。 這意味着如果將其設置爲10,則這個參數將被設置爲10V

如果使用編碼器
odrv0.axis0.encoder.config.cpr: 編碼器每轉計數 [CPR]
這是每轉產生的脈衝數(PPR)值的4倍。 通常,這在編碼器的手冊中會有說明。

如果不使用編碼器

3. 保存配置

您可以將所有帶有 .config 的參數保存到ODrive FLASH中,以便ODrive在重啓後配置的參數仍然有效。

  • odrv0.save_configuration() Enter.

基於已知問題,強烈建議您在每次保存配置後使用odrv0.reboot()重新啓動。

M0 的位置控制

讓電機0啓動並運行。 電機1的操作步驟完全相同,因此請在axis0的地方替換axis1即可。

  1. 輸入 odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE Enter。大約2秒鐘後,應聽到嗶聲。 然後,電動機將在一個方向上緩慢旋轉幾秒鐘,然後在另一方向上緩慢旋轉。
    這有什麼意義?
    內部程序首先測量電機的電氣特性(即電機相電阻和相電感),然後測量電機的電氣相位與編碼器位置之間的偏移量。此視頻演示了此過程。
    注意:在啓動過程中,必須允許轉子旋轉而且不能有偏載。 這意味着載荷均勻和較弱的摩擦載荷纔行,但是重載或類似彈簧載荷不行。 另請注意,在視頻中,電動機在初始化後會旋轉,但是在當前軟件中,默認行爲並非如此
    無法正常工作?
    檢查編碼器接線,並確保編碼器已牢固連接至電機。 檢查dump_errors(odrv0) 然後參考故障排除查看具體的錯誤信息。一旦理解了錯誤並解決了問題,就可以執行dump_errors(odrv0, True) Enter來清除錯誤,然後重試即可。

  2. 輸入 odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL Enter。此時 ODrive 將保持電機轉子的位置。如果用手去扭動電機軸,電機會試圖阻止轉子被扭動,您可以通過調高odrv0.axis0.motor.config.current_lim,這樣電機將能提供更大的扭力去對抗您的旋轉。如果電機進入閉環運行後馬上開始抖動,或在您用手去扭動電機軸後開始抖動,您需要 降低控制器增益

  3. 向電動機發送新的位置設定值。odrv0.axis0.controller.pos_setpoint = 10000 Enter。單位爲編碼器計數。

  4. 此時您可能想要更好的調整控制器參數,使系統發揮出更高的性能。

其他控制方式

默認控制模式是絕對編碼器位置控制。您可能會希望使用軌跡控制模式,或者您希望使用環形位置控制模式,以此達到持續向一個方向旋轉而不需要持續增大位置的設定值。

您也許希望使用速度控制模式(直接設置轉速或者使用速度爬升機制使轉速以設定加速度達到設定轉速).

您也可以直接控制電機電流,電機電流與轉矩成比例。

軌跡控制

在位置控制模式下,使用move_to_posmove_incremental函數。 有關詳細信息,請參見“用法”部分。
此模式使您可以平滑地使電機從一個位置加速,勻速和減速到另一位置。 使用位置控制時,控制器只是試圖儘可能快地到達設定點。 使用軌跡可以使您更靈活地調整反饋增益,以消除干擾,同時保持平穩的運動。
TrapTrajPosVel
在上圖中,藍色是位置,橙色是速度。

參數

<odrv>.<axis>.trap_traj.config.vel_limit = <Float>
<odrv>.<axis>.trap_traj.config.accel_limit = <Float>
<odrv>.<axis>.trap_traj.config.decel_limit = <Float>
<odrv>.<axis>.trap_traj.config.A_per_css = <Float>

vel_limit 最大速度,也表示勻速階段的轉速
accel_limit 最大加速度,以[counts / sec^2]爲單位
decel_limit 最大反向加速度,以[counts / sec^2]爲單位
A_per_css 此項參數和加減速、電機電流相關。默認爲0。此項參數是可選的,可以通過調整此項參數來改善系統的響應。. 請記住,此參數和系統的負載、質量有關。

所有值都應嚴格爲正數(> = 0)。

請記住,您仍然必須像以前一樣設置極限值。 我建議您將這些值設置爲比計劃值稍高(> 10%),以賦予控制器足夠的控制權。

<odrv>.<axis>.motor.config.current_lim = <Float>
<odrv>.<axis>.controller.config.vel_limit = <Float>

用法

使用move_to_pos函數移動到絕對位置:

<odrv>.<axis>.controller.move_to_pos(設置的絕對位置)

使用move_incremental函數移動到相對位置。
要相對於當前實際位置設置目標位置,請使用from_goal_point = False
要設置相對於先前目標位置的目標位置,請使用from_goal_point = True

<odrv>.<axis>.controller.move_incremental(pos_increment, from_goal_point)

您也可以使用ascii命令來控制電機的位置。

環形位置控制

要啓用環形位置控制,請設置axis.controller.config.setpoints_in_cpr = True

此模式對於連續的增量位置移動很有用。 例如,機器人會無限期滾動,或者擠出機馬達或傳送帶會以受控的增量無限期地移動。
在常規位置模式下,pos_setpoint將增長到非常大的值,並且由於浮點舍入而失去精度。

在這種模式下,控制器將嘗試僅在電動機旋轉一圈之內跟蹤位置。 具體而言,pos_setpoint的範圍應爲[0,cpr-1],其中cpr是一圈編碼器計數值。 如果pos_setpoint增加到該範圍之外(例如通過step / dir輸入),則會自動將其約束到[0,cpr-1]範圍內。注意:在此模式下,將使用encoder.pos_cpr 作爲位置位置反饋,而非encoder.pos_estimate

如果嘗試以超過cpr/2步的大步幅增加位置,則電機將以相反的方向旋轉至相同角度。當輸入控制量干擾很大時,也會出現這種情況。 如果您有一個需要處理較大步幅的應用程序,則可以使用虛擬CPR,該虛擬CPR是編碼器實際CPR的整數倍。 設置encoder.config.cpr = N * your_enc_cpr,其中N是一些整數。 選擇合適的N爲您的應用提供合適的位置設置範圍。

速度控制

設置 axis.controller.config.control_mode = CTRL_MODE_VELOCITY_CONTROL

現在,您可以使用 axis.controller.vel_setpoint = 5000 [count/s] 控制轉速。

速度爬升控制

設置 axis.controller.config.control_mode = CTRL_MODE_VELOCITY_CONTROL

設置速度爬升速率 (絕對加速度): axis.controller.config.vel_ramp_rate = 2000 [counts/s^2]
啓動速度爬升模式: axis.controller.vel_ramp_enable = True
現在,您可以使用 axis.controller.vel_ramp_target = 5000 [count/s] 控制轉速。

電流控制

設置 axis.controller.config.control_mode = CTRL_MODE_CURRENT_CONTROL
現在,您可以使用axis.controller.current_setpoint = 3 [A] 來控制電機電流。

注意: 在電流控制模式下沒有速度限制。 確保您不要使電機過載或超過編碼器的最大速度。

看門狗定時器

每個axis都有一個可配置的看門狗定時器,如果與ODrive的控制連接中斷,則可以使電機停止。

每個axis都有一個可配置的看門狗超時:axis.config.watchdog_timeout,以秒爲單位。 值設置爲0禁用看門狗功能。 大於0的值看門狗將啓動,如果沒有在設置的時間間隔內餵狗,電機將停止。

使用 axis.watchdog_feed() 來爲每個axis餵狗。

下一步該幹什麼?

現在您可以:

如果您有任何問題或疑問,歡迎您加入ODrive社區或QQ羣 851421965 進行交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章