R5F_0_1 の初期化
モーター 1 の R5F_0_0 を初期化するには、次の手順に従います (single_chip_servo_remote_core_start)。
- GPIO ピンの方向と初期値 を設定 (init_gpio_state)
- EPWM ディスエーブル (enable_pwm_buffers)
- モーター 1 の EPWM 周波数と割り込みを設定 (init_pwms)
- EnDAT 2.2 モーター 1 の ICSSG0 PRU1 を設定 (チャネル 0、init_encoder)
- ICSSG_SA_MX_REG レジスタで g_mux_en を 1 に設定 HW_WR_REG32((CSL_PRU_ICSSG0_PR1_CFG_SLV_BASE+0x40), (0x80))
- レジスタ & イネーブル ICSSG EnDat PRU FW 割り込み
-
- 割り込み番号: ICSSG_PRU_ENDAT_INT_NUM
- コールバック関数:pruEncoderIrqHandler
- EnDat 2.2 パラメータの設定
- gEndat_multi_ch_mask = ENDAT_MULTI_CH0 | ENDAT_MULTI_CH2;
- gEndat_is_multi_ch = CONFIG_ENDAT0_MODE & 1;
- gEndat_is_load_share_mode = CONFIG_ENDAT0_MODE & 2;
- ICSSG0 PRU1 を初期化 (EnDat_pruss_init)
- エンコーダ ドライバ API を使用してエンコーダを初期化 (endat_init)
- エンコーダ ドライバ API を使用してエンコーダを設定 (endat_config_multi_channel_mask)
- ICSSG 周波数に基づいて遅延を構成
- EnDat 2.2 PRU FW を ICSSG0 PRU1 にロードして実行 (endat_pruss_load_run_fw)
- 5 秒のタイムアウトを指定して、ファームウェアからの初期化 ack を確認 (endat_wait_initialization)
- 2.2 エンコーダのデフォルト周波数を 16 MHz に設定 (endat_init_clock)
- 300MHz PRU で 16MHz が動作するように伝播遅延を設定 (endat_handle_prop_delay(priv, 265))
- EnDat 2.2 FW に周期的なトリガを設定 (endat_config_periodic_trigger)
- EnDat 2.2 FW 周期モードのパラメータを設定 (endat_config_periodic_mode)
- チャネル 0 の IEP0 CMP3 イベント (PWM 周期の開始から 3000ns)
- チャネル 2 の IEP0 CMP6 イベント (PWM 周期の開始から 3000ns)
- EnData 2.2 データの受信を開始 (endat_handle_rx)
- モーター 1 の SDFM 用に ICSSG0 PRU0 を設定 (init_sddf)
- IEP0 を初期化し、SYNC0 SD クロックを設定 (init_IEP0_SYNC)
- ICSSG0 PRU0 の初期化 (initIcss)
- ICSSG SDFM RTU FW 割り込みの登録とイネーブル
- 割り込み番号:ICSSG_RTU_SDDF_INT_NUM
- コールバック関数:rtuSddfIrqHandler
- SDFM の RTU/PRU コアを初期化 (initPruSddf)
- RTU サンプル ベース アドレス:gTestSdfmPrms.samplesBaseAddress
- PRU サンプル ベース アドレス:gTestSdfmPrms.samplesBaseAddress+0x80
- IEP0 を起動 (start_IEP0)
- SW を強制的に EPWM0 に同期他の PWM は、ハードウェア同期デイジー チェーンを介して同期 (EPWM_tbTriggerSwSync)
- EPWM 出力バッファのディスエーブル (enable_pwm_buffers)
- FOC のパラメーターを初期化 (init_pids)
- モーター 1 の EPWM 出力バッファをイネーブル (enable_pwm_buffers(TRUE))
R5F_0_1 の初期化
モーター 2 の R5F_0_1 を初期化するには、次の手順に従います (single_chip_servo_remote_core_start)。
- モーター 2 の EPWM 周波数と割り込み (init_pwms) のセットアップ
- モーター 2 の ICSSG EnDat PRU FW 割り込みを登録してイネーブル
- 割り込み番号: ICSSG_PRU_ENDAT_INT_NUM+2
- コールバック関数:pruEncoderIrqHandler2
- モーター 2 の ICSSG SDFM PRU FW 割り込みイネーブル & を登録
- 割り込み番号: ICSSG_PRU_SDDF_INT_NUM
- コールバック関数:pruSddfIrqHandler
- FOC のパラメーターを初期化 (init_pids)
割り込みのセットアップ
割り込みとハンドラを設定するには、次の手順に従います。
EPWM 割り込み (50kHz)、ISR - App_epwmIntrISR (モーター 1) または App_epwmIntrISR2 (モーター 2)
SDFM 割り込み (50kHz)、ISR - rtuSddfIrqHandler (モーター 1) または pruSddfIrqHandler (モーター 2)
- サンプル 8192 から 16384 の範囲で、SDFM チャネルのオフセットを計算します (0–2 または 3–5)。PRECOMPUTE_LEVEL == NO_PRECOMPUTE の場合、SDFM チャネル オフセットが FOC ループで使用されます。
- サンプル 16384 で、位相 A、位相 B、位相 C の EPWM を書き込み、回転子を電気的 0 にロックし、SDFM 割り込みをディセーブル
- ソースでの割り込みをクリア
EnDAT 2.2 割り込み (50kHz)、ISR – pruEncoderIrqHandler (モーター 1)
- ソースでの割り込みをクリア
- サンプル 0 - 8192 の場合は何もしていない
- サンプル 8193-16383 の場合:
- 機械的および電気的角度オフセットの計算 (localEnDatGetSingleMulti)
- サンプル 16384 の場合:
- 機械的および電気的角度オフセットの平均を求めます
- すべての位相をオフ
- 機械的および電気的角度オフセットを保存
- 16384 より後のサンプルの場合:
- FOC ループを開始し、回転子のロックを解除
- エンコーダから最新の機械的 θ と多回転位置を取得 (localEnDatGetSingleMulti)
- 電気的な 0、4 ポールのペアから計算されたオフセットを使用
- FOC ループを実行して空間ベクトルを計算
- 次の CMPA 値を書き込みHW は EPWM0 を位相 C に、EPWM2 を位相 A に接続するので、cmp0 と cmp2 を交換します
- EPWM0 は実際には EHRPWM2 を使用し、EPWM1 は EHRPWM1 を、EPWM2 は EHRPWM0 を使用
- 詳細については、single_chip_servo_am243x-lp_r5fss0-0_nortos_ti-arm-clang の example_syscfg の EPWM 設定を参照してください。
EnDAT 2.2 割り込み (50kHz)、ISR – pruEncoderIrqHandler (モーター 2)
- ソースでの割り込みをクリア
- サンプル 0-8192 の場合は何もしない
- サンプル 8193-16383 の場合:
- 機械的および電気的角度オフセットの計算 (localEnDatGetSingleMulti)
- サンプル 16384 の場合:
- 機械的角度オフセットと電気的角度オフセットの平均を求めます。
- すべての位相をオフ
- 機械的および電気的角度オフセットを保存
- 16384 より後のサンプルの場合:
- FOC ループを開始し、回転子のロックを解除
- エンコーダから最新の機械的 θ と複数回転位置を取得 (localEnDatGetSingleMulti)
- 電気的な 0、4 ポールのペアから計算されたオフセットを使用します
- FOC ループを実行して空間ベクトルを計算
- 次の CMPA 値を書き込みます。HW は EPWM0 を位相 C に、EPWM5 を位相 A に接続するので、cmp0 と cmp2 を交換します
- EPWM0 は実際には EHRPWM5 を使用し、EPWM1 は EHRPWM4 を使用し、EPWM2 は EHRPWM3 を使用
- 詳細については、single_chip_servo_am243x-lp_r5fss0-1_nortos_ti-arm-clang の example_syscfg の EPWM 設定を参照してください。