ODrive乾貨 #4 電機配置實例(9235-100KV + TLE5012B-E1000)
以下內容將詳細介紹使用 ODrive 驅動無刷電機的過程,如果您的硬件和本文中所使用的一樣的話,配置參數按照本文中的配置即可達到同樣的效果,如果硬件使用有所不同,個別參數需要您適當調整。
文章目錄
1 硬件介紹
-
ODrive
- 硬件版本:ODrive v3.6 56v電壓版本
- 固件版本:v3.6-56V fw-v0.4.11
購買鏈接:淘寶鏈接
-
無刷電機
恆力源 9235-100KV 外轉子無刷電機
-
KV(RPM/V): 100
-
LiPo Cells: 8~12s
-
Max Power: 2800W
-
Max Amps: 57A
-
No Load Current: 1.0A @ 10v
-
Internal Resistance: 0.055ohm
-
Dimensions(Dia.xL): 92 x 39mm
-
Motor Shaft: 3mm
-
Prop Shaft: 33mm hole to hole for bolt through style props
-
Weight: 674g (each)
購買鏈接:HobbyKing
-
-
編碼器
編碼器採用英飛凌 TLE5012B-E1000 磁編碼器(ABI接口) + 6mm徑向磁鐵
購買鏈接:淘寶鏈接
2 硬件連接
電機 U V W 三根線接入 ODrive M0 電機接口,線序無要求,如果電機調試完畢後想要反轉電機旋轉方向可以通過任意對調其中兩根線即可。注意:對調後需要重新校準編碼器,並保存參數
將編碼器插入 ODrive M0 編碼器接口,板上絲印 J4 排母處
將制動電阻接入 ODrive AUX 接口,線序無要求。提示:制動電阻也可不接
3 配置參數
3.1 基本配置
odrv0.config.brake_resistance = 2.0
配置制動電阻阻值,我們使用的的制動電阻阻值爲 2 Ohm,如果不接制動電阻或不想使用制動電阻功能將此屬性配置爲 0 即可
odrv0.config.dc_bus_undervoltage_trip_level = 8
配置電源電壓低壓保護閾值,當電源電壓低於 8v 時將停止電機並報錯,注意:8v 爲極限值建議根據自己所使用的供電更精確的配置以更好地保護 ODrive 主板
odrv0.config.dc_bus_overvoltage_trip_level = 56
配置電源電壓過壓保護閾值,當電源電壓高於 56v 時將停止電機並報錯,注意:56v 爲極限值建議根據自己所使用的供電更精確的配置以更好地保護 ODrive 主板
3.2 電機配置
odrv0.axis0.motor.config.pole_pairs = 20
配置電機極對數,我們所使用的電機極對數爲 20
可以通過以下方式獲取電機極對數:
- 查找電機數據手冊,一般會有說明
- 數一數電機永磁體個數,然後除以 2 就是電機極對數
- 在兩個電機線之間連接直流電源,電源電壓設定爲額定直流母線電壓的5% (您也可以將電源設置爲電機的額定電流)
- 用手旋轉電機,應該稍微有一點阻力,否則:
- 如果無法旋轉電機,請降低施加的電壓或電流
- 如果電機產生的阻力過小,請逐漸增加施加的電壓或電流
- 用手轉動轉子一圈,其中穩定位置的數量代表該電機的極對數
- 用手旋轉電機,應該稍微有一點阻力,否則:
odrv0.axis0.motor.config.calibration_current = 3
配置校準時的電流,此電流值在進行電機參數校準和編碼器偏移校準時使用,如果設置的過小在進行編碼器偏移校準時電機將沒有足夠的力量旋轉
odrv0.axis0.motor.config.resistance_calib_max_voltage = 2
配置電機參數校準中自動測量電機相電阻時使用的電壓,當電機的相電阻越高此值應該越高,但是如果此值過高會造成電流過大,產生過流保護錯誤
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT
配置所使用的電機類型,電機類型只有大電流電機(MOTOR_TYPE_HIGH_CURRENT),雲臺電機(MOTOR_TYPE_GIMBAL)
odrv0.axis0.motor.config.current_lim = 20
配置電機運行的最大電流限制
odrv0.axis0.motor.config.requested_current_range = 20
配置電機電流採樣範圍,注意:此值設置後需要重新啓動才能生效
3.3 編碼器配置
odrv0.axis0.encoder.config.mode = ENCODER_MODE_INCREMENTAL
配置電機編碼器類型爲增量式編碼器
odrv0.axis0.encoder.config.use_index = True
我們使用的編碼有索引信號,所以配置爲啓用索引信號輸入
odrv0.axis0.encoder.config.cpr = 16384
配置編碼器分辨率,即電機轉動一圈多少個計數值,一般編碼器手冊中會給出一圈多少步,例如我們使用的TLE5012編碼器手冊中給出的 (4096 steps per full rotation),我們只需要將4096 * 4 就是我們這裏需要的每圈計數值
odrv0.axis0.encoder.config.bandwidth = 3000
設置編碼器 PLL 帶寬,一般對於高分辨率編碼器 (> 4000個計數/轉) 此值應該越高,這樣有助於減少電機振動
odrv0.axis0.config.calibration_lockin.current = 5
odrv0.axis0.config.calibration_lockin.ramp_time = 0.4
odrv0.axis0.config.calibration_lockin.ramp_distance = 3.1415927410125732
odrv0.axis0.config.calibration_lockin.accel = 20
odrv0.axis0.config.calibration_lockin.vel = 40
配置電機進行編碼器索引校準時電機開環轉動的相關參數
- current 開環運行時的電流,單位爲 [A],根據負載調整,以電機能夠正常轉動爲準
- ramp_time 電流爬升時間,表示電流從零爬升到設定的 current 值所需要的時間
- ramp_distance 電流爬升時電角度轉動距離,單位爲 [rad],配合 ramp_time 參數來緩慢鎖定轉子相位,可以通過調整 ramp_time、ramp_distance 使編碼器索引校準啓動的更平順
- accel 轉速爬升的加速度,單位爲 [rad/s^2]
- vel 編碼器索引校準的運行速度,單位爲 [rad/s]
3.4 控制器配置
odrv0.axis0.controller.config.control_mode = CTRL_MODE_TRAJECTORY_CONTROL
配置電機控制模式,此處我們設置爲軌跡位置模式
odrv0.axis0.controller.config.vel_limit = 16384*40
配置電機最大轉速,以編碼器計數值爲單位 [count/s],例如我們的編碼器 cpr = 16384,我們將 vel_limit 設置爲 cpr * 40 即最大轉速爲 40 轉/秒 2400 轉/分
odrv0.axis0.controller.config.pos_gain = 2
odrv0.axis0.controller.config.vel_gain = 0.0003
odrv0.axis0.controller.config.vel_integrator_gain = 0.005
配置控制器控制增益,pos_gain 爲位置環增益,vel_gain 和 vel_integrator_gain 爲速度環增益
3.5 梯形加減速配置
odrv0.axis0.trap_traj.config.vel_limit = 16384*20
配置梯形軌跡模式下電機勻速時的轉速,以編碼器計數值爲單位 [count/s],例如我們的編碼器 cpr = 16384,我們將 vel_limit 設置爲 cpr * 20 即最大轉速爲 20 轉/秒 1200 轉/分
odrv0.axis0.trap_traj.config.accel_limit = 16384*10
配置梯形軌跡模式下電機加速時的加速度,以編碼器計數值爲單位 [count/s^2],例如我們的編碼器 cpr = 16384,我們將 accel_limit 設置爲 cpr * 10 即表示電機從靜止加速到 10 轉/秒 需要一秒鐘的時間
odrv0.axis0.trap_traj.config.decel_limit = 16384*10
配置梯形軌跡模式下電機減速時的加速度,以編碼器計數值爲單位 [count/s^2],例如我們的編碼器 cpr = 16384,我們將 decel_limit 設置爲 cpr * 10 即表示電機從 10 轉/秒 減速到靜止需要一秒鐘的時間
3.6 保存配置
odrv0.save_configuration()
odrv0.reboot()
保存配置參數並重啓 ODrive 已使某些配置參數生效
等待 ODrive 重新連接到 odrivetool
4 校準工作
4.1 校準電機
odrv0.axis0.requested_state = AXIS_STATE_MOTOR_CALIBRATION
進行電機參數校準,校準過程將測量電機相電阻、電機相電感,並根據相電阻相電感自動生成電流環 PI 增益,當聽到電機發出 ‘嗶’ 聲後表示電機參數測量操作已完成
輸入:
dump_errors(odrv0)
返回:
axis0
axis: no error
motor: no error
encoder: no error
controller: no error
axis1
axis: no error
motor: no error
encoder: no error
controller: no error
列出錯誤狀態信息,當得到上述返回則表明電機校準OK可以繼續進行下面步驟,如果出現錯誤則要根據錯誤代碼分析原因,直到錯誤消失
odrv0.axis0.motor.config.pre_calibrated = True
將電機 pre_calibrated 設置爲 True,表示電機已校準下次重新啓動後可以直接使用本次校準的結果
4.2 編碼器校準
odrv0.axis0.requested_state = AXIS_STATE_ENCODER_INDEX_SEARCH
進行電機編碼器索引校準,啓動後電機將朝着一個方向開環旋轉直到檢測到索引信號脈衝時停止,如果想要指定編碼器索引校準時電機的轉動方向可以通過改變以下三個參數的正負號來實現:
- odrv0.axis0.config.calibration_lockin.ramp_distance = -3.1415927410125732
- odrv0.axis0.config.calibration_lockin.accel = -20
- odrv0.axis0.config.calibration_lockin.vel = -40
參考 [3.3 編碼器配置](#3.3 編碼器配置)
注意:以上三個參數正負號應保持一致
輸入:
dump_errors(odrv0)
返回:
axis0
axis: no error
motor: no error
encoder: no error
controller: no error
axis1
axis: no error
motor: no error
encoder: no error
controller: no error
列出錯誤狀態信息,當得到上述返回則表明校準OK可以繼續進行下面步驟,如果出現錯誤則要根據錯誤代碼分析原因,直到錯誤消失
odrv0.axis0.requested_state = AXIS_STATE_ENCODER_OFFSET_CALIBRATION
進行電機編碼器偏移校準,啓動後電機將朝着一個方向開環旋轉然後反方向旋轉然後停止,開環旋轉時的電流大小爲 odrv0.axis0.motor.config.calibration_current 參考 [3.2 電機配置](#3.2 電機配置)
輸入:
dump_errors(odrv0)
返回:
axis0
axis: no error
motor: no error
encoder: no error
controller: no error
axis1
axis: no error
motor: no error
encoder: no error
controller: no error
列出錯誤狀態信息,當得到上述返回則表明校準OK可以繼續進行下面步驟,如果出現錯誤則要根據錯誤代碼分析原因,直到錯誤消失
odrv0.axis0.encoder.config.pre_calibrated = True
將編碼器 pre_calibrated 設置爲 True,表示編碼器已校準下次重新啓動後可以直接使用本次校準的結果,注意:由於我們使用的並非絕對值編碼器而是增量編碼器,所以每次重新啓動後需要進行編碼器索引校準,如果您使用的編碼器沒有索引信號 (只有 AB) 則每次重新啓動後需要進行編碼器偏移校準
4.3 保存校準結果
odrv0.save_configuration()
odrv0.reboot()
將電機校準、編碼器校準和進行的新的配置保存並重啓
等待 ODrive 重新連接到 odrivetool
5 控制電機運行
odrv0.axis0.requested_state = AXIS_STATE_ENCODER_INDEX_SEARCH
重新啓動後進行編碼器索引校準。注意:由於我們使用的並非絕對值編碼器而是增量編碼器,所以每次重新啓動後需要進行編碼器索引校準,如果您使用的編碼器沒有索引信號 (只有 AB) 則每次重新啓動後需要進行編碼器偏移校準
odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
進入閉環運行模式,此時電機將維持在當前位置,如果電機產生震動則說明控制增益設置的不合適需要適當調低,當嘗試用手轉動電機軸時如果電機反應很遲鈍反作用力很弱則說明需要適當調高控制增益,參考 [3.4控制器配置](#3.4 控制器配置)
odrv0.axis0.controller.move_to_pos(16384*10)
控制電機運行到 16384*10 位置,當電機啓動後進入閉環位置運行後電機當前位置爲 0,我們的編碼器 cpr = 16384 即一圈 16384 個計數,此命令命令電機運行到 16384 * 10 的位置即表示電機轉動到 10 圈位置。此過程電機會經歷加速、勻速、減速三個過程,參考[3.5 梯形加減速配置](#3.5 梯形加減速配置),最終停在我們命令它移動到的位置。如果想反方向轉動,位置值改爲負數即可。
odrv0.axis0.requested_state = AXIS_STATE_IDLE
如果想釋放電機發送此命令即可讓電機自由轉動
6 如何避免每次重新啓動後手動校準編碼器、進入閉環控制
每次重新啓動後必須要進行編碼器索引校準,然後切入閉環控制後才能向電機發送運行指令,這兩個步驟可以通過配置讓 ODrive 自動替我們完成
odrv0.axis0.config.startup_encoder_index_search = True
odrv0.axis0.config.startup_closed_loop_control = True
odrv0.save_configuration()
配置 ODrive 啓動後自動執行的操作,編碼器索引校準、進入閉環控制模式,然後保存配置。
7 運行效果演示
ODrive 外轉子電機+磁編碼器 發送正弦曲線位置指令運行測試
如果您有任何問題或疑問,歡迎您加入ODrive社區或QQ羣 851421965 進行交流。