cvl-robot's diary

研究ノート メモメモ https://github.com/dotchang/

特性の分からない3相DCブラシレスモーターをソフトウェアエンコーダを搭載したTiのマイコンボードLAUNCHXL-F28069MとモータドライバBOOSTXL-DRV8305EVMを使って動かす(その4)

(編集中)
最重要ファイルであるところのmotorware_selecting_user_variables.xlsxのv2p1 2014-May-28版を見てみましょう。
MotorwareのResources->Training: User's Guides, Labs, Tutorials->InstaSPIN Projects Setting User Variablesの下にあります。

1. FILL IN THESE VALUES FOR YOUR USER.H, MOTOR, and INVERTER HW

(お使いのuser.h, モータ,インバータハードウェアに合わせて、これらの値を埋めてください。)

USER_SYSTEM_FREQ_MHz90[MHz]
Maximum Bus Voltage24[V]
Maximum Target RPM40000[RPM]
USER_MOTOR_NUM_POLE_PAIRS2[PAIRS]
USER_PWM_FREQ_kHz45[kHz]
USER_NUM_PWM_TICKS_PER_ISR_TICK3[ticks]
USER_NUM_ISR_TICKS_PER_CTRL_TICK1[ticks]
USER_NUM_CTRL_TICKS_PER_CURRENT_TICK1[ticks]
USER_NUM_CTRL_TICKS_PER_EST_TICK1[ticks]
USER_ZEROSPEEDLIMIT0.002

sub-calculations:
Target Hz = (Maximum Target RPM) * (USER_MOTOR_NUM_POLE_PAIRS) / 60
POLE = 2 * (USER_MOTOR_NUM_POLE_PAIRS)
ISR_Hz = (USER_PWM_FREQ_Hz) / (USER_NUM_PWM_TICKS_PER_ISR_TICK)
CTRL_Hz = (ISR_Hz) / (USER_NUM_ISR_TICKS_PER_CTRL_TICK)
CURRENT_Hz = (CTRL_Hz) / (USER_NUM_CTRL_TICKS_PER_CURRENT_TICK)
EST_Hz = (CURRENT_Hz) / (USER_NUM_CTRL_TICKS_PER_EST_TICK)

2. The following are set by HW design, use defaults for TI EVM or your own HW

(次の値はハードウェアデザインによって決定されますので,Tiの評価ボードまたはお使いのハードウェアのための規定値をお使いください。)

USER_VOLTAGE_FILTER_POLE_Hz364.682[Hz]
USER_ADC_FULL_SCALE_CURRENT_A33.00[A]
USER_ADC_FULL_SCALE_VOLTAGE_V26.3147[V]

3. THESE VALUES ARE RECOMMENDED FOR USE once TRUE checks are satisfied

 (TRUEの確認が満たされると,これらの値は使用できます。)

Ideal USER_IQ_FULL_SCALE_FREQ_Hz for Motor

(モータのための理想的なUSER_IQ_FULL_SCALER_FREQ_Hz)
Target Hz with 10% buffer
(10%の余裕を加えた目標周波数)

Maximum allowed USER_IQ_FULL_SCALE_FREQ_HZ for HW

(ハードウェアのための最大許容可能なUSER_IQ_FULL_SCALE_FREQ_HZ)
4 * USER_VOLTAGE_FILTER_POLE_Hz [with 5% buffer]
(USER_VOLTAGE_FILTER_POLE_Hzの4倍から5%の余裕を持たせた値)

USER_IQ_FULL_SCALE_FREQ_Hz

Lower of Ideal and Maximum
(理想と最大のうち小さい方)

Maximum RPM Supported

(サポートされる最大回転数)
Rotor Hz can be 1.98 * USER_IQ_FULL_SCALE_FREQ_HZ; EST speed will roll-over outside boundary!!!!
(ローターの周波数はUSER_IQ_FULL_SCALE_FREQ_Hzの1.98倍を取り得るため,推定速度は境界の外に転がり出得ます。)

USER_MOTOR_FLUX_EST_FREQ_Hz

5-150 Hz; ~10% of Maximum Target Hz but use low as possible where Ls and Flux can be ID'd consistently
(5-150Hz; 最大目標周波数のおよそ10%、ただしLsとFluxが一貫して特定できる範囲で出来るだけ低い値を使ってください。)

USER_MAX_ACCEL_EST_Hzps

If USER_MOTOR_FLUX_EST_FREQ_Hz > 50 Hz must increase the acceleration during ID to avoid a timeout
(もしUSER_MOTOR_FLUX_EST_FREQ_Hzが50Hzよりも大きければ,タイムアウトを避けるためにIDの間の加速を増加してください。)

CURRENT Hz > MAX_Hz * 7

If FALSE increase CURRENT kHz or reduce MAX_HZ; Standard good practice for control systems
(もしFALSEならばCURRENT kHzを増加させるか、MAX_Hzを現象させてください。制御システムのための標準的な良い慣習値)

EST <= CTRL

If FALSE correct; No need to run the estimator if results are not being updated in control loop
(もしFALSEならば、制御ループ中に更新され無いことを意味するので、推定は実行されません。)

EST > 10 * USER_VOLTAGE_FILTER_POLE_Hz (+10% margin)

If FALSE increase EST Rate
(もしFALSEならEST Rateを増やしてください。)

EST > 8 * TARGET_Hz

If FALSE, increase effective EST Frequency using TICKs
(もしFALSEなら、TICKsを使って有効なEST周波数に増加さえてください。)

FLUX_EST_FREQ > ZEROSPEEDLIMIT * FULL_SCALE_FREQ

If FALSE, lower ZEROSPEEDLIMIT
(もしFLASEならば, ZEROSPEEDLIMITを減らしてください。)

USER_IQ_FULL_SCALE_CURRENT_A

Slightly >= 0.5 * ADC_FULL_SCALE_CURRENT_A
(0.5*ADC_FUKK_SCALE_CURRENT_Aよりわずかに大きい値にしてください。)

starting USER_IQ_FULL_SCALE_VOLTAGE_V

 Initially set to bus voltage until flux is identified
(磁束が特定されるまで最初に設定されるバス電圧値)

4. Once Motor ID is attempted, update these as best you can and check IQ_V Scaling

 (モーター特定を実行したら,これらの値を出来るだけ最適に調整して、IQ_Vの値幅を確認してください。)

USER_MOTOR_RATED_FLUX0.023[V/Hz]
USER_MOTOR_Ls_d0.00005[H]

sub-calculations:
Minumiu Flux Measurement = (new USER_IQ_FULL_SCALE_VOLTAGE_V) / (EST_Hz * 1000) / 0.7
= Minimum Flux that can be measured with new USER_IQ_FULL_SCALE_VOLTAGE_V (cell I20)
(=最小磁束はnew_USER_IQ_FULL_SCALE_VOLTAGE_Vで計ることができます。)

4. Check after valid USER_MOTOR_RATED_FLUX Identification
(有効なUSER_MOTOR_RATED_FLUX特定後の確認)

Minimum Flux Measurement < 0.9 * RATED_FLUX

(最小磁束測定値が0.9*RATED_FLUXより小さいこと。)
  If FALSE, reduce new USER_IQ_FULL_SCALE_VOLTAGE as low as Bus Voltage / 2 + 10% buffer
(もしFALSEならば,new USER_IQ_FULL_SCALE_VOLTAGEを電源電圧の半分に10%の余裕を持たせた値よりも小さくしてください。)

IQ_VOLTAGE < RATED_FLUX * EST Hz

If FALSE, reduce new USER_IQ_FULL_SCALE_VOLTAGE or increase EST_Hz
(もしFALSEならば、new USER_IQ_FULL_SCALE_VOLTAGEを減らすか、EST_Hzを増やしてください。)

new USER_IQ_FULL_SCALE_VOLTAGE_V

Use larger of a) or b). Minimum of Bus Voltage / 2 + 10% buffer if required to make I18 & I19 TRUE
(a)またはb)の大きな方を使ってください。Minimum Flux Measurement < 0.9 * RATED_FLUXとIQ_VOLTAGE < RATED_FLUX * EST_Hzの条件を満たすためには、電源電圧の半分に10%の余裕を持たせた値にしてください。
a) Bus Voltage
(電源電圧)
Typical Minimum, but can reduce as low as Bus Voltage / 2 + 10% buffer
(形式上の最小値、ただしBus Voltageの半分に10%の余裕を持たせた電圧程度まで減りえます。)
b) Bemf Generated @ Target Hz + 10% buffer
(目標周波数+10%余裕における逆起電力)

5. Ideal Pole Design when you build wwn HW

(ユーザが自身のHWを作る際の理想的な極設計)

Minimum Pole200[Hz MIN]
Ideal* Pole >=366.667[Hz]
Half** Pole >=183.3333[Hz]

* Use Ideal pole to keep Target Hz < USER_IQ_FULL_SCALE_FREQ_Hz but note that as pole Hz increases you are more susceptible to drift/error and should use higher precision Vph filter Capacitors
(理想的な極を使うためにTarget Hz < USER_IQ_FULL_SCALE_FREQ_Hzを維持してください。しかし,極周波数の増加は、ドリフトやエラーに影響されやすくするので高い精度のVphフィルタキャパシタを使うように、気を付けてください。)

** You may use a lower pole (down to half the value of the ideal) that is less sensitive to capacitor error/offset/drift. Set USER_IQ_FULL_SCALE_FREQ_HZ <= 4 * Lowered Pole * 0.95 buffer. Target Hz can reach +/- 1.98 * USER_IQ_FULL_SCALE_FREQ_Hz

Performance difference between the two is typically very marginal though. Do NOT use a filter pole < Minimum Pole!!!

user.hへの反映

マイコンボードとインバータボードに依存して、テンプレートのuser.hが用意されています。たとえば、LAUNCHXL-F28027F+BOOSTXL-DRV8305EVMの組み合わせの場合は、

C:\ti\motorware\motorware_1_01_00_16\sw\solutions\instaspin_foc\boards\boostxldrv8305_revA\f28x\f2802xF\src

にあります。この中から、編集可能な値をピックアップしてみます。

CURRENTS AND VOLTAGES

#define USER_IQ_FULL_SCALE_FREQ_Hz (800.0) // 800 Example with buffer for 8-pole 6 KRPM motor to be run to 10 KRPM with field weakening; Hz =(RPM * Poles) / 120
#define USER_IQ_FULL_SCALE_VOLTAGE_V (24.0) // 24.0 Set to Vbus
#define USER_ADC_FULL_SCALE_VOLTAGE_V (44.30) // BOOSTXL-DRV8305EVM = 44.30 V
#define USER_IQ_FULL_SCALE_CURRENT_A (24.0) // BOOSTXL-DRV8305EVM = 24.0 A
#define USER_ADC_FULL_SCALE_CURRENT_A (47.14) // BOOSTXL-DRV8305EVM = 47.14 A
#define USER_NUM_CURRENT_SENSORS (3) // 3 Preferred setting for best performance across full speed range, allows for 100% duty cycle
#define USER_NUM_VOLTAGE_SENSORS (3) // 3 Required
#define I_A_offset (1.210729778) // BOOSTXL-DRV8305EVM = 1.047175646
#define I_B_offset (1.209441483) // BOOSTXL-DRV8305EVM = 1.044038892
#define I_C_offset (1.209092796) // BOOSTXL-DRV8305EVM = 1.040363491
#define V_A_offset (0.5084558129) // BOOSTXL-DRV8305EVM = 0.5256254077
#define V_B_offset (0.5074239969) // BOOSTXL-DRV8305EVM = 0.5250559449
#define V_C_offset (0.5065535307) // BOOSTXL-DRV8305EVM = 0.5247237682

CLOCKS & TIMERS

#define USER_SYSTEM_FREQ_MHz (60.0)
#define USER_PWM_FREQ_kHz (45.0) //30.0 Example, 8.0 - 30.0 KHz typical; 45-80 KHz may be required for very low inductance, high speed motors
#define USER_MAX_VS_MAG_PU (0.5) // Set to 0.5 if a current reconstruction technique is not used. Look at the module svgen_current in lab10a-x for more info.
#define USER_EST_HANDLE_ADDRESS (0x600)
#define USER_VD_SF (0.95)

DECIMATION

#define USER_NUM_PWM_TICKS_PER_ISR_TICK (3)
#define USER_NUM_ISR_TICKS_PER_CTRL_TICK (1) // 2 Example, controller clock rate (CTRL) runs at PWM / 2; ex 30 KHz PWM, 15 KHz control
#define USER_NUM_CTRL_TICKS_PER_CURRENT_TICK (1) // 1 Typical, Forward FOC current controller (Iq/Id/IPARK/SVPWM) runs at same rate as CTRL.
#define USER_NUM_CTRL_TICKS_PER_EST_TICK (1) // 1 Typical, FAST estimator runs at same rate as CTRL;
#define USER_NUM_CTRL_TICKS_PER_SPEED_TICK (15) // 15 Typical to match PWM, ex: 15KHz PWM, controller, and current loop, 1KHz speed loop
#define USER_NUM_CTRL_TICKS_PER_TRAJ_TICK (15) // 15 Typical to match PWM, ex: 10KHz controller & current loop, 1KHz speed loop, 1 KHz Trajectory

LIMITS

#define USER_ZEROSPEEDLIMIT (0.5 / USER_IQ_FULL_SCALE_FREQ_Hz) // 0.002 pu, 1-5 Hz typical; Hz = USER_ZEROSPEEDLIMIT * USER_IQ_FULL_SCALE_FREQ_Hz
#define USER_MAX_ACCEL_Hzps (20.0) // 20.0 Default
#define USER_MAX_ACCEL_EST_Hzps (5.0) // 5.0 Default, don't change
#define USER_IDRATED_FRACTION_FOR_L_IDENT (1.0) // 1.0 Default, don't change
#define USER_IDRATED_DELTA (0.00002)
#define USER_SPEEDMAX_FRACTION_FOR_L_IDENT (1.0) // 1.0 Default, don't change
#define USER_FLUX_FRACTION (1.0) // 1.0 Default, don't change
#define USER_POWERWARP_GAIN (1.0) // 1.0 Default, don't change
#define USER_R_OVER_L_EST_FREQ_Hz (300) // 300 Default for high speed motors, can reduce to 100 if RoverL from Motor ID is < 2000

POLES

#define USER_VOLTAGE_FILTER_POLE_Hz (344.62) // BOOSTXL-DRV8305 = 344.62 Hz
#define USER_OFFSET_POLE_rps (20.0) // 20.0 Default, do not change
#define USER_FLUX_POLE_rps (100.0) // 100.0 Default, do not change
#define USER_DIRECTION_POLE_rps (6.0) // 6.0 Default, do not change
#define USER_SPEED_POLE_rps (100.0) // 100.0 Default, do not change
#define USER_DCBUS_POLE_rps (100.0) // 100.0 Default, do not change
#define USER_EST_KAPPAQ (1.5) // 1.5 Default, do not change

Define each motor with a unique name and ID number

#define Anaheim_BLY172S 102
#define USER_MOTOR Anaheim_BLY172S

#define USER_MOTOR_TYPE MOTOR_Type_Pm // Motor_Type_Pm (All Synchronous: BLDC, PMSM, SMPM, IPM) or Motor_Type_Induction (Asynchronous ACI)
#define USER_MOTOR_NUM_POLE_PAIRS (4) // PAIRS, not total poles. Used to calculate user RPM from rotor Hz only
#define USER_MOTOR_Rr (NULL) // Induction motors only, else NULL
#define USER_MOTOR_Rs (0.3968007) // Identified phase to neutral resistance in a Y equivalent circuit (Ohms, float)
#define USER_MOTOR_Ls_d (0.0006708066) // For PM, Identified average stator inductance (Henry, float)
#define USER_MOTOR_Ls_q (0.0006708066) // For PM, Identified average stator inductance (Henry, float)
#define USER_MOTOR_RATED_FLUX (0.03433958) // Identified TOTAL flux linkage between the rotor and the stator (V/Hz)
#define USER_MOTOR_MAGNETIZING_CURRENT (NULL) // Induction motors only, else NULL
#define USER_MOTOR_RES_EST_CURRENT (1.0) // During Motor ID, maximum current (Amperes, float) used for Rs estimation, 10-20% rated current
#define USER_MOTOR_IND_EST_CURRENT (-1.0) // During Motor ID, maximum current (negative Amperes, float) used for Ls estimation, use just enough to enable rotation
#define USER_MOTOR_MAX_CURRENT (5.0) // CRITICAL: Used during ID and run-time, sets a limit on the maximum current command output of the pded Speed PI Controller to the Iq controller
#define USER_MOTOR_FLUX_EST_FREQ_Hz (20.0) // During Motor ID, maximum commanded speed (Hz, float), ~10% rated

user.hとmotorware_selecting_user_variables.xlsxを並べて開いて、データを相互に編集してやる必要があります。
1.最初に、user.hからエクセルの黄色い枠の中にデータをコピペしていきます。モニターで黄色が見にくいのでこのページでは、赤になっています。
2.次に、エクセルの緑の枠の値をuser.hにコピーして持ってきます。USER_MAX_ACCEL_EST_Hzpsは変えるな、とuser.hに書いてあるので変えない方が良いでしょう。
3.実機でモータ同定を行ってから、両方の青枠のデータを更新します。モータ同定はうまくいかないことの方が多いので、うまく回るかどうかを確認してから反映してください。
4.水色で示したモータの巻き線抵抗や、インバータの電流電圧検出抵抗の値をuser.hに更新します。

Tiのホームページの素晴らしい宣伝文句とは裏腹に、おしゃれなGUIなどでは設定できませんので、エディタ等でテキストベースで設定を書き換えます。
(ここまで出来ていて、何故自動ソフトウェア化しないのだろう??)

実際のパラメータ決定法

上記の計算結果をuser.hに入れて、コンパイルして、実行しようとしてもまずうまくいきません。
USER_MOTOR_RATED_FLUXの値が下限リミットに引っかかってしまい、エラーで弾かれるか、まともに動かないという結果になりがちです。
解決方法としては、excelのUSER_MOTOR_RATED_FLUXを使わない、というのが本末転倒ですが現実的なようです。

GUI ComposerのInstaSPIN-FOC MotorWare Instrumentationタブの右下の方に、Variable Overflow Checksがあり、この中の

Flux * Full Scale Freq [V] <

の項目がうまく設定できているかどうかのカギです。
要するに、この項目が下限電圧値を示していてFull Scale Freqの値はエクセルシート上ですでに計算していますから、Fluxの値をこれから直接計算してしまいましょう。
下限電圧値は、「電源電圧の半分に10%の余裕を持たせた値」としていますので、バス電圧が24Vの場合

24[V]/2*1.1=13.2[V]

です。
USER_IQ_FULL_SCALE_FREQ_Hzはエクセルシートの右側で、例えば800Hzとか513.3Hzなんていうオーダーの数値になっています。
試しに513.3Hzとすると、

Flux = 13.2[V] / 513.3[Hz] = 0.02571596 [V/Hz]

となります。エクセルと10倍程度違ったり、自動同定で見つけさせた値とかけ離れていたりしますが、こちらの値の方が上手くいくことが多いです。

これが、InstaSPIN-MOTION用だとまた少し違う項目が出てきます。が、それはまた次に。


[1]parameter settings: http://www.ti.com/lit/ug/spruhj1f/spruhj1f.pdf