JAJU919 December 2023
モーターを制御するためのアプリケーション パラメータは、ハードウェアに基づいて hal.h に #define
として、PWM、CMPSS、ADC モジュールのベース アドレスを構成するように記述されます。 コンプレッサ モーターの PWM、CMPSS、ADC は、以下のコードで定義されています。
モーター駆動用の PWM と CMPSS のベースアドレスを構成してください。
// EPWM
#define MTR1_PWM_U_BASE EPWM2_BASE
#define MTR1_PWM_V_BASE EPWM3_BASE
#define MTR1_PWM_W_BASE EPWM4_BASE
// CMPSS->Iu/Iv/Iw
#define MTR1_CMPSS_U_BASE CMPSSLITE4_BASE
#define MTR1_CMPSS_V_BASE CMPSSLITE2_BASE
#define MTR1_CMPSS_W_BASE CMPSSLITE3_BASE
モーター駆動用の ADC のベースアドレスとチャネルを構成してください。
// Three shunts
// Using ADCA/ADCC for current sensing
#define MTR1_ADC_TRIGGER_SOC ADC_TRIGGER_EPWM2_SOCA // EPWM2_SOCA
#define MTR1_ADC_I_SAMPLEWINDOW 14
#define MTR1_ADC_V_SAMPLEWINDOW 20
#define MTR1_IU_ADC_BASE ADCC_BASE // ADCC-A7/C3*/CMP4 -SOC1
#define MTR1_IV_ADC_BASE ADCA_BASE // ADCA-A4*/C14/CMP2 -SOC2
#define MTR1_IW_ADC_BASE ADCA_BASE // ADCA-A0*/C15/CMP3 -SOC1
#define MTR1_IU_ADCRES_BASE ADCCRESULT_BASE // ADCC-A7/C3*
#define MTR1_IV_ADCRES_BASE ADCARESULT_BASE // ADCA-A4*/C14
#define MTR1_IW_ADCRES_BASE ADCARESULT_BASE // ADCA-A0*/C15
#define MTR1_IU_ADC_CH_NUM ADC_CH_ADCIN3 // ADCC-A7/C3*
#define MTR1_IV_ADC_CH_NUM ADC_CH_ADCIN4 // ADCA-A4*/C14
#define MTR1_IW_ADC_CH_NUM ADC_CH_ADCIN0 // ADCA-A0*/C15
#define MTR1_IU_ADC_SOC_NUM ADC_SOC_NUMBER1 // ADCC-A7/C3* -SOC1-PPB1
#define MTR1_IV_ADC_SOC_NUM ADC_SOC_NUMBER2 // ADCA-A4*/C14 -SOC2-PPB2
#define MTR1_IW_ADC_SOC_NUM ADC_SOC_NUMBER1 // ADCA-A0*/C15 -SOC1-PPB1
#define MTR1_IU_ADC_PPB_NUM ADC_PPB_NUMBER1 // ADCC-A7/C3* -SOC1-PPB1
#define MTR1_IV_ADC_PPB_NUM ADC_PPB_NUMBER2 // ADCA-A4*/C14 -SOC2-PPB2
#define MTR1_IW_ADC_PPB_NUM ADC_PPB_NUMBER1 // ADCA-A0*/C15 -SOC1-PPB1
モーター駆動制御用のペリフェラル割り込みを構成してください。
// Interrupt
#define MTR1_PWM_INT_BASE MTR1_PWM_U_BASE // EPWM1
#define MTR1_ADC_INT_BASE ADCC_BASE // ADCC-A11/C0*-SOC4
#define MTR1_ADC_INT_NUM ADC_INT_NUMBER1 // ADCC_INT1 -SOC4
#define MTR1_ADC_INT_SOC ADC_SOC_NUMBER4 // ADCC_INT1 -SOC4
#define MTR1_PIE_INT_NUM INT_ADCC1 // ADCC_INT1 -SOC4
#define MTR1_CPU_INT_NUM INTERRUPT_CPU_INT1 // ADCC_INT1-CPU_INT1
#define MTR1_INT_ACK_GROUP INTERRUPT_ACK_GROUP1 // ADCC_INT1-CPU_INT1
ハードウェアに基づいて hal.h に ADC ピンと CMPSS モジュール間の接続を構成してください。詳細については、『TMS320F280013x リアルタイム マイクロコントローラ テクニカル リファレンス マニュアル』の表、アナログ ピン、内部接続を参照してください。
// CMPSS->Iu/Iv/Iw
#define MTR1_CMPSS_U_BASE CMPSSLITE4_BASE
#define MTR1_CMPSS_V_BASE CMPSSLITE2_BASE
#define MTR1_CMPSS_W_BASE CMPSSLITE3_BASE
#define MTR1_IU_CMPHP_SEL ASYSCTL_CMPHPMUX_SELECT_4 // CMPSS4H-A7/C3*
#define MTR1_IU_CMPLP_SEL ASYSCTL_CMPLPMUX_SELECT_4 // CMPSS4L-A7/C3*
#define MTR1_IV_CMPHP_SEL ASYSCTL_CMPHPMUX_SELECT_2 // CMPSS2H-A4*/C14
#define MTR1_IV_CMPLP_SEL ASYSCTL_CMPLPMUX_SELECT_2 // CMPSS2L-A4*/C14
#define MTR1_IW_CMPHP_SEL ASYSCTL_CMPHPMUX_SELECT_3 // CMPSS3H-A0*/C15
#define MTR1_IW_CMPLP_SEL ASYSCTL_CMPLPMUX_SELECT_3 // CMPSS3L-A0*/C15
#define MTR1_IU_CMPHP_MUX 1 // CMPSS4H-A7/C3*
#define MTR1_IU_CMPLP_MUX 1 // CMPSS4L-A7/C3*
#define MTR1_IV_CMPHP_MUX 0 // CMPSS2H-A4*/C14
#define MTR1_IV_CMPLP_MUX 0 // CMPSS2L-A4*/C14
#define MTR1_IW_CMPHP_MUX 2 // CMPSS3H-A0*/C15
#define MTR1_IW_CMPLP_MUX 2 // CMPSS3L-A0*/C15
ハードウェアに基づいて hal.h に EPWM と GPIO 出力に渡される CMPSS からのトリップ信号を構成してください。詳細については、『TMS320F280013x リアルタイム マイクロコントローラ テクニカル リファレンス マニュアル』の表、ePWM X-BAR MUX 構成表と表、OUTPUT X-BAR MUX 構成表を参照してください。
// XBAR-EPWM
#define MTR1_XBAR_TRIP_ADDRL XBAR_O_TRIP8MUX0TO15CFG
#define MTR1_XBAR_TRIP_ADDRH XBAR_O_TRIP8MUX16TO31CFG
#define MTR1_XBAR_INPUT1 XBAR_INPUT1
#define MTR1_TZ_OSHT1 EPWM_TZ_SIGNAL_OSHT1
#define MTR1_XBAR_TRIP XBAR_TRIP8
#define MTR1_DCTRIPIN EPWM_DC_COMBINATIONAL_TRIPIN8y
// XBAR-EPWM->Iu/Iv/Iw
#define MTR1_IU_XBAR_EPWM_MUX XBAR_EPWM_MUX06_CMPSS4_CTRIPH_OR_L // CMPSS4-HP&LP, A7/C3*
#define MTR1_IV_XBAR_EPWM_MUX XBAR_EPWM_MUX02_CMPSS2_CTRIPH_OR_L // CMPSS2-HP&LP, A4*/C14
#define MTR1_IW_XBAR_EPWM_MUX XBAR_EPWM_MUX04_CMPSS3_CTRIPH_OR_L // CMPSS3-HP&LP, A0*/C15
#define MTR1_IU_XBAR_MUX XBAR_MUX06 // CMPSS4-HP&LP, A7/C3*
#define MTR1_IV_XBAR_MUX XBAR_MUX02 // CMPSS2-HP&LP, A4*/C14
#define MTR1_IW_XBAR_MUX XBAR_MUX04 // CMPSS3-HP&LP, A0*/C15
関連する ADC チャネルは、ピンがコンパレータ サブシステム (CMPSS) に内部接続されているモーター電流センシングに使用されます。以下のコードに示すように、hal.c ファイル の HAL_setupCMPSSs() 関数で CMPSS レジスタを構成してください。 3 つの CMPSS モジュールは、モーターの U 相、V 相、W 相に対する正負の過電流保護を実装するために使用されます。
void HAL_setupCMPSSsMTR(HAL_MTR_Handle handle)
{
HAL_MTR_Obj *obj = (HAL_MTR_Obj *)handle;
#if defined(DMCPFC_REV3P2) || defined(DMCPFC_REV3P1)
#if !defined(MOTOR1_DCLINKSS) || !defined(MOTOR2_DCLINKSS)
uint16_t cmpsaDACH;
#endif // !(MOTOR1_DCLINKSS || MOTOR2_DCLINKSS)
uint16_t cmpsaDACL;
... ...
#else // !MOTOR1_DCLINKSS, Three-shunt
cmpsaDACH = MTR1_CMPSS_DACH_VALUE;
cmpsaDACL = MTR1_CMPSS_DACL_VALUE;
ASysCtl_selectCMPHPMux(MTR1_IU_CMPHP_SEL, MTR1_IU_CMPHP_MUX);
ASysCtl_selectCMPHPMux(MTR1_IV_CMPHP_SEL, MTR1_IV_CMPHP_MUX);
ASysCtl_selectCMPLPMux(MTR1_IW_CMPLP_SEL, MTR1_IW_CMPLP_MUX);
... ...
return;
} // end of HAL_setupCMPSSs() function
CMPSS で生成された信号は X-Bar に送られ、さまざまな独自の方法で信号を組み合わせて、IPM #Fault からの外部 TZ 信号を含む複数のソースからの独自のトリップ イベントにフラグを立て、フォルト保護を実装することができます。フォルトには、CMPSS からの過電流信号と、パワー モジュールからのフォルト インジケータ出力が含まれます。以下のコードに示すように、hal.c ファイルの HAL_setupMtrFaults() 関数で XBAR レジスタを構成してください。
void HAL_setupMtrFaults(HAL_MTR_Handle handle)
{
HAL_MTR_Obj *obj = (HAL_MTR_Obj *)handle;
uint16_t cnt;
// Configure TRIP 7 to OR the High and Low trips from both
// comparator 5, 3 & 1, clear everything first
EALLOW;
HWREG(XBAR_EPWM_CFG_REG_BASE + MTR1_XBAR_TRIP_ADDRL) = 0;
HWREG(XBAR_EPWM_CFG_REG_BASE + MTR1_XBAR_TRIP_ADDRH) = 0;
EDIS;
... ...
// What do we want the OST/CBC events to do?
// TZA events can force EPWMxA
// TZB events can force EPWMxB
EPWM_setTripZoneAction(obj->pwmHandle[cnt],
EPWM_TZ_ACTION_EVENT_TZA,
EPWM_TZ_ACTION_LOW);
EPWM_setTripZoneAction(obj->pwmHandle[cnt],
EPWM_TZ_ACTION_EVENT_TZB,
EPWM_TZ_ACTION_LOW);
... ...
// Clear any spurious fault
EPWM_clearTripZoneFlag(obj->pwmHandle[0], HAL_TZFLAG_INTERRUPT_ALL);
EPWM_clearTripZoneFlag(obj->pwmHandle[1], HAL_TZFLAG_INTERRUPT_ALL);
EPWM_clearTripZoneFlag(obj->pwmHandle[2], HAL_TZFLAG_INTERRUPT_ALL);
return;
}
以下のコードに示すように、ハードウェアに基づいて hal.c ファイルの HAL_setupGPIOs() で GPIO を構成してください。
void HAL_setupGPIOs(HAL_Handle handle)
{
... ...
// GPIO2->EPWM2A->M1_UH
GPIO_setPinConfig(GPIO_2_EPWM2_A);
GPIO_writePin(2, 0);
GPIO_setDirectionMode(2, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(2, GPIO_PIN_TYPE_STD);
// GPIO3->EPWM2B->M1_UL
GPIO_setPinConfig(GPIO_3_EPWM2_B);
GPIO_writePin(3, 0);
GPIO_setDirectionMode(3, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(3, GPIO_PIN_TYPE_STD);
... ...
return;
} // end of HAL_setupGPIOs() function
使用するモーター制御用 CMPSS に応じて、構成コードは hal.h ファイルの HAL_enableMtrPWM() と HAL_clearMtrFaultStatus() で、以下の太字のように変更する必要があります。
static inline void HAL_enableMtrPWM(HAL_MTR_Handle handle)
{
HAL_MTR_Obj *obj = (HAL_MTR_Obj *)handle;
obj->flagEnablePWM = true;
#if defined(DMCPFC_REV3P2) || defined(DMCPFC_REV3P1)
if(obj->motorNum == MTR_1)
{
#if defined(MOTOR1_DCLINKSS)
// Clear any comparator digital filter output latch
CMPSS_clearFilterLatchLow(obj->cmpssHandle[0]);
#else // !MOTOR1_DCLINKSS
// Clear any comparator digital filter output latch
CMPSS_clearFilterLatchHigh(obj->cmpssHandle[0]);
CMPSS_clearFilterLatchHigh(obj->cmpssHandle[1]);
CMPSS_clearFilterLatchLow(obj->cmpssHandle[2]);
... ...
return;
} // end of HAL_enableMtrPWM() function
static inline void HAL_clearMtrFaultStatus(HAL_MTR_Handle handle)
{
HAL_MTR_Obj *obj = (HAL_MTR_Obj *)handle;
... ...
#if defined(HVMTRPFC_REV1P1) || defined(WMINVBRD_REV1P0) || defined(TIDSMPFC_REV3P2)
// Clear any comparator digital filter output latch
CMPSS_clearFilterLatchHigh(obj->cmpssHandle[0]);
CMPSS_clearFilterLatchLow(obj->cmpssHandle[0]);
CMPSS_clearFilterLatchHigh(obj->cmpssHandle[1]);
CMPSS_clearFilterLatchLow(obj->cmpssHandle[1]);
CMPSS_clearFilterLatchHigh(obj->cmpssHandle[2]);
CMPSS_clearFilterLatchLow(obj->cmpssHandle[2]);
... ...
return;
} // end of HAL_clearMtrFaultStatus() function