RX66Tマイコン でモータ用PWM出力が出ない

RX66T R5F566TAAGFN でスマートコンフィグレータでConfig_MTU3_MTU4を作成出力し、ソースファイルにて

static uint8_t TOERA_buf = 0xC0 ; //タイマーアウトプットマスタイネーブルレジスタバッファ 0xC0で出力禁止

R_Config_MTU3_MTU4_StartTimerCount() ; //モーター1タイマーカウント起動
R_Config_MTU3_MTU4_StartTimerCtrl() ; //モーター1タイマーコントロール起動

TOERA_buf = TOERA_buf | 0x01 ; //タイマーアウトプットマスタイネーブルレジスタ 3B起動 0x1:1:4D:4C:3D:4B:4A:3B
MTU.TOERA.BYTE = TOERA_buf ;
PORT7.PMR.BIT.B1 = 1 ; // 1U_HI I/O port for peripheral functions //MTIOC3B

R_Config_MTU3_MTU4_UpdDuty(0x0438, 0x0438, 0x0438) ; 0x0438は TGRAレジスタ値0x0870の半分の値(なので50%Dutyが出るはず)

を実行してもMTI0C3Bが割り当てられてる,46pinP71から出力が出てきません(オシロで確認)。

RX23Tでは上記で問題無く出力がされたのですが、RX66TはRX23Tと記述が何処か変える必要があるのか

ご教授頂けませんでしょうか?

尚、スマートコンフィグレータで出力されたファイルは以下になります

///////////////////////////////////////////////////////////////////////////////////////////////////////

/***********************************************************************************************************************
* Function Name: R_Config_MTU3_MTU4_Create
* Description : This function initializes the MTU for motor
* Arguments : None
* Return Value : None
***********************************************************************************************************************/

void R_Config_MTU3_MTU4_Create(void)
{
/* Release MTU channel 3 from stop state */
MSTP(MTU3) = 0U;
/* Enable read/write to MTU3, MTU4 registers */
MTU.TRWERA.BIT.RWE = 1U;
/* Stop MTU3, MTU4 counter */
MTU.TSTRA.BYTE = MTU.TSTRA.BYTE & 0x3FU;

/* Configure MTU3 and MTU4 as complementary PWM mode timer */
MTU3.TIER.BYTE = 0x00U;
MTU4.TIER.BYTE = 0x00U;
MTU.TITCR1A.BIT.T3AEN = 0U;
MTU.TITCR1A.BIT.T4VEN = 0U;
MTU3.TCR.BYTE = _00_MTR_MTU_PCLK_1 | _00_MTR_MTU_CKEG_RISE;
MTU4.TCR.BYTE = _00_MTR_MTU_PCLK_1 | _00_MTR_MTU_CKEG_RISE;
MTU3.TCR2.BYTE = _00_MTR_MTU_PCLK_1;
MTU4.TCR2.BYTE = _00_MTR_MTU_PCLK_1;
MTU3.TCNT = _00A0_3TCNT_VALUE;
MTU4.TCNT = 0x0000U;
MTU.TSYRA.BIT.SYNC3 = 0U;
MTU.TSYRA.BIT.SYNC4 = 0U;
MTU3.TGRB = _0438_3TGRB_VALUE;
MTU3.TGRD = _0438_3TGRB_VALUE;
MTU4.TGRA = _0438_4TGRA_VALUE;
MTU4.TGRC = _0438_4TGRA_VALUE;
MTU4.TGRB = _0438_4TGRB_VALUE;
MTU4.TGRD = _0438_4TGRB_VALUE;
MTU.TDERA.BIT.TDER = 1U;
MTU.TDDRA = _00A0_TDDRA_VALUE;
MTU.TCDRA = _07D0_TCDRA_VALUE;
MTU.TCBRA = _07D0_TCDRA_VALUE;
MTU3.TGRA = _0870_SUM_VALUE;
MTU3.TGRC = _0870_SUM_VALUE;
MTU.TOCR1A.BYTE = _00_MTR_MTU_PSYE_DISABLE | _08_MTR_MTU_TOCL_DISABLE | _04_MTR_MTU_TOCS_TOCR2;
MTU.TOCR2A.BYTE = _20_MTR_MTU_OLS3N_LH | _10_MTR_MTU_OLS3P_LH | _08_MTR_MTU_OLS2N_LH | _04_MTR_MTU_OLS2P_LH |
_02_MTR_MTU_OLS1N_LH | _01_MTR_MTU_OLS1P_LH;
MTU.TOLBRA.BYTE = MTU.TOCR2A.BYTE & 0x3FU;
MTU4.TADCORA = _0002_MTR_MTU_TADCORA_VALUE;
MTU4.TADCOBRA = _0002_MTR_MTU_TADCORA_VALUE;
MTU4.TADCR.WORD = _0004_MTR_MTU_ADSYNCH_ITAVE_ENABLE | _0080_MTR_MTU_UTAE_ENABLE;
MTU.TITMRA.BIT.TITM = 0U;
MTU.TITCR1A.BYTE = _00_MTR_MTU_INT_SKIP_DISABLE << 4U | _09_MTR_MTU_INT_SKIP_COUNT_1;
MTU3.TMDR1.BYTE = _0E_MTR_MTU_CMT2 | _10_MTR_MTU_BFA_BUFFER | _20_MTR_MTU_BFB_BUFFER;
MTU.TOERA.BYTE = 0xC0U;
MTU3.TIORH.BYTE = 0x00U;
MTU3.TIORL.BYTE = 0x00U;
MTU4.TIORH.BYTE = 0x00U;
MTU4.TIORL.BYTE = 0x00U;
/* Disable read/write to MTU3, MTU4 registers */
MTU.TRWERA.BIT.RWE = 0U;


R_Config_MTU3_MTU4_Create_UserInit();
}

/***********************************************************************************************************************
* Function Name: R_Config_MTU3_MTU4_StarttTimerCount
* Description : This function starts the MTU3 channel counter
* Arguments : None
* Return Value : None
***********************************************************************************************************************/

void R_Config_MTU3_MTU4_StartTimerCount(void)
{

/* Start MTU3, MTU4 counter */
MTU.TCSYSTR.BYTE = (_10_MTR_MTU_SCH3_START | _08_MTR_MTU_SCH4_START);
}

/***********************************************************************************************************************
* Function Name: R_Config_MTU3_MTU4_StopTimerCount
* Description : This function stops the MTU3 channel counter
* Arguments : None
* Return Value : None
***********************************************************************************************************************/

void R_Config_MTU3_MTU4_StopTimerCount(void)
{

/* Stop MTU3, MTU4 channel counter */
MTU.TSTRA.BYTE = MTU.TSTRA.BYTE & 0x3FU;
}

/***********************************************************************************************************************
* Function Name: R_Config_MTU3_MTU4_StartTimerOutput
* Description : This function starts the MTU output
* Arguments : None
* Return Value : None
***********************************************************************************************************************/

void R_Config_MTU3_MTU4_StartTimerCtrl(void)
{
/* Enable read/write to MTU3, MTU4 registers */
MTU.TRWERA.BIT.RWE = 1U;

//Enable MTU3,MTU4 PWM output
MTU.TOERA.BYTE = _C1_MTR_MTU_OE3B_ENABLE | _C8_MTR_MTU_OE3D_ENABLE | _C2_MTR_MTU_OE4A_ENABLE |
_D0_MTR_MTU_OE4C_ENABLE | _C4_MTR_MTU_OE4B_ENABLE | _E0_MTR_MTU_OE4D_ENABLE;

/* Disable read/write to MTU3, MTU4 registers */
MTU.TRWERA.BIT.RWE = 0U;
}

/***********************************************************************************************************************
* Function Name: R_Config_MTU3_MTU4_StopTimerOutput
* Description : This function stops the MTU output
* Arguments : None
* Return Value : None
***********************************************************************************************************************/

void R_Config_MTU3_MTU4_StopTimerCtrl(void)
{
/* Enable read/write to MTU3, MTU4 registers */
MTU.TRWERA.BIT.RWE = 1U;

//Disable MTU3,MTU4 PWM output
MTU.TOERA.BYTE = 0xC0U;

/* Disable read/write to MTU3, MTU4 registers */
MTU.TRWERA.BIT.RWE = 0U;
}

/***********************************************************************************************************************
* Function Name: R_Config_MTU3_MTU4_UpdDuty
* Description : This function updates duty cycle
* Arguments : duty_u -
* U phase duty register value
* duty_v -
* V phase duty register value
* duty_w -
* W phase duty register value
* Return Value : None
***********************************************************************************************************************/

void R_Config_MTU3_MTU4_UpdDuty(uint16_t duty_u, uint16_t duty_v, uint16_t duty_w)
{
MTU3.TGRD = duty_u;
MTU4.TGRC = duty_v;
MTU4.TGRD = duty_w;
}

  • MTU3_MTU4が使われていて出力されている関数名から推測すると、追加したコンポーネントは

    モータでしょうか?

    モータだとして、

    赤枠の端子設定の所はどう設定されましたでしょうか。

     R_Config_MTU3_MTU4_Create(), R_Config_MTU3_MTU4_StartTimerCtrl()内に端子設定がないので、チェックを入れていない状態でしょうか。

    (こちらでチェックを入れない状態を試してみましたが、チェックを入れないと、R_Config_MTU3_MTU4_UpdDuty()関数の中身が投稿されている内容と違っていたりして、どのように設定しているのか、良く判りませんでした。)

     上記の端子設定の所にチェックを入れると、P71(U相のH側に割り当てられている端子)からPWM波形が出力されました。なお、他の端子(P74等、U, V, W相のH/L側、合計6端子)からも出力されます。

     P71のみ、出力させたいのか、6本の端子から出力させたいのか、どちらでしょう。P71以外の端子から出力させたくない場合は、強引ですが、

    //U相H側以外の端子を未使用とする
    PORT7.PMR.BIT.B4 = 0;
    PORT7.PMR.BIT.B2 = 0;
    PORT7.PMR.BIT.B3 = 0;
    PORT7.PMR.BIT.B5 = 0;
    PORT7.PMR.BIT.B6 = 0;

    を実行すると、P72~P76からは出力されません。

    (なお、P71のみPWM出力させる場合は、追加するコンポーネントは「モーター」じゃない方が良いと思います。)

  • ご回答有難う御座います。

    bldcモータを回す為のプログラムを作成したく、御指摘の通りモータの追加コンポーネンツをしました。

    で、チェックは打ってある状態でコード生成をした結果が、上記添付だったのですが、一旦チェックを外してもう一度チェックを入れる事で、コード生成で

    void R_Config_MTU3_MTU4_StartTimerCtrl(void)
    {
    /* Enable read/write to MTU3, MTU4 registers */
    MTU.TRWERA.BIT.RWE = 1U;

    //Control Up (MTIOC3B)
    PORT7.PODR.BIT.B1 = 0U; //Active High
    PORT7.PMR.BIT.B1 = 1U;
    //Control Un (MTIOC3D)
    PORT7.PODR.BIT.B4 = 0U; //Active High
    PORT7.PMR.BIT.B4 = 1U;
    //Control Vp (MTIOC4A)
    PORT7.PODR.BIT.B2 = 0U; //Active High
    PORT7.PMR.BIT.B2 = 1U;
    //Control Wp (MTIOC4B)
    PORT7.PODR.BIT.B3 = 0U; //Active High
    PORT7.PMR.BIT.B3 = 1U;
    //Control Vn (MTIOC4C)
    PORT7.PODR.BIT.B5 = 0U; //Active High
    PORT7.PMR.BIT.B5 = 1U;
    //Control Wn (MTIOC4D)
    PORT7.PODR.BIT.B6 = 0U; //Active High
    PORT7.PMR.BIT.B6 = 1U;
    //Enable MTU3,MTU4 PWM output
    MTU.TOERA.BYTE = _C1_MTR_MTU_OE3B_ENABLE | _C8_MTR_MTU_OE3D_ENABLE | _C2_MTR_MTU_OE4A_ENABLE |
    _D0_MTR_MTU_OE4C_ENABLE | _C4_MTR_MTU_OE4B_ENABLE | _E0_MTR_MTU_OE4D_ENABLE;

    /* Disable read/write to MTU3, MTU4 registers */
    MTU.TRWERA.BIT.RWE = 0U;

    と端子配列が追加され、問題無くPWM出力が出来るようになりました。

    今回RX66Tのプロジェクトを作成の際、すでに作ってあったRX24Tのプロジェクトを流用元に設定して作成したので、その辺りでスマートコンフィグレータのバグがあるのかもしれませんね。

    とりあえず、問題が解決しましたので、有難う御座いました。